You've already forked pgbackrest
							
							
				mirror of
				https://github.com/pgbackrest/pgbackrest.git
				synced 2025-10-30 23:37:45 +02:00 
			
		
		
		
	Allow most unit tests to run outside of a container.
Three major changes were required to get this working: 1) Provide the path to pgbackrest in the build directory when running outside a container. Tests in a container will continue to install and run against /usr/bin/pgbackrest. 1) Set a per-test lock path so tests don't conflict on the default /tmp/pgbackrest path. Also set a per-test log-path while we are at it. 2) Use localhost instead of a custom host for TLS test connections. Tests in containers will continue to update /etc/hosts and use the custom host. Add infrastructure and update harnessCfgLoad*() to get the correct exe and paths loaded for testing. Since new tests are required to verify that running outside a container works, also rework the tests in Travis CI to provide coverage within a reasonable amount of time. Mainly, break up to doc tests by VM and run an abbreviated unit test suite on co6 and co7.
This commit is contained in:
		| @@ -55,7 +55,6 @@ sub new | ||||
|         $self->{oStorageTest}, | ||||
|         $self->{strBackRestBase}, | ||||
|         $self->{strTestPath}, | ||||
|         $self->{strCoveragePath}, | ||||
|         $self->{oTest}, | ||||
|         $self->{bDryRun}, | ||||
|         $self->{bVmOut}, | ||||
| @@ -86,7 +85,6 @@ sub new | ||||
|             {name => 'oStorageTest'}, | ||||
|             {name => 'strBackRestBase'}, | ||||
|             {name => 'strTestPath'}, | ||||
|             {name => 'strCoveragePath'}, | ||||
|             {name => 'oTest'}, | ||||
|             {name => 'bDryRun'}, | ||||
|             {name => 'bVmOut'}, | ||||
| @@ -117,7 +115,7 @@ sub new | ||||
|  | ||||
|     # Setup the path where gcc coverage will be performed | ||||
|     $self->{strGCovPath} = "$self->{strTestPath}/gcov-$self->{oTest}->{&TEST_VM}-$self->{iVmIdx}"; | ||||
|     $self->{strExpectPath} = "$self->{strTestPath}/expect-$self->{iVmIdx}"; | ||||
|     $self->{strDataPath} = "$self->{strTestPath}/data-$self->{iVmIdx}"; | ||||
|  | ||||
|     # Return from function and log return values if any | ||||
|     return logDebugReturn | ||||
| @@ -189,24 +187,26 @@ sub run | ||||
|                 $bGCovExists = false; | ||||
|             } | ||||
|  | ||||
|             # Create expect directory | ||||
|             if ($self->{oTest}->{&TEST_C} && !$self->{oStorageTest}->pathExists($self->{strExpectPath})) | ||||
|             # Create data directory | ||||
|             if ($self->{oTest}->{&TEST_C} && !$self->{oStorageTest}->pathExists($self->{strDataPath})) | ||||
|             { | ||||
|                 $self->{oStorageTest}->pathCreate($self->{strExpectPath}, {strMode => '0770'}); | ||||
|                 $self->{oStorageTest}->pathCreate($self->{strDataPath}, {strMode => '0770'}); | ||||
|             } | ||||
|  | ||||
|             if ($self->{oTest}->{&TEST_CONTAINER}) | ||||
|             { | ||||
|                 executeTest( | ||||
|                     'docker run -itd -h ' . $self->{oTest}->{&TEST_VM} . "-test --name=${strImage}" . | ||||
|                     " -v $self->{strCoveragePath}:$self->{strCoveragePath} " . | ||||
|                     " -v ${strHostTestPath}:${strVmTestPath}" . | ||||
|                     ($self->{oTest}->{&TEST_C} ? " -v $self->{strGCovPath}:$self->{strGCovPath}" : '') . | ||||
|                     ($self->{oTest}->{&TEST_C} ? " -v $self->{strExpectPath}:$self->{strExpectPath}" : '') . | ||||
|                     " -v $self->{strBackRestBase}:$self->{strBackRestBase} " . | ||||
|                     containerRepo() . ':' . $self->{oTest}->{&TEST_VM} . | ||||
|                     "-test", | ||||
|                     {bSuppressStdErr => true}); | ||||
|                 if ($self->{oTest}->{&TEST_VM} ne VM_NONE) | ||||
|                 { | ||||
|                     executeTest( | ||||
|                         'docker run -itd -h ' . $self->{oTest}->{&TEST_VM} . "-test --name=${strImage}" . | ||||
|                         " -v ${strHostTestPath}:${strVmTestPath}" . | ||||
|                         ($self->{oTest}->{&TEST_C} ? " -v $self->{strGCovPath}:$self->{strGCovPath}" : '') . | ||||
|                         ($self->{oTest}->{&TEST_C} ? " -v $self->{strDataPath}:$self->{strDataPath}" : '') . | ||||
|                         " -v $self->{strBackRestBase}:$self->{strBackRestBase} " . | ||||
|                         containerRepo() . ':' . $self->{oTest}->{&TEST_VM} . | ||||
|                         "-test", | ||||
|                         {bSuppressStdErr => true}); | ||||
|                 } | ||||
|  | ||||
|                 # If testing C code copy source files to the test directory | ||||
|                 if ($self->{oTest}->{&TEST_C}) | ||||
| @@ -230,7 +230,7 @@ sub run | ||||
|                 } | ||||
|  | ||||
|                 # If testing Perl code (or C code that calls Perl code) install bin and Perl C Library | ||||
|                 if (!$self->{oTest}->{&TEST_C} || $self->{oTest}->{&TEST_PERL_REQ}) | ||||
|                 if ($self->{oTest}->{&TEST_VM} ne VM_NONE && (!$self->{oTest}->{&TEST_C} || $self->{oTest}->{&TEST_PERL_REQ})) | ||||
|                 { | ||||
|                     jobInstallC( | ||||
|                         $self->{strBackRestBase}, $self->{oTest}->{&TEST_VM}, $strImage, | ||||
| @@ -253,7 +253,8 @@ sub run | ||||
|         if ($self->{oTest}->{&TEST_C}) | ||||
|         { | ||||
|             $strCommand = | ||||
|                 'docker exec -i -u ' . TEST_USER . " ${strImage} bash -l -c '" . | ||||
|                 ($self->{oTest}->{&TEST_VM} ne VM_NONE  ? 'docker exec -i -u ' . TEST_USER . " ${strImage} " : '') . | ||||
|                 "bash -l -c '" . | ||||
|                 "cd $self->{strGCovPath} && " . | ||||
|                 "make -j $self->{iBuildMax} -s 2>&1 &&" . | ||||
|                 ($self->{oTest}->{&TEST_VM} ne VM_CO6 && $self->{bValgrindUnit} && | ||||
| @@ -372,9 +373,18 @@ sub run | ||||
|                         $strDepend; | ||||
|                 } | ||||
|  | ||||
|                 # Determine where the project exe is located | ||||
|                 my $strProjectExePath = $self->{oTest}->{&TEST_VM} eq VM_NONE ? | ||||
|                     "$self->{strBackRestBase}/test/.vagrant/bin/$self->{oTest}->{&TEST_VM}/src/" . PROJECT_EXE : PROJECT_EXE; | ||||
|  | ||||
|                 # Is this test running in a container? | ||||
|                 my $strContainer = $self->{oTest}->{&TEST_VM} eq VM_NONE ? 'false' : 'true'; | ||||
|  | ||||
|                 # Set globals | ||||
|                 $strTestC =~ s/\{\[C\_TEST\_CONTAINER\]\}/$strContainer/g; | ||||
|                 $strTestC =~ s/\{\[C\_TEST\_PROJECT\_EXE\]\}/$strProjectExePath/g; | ||||
|                 $strTestC =~ s/\{\[C\_TEST\_PATH\]\}/$strVmTestPath/g; | ||||
|                 $strTestC =~ s/\{\[C\_TEST\_EXPECT_PATH\]\}/$self->{strExpectPath}/g; | ||||
|                 $strTestC =~ s/\{\[C\_TEST\_DATA_PATH\]\}/$self->{strDataPath}/g; | ||||
|                 $strTestC =~ s/\{\[C\_TEST\_REPO_PATH\]\}/$self->{strBackRestBase}/g; | ||||
|                 $strTestC =~ s/\{\[C\_TEST\_SCALE\]\}/$self->{iScale}/g; | ||||
|  | ||||
| @@ -571,7 +581,7 @@ sub end | ||||
|         if ($iExitStatus == 0 && $self->{oTest}->{&TEST_C} && $self->{bProfile}) | ||||
|         { | ||||
|             executeTest( | ||||
|                 'docker exec -i -u ' . TEST_USER . " ${strImage} " . | ||||
|                 ($self->{oTest}->{&TEST_VM} ne VM_NONE  ? 'docker exec -i -u ' . TEST_USER . " ${strImage} " : '') . | ||||
|                     "gprof $self->{strGCovPath}/test.bin $self->{strGCovPath}/gmon.out > $self->{strGCovPath}/gprof.txt"); | ||||
|  | ||||
|             $self->{oStorageTest}->pathCreate("$self->{strBackRestBase}/test/profile", {strMode => '0750', bIgnoreExists => true}); | ||||
| @@ -606,7 +616,7 @@ sub end | ||||
|             my $strLCovOutTmp = $self->{strGCovPath} . '/test.tmp.lcov'; | ||||
|  | ||||
|             executeTest( | ||||
|                 'docker exec -i -u ' . TEST_USER . " ${strImage} " . | ||||
|                 ($self->{oTest}->{&TEST_VM} ne VM_NONE  ? 'docker exec -i -u ' . TEST_USER . " ${strImage} " : '') . | ||||
|                 "${strLCovExeBase} --capture --directory=$self->{strGCovPath} --o=${strLCovOut}"); | ||||
|  | ||||
|             # Generate coverage report for each module | ||||
| @@ -731,8 +741,12 @@ sub end | ||||
|         { | ||||
|             my $strHostTestPath = "$self->{strTestPath}/${strImage}"; | ||||
|  | ||||
|             containerRemove("test-$self->{iVmIdx}"); | ||||
|             executeTest("sudo rm -rf ${strHostTestPath}"); | ||||
|             if ($self->{oTest}->{&TEST_VM} ne VM_NONE) | ||||
|             { | ||||
|                 containerRemove("test-$self->{iVmIdx}"); | ||||
|             } | ||||
|  | ||||
|             executeTest(($self->{oTest}->{&TEST_VM} ne VM_NONE ? "sudo " : '') . "rm -rf ${strHostTestPath}"); | ||||
|         } | ||||
|  | ||||
|         $bDone = true; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user