Merge pull request #741 from yuslepukhin/test_appveyor_baseline
Improve CI build and build switchesmain
commit
75134f7562
@ -0,0 +1,13 @@ |
||||
version: 1.0.{build} |
||||
before_build: |
||||
- md %APPVEYOR_BUILD_FOLDER%\build |
||||
- cd %APPVEYOR_BUILD_FOLDER%\build |
||||
- cmake -G "Visual Studio 12 Win64" -DOPTDBG=1 .. |
||||
- cd .. |
||||
build: |
||||
project: build\ALL_BUILD.vcxproj |
||||
parallel: true |
||||
verbosity: minimal |
||||
test: |
||||
test_script: |
||||
- ps: build_tools\run_ci_db_test.ps1 |
@ -0,0 +1,180 @@ |
||||
# Extract the names of its tests by running db_test with --gtest_list_tests. |
||||
# This filter removes the "#"-introduced comments, and expands to |
||||
# fully-qualified names by changing input like this: |
||||
# |
||||
# DBTest. |
||||
# Empty |
||||
# WriteEmptyBatch |
||||
# MultiThreaded/MultiThreadedDBTest. |
||||
# MultiThreaded/0 # GetParam() = 0 |
||||
# MultiThreaded/1 # GetParam() = 1 |
||||
# |
||||
# into this: |
||||
# |
||||
# DBTest.Empty |
||||
# DBTest.WriteEmptyBatch |
||||
# MultiThreaded/MultiThreadedDBTest.MultiThreaded/0 |
||||
# MultiThreaded/MultiThreadedDBTest.MultiThreaded/1 |
||||
|
||||
# Folders and commands must be fullpath to run assuming |
||||
# the current folder is at the root of the git enlistment |
||||
Get-Date |
||||
# Limit the number of tests to start for debugging purposes |
||||
$limit = -1 |
||||
|
||||
$RootFolder = $pwd -replace '\\build_tools', '' |
||||
$LogFolder = -Join($RootFolder, "\db_logs\") |
||||
$TmpFolder = -Join($RootFolder, "\db_tests\") |
||||
$Env:TEST_TMPDIR = $TmpFolder |
||||
$global:db_test = -Join ($RootFolder, "\build\Debug\db_test.exe") |
||||
|
||||
#Exclusions that we do not want to run |
||||
$ExcludeTests = @{ |
||||
<# |
||||
"DBTest.HugeNumberOfLevels" = "" |
||||
"DBTest.SparseMerge" = "" |
||||
"DBTest.RateLimitingTest" = "" |
||||
"DBTest.kAbsoluteConsistency" = "" |
||||
"DBTest.GroupCommitTest" = "" |
||||
"DBTest.FileCreationRandomFailure" = "" |
||||
"DBTest.kTolerateCorruptedTailRecords" = "" |
||||
"DBTest.kSkipAnyCorruptedRecords" = "" |
||||
"DBTest.kPointInTimeRecovery" = "" |
||||
"DBTest.Randomized" = "" |
||||
#> |
||||
} |
||||
|
||||
# Create test directories in the current folder |
||||
md -Path $TmpFolder -ErrorAction Ignore |
||||
md -Path $LogFolder -ErrorAction Ignore |
||||
|
||||
function Normalize-Tests([System.Array]$Tests, $HashTable) { |
||||
# Current group |
||||
$Group="" |
||||
|
||||
ForEach( $l in $tests) { |
||||
# Trailing dot is a test group |
||||
if( $l -match "\.$") { |
||||
$Group = $l |
||||
} else { |
||||
# Otherwise it is a test name, remove leading space |
||||
$test = $l -replace '^\s+','' |
||||
# remove trailing comment if any and create a log name |
||||
$test = $test -replace '\s+\#.*','' |
||||
$test = "$Group$test" |
||||
|
||||
if($ExcludeTests.Contains($test)) { |
||||
continue |
||||
} |
||||
|
||||
$test_log = $test -replace '[./]','_' |
||||
$test_log += ".log" |
||||
|
||||
# Add to a hashtable |
||||
$HashTable.Add($test, $test_log); |
||||
} |
||||
} |
||||
} |
||||
|
||||
# Run db_test to get a list of tests and store it into $a array |
||||
&$db_test --gtest_list_tests | tee -Variable TestList | Out-Null |
||||
|
||||
# Parse the tests and store along with the log name into a hash |
||||
$TestToLog = [ordered]@{} |
||||
|
||||
Normalize-Tests -Tests $TestList -HashTable $TestToLog |
||||
|
||||
Write-Host "Attempting to start: " ($TestToLog.Count) " tests" |
||||
|
||||
# Start jobs async each running a separate test |
||||
$AsyncScript = { |
||||
param($exe, $test, $log); |
||||
&$exe --gtest_filter=$test > $log 2>&1 |
||||
} |
||||
|
||||
$jobs = @() |
||||
$JobToLog = @{} |
||||
# Test limiting factor here |
||||
$count = 0 |
||||
|
||||
ForEach($k in $TestToLog.keys) { |
||||
|
||||
Write-Host "Starting $k" |
||||
$log_path = -join ($LogFolder, ($TestToLog.$k)) |
||||
$job = Start-Job -Name $k -ScriptBlock $AsyncScript -ArgumentList @($db_test,$k,$log_path) |
||||
$JobToLog.Add($job, $log_path) |
||||
|
||||
# Limiting trial runs |
||||
if(($limit -gt 0) -and (++$count -ge $limit)) { |
||||
break |
||||
} |
||||
} |
||||
|
||||
|
||||
$success = 1; |
||||
|
||||
# Wait for all to finish and get the results |
||||
while($JobToLog.Count -gt 0) { |
||||
|
||||
$jobs = @() |
||||
foreach($k in $JobToLog.Keys) { $jobs += $k } |
||||
|
||||
<# |
||||
if(!$success) { |
||||
break |
||||
} |
||||
#> |
||||
|
||||
$completed = Wait-Job -Job $jobs -Any |
||||
$log = $JobToLog[$completed] |
||||
$JobToLog.Remove($completed) |
||||
|
||||
$message = -join @($completed.Name, " State: ", ($completed.State)) |
||||
|
||||
$log_content = @(Get-Content $log) |
||||
|
||||
if($completed.State -ne "Completed") { |
||||
$success = 0 |
||||
Write-Warning $message |
||||
$log_content | Write-Warning |
||||
} else { |
||||
# Scan the log. If we find PASSED and no occurence of FAILED |
||||
# then it is a success |
||||
$pass_found = 0 |
||||
ForEach($l in $log_content) { |
||||
|
||||
if($l -match "^\[\s+FAILED") { |
||||
$pass_found = 0 |
||||
break |
||||
} |
||||
|
||||
if($l -match "^\[\s+PASSED") { |
||||
$pass_found = 1 |
||||
} |
||||
} |
||||
|
||||
if(!$pass_found) { |
||||
$success = 0; |
||||
Write-Warning $message |
||||
$log_content | Write-Warning |
||||
} else { |
||||
Write-Host $message |
||||
} |
||||
} |
||||
|
||||
# Remove cached job info from the system |
||||
# Should be no output |
||||
Receive-Job -Job $completed | Out-Null |
||||
} |
||||
|
||||
Get-Date |
||||
|
||||
if(!$success) { |
||||
# This does not succeed killing off jobs quick |
||||
# So we simply exit |
||||
# Remove-Job -Job $jobs -Force |
||||
# indicate failure using this exit code |
||||
exit 12345 |
||||
} |
||||
|
||||
|
Loading…
Reference in new issue