mirror of
https://github.com/pgbackrest/pgbackrest.git
synced 2024-12-12 10:04:14 +02:00
Improve single test run performance.
Improve on 7794ab50
by including the build flag files directly into the Makefile as dependencies (even though they are not includes). This simplifies some of the rsync logic and allows make to do what it does best.
Also split build flag files into test, harness, and build to reduce rebuilds. Test flags are used to build test.c, harness flags are used to build the rest of the files in the test harness, and build flags are used for the files that are not directly involved in testing.
This commit is contained in:
parent
7794ab50dc
commit
1f8931f732
2
test/Vagrantfile
vendored
2
test/Vagrantfile
vendored
@ -60,7 +60,7 @@ Vagrant.configure(2) do |config|
|
||||
|
||||
#---------------------------------------------------------------------------------------------------------------------------
|
||||
echo 'Install Build Tools' && date
|
||||
apt-get install -y devscripts build-essential lintian git txt2man debhelper libssl-dev zlib1g-dev lcov cloc
|
||||
apt-get install -y devscripts build-essential lintian git txt2man debhelper libssl-dev zlib1g-dev libperl-dev lcov cloc
|
||||
|
||||
#---------------------------------------------------------------------------------------------------------------------------
|
||||
echo 'Install AWS CLI' && date
|
||||
|
@ -13,7 +13,8 @@
|
||||
# full - the module/test provides full coverage for the code module
|
||||
# partial - the module/test provides partial coverage for the code module
|
||||
# noCode - the code module should not contain any coverable code. If it does an error will be thrown.
|
||||
# * define - defines for C testing
|
||||
# * define - defines for C code (will also be applied to the test harness)
|
||||
# * define-test - defines for the test harness
|
||||
# * debugUnitSuppress - don't define DEBUG_UNIT for unit tests -- this is used to test unit test debugging macros
|
||||
# * perlReq - is Perl required for this C test?
|
||||
#
|
||||
@ -36,7 +37,7 @@ unit:
|
||||
# ----------------------------------------------------------------------------------------------------------------------------
|
||||
- name: error
|
||||
total: 8
|
||||
define: -DNO_ERROR -DNO_LOG -DNO_STACK_TRACE -DNO_MEM_CONTEXT
|
||||
define-test: -DNO_ERROR -DNO_LOG -DNO_STACK_TRACE -DNO_MEM_CONTEXT
|
||||
|
||||
coverage:
|
||||
common/error: full
|
||||
@ -45,7 +46,7 @@ unit:
|
||||
# ----------------------------------------------------------------------------------------------------------------------------
|
||||
- name: assert-on
|
||||
total: 2
|
||||
define: -DNO_LOG -DNO_STACK_TRACE -DNO_MEM_CONTEXT
|
||||
define-test: -DNO_LOG -DNO_STACK_TRACE -DNO_MEM_CONTEXT
|
||||
|
||||
coverage:
|
||||
common/assert: noCode
|
||||
@ -53,7 +54,8 @@ unit:
|
||||
# ----------------------------------------------------------------------------------------------------------------------------
|
||||
- name: assert-off
|
||||
total: 2
|
||||
define: -DNDEBUG -DNO_LOG -DNO_STACK_TRACE -DNO_MEM_CONTEXT
|
||||
define: -DNDEBUG
|
||||
define-test: -DNO_LOG -DNO_STACK_TRACE -DNO_MEM_CONTEXT
|
||||
debugUnitSuppress: true
|
||||
|
||||
coverage:
|
||||
@ -62,7 +64,7 @@ unit:
|
||||
# ----------------------------------------------------------------------------------------------------------------------------
|
||||
- name: stack-trace
|
||||
total: 4
|
||||
define: -DNO_LOG -DNO_STACK_TRACE -DNO_MEM_CONTEXT
|
||||
define-test: -DNO_LOG -DNO_STACK_TRACE -DNO_MEM_CONTEXT
|
||||
|
||||
coverage:
|
||||
common/stackTrace: full
|
||||
@ -70,7 +72,7 @@ unit:
|
||||
# ----------------------------------------------------------------------------------------------------------------------------
|
||||
- name: mem-context
|
||||
total: 7
|
||||
define: -DNO_MEM_CONTEXT -DNO_LOG
|
||||
define-test: -DNO_MEM_CONTEXT -DNO_LOG
|
||||
|
||||
coverage:
|
||||
common/memContext: full
|
||||
@ -78,7 +80,7 @@ unit:
|
||||
# ----------------------------------------------------------------------------------------------------------------------------
|
||||
- name: time
|
||||
total: 2
|
||||
define: -DNO_ERROR -DNO_LOG
|
||||
define-test: -DNO_ERROR -DNO_LOG
|
||||
|
||||
coverage:
|
||||
common/time: full
|
||||
@ -86,7 +88,7 @@ unit:
|
||||
# ----------------------------------------------------------------------------------------------------------------------------
|
||||
- name: fork
|
||||
total: 1
|
||||
define: -DNO_LOG
|
||||
define-test: -DNO_LOG
|
||||
|
||||
coverage:
|
||||
common/fork: full
|
||||
@ -94,7 +96,7 @@ unit:
|
||||
# ----------------------------------------------------------------------------------------------------------------------------
|
||||
- name: log
|
||||
total: 5
|
||||
define: -DNO_LOG
|
||||
define-test: -DNO_LOG
|
||||
|
||||
coverage:
|
||||
common/log: full
|
||||
@ -102,7 +104,8 @@ unit:
|
||||
# ----------------------------------------------------------------------------------------------------------------------------
|
||||
- name: debug-off
|
||||
total: 2
|
||||
define: -DNDEBUG -DNO_LOG
|
||||
define: -DNDEBUG
|
||||
define-test: -DNO_LOG
|
||||
debugUnitSuppress: true
|
||||
|
||||
coverage:
|
||||
|
@ -17,6 +17,35 @@ use Exporter qw(import);
|
||||
|
||||
use pgBackRest::Common::Log;
|
||||
|
||||
####################################################################################################################################
|
||||
# Save contents to a file if the file is missing or the contents are different. This saves write IO and prevents the timestamp from
|
||||
# changing.
|
||||
####################################################################################################################################
|
||||
sub buildPutDiffers
|
||||
{
|
||||
my $oStorage = shift;
|
||||
my $strFile = shift;
|
||||
my $strContents = shift;
|
||||
|
||||
# Attempt to load the file
|
||||
my $bSave = true;
|
||||
my $oFile = $oStorage->openRead($strFile, {bIgnoreMissing => true});
|
||||
|
||||
# If file was found see if the content is the same
|
||||
if (defined($oFile) && ${$oStorage->get($oFile)} eq $strContents)
|
||||
{
|
||||
$bSave = false;
|
||||
}
|
||||
|
||||
# Save if the contents are different or missing
|
||||
if ($bSave)
|
||||
{
|
||||
$oStorage->put($strFile, $strContents);
|
||||
}
|
||||
}
|
||||
|
||||
push @EXPORT, qw(buildPutDiffers);
|
||||
|
||||
####################################################################################################################################
|
||||
# Find last modification time in a list of directories, with optional filters
|
||||
####################################################################################################################################
|
||||
@ -69,7 +98,7 @@ sub buildDependencyTree
|
||||
# Only process non-auto files
|
||||
if ($strFile =~ /^[A-Za-z0-9\/]+\.(c|h)$/)
|
||||
{
|
||||
buildDependencyTreeSub($oStorage, $rhDependencyTree, $strFile);
|
||||
buildDependencyTreeSub($oStorage, $rhDependencyTree, $strFile, undef, ['src', 'libc']);
|
||||
}
|
||||
}
|
||||
|
||||
@ -83,17 +112,34 @@ sub buildDependencyTreeSub
|
||||
my $oStorage = shift;
|
||||
my $rhDependencyTree = shift;
|
||||
my $strFile = shift;
|
||||
my $strBasePath = shift;
|
||||
my $rstryPath = shift;
|
||||
|
||||
if (!defined($rhDependencyTree->{$strFile}))
|
||||
{
|
||||
$rhDependencyTree->{$strFile} = {};
|
||||
|
||||
# Load file contents
|
||||
my $rstrContent = $oStorage->get($oStorage->openRead("src/${strFile}", {bIgnoreMissing => true}));
|
||||
my $rstrContent;
|
||||
|
||||
foreach my $strPath (@{$rstryPath})
|
||||
{
|
||||
$rstrContent = $oStorage->get(
|
||||
$oStorage->openRead(
|
||||
(defined($strBasePath) ? "${strBasePath}/" : '') . ($strPath ne '' ? "${strPath}/" : '') . "${strFile}",
|
||||
{bIgnoreMissing => true}));
|
||||
|
||||
if (defined($rstrContent))
|
||||
{
|
||||
$rhDependencyTree->{$strFile}{path} = $strPath;
|
||||
last;
|
||||
}
|
||||
}
|
||||
|
||||
if (!defined($rstrContent))
|
||||
{
|
||||
$rstrContent = $oStorage->get("libc/${strFile}");
|
||||
confess &log(ERROR,
|
||||
"unable to find ${strFile} in " . $oStorage->pathGet($strBasePath) . " + [" . join(', ', @{$rstryPath}) . "]");
|
||||
}
|
||||
|
||||
# Process includes
|
||||
@ -104,7 +150,7 @@ sub buildDependencyTreeSub
|
||||
$strInclude = (split('"', $strInclude))[1];
|
||||
$rhInclude->{$strInclude} = true;
|
||||
|
||||
buildDependencyTreeSub($oStorage, $rhDependencyTree, $strInclude);
|
||||
buildDependencyTreeSub($oStorage, $rhDependencyTree, $strInclude, $strBasePath, $rstryPath);
|
||||
|
||||
foreach my $strIncludeSub (@{$rhDependencyTree->{$strInclude}{include}})
|
||||
{
|
||||
@ -114,23 +160,11 @@ sub buildDependencyTreeSub
|
||||
|
||||
my @stryInclude = sort(keys(%{$rhInclude}));
|
||||
$rhDependencyTree->{$strFile}{include} = \@stryInclude;
|
||||
|
||||
# Find header files that map to C files -- these are required to compile this file
|
||||
foreach my $strInclude (@stryInclude)
|
||||
{
|
||||
if ($strInclude =~ /^[A-Za-z0-9\/]+\.h$/)
|
||||
{
|
||||
my $strObject = substr($strInclude, 0, length($strInclude) - 1) . 'c';
|
||||
|
||||
if ($oStorage->exists("src/${strObject}"))
|
||||
{
|
||||
push(@{$rhDependencyTree->{$strFile}{object}}, $strObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
push @EXPORT, qw(buildDependencyTreeSub);
|
||||
|
||||
####################################################################################################################################
|
||||
# Build Makefile object compile rules
|
||||
####################################################################################################################################
|
||||
@ -223,7 +257,7 @@ sub buildMakefile
|
||||
push @EXPORT, qw(buildMakefile);
|
||||
|
||||
####################################################################################################################################
|
||||
# Update a Makefile with object compile rules
|
||||
# Load the C library and check pointer size
|
||||
####################################################################################################################################
|
||||
sub buildLoadLibC
|
||||
{
|
||||
|
@ -49,6 +49,8 @@ use constant TESTDEF_C => 'c';
|
||||
push @EXPORT, qw(TESTDEF_C);
|
||||
use constant TESTDEF_DEFINE => 'define';
|
||||
push @EXPORT, qw(TESTDEF_DEFINE);
|
||||
use constant TESTDEF_DEFINE_TEST => 'define-test';
|
||||
push @EXPORT, qw(TESTDEF_DEFINE_TEST);
|
||||
use constant TESTDEF_DEBUG_UNIT_SUPPRESS => 'debugUnitSuppress';
|
||||
push @EXPORT, qw(TESTDEF_DEBUG_UNIT_SUPPRESS);
|
||||
use constant TESTDEF_INDIVIDUAL => 'individual';
|
||||
@ -119,7 +121,8 @@ sub testDefLoad
|
||||
push(@stryModuleTest, $strTest);
|
||||
|
||||
# Resolve variables that can be set in the module or the test
|
||||
foreach my $strVar (TESTDEF_DEFINE, TESTDEF_DEBUG_UNIT_SUPPRESS, TESTDEF_DB, TESTDEF_PERL_REQ, TESTDEF_VM)
|
||||
foreach my $strVar (
|
||||
TESTDEF_DEFINE, TESTDEF_DEFINE_TEST, TESTDEF_DEBUG_UNIT_SUPPRESS, TESTDEF_DB, TESTDEF_PERL_REQ, TESTDEF_VM)
|
||||
{
|
||||
$hTestDefHash->{$strModule}{$strTest}{$strVar} = coalesce(
|
||||
$hModuleTest->{$strVar}, $hModule->{$strVar}, $strVar eq TESTDEF_VM ? undef : false);
|
||||
|
@ -24,6 +24,7 @@ use pgBackRest::Common::Log;
|
||||
use pgBackRest::Common::String;
|
||||
use pgBackRest::Version;
|
||||
|
||||
use pgBackRestTest::Common::BuildTest;
|
||||
use pgBackRestTest::Common::ContainerTest;
|
||||
use pgBackRestTest::Common::DefineTest;
|
||||
use pgBackRestTest::Common::ExecuteTest;
|
||||
@ -32,9 +33,8 @@ use pgBackRestTest::Common::RunTest;
|
||||
use pgBackRestTest::Common::VmTest;
|
||||
|
||||
####################################################################################################################################
|
||||
# Build flags from the last build. When the build flags change test files must be rebuilt
|
||||
# Has the C build directory been initialized yet?
|
||||
####################################################################################################################################
|
||||
my $rhBuildFlags = undef;
|
||||
my $rhBuildInit = undef;
|
||||
|
||||
####################################################################################################################################
|
||||
@ -202,44 +202,20 @@ sub run
|
||||
# If testing C code copy source files to the test directory
|
||||
if ($self->{oTest}->{&TEST_C})
|
||||
{
|
||||
# If no tests have been run on this VM init build flags
|
||||
# If this is the first build, then rsync files
|
||||
if (!$rhBuildInit->{$self->{oTest}->{&TEST_VM}}{$self->{iVmIdx}})
|
||||
{
|
||||
# Attempt to load build flags off from file
|
||||
my $oFile = $self->{oStorageTest}->openRead("$self->{strGCovPath}/buildflags", {bIgnoreMissing => true});
|
||||
|
||||
# If the file was not found then we don't know what the flags were set to, so rebuild
|
||||
if (!defined($oFile))
|
||||
{
|
||||
$rhBuildFlags->{$self->{oTest}->{&TEST_VM}}{$self->{iVmIdx}} = 'REBUILD-REQUIRED';
|
||||
}
|
||||
# Else load the build flags
|
||||
else
|
||||
{
|
||||
$rhBuildFlags->{$self->{oTest}->{&TEST_VM}}{$self->{iVmIdx}} = ${$self->{oStorageTest}->get($oFile)};
|
||||
}
|
||||
}
|
||||
|
||||
# If any of the build flags have changed then we'll need to rebuild from scratch
|
||||
my $bFlagsChanged =
|
||||
$rhBuildFlags->{$self->{oTest}->{&TEST_VM}}{$self->{iVmIdx}} ne $self->{oTest}->{&TEST_CDEF};
|
||||
|
||||
# If flags changed or this is the first build, then rsync files
|
||||
if ($bFlagsChanged || !$rhBuildInit->{$self->{oTest}->{&TEST_VM}}{$self->{iVmIdx}})
|
||||
{
|
||||
executeTest(
|
||||
'rsync -rt' . ($bFlagsChanged ? ' --delete' : '') .
|
||||
" --exclude=test.c $self->{strBackRestBase}/src/ $self->{strGCovPath} && " .
|
||||
'rsync -rt --delete --exclude=*.o --exclude=test.c --exclude=test.gcno --exclude=LibC.h --exclude=xs' .
|
||||
" --exclude=test --exclude=buildflags --exclude=testflags --exclude=harnessflags" .
|
||||
" $self->{strBackRestBase}/src/ $self->{strGCovPath} && " .
|
||||
"rsync -t $self->{strBackRestBase}/libc/LibC.h $self->{strGCovPath} && " .
|
||||
"rsync -rt $self->{strBackRestBase}/libc/xs/ $self->{strGCovPath}/xs && " .
|
||||
"rsync -rt --exclude=test.c $self->{strBackRestBase}/test/src/ $self->{strGCovPath}");
|
||||
"rsync -rt --delete $self->{strBackRestBase}/libc/xs/ $self->{strGCovPath}/xs && " .
|
||||
"rsync -rt --delete --exclude=*.o $self->{strBackRestBase}/test/src/ $self->{strGCovPath}/test");
|
||||
}
|
||||
|
||||
# Set build flags and save them to a file
|
||||
# Build directory has been initialized
|
||||
$rhBuildInit->{$self->{oTest}->{&TEST_VM}}{$self->{iVmIdx}} = true;
|
||||
$rhBuildFlags->{$self->{oTest}->{&TEST_VM}}{$self->{iVmIdx}} = $self->{oTest}->{&TEST_CDEF};
|
||||
$self->{oStorageTest}->put(
|
||||
"$self->{strGCovPath}/buildflags", $rhBuildFlags->{$self->{oTest}->{&TEST_VM}}{$self->{iVmIdx}});
|
||||
}
|
||||
|
||||
# If testing Perl code (or C code that calls Perl code) install bin and Perl C Library
|
||||
@ -270,9 +246,9 @@ sub run
|
||||
"cd $self->{strGCovPath} && " .
|
||||
"make -s 2>&1 &&" .
|
||||
($self->{oTest}->{&TEST_VM} ne VM_CO6 && $self->{bValgrindUnit}?
|
||||
" valgrind -q --gen-suppressions=all --suppressions=$self->{strBackRestBase}/test/src/valgrind.suppress" .
|
||||
" valgrind -q --gen-suppressions=all --suppressions=$self->{strGCovPath}/test/valgrind.suppress" .
|
||||
" --leak-check=full --leak-resolution=high --error-exitcode=25" : '') .
|
||||
" ./test 2>&1'";
|
||||
" ./test.bin 2>&1'";
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -318,15 +294,16 @@ sub run
|
||||
next if $strFile =~ /test\.c$/;
|
||||
|
||||
if (!defined($hTestCoverage->{substr($strFile, 0, length($strFile) - 2)}) &&
|
||||
$strFile !~ /^module\/[^\/]*\/.*Test\.c$/)
|
||||
$strFile !~ /^test\/module\/[^\/]*\/.*Test\.c$/)
|
||||
{
|
||||
push(@stryCFile, "${strFile}");
|
||||
}
|
||||
}
|
||||
|
||||
# Generate list of C files to include for testing
|
||||
my $strTestDepend = '';
|
||||
my $strTestFile =
|
||||
"module/$self->{oTest}->{&TEST_MODULE}/" . testRunName($self->{oTest}->{&TEST_NAME}, false) . 'Test.c';
|
||||
"test/module/$self->{oTest}->{&TEST_MODULE}/" . testRunName($self->{oTest}->{&TEST_NAME}, false) . 'Test.c';
|
||||
my $strCInclude;
|
||||
|
||||
foreach my $strFile (sort(keys(%{$hTestCoverage})))
|
||||
@ -353,12 +330,26 @@ sub run
|
||||
}
|
||||
|
||||
$strCInclude .= (defined($strCInclude) ? "\n" : '') . "#include \"${strCIncludeFile}\"";
|
||||
$strTestDepend .= " ${strCIncludeFile}";
|
||||
}
|
||||
|
||||
# Update C test file with test module
|
||||
my $strTestC = ${$self->{oStorageTest}->get("$self->{strBackRestBase}/test/src/test.c")};
|
||||
my $strTestC = ${$self->{oStorageTest}->get("$self->{strGCovPath}/test/test.c")};
|
||||
$strTestC =~ s/\{\[C\_INCLUDE\]\}/$strCInclude/g;
|
||||
$strTestC =~ s/\{\[C\_TEST\_INCLUDE\]\}/\#include \"$strTestFile\"/g;
|
||||
$strTestDepend .= " ${strTestFile}";
|
||||
|
||||
# Build dependencies for the test file
|
||||
my $rhDependencyTree = {};
|
||||
buildDependencyTreeSub(
|
||||
$self->{oStorageTest}, $rhDependencyTree, $strTestFile, $self->{strGCovPath}, ['', 'test']);
|
||||
|
||||
foreach my $strDepend (@{$rhDependencyTree->{$strTestFile}{include}})
|
||||
{
|
||||
$strTestDepend .=
|
||||
' ' . ($rhDependencyTree->{$strDepend}{path} ne '' ? $rhDependencyTree->{$strDepend}{path} . '/' : '') .
|
||||
$strDepend;
|
||||
}
|
||||
|
||||
# Set globals
|
||||
$strTestC =~ s/\{\[C\_TEST\_PATH\]\}/$strVmTestPath/g;
|
||||
@ -387,62 +378,93 @@ sub run
|
||||
}
|
||||
|
||||
$strTestC =~ s/\{\[C\_TEST\_LIST\]\}/$strTestInit/g;
|
||||
buildPutDiffers($self->{oStorageTest}, "$self->{strGCovPath}/test.c", $strTestC);
|
||||
|
||||
# Save C test file but don't overwrite the file if it exists and has the same content. This prevents unneeded
|
||||
# recompiles of the test code.
|
||||
my $bSave = true;
|
||||
my $oFile = $self->{oStorageTest}->openRead("$self->{strGCovPath}/test.c", {bIgnoreMissing => true});
|
||||
# Flags that are common to all builds
|
||||
my $strCommonFlags =
|
||||
'-I. -Itest -std=c99 -fPIC -g -Wno-clobbered `perl -MExtUtils::Embed -e ccopts`'
|
||||
. ($self->{bProfile} ? " -pg" : '') .
|
||||
($self->{oTest}->{&TEST_DEBUG_UNIT_SUPPRESS} ? '' : " -DDEBUG_UNIT") .
|
||||
(vmWithBackTrace($self->{oTest}->{&TEST_VM}) && $self->{bBackTrace} ? ' -DWITH_BACKTRACE' : '') .
|
||||
($self->{oTest}->{&TEST_CDEF} ? " $self->{oTest}->{&TEST_CDEF}" : '') .
|
||||
($self->{bDebug} ? '' : " -DNDEBUG");
|
||||
|
||||
if (defined($oFile) && ${$self->{oStorageTest}->get($oFile)} eq $strTestC)
|
||||
{
|
||||
$bSave = false;
|
||||
}
|
||||
# Flags used to buid harness files
|
||||
my $strHarnessFlags =
|
||||
'-O0' . ($self->{oTest}->{&TEST_VM} ne VM_U12 ? ' -ftree-coalesce-vars' : '') .
|
||||
($self->{oTest}->{&TEST_CTESTDEF} ? " $self->{oTest}->{&TEST_CTESTDEF}" : '');
|
||||
|
||||
if ($bSave)
|
||||
{
|
||||
$self->{oStorageTest}->put("$self->{strGCovPath}/test.c", $strTestC);
|
||||
}
|
||||
buildPutDiffers($self->{oStorageTest}, "$self->{strGCovPath}/harnessflags", "${strCommonFlags} ${strHarnessFlags}");
|
||||
|
||||
# Flags used to buid test.c
|
||||
my $strTestFlags =
|
||||
'-Werror -Wfatal-errors -Wall -Wextra -Wwrite-strings -Wswitch-enum -Wconversion -Wformat=2' .
|
||||
' -Wformat-nonliteral -Wstrict-prototypes -Wpointer-arith -Wvla' .
|
||||
($self->{oTest}->{&TEST_VM} eq VM_U16 || $self->{oTest}->{&TEST_VM} eq VM_U18 ?
|
||||
' -Wformat-signedness' : '') .
|
||||
($self->{oTest}->{&TEST_VM} eq VM_U18 ?
|
||||
' -Wduplicated-branches -Wduplicated-cond' : '') .
|
||||
# This warning appears to be broken on U12/CO6 even though the functionality is fine
|
||||
($self->{oTest}->{&TEST_VM} eq VM_U12 || $self->{oTest}->{&TEST_VM} eq VM_CO6 ?
|
||||
' -Wno-missing-field-initializers' : '') .
|
||||
' -O0' . ($self->{oTest}->{&TEST_VM} ne VM_U12 ? ' -ftree-coalesce-vars' : '') .
|
||||
(vmCoverageC($self->{oTest}->{&TEST_VM}) && $self->{bCoverageUnit} ?
|
||||
' -fprofile-arcs -ftest-coverage' : '') .
|
||||
($self->{oTest}->{&TEST_CTESTDEF} ? " $self->{oTest}->{&TEST_CTESTDEF}" : '');
|
||||
|
||||
buildPutDiffers(
|
||||
$self->{oStorageTest}, "$self->{strGCovPath}/testflags", "${strCommonFlags} ${strTestFlags}");
|
||||
|
||||
# Flags used to buid all other files
|
||||
my $strBuildFlags =
|
||||
($self->{bOptimize} ? '-O2' : '-O0' . ($self->{oTest}->{&TEST_VM} ne VM_U12 ? ' -ftree-coalesce-vars' : ''));
|
||||
|
||||
buildPutDiffers($self->{oStorageTest}, "$self->{strGCovPath}/buildflags", "${strCommonFlags} ${strBuildFlags}");
|
||||
|
||||
# Build the Makefile
|
||||
my $strMakefile =
|
||||
"CC=gcc\n" .
|
||||
"CFLAGS=-I. -std=c99 -fPIC -g" . ($self->{bProfile} ? " -pg" : '') . "\\\n" .
|
||||
" -Werror -Wfatal-errors -Wall -Wextra -Wwrite-strings -Wno-clobbered -Wswitch-enum -Wconversion \\\n" .
|
||||
($self->{oTest}->{&TEST_VM} eq VM_U16 || $self->{oTest}->{&TEST_VM} eq VM_U18 ?
|
||||
" -Wformat-signedness \\\n" : '') .
|
||||
($self->{oTest}->{&TEST_VM} eq VM_U18 ?
|
||||
" -Wduplicated-branches -Wduplicated-cond \\\n" : '') .
|
||||
# This warning appears to be broken on U12 even though the functionality is fine
|
||||
($self->{oTest}->{&TEST_VM} eq VM_U12 || $self->{oTest}->{&TEST_VM} eq VM_CO6 ?
|
||||
" -Wno-missing-field-initializers \\\n" : '') .
|
||||
# ($self->{oTest}->{&TEST_VM} ne VM_CO6 && $self->{oTest}->{&TEST_VM} ne VM_U12 &&
|
||||
# $self->{oTest}->{&TEST_MODULE} ne 'perl' && $self->{oTest}->{&TEST_NAME} ne 'exec' ?
|
||||
# " -Wpedantic \\\n" : '') .
|
||||
" -Wformat=2 -Wformat-nonliteral -Wstrict-prototypes -Wpointer-arith -Wvla \\\n" .
|
||||
" `perl -MExtUtils::Embed -e ccopts`\n" .
|
||||
"LDFLAGS=-lcrypto -lz" . (vmCoverageC($self->{oTest}->{&TEST_VM}) && $self->{bCoverageUnit} ? " -lgcov" : '') .
|
||||
"COMMONFLAGS=${strCommonFlags}\n" .
|
||||
"BUILDFLAGS=${strBuildFlags}\n" .
|
||||
"HARNESSFLAGS=${strHarnessFlags}\n" .
|
||||
"TESTFLAGS=${strTestFlags}\n" .
|
||||
"LDFLAGS=-lcrypto -lssl -lz" .
|
||||
(vmCoverageC($self->{oTest}->{&TEST_VM}) && $self->{bCoverageUnit} ? " -lgcov" : '') .
|
||||
(vmWithBackTrace($self->{oTest}->{&TEST_VM}) && $self->{bBackTrace} ? ' -lbacktrace' : '') .
|
||||
" `perl -MExtUtils::Embed -e ldopts`\n" .
|
||||
'TESTFLAGS=' . ($self->{oTest}->{&TEST_DEBUG_UNIT_SUPPRESS} ? '' : "-DDEBUG_UNIT") .
|
||||
(vmWithBackTrace($self->{oTest}->{&TEST_VM}) && $self->{bBackTrace} ? ' -DWITH_BACKTRACE' : '') .
|
||||
($self->{oTest}->{&TEST_CDEF} ? " $self->{oTest}->{&TEST_CDEF}" : '') .
|
||||
($self->{bDebug} ? '' : " -DNDEBUG") .
|
||||
"\n" .
|
||||
"\nSRCS=" . join(' ', @stryCFile) . "\n" .
|
||||
"SRCS=" . join(' ', @stryCFile) . "\n" .
|
||||
"OBJS=\$(SRCS:.c=.o)\n" .
|
||||
"\n" .
|
||||
"test: \$(OBJS) test.o\n" .
|
||||
"\t\$(CC) -o test \$(OBJS) test.o" . ($self->{bProfile} ? " -pg" : '') . " \$(LDFLAGS)\n" .
|
||||
"\t\$(CC) -o test.bin \$(OBJS) test.o" . ($self->{bProfile} ? " -pg" : '') . " \$(LDFLAGS)\n" .
|
||||
"\n" .
|
||||
"test.o: test.c\n" .
|
||||
"\t\$(CC) \$(CFLAGS) \$(TESTFLAGS) -O0" .
|
||||
($self->{oTest}->{&TEST_VM} ne VM_U12 ? ' -ftree-coalesce-vars' : '') .
|
||||
(vmCoverageC($self->{oTest}->{&TEST_VM}) && $self->{bCoverageUnit} ?
|
||||
' -fprofile-arcs -ftest-coverage' : '') .
|
||||
" -c test.c\n" .
|
||||
"\n" .
|
||||
".c.o:\n" .
|
||||
"\t\$(CC) \$(CFLAGS) \$(TESTFLAGS) " . ($self->{bOptimize} ? '-O2' : '-O0') . " -c \$< -o \$@\n";
|
||||
"test.o: testflags test.c${strTestDepend}\n" .
|
||||
"\t\$(CC) \$(COMMONFLAGS) \$(TESTFLAGS) -c test.c\n";
|
||||
|
||||
# Build C file dependencies
|
||||
foreach my $strCFile (@stryCFile)
|
||||
{
|
||||
buildDependencyTreeSub(
|
||||
$self->{oStorageTest}, $rhDependencyTree, $strCFile, $self->{strGCovPath}, ['', 'test']);
|
||||
|
||||
$strMakefile .=
|
||||
"\n" . substr($strCFile, 0, length($strCFile) - 2) . ".o:" .
|
||||
($strCFile =~ /^test\// ? " harnessflags" : " buildflags") . " $strCFile";
|
||||
|
||||
foreach my $strDepend (@{$rhDependencyTree->{$strCFile}{include}})
|
||||
{
|
||||
$strMakefile .=
|
||||
' ' . ($rhDependencyTree->{$strDepend}{path} ne '' ? $rhDependencyTree->{$strDepend}{path} . '/' : '') .
|
||||
$strDepend;
|
||||
}
|
||||
|
||||
$strMakefile .=
|
||||
"\n" .
|
||||
"\t\$(CC) \$(COMMONFLAGS)" .
|
||||
($strCFile =~ /^test\// ? " \$(HARNESSFLAGS)" : " \$(BUILDFLAGS)") .
|
||||
" -c $strCFile -o " . substr($strCFile, 0, length($strCFile) - 2) . ".o\n";
|
||||
}
|
||||
|
||||
$self->{oStorageTest}->put($self->{strGCovPath} . "/Makefile", $strMakefile);
|
||||
}
|
||||
@ -531,7 +553,7 @@ sub end
|
||||
"module/$self->{oTest}->{&TEST_MODULE}/" . testRunName($self->{oTest}->{&TEST_NAME}, false) . 'Test');
|
||||
|
||||
# Generate coverage reports for the modules
|
||||
my $strLCovExe = "lcov --config-file=$self->{strBackRestBase}/test/src/lcov.conf";
|
||||
my $strLCovExe = "lcov --config-file=$self->{strGCovPath}/test/lcov.conf";
|
||||
my $strLCovOut = $self->{strGCovPath} . '/test.lcov';
|
||||
my $strLCovOutTmp = $self->{strGCovPath} . '/test.tmp.lcov';
|
||||
|
||||
|
@ -28,6 +28,8 @@ use constant TEST_C => 'c';
|
||||
push @EXPORT, qw(TEST_C);
|
||||
use constant TEST_CDEF => 'cdef';
|
||||
push @EXPORT, qw(TEST_CDEF);
|
||||
use constant TEST_CTESTDEF => 'ctestdef';
|
||||
push @EXPORT, qw(TEST_CTESTDEF);
|
||||
use constant TEST_CONTAINER => 'container';
|
||||
push @EXPORT, qw(TEST_CONTAINER);
|
||||
use constant TEST_DEBUG_UNIT_SUPPRESS => TESTDEF_DEBUG_UNIT_SUPPRESS;
|
||||
@ -151,6 +153,7 @@ sub testListGet
|
||||
&TEST_VM => $strTestOS,
|
||||
&TEST_C => coalesce($hTest->{&TESTDEF_C}, $hModule->{&TESTDEF_C}, false),
|
||||
&TEST_CDEF => $hTest->{&TESTDEF_DEFINE},
|
||||
&TEST_CTESTDEF => $hTest->{&TESTDEF_DEFINE_TEST},
|
||||
&TEST_DEBUG_UNIT_SUPPRESS => $hTest->{&TEST_DEBUG_UNIT_SUPPRESS},
|
||||
&TEST_CONTAINER => defined($hTest->{&TESTDEF_CONTAINER}) ?
|
||||
$hTest->{&TESTDEF_CONTAINER} : $hModule->{&TESTDEF_CONTAINER},
|
||||
|
@ -115,11 +115,11 @@ testRun(void)
|
||||
testFunction1(99, false, 1.17, 0755);
|
||||
|
||||
harnessLogResult(
|
||||
"P00 DEBUG: module/common/debugOnTest::testFunction1: (paramInt: 99, paramBool: false, paramDouble: 1.17"
|
||||
"P00 DEBUG: test/module/common/debugOnTest::testFunction1: (paramInt: 99, paramBool: false, paramDouble: 1.17"
|
||||
", paramMode: 0755)\n"
|
||||
"P00 TRACE: module/common/debugOnTest::testFunction2: (void)\n"
|
||||
"P00 TRACE: module/common/debugOnTest::testFunction2: => void\n"
|
||||
"P00 DEBUG: module/common/debugOnTest::testFunction1: => 1");
|
||||
"P00 TRACE: test/module/common/debugOnTest::testFunction2: (void)\n"
|
||||
"P00 TRACE: test/module/common/debugOnTest::testFunction2: => void\n"
|
||||
"P00 DEBUG: test/module/common/debugOnTest::testFunction1: => 1");
|
||||
harnessLogLevelReset();
|
||||
|
||||
// -------------------------------------------------------------------------------------------------------------------------
|
||||
|
@ -183,11 +183,12 @@ testRun(void)
|
||||
CATCH(AssertError)
|
||||
{
|
||||
assert(errorCode() == AssertError.code);
|
||||
assert(strcmp(errorFileName(), "module/common/errorTest.c") == 0);
|
||||
assert(strcmp(errorFileName(), "test/module/common/errorTest.c") == 0);
|
||||
assert(strcmp(errorFunctionName(), "testTryRecurse") == 0);
|
||||
assert(errorFileLine() == 29);
|
||||
assert(
|
||||
strcmp(errorStackTrace(), "module/common/errorTest:testTryRecurse:29:(test build required for parameters)") == 0);
|
||||
strcmp(errorStackTrace(),
|
||||
"test/module/common/errorTest:testTryRecurse:29:(test build required for parameters)") == 0);
|
||||
assert(strcmp(errorMessage(), "too many nested try blocks") == 0);
|
||||
assert(strcmp(errorName(), AssertError.name) == 0);
|
||||
assert(errorType() == &AssertError);
|
||||
|
@ -85,7 +85,7 @@ testRun(void)
|
||||
harnessLogResultRegExp(
|
||||
"P00 ERROR\\: \\[122\\]\\: test debug error message\n"
|
||||
" STACK TRACE\\:\n"
|
||||
" module\\/common\\/exitTest\\:testRun\\:.*\n"
|
||||
" test\\/module\\/common\\/exitTest\\:testRun\\:.*\n"
|
||||
" test\\:main\\:.*\n");
|
||||
}
|
||||
TRY_END();
|
||||
@ -103,7 +103,7 @@ testRun(void)
|
||||
harnessLogResultRegExp(
|
||||
"P00 ASSERT\\: \\[025\\]\\: test assert message\n"
|
||||
" STACK TRACE\\:\n"
|
||||
" module/common/exitTest\\:testRun\\:.*\n"
|
||||
" test/module/common/exitTest\\:testRun\\:.*\n"
|
||||
" test\\:main\\:.*\n");
|
||||
}
|
||||
TRY_END();
|
||||
|
Loading…
Reference in New Issue
Block a user