You've already forked pgbackrest
							
							
				mirror of
				https://github.com/pgbackrest/pgbackrest.git
				synced 2025-10-30 23:37:45 +02:00 
			
		
		
		
	Allow suppression of times in testing for reproducibility.
Timestamps, timings, etc. cause a lot of log churn when included in documentation.
This commit is contained in:
		| @@ -66,6 +66,7 @@ sub new | ||||
|         $self->{strLogLevel}, | ||||
|         $self->{strLogLevelTest}, | ||||
|         $self->{strLogLevelTestFile}, | ||||
|         $self->{bLogTimestamp}, | ||||
|         $self->{bLogForce}, | ||||
|         $self->{bShowOutputAsync}, | ||||
|         $self->{bNoCleanup}, | ||||
| @@ -99,6 +100,7 @@ sub new | ||||
|             {name => 'strLogLevel'}, | ||||
|             {name => 'strLogLevelTest'}, | ||||
|             {name => 'strLogLevelTestFile'}, | ||||
|             {name => 'bLogTimestamp'}, | ||||
|             {name => 'bLogForce'}, | ||||
|             {name => 'bShowOutputAsync'}, | ||||
|             {name => 'bNoCleanup'}, | ||||
| @@ -278,6 +280,7 @@ sub run | ||||
|                 (defined($self->{oTest}->{&TEST_DB}) ? ' --pg-version=' . $self->{oTest}->{&TEST_DB} : '') . | ||||
|                 ($self->{strLogLevel} ne lc(INFO) ? " --log-level=$self->{strLogLevel}" : '') . | ||||
|                 ($self->{strLogLevelTestFile} ne lc(TRACE) ? " --log-level-test-file=$self->{strLogLevelTestFile}" : '') . | ||||
|                 ($self->{bLogTimestamp} ? '' : ' --no-log-timestamp') . | ||||
|                 ' --pgsql-bin=' . $self->{oTest}->{&TEST_PGSQL_BIN} . | ||||
|                 ($self->{strTimeZone} ? " --tz='$self->{strTimeZone}'" : '') . | ||||
|                 ($self->{bLogForce} ? ' --log-force' : '') . | ||||
| @@ -395,6 +398,9 @@ sub run | ||||
|                 $strTestC =~ s/\{\[C\_TEST\_REPO_PATH\]\}/$self->{strBackRestBase}/g; | ||||
|                 $strTestC =~ s/\{\[C\_TEST\_SCALE\]\}/$self->{iScale}/g; | ||||
|  | ||||
|                 my $strLogTimestampC = $self->{bLogTimestamp} ? 'true' : 'false'; | ||||
|                 $strTestC =~ s/\{\[C\_TEST\_TIMING\]\}/$strLogTimestampC/g; | ||||
|  | ||||
|                 # Set timezone | ||||
|                 if (defined($self->{strTimeZone})) | ||||
|                 { | ||||
| @@ -624,7 +630,7 @@ sub end | ||||
|         # Output error | ||||
|         if ($iExitStatus != 0) | ||||
|         { | ||||
|             &log(ERROR, "${strTestDone} (err${iExitStatus}-${fTestElapsedTime}s)" . | ||||
|             &log(ERROR, "${strTestDone} (err${iExitStatus}" . ($self->{bLogTimestamp} ? "-${fTestElapsedTime}s)" : '') . | ||||
|                  (defined($oExecDone->{strOutLog}) && !$self->{bShowOutputAsync} ? | ||||
|                     ":\n\n" . trim($oExecDone->{strOutLog}) . "\n" : ''), undef, undef, 4); | ||||
|             $bFail = true; | ||||
| @@ -632,7 +638,7 @@ sub end | ||||
|         # Output success | ||||
|         else | ||||
|         { | ||||
|             &log(INFO, "${strTestDone} (${fTestElapsedTime}s)". | ||||
|             &log(INFO, "${strTestDone}" . ($self->{bLogTimestamp} ? "(${fTestElapsedTime}s)" : ''). | ||||
|                  ($self->{bVmOut} && !$self->{bShowOutputAsync} ? | ||||
|                      ":\n\n" . trim($oExecDone->{strOutLog}) . "\n" : ''), undef, undef, 4); | ||||
|         } | ||||
|   | ||||
| @@ -33,6 +33,7 @@ static const char *testExeData = NULL; | ||||
| static const char *testProjectExeData = NULL; | ||||
| static bool testContainerData = false; | ||||
| static unsigned int testIdxData = 0; | ||||
| static bool testTiming = true; | ||||
| static uint64_t testScaleData = 1; | ||||
| static const char *testPathData = NULL; | ||||
| static const char *testDataPathData = NULL; | ||||
| @@ -56,7 +57,7 @@ Initialize harness | ||||
| ***********************************************************************************************************************************/ | ||||
| void | ||||
| hrnInit( | ||||
|     const char *testExe, const char *testProjectExe, bool testContainer, unsigned int testIdx, uint64_t testScale, | ||||
|     const char *testExe, const char *testProjectExe, bool testContainer, unsigned int testIdx, bool timing, uint64_t testScale, | ||||
|     const char *testPath, const char *testDataPath, const char *testRepoPath) | ||||
| { | ||||
|     FUNCTION_HARNESS_VOID(); | ||||
| @@ -66,6 +67,7 @@ hrnInit( | ||||
|     testProjectExeData = testProjectExe; | ||||
|     testContainerData = testContainer; | ||||
|     testIdxData = testIdx; | ||||
|     testTiming = timing; | ||||
|     testScaleData = testScale; | ||||
|     testPathData = testPath; | ||||
|     testDataPathData = testDataPath; | ||||
| @@ -383,6 +385,32 @@ hrnDiff(const char *expected, const char *actual) | ||||
|     FUNCTION_HARNESS_RESULT(STRINGZ, harnessDiffBuffer); | ||||
| } | ||||
|  | ||||
| /**********************************************************************************************************************************/ | ||||
| void | ||||
| hrnTestLogPrefix(int lineNo, bool padding) | ||||
| { | ||||
|     FUNCTION_HARNESS_BEGIN(); | ||||
|         FUNCTION_HARNESS_PARAM(INT, lineNo); | ||||
|         FUNCTION_HARNESS_PARAM(BOOL, padding); | ||||
|     FUNCTION_HARNESS_END(); | ||||
|  | ||||
|     // Always indent at the beginning | ||||
|     printf("    "); | ||||
|  | ||||
|     // Add timing if requested | ||||
|     if (testTiming) | ||||
|     { | ||||
|         printf( | ||||
|             "%03u.%03us ", (unsigned int)((testTimeMSec() - testTimeMSecBegin()) / 1000), | ||||
|             (unsigned int)((testTimeMSec() - testTimeMSecBegin()) % 1000)); | ||||
|     } | ||||
|  | ||||
|     // Add number and padding | ||||
|     printf("l%04d - %s", lineNo, padding ? "    " : ""); | ||||
|  | ||||
|     FUNCTION_HARNESS_RESULT_VOID(); | ||||
| } | ||||
|  | ||||
| /*********************************************************************************************************************************** | ||||
| Getters | ||||
| ***********************************************************************************************************************************/ | ||||
|   | ||||
| @@ -6,6 +6,8 @@ C Test Harness | ||||
|  | ||||
| #include <inttypes.h> | ||||
|  | ||||
| #include "common/harnessTest.intern.h" | ||||
|  | ||||
| #include "common/debug.h" | ||||
| #include "common/error.h" | ||||
|  | ||||
| @@ -95,10 +97,8 @@ Test that an expected error is actually thrown and error when it isn't | ||||
| {                                                                                                                                  \ | ||||
|     bool TEST_ERROR_catch = false;                                                                                                 \ | ||||
|                                                                                                                                    \ | ||||
|     printf(                                                                                                                        \ | ||||
|         "    %03u.%03us l%04d -     expect %s: %s\n", (unsigned int)((testTimeMSec() - testTimeMSecBegin()) / 1000),               \ | ||||
|         (unsigned int)((testTimeMSec() - testTimeMSecBegin()) % 1000), __LINE__, errorTypeName(&errorTypeExpected),                \ | ||||
|         errorMessageExpected);                                                                                                     \ | ||||
|     hrnTestLogPrefix(__LINE__, true);                                                                                              \ | ||||
|     printf("expect %s: %s\n", errorTypeName(&errorTypeExpected), errorMessageExpected);                                            \ | ||||
|     fflush(stdout);                                                                                                                \ | ||||
|                                                                                                                                    \ | ||||
|     TRY_BEGIN()                                                                                                                    \ | ||||
| @@ -179,9 +179,7 @@ Compare types | ||||
| Output information about the test | ||||
| ***********************************************************************************************************************************/ | ||||
| #define TEST_RESULT_INFO(...)                                                                                                      \ | ||||
|     printf(                                                                                                                        \ | ||||
|         "    %03u.%03us l%04d -     ", (unsigned int)((testTimeMSec() - testTimeMSecBegin()) / 1000),                              \ | ||||
|         (unsigned int)((testTimeMSec() - testTimeMSecBegin()) % 1000), __LINE__);                                                  \ | ||||
|     hrnTestLogPrefix(__LINE__, true);                                                                                              \ | ||||
|     printf(__VA_ARGS__);                                                                                                           \ | ||||
|     printf("\n");                                                                                                                  \ | ||||
|     fflush(stdout); | ||||
| @@ -423,18 +421,16 @@ Logging macros | ||||
| #define TEST_LOG(message)                                                                                                          \ | ||||
|     do                                                                                                                             \ | ||||
|     {                                                                                                                              \ | ||||
|         printf(                                                                                                                    \ | ||||
|             "    %03u.%03us l%04d -     %s\n", (unsigned int)((testTimeMSec() - testTimeMSecBegin()) / 1000),                      \ | ||||
|             (unsigned int)((testTimeMSec() - testTimeMSecBegin()) % 1000), __LINE__, message);                                     \ | ||||
|         hrnTestLogPrefix(__LINE__, true);                                                                                          \ | ||||
|         printf("%s\n", message);                                                                                                   \ | ||||
|         fflush(stdout);                                                                                                            \ | ||||
|     } while(0) | ||||
|  | ||||
| #define TEST_LOG_FMT(format, ...)                                                                                                  \ | ||||
|     do                                                                                                                             \ | ||||
|     {                                                                                                                              \ | ||||
|         printf(                                                                                                                    \ | ||||
|             "    %03u.%03us l%04d -     " format "\n", (unsigned int)((testTimeMSec() - testTimeMSecBegin()) / 1000),              \ | ||||
|             (unsigned int)((testTimeMSec() - testTimeMSecBegin()) % 1000), __LINE__, __VA_ARGS__);                                 \ | ||||
|         hrnTestLogPrefix(__LINE__, true);                                                                                          \ | ||||
|         printf(format "\n", __VA_ARGS__);                                                                                          \ | ||||
|         fflush(stdout);                                                                                                            \ | ||||
|     } while(0) | ||||
|  | ||||
| @@ -444,9 +440,8 @@ Test title macro | ||||
| #define TEST_TITLE(message)                                                                                                        \ | ||||
|     do                                                                                                                             \ | ||||
|     {                                                                                                                              \ | ||||
|         printf(                                                                                                                    \ | ||||
|             "    %03u.%03us l%04d - %s\n", (unsigned int)((testTimeMSec() - testTimeMSecBegin()) / 1000),                          \ | ||||
|             (unsigned int)((testTimeMSec() - testTimeMSecBegin()) % 1000), __LINE__, message);                                     \ | ||||
|         hrnTestLogPrefix(__LINE__, false);                                                                                         \ | ||||
|         printf("%s\n", message);                                                                                                   \ | ||||
|         fflush(stdout);                                                                                                            \ | ||||
|     } while(0) | ||||
|  | ||||
|   | ||||
| @@ -4,15 +4,20 @@ C Test Harness Internal | ||||
| #ifndef TEST_COMMON_HARNESS_INTERN_H | ||||
| #define TEST_COMMON_HARNESS_INTERN_H | ||||
|  | ||||
| #include <stdbool.h> | ||||
|  | ||||
| #include "common/harnessTest.h" | ||||
|  | ||||
| /*********************************************************************************************************************************** | ||||
| Functions | ||||
| ***********************************************************************************************************************************/ | ||||
| void hrnInit( | ||||
|     const char *testExe, const char *testProjectExe, bool testContainer, unsigned int testIdx, uint64_t testScale, | ||||
|     const char *testExe, const char *testProjectExe, bool testContainer, unsigned int testIdx, bool timing, uint64_t testScale, | ||||
|     const char *testPath, const char *testDataPath, const char *testRepoPath); | ||||
| void hrnAdd(int run, bool selected); | ||||
| void hrnComplete(void); | ||||
|  | ||||
| // Output test log prefix with timing, line number, and optional padding | ||||
| void hrnTestLogPrefix(int lineNo, bool padding); | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -85,6 +85,7 @@ main(int argListSize, const char *argList[]) | ||||
|         "{[C_TEST_PROJECT_EXE]}",   // Project exe | ||||
|         {[C_TEST_CONTAINER]},       // Is this test running in a container? | ||||
|         {[C_TEST_IDX]},             // The 0-based index of this test | ||||
|         {[C_TEST_TIMING]},          // Is timing enabled (may be disabled for reproducible documentation) | ||||
|         {[C_TEST_SCALE]},           // Scaling factor for performance tests | ||||
|         "{[C_TEST_PATH]}",          // Path where tests write data | ||||
|         "{[C_TEST_DATA_PATH]}",     // Path where the harness stores temp files (expect, diff, etc.) | ||||
|   | ||||
							
								
								
									
										15
									
								
								test/test.pl
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								test/test.pl
									
									
									
									
									
								
							| @@ -108,6 +108,7 @@ test.pl [options] | ||||
|    --log-level          log level to use for test harness (and Perl tests) (defaults to INFO) | ||||
|    --log-level-test     log level to use for C tests (defaults to OFF) | ||||
|    --log-level-test-file log level to use for file logging in integration tests (defaults to TRACE) | ||||
|    --no-log-timestamp   suppress timestamps, timings, etc. Used to generate documentation. | ||||
|    --quiet, -q          equivalent to --log-level=off | ||||
|  | ||||
|  VM Options: | ||||
| @@ -128,6 +129,7 @@ test.pl [options] | ||||
| my $strLogLevel = lc(INFO); | ||||
| my $strLogLevelTest = lc(OFF); | ||||
| my $strLogLevelTestFile = lc(TRACE); | ||||
| my $bNoLogTimestamp = false; | ||||
| my $bVmOut = false; | ||||
| my @stryModule; | ||||
| my @stryModuleTest; | ||||
| @@ -182,6 +184,7 @@ GetOptions ('q|quiet' => \$bQuiet, | ||||
|             'log-level=s' => \$strLogLevel, | ||||
|             'log-level-test=s' => \$strLogLevelTest, | ||||
|             'log-level-test-file=s' => \$strLogLevelTestFile, | ||||
|             'no-log-timestamp' => \$bNoLogTimestamp, | ||||
|             'vm=s' => \$strVm, | ||||
|             'vm-host=s' => \$strVmHost, | ||||
|             'vm-out' => \$bVmOut, | ||||
| @@ -312,7 +315,7 @@ eval | ||||
|         $strLogLevel = 'off'; | ||||
|     } | ||||
|  | ||||
|     logLevelSet(uc($strLogLevel), uc($strLogLevel), OFF); | ||||
|     logLevelSet(uc($strLogLevel), uc($strLogLevel), OFF, !$bNoLogTimestamp); | ||||
|     &log(INFO, "test begin - log level ${strLogLevel}"); | ||||
|  | ||||
|     if (@stryModuleTest != 0 && @stryModule != 1) | ||||
| @@ -1095,10 +1098,10 @@ eval | ||||
|                 { | ||||
|                     my $oJob = new pgBackRestTest::Common::JobTest( | ||||
|                         $oStorageTest, $strBackRestBase, $strTestPath, $$oyTestRun[$iTestIdx], $bDryRun, $strVmHost, $bVmOut, | ||||
|                         $iVmIdx, $iVmMax, $iTestIdx, $iTestMax, $strLogLevel, $strLogLevelTest, $strLogLevelTestFile, $bLogForce, | ||||
|                         $bShowOutputAsync, $bNoCleanup, $iRetry, !$bNoValgrind, !$bNoCoverage, $bCoverageSummary, !$bNoOptimize, | ||||
|                         $bBackTrace, $bProfile, $iScale, $strTimeZone, !$bNoDebug, $bDebugTestTrace, | ||||
|                         $iBuildMax / $iVmMax < 1 ? 1 : int($iBuildMax / $iVmMax)); | ||||
|                         $iVmIdx, $iVmMax, $iTestIdx, $iTestMax, $strLogLevel, $strLogLevelTest, $strLogLevelTestFile, | ||||
|                         !$bNoLogTimestamp, $bLogForce, $bShowOutputAsync, $bNoCleanup, $iRetry, !$bNoValgrind, !$bNoCoverage, | ||||
|                         $bCoverageSummary, !$bNoOptimize, $bBackTrace, $bProfile, $iScale, $strTimeZone, !$bNoDebug, | ||||
|                         $bDebugTestTrace, $iBuildMax / $iVmMax < 1 ? 1 : int($iBuildMax / $iVmMax)); | ||||
|                     $iTestIdx++; | ||||
|  | ||||
|                     if ($oJob->run()) | ||||
| @@ -1129,7 +1132,7 @@ eval | ||||
|             ($bDryRun ? 'DRY RUN COMPLETED' : 'TESTS COMPLETED') . ($iTestFail == 0 ? ' SUCCESSFULLY' . | ||||
|                 ($iUncoveredCodeModuleTotal == 0 ? '' : " WITH ${iUncoveredCodeModuleTotal} MODULE(S) MISSING COVERAGE") : | ||||
|             " WITH ${iTestFail} FAILURE(S)") . ($iTestRetry == 0 ? '' : ", ${iTestRetry} RETRY(IES)") . | ||||
|                 ' (' . (time() - $lStartTime) . 's)'); | ||||
|                 ($bNoLogTimestamp ? '' : ' (' . (time() - $lStartTime) . 's)')); | ||||
|  | ||||
|         exit 1 if ($iTestFail > 0 || ($iUncoveredCodeModuleTotal > 0 && !$bCoverageSummary)); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user