[PATCH] testbot: Run the patched tests on Wine.
Francois Gouget
fgouget at codeweavers.com
Tue Sep 25 18:28:47 CDT 2018
Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
---
testbot/bin/CheckForWinetestUpdate.pl | 4 +-
testbot/bin/WineRunWineTest.pl | 53 +++++++++++++++++++----
testbot/bin/build/WineTest.pl | 61 ++++++++++++++++++++++++++-
testbot/lib/WineTestBot/Config.pm | 8 ++--
testbot/lib/WineTestBot/PatchUtils.pm | 17 +++++++-
testbot/lib/WineTestBot/Patches.pm | 5 ++-
testbot/web/Submit.pl | 9 ++--
7 files changed, 133 insertions(+), 24 deletions(-)
diff --git a/testbot/bin/CheckForWinetestUpdate.pl b/testbot/bin/CheckForWinetestUpdate.pl
index 991cdeb0f..29953642e 100755
--- a/testbot/bin/CheckForWinetestUpdate.pl
+++ b/testbot/bin/CheckForWinetestUpdate.pl
@@ -215,7 +215,7 @@ sub AddJob($$$)
Debug(" $VMKey $Build\n");
my $Task = $Tasks->Add();
$Task->VM($VMs->GetItem($VMKey));
- $Task->Timeout($SuiteTimeout);
+ $Task->Timeout(GetTestTimeout(undef, { $Build => 1 }));
}
# Save it all
@@ -318,7 +318,7 @@ sub AddReconfigJob($)
my $Task = $NewStep->Tasks->Add();
$Task->VM($VM);
$Task->CmdLineArg($Build);
- $Task->Timeout($SuiteTimeout);
+ $Task->Timeout(GetTestTimeout(undef, { $Build => 1 }));
}
}
}
diff --git a/testbot/bin/WineRunWineTest.pl b/testbot/bin/WineRunWineTest.pl
index 90e3403f7..0e438f957 100755
--- a/testbot/bin/WineRunWineTest.pl
+++ b/testbot/bin/WineRunWineTest.pl
@@ -382,7 +382,7 @@ if (!$VM->GetDomain()->IsPoweredOn())
FatalError("The VM is not powered on\n");
}
-if ($Step->Type ne "build" and $Step->Type ne "suite")
+if ($Step->Type ne "build" and $Step->Type ne "suite" and $Step->Type ne "single")
{
FatalError("Unexpected step type '". $Step->Type ."' found\n");
}
@@ -422,7 +422,12 @@ if (defined $FileName)
my $Script = "#!/bin/sh\n".
"( set -x\n".
- " ../bin/build/WineTest.pl ";
+ " export WINETEST_DEBUG=". $Step->DebugLevel ."\n";
+if ($Step->ReportSuccessfulTests)
+{
+ $Script .= " export WINETEST_REPORT_SUCCESS=1\n";
+}
+$Script .= " ../bin/build/WineTest.pl ";
if ($Step->Type eq "suite")
{
my $BaseTag = BuildTag($VM->Name);
@@ -460,7 +465,7 @@ Debug(Elapsed($Start), " Starting the script\n");
my $Pid = $TA->Run(["./task"], 0);
if (!$Pid)
{
- FatalTAError($TA, "Failed to start the task");
+ FatalTAError($TA, "Failed to start the test");
}
@@ -530,8 +535,9 @@ elsif (!defined $TAError)
$TAError = "An error occurred while retrieving the task log: ". $TA->GetLastError();
}
+
#
-# Grab the test logs if any
+# Grab the test reports if any
#
if ($Step->Type ne "build")
@@ -585,14 +591,45 @@ if ($Step->Type ne "build")
Debug(Elapsed($Start), " Disconnecting\n");
$TA->Disconnect();
-# Report the task errors even though they may have been caused by
-# TestAgent trouble.
-LogTaskError($ErrMessage) if (defined $ErrMessage);
-FatalTAError(undef, $TAError, $PossibleCrash) if (defined $TAError);
+
+#
+# Grab a copy of the reference logs
+#
+
+# Note that this may be a bit inaccurate right after a Wine commit.
+# See WineSendLog.pl for more details.
+if ($NewStatus eq 'completed')
+{
+ my $LatestDir = "$DataDir/latest";
+ my $StepDir = $Step->GetDir();
+ my $BuildList = $Task->CmdLineArg;
+ $BuildList =~ s/ .*$//;
+ foreach my $Build (split /,/, $BuildList)
+ {
+ my $RptFileName = "$Build.report";
+ my $RefReport = $Task->VM->Name ."_$RptFileName";
+ for my $Suffix ("", ".err")
+ {
+ if (-f "$LatestDir/$RefReport$Suffix")
+ {
+ unlink "$StepDir/$RefReport$Suffix";
+ if (!link "$LatestDir/$RefReport$Suffix", "$StepDir/$RefReport$Suffix")
+ {
+ Error "Could not link '$RefReport$Suffix': $!\n";
+ }
+ }
+ }
+ }
+}
#
# Wrap up
#
+# Report the task errors even though they may have been caused by
+# TestAgent trouble.
+LogTaskError($ErrMessage) if (defined $ErrMessage);
+FatalTAError(undef, $TAError, $PossibleCrash) if (defined $TAError);
+
WrapUpAndExit($NewStatus, $TaskFailures, undef, $TaskTimedOut);
diff --git a/testbot/bin/build/WineTest.pl b/testbot/bin/build/WineTest.pl
index 9be73a42f..2b26a41ab 100755
--- a/testbot/bin/build/WineTest.pl
+++ b/testbot/bin/build/WineTest.pl
@@ -107,6 +107,46 @@ sub DailyWineTest($$$$$)
return 1;
}
+sub TestPatch($$$)
+{
+ my ($Targets, $Build, $Impacts) = @_;
+
+ return 1 if (!$Targets->{"test$Build"});
+
+ my @TestList;
+ foreach my $Module (sort keys %{$Impacts->{Tests}})
+ {
+ my $TestInfo = $Impacts->{Tests}->{$Module};
+ if ($TestInfo->{All})
+ {
+ push @TestList, $Module;
+ }
+ else
+ {
+ foreach my $Unit (sort keys %{$TestInfo->{Units}})
+ {
+ push @TestList, "$Module:$Unit";
+ }
+ }
+ }
+ return 1 if (!@TestList);
+
+ InfoMsg "\nRunning the tests in the $Build Wine\n";
+ SetupWineEnvironment($Build);
+
+ # Run WineTest. Ignore the exit code since it returns non-zero whenever
+ # there are test failures.
+ RunWine($Build, "./programs/winetest/winetest.exe.so",
+ "-c -o '../$Build.report' -t test-$Build ". join(" ", @TestList));
+ if (!-f "$Build.report")
+ {
+ LogMsg "WineTest did not produce a report file\n";
+ return 0;
+ }
+
+ return 1;
+}
+
#
# Setup and command line processing
@@ -226,6 +266,20 @@ if (!defined $Usage)
$Usage = 2;
}
}
+ else
+ {
+ foreach my $Build ("win32", "wow32", "wow64")
+ {
+ $Targets->{"test$Build"} = 1 if ($Targets->{$Build});
+ }
+ if ($Targets->{"wow32"} or $Targets->{"wow64"})
+ {
+ # Always rebuild both WoW targets before running the tests to make sure
+ # we don't run into issues caused by the two Wine builds being out of
+ # sync.
+ $Targets->{"wow32"} = $Targets->{"wow64"} = 1;
+ }
+ }
if (!defined $FileName and $Action eq "testpatch")
{
@@ -247,7 +301,7 @@ if (defined $Usage)
print "Tests the specified patch or runs WineTest in Wine.\n";
print "\n";
print "Where:\n";
- print " --testpatch Verify that the patch compiles.\n";
+ print " --testpatch Verify that the patch compiles and run the impacted tests.\n";
print " --winetest Run WineTest and submit the result to the website.\n";
print " --no-submit Do not submit the WineTest results to the website.\n";
print " TARGETS Is a comma-separated list of targets for the specified action.\n";
@@ -282,7 +336,10 @@ if ($Action eq "testpatch")
exit(1) if (!$Impacts or
!BuildWine($Targets, "win32") or
!BuildWine($Targets, "wow64") or
- !BuildWine($Targets, "wow32"));
+ !BuildWine($Targets, "wow32") or
+ !TestPatch($Targets, "win32", $Impacts) or
+ !TestPatch($Targets, "wow64", $Impacts) or
+ !TestPatch($Targets, "wow32", $Impacts));
}
elsif ($Action eq "winetest")
{
diff --git a/testbot/lib/WineTestBot/Config.pm b/testbot/lib/WineTestBot/Config.pm
index 157617780..44692295e 100644
--- a/testbot/lib/WineTestBot/Config.pm
+++ b/testbot/lib/WineTestBot/Config.pm
@@ -33,7 +33,7 @@ use vars qw (@ISA @EXPORT @EXPORT_OK $UseSSL $LogDir $DataDir $BinDir
$WinePatchToOverride $WinePatchCc
$ExeBuildNativeTimeout $ExeBuildTestTimeout $ExeModuleTimeout
$WineBuildTimeout $WineModuleTimeout $TimeoutMargin
- $SuiteTimeout $SingleTimeout $MaxUnitSize
+ $SuiteTimeout $SingleTimeout $SingleAvgTime $MaxUnitSize
$TagPrefix $ProjectName $PatchesMailingList $LDAPServer
$LDAPBindDN $LDAPSearchBase $LDAPSearchFilter
$LDAPRealNameAttribute $LDAPEMailAttribute $AgentPort $Tunnel
@@ -49,7 +49,7 @@ require Exporter;
$RobotEMail $WinePatchToOverride $WinePatchCc $SuiteTimeout
$ExeBuildNativeTimeout $ExeBuildTestTimeout $ExeModuleTimeout
$WineBuildTimeout $WineModuleTimeout $TimeoutMargin
- $SuiteTimeout $SingleTimeout $MaxUnitSize
+ $SuiteTimeout $SingleTimeout $SingleAvgTime $MaxUnitSize
$TagPrefix $ProjectName $PatchesMailingList
$LDAPServer $LDAPBindDN $LDAPSearchBase $LDAPSearchFilter
$LDAPRealNameAttribute $LDAPEMailAttribute $AgentPort $Tunnel
@@ -112,8 +112,10 @@ $TimeoutMargin = 2 * 60;
# Test timeouts (in seconds)
# - For the whole test suite
$SuiteTimeout = 30 * 60;
-# - For a single test
+# - For the first two tests
$SingleTimeout = 2 * 60;
+# - For extra tests
+$SingleAvgTime = 2;
# Maximum amount of traces for a test unit.
$MaxUnitSize = 32 * 1024;
diff --git a/testbot/lib/WineTestBot/PatchUtils.pm b/testbot/lib/WineTestBot/PatchUtils.pm
index f03cc40bb..502a781f6 100644
--- a/testbot/lib/WineTestBot/PatchUtils.pm
+++ b/testbot/lib/WineTestBot/PatchUtils.pm
@@ -32,7 +32,7 @@ the Wine builds.
use Exporter 'import';
our @EXPORT = qw(GetPatchImpacts LastPartSeparator UpdateWineData
- GetBuildTimeout);
+ GetBuildTimeout GetTestTimeout);
use List::Util qw(min max);
@@ -478,4 +478,19 @@ sub GetBuildTimeout($$)
return $ExeTimeout + $WineTimeout;
}
+sub GetTestTimeout($$)
+{
+ my ($Impacts, $Builds) = @_;
+
+ my $Timeout = $SuiteTimeout;
+ if ($Impacts)
+ {
+ my $UnitCount = $Impacts->{TestUnitCount};
+ my $TestsTimeout = min(2, $UnitCount) * $SingleTimeout +
+ max(0, $UnitCount - 2) * $SingleAvgTime;
+ $Timeout = min($SuiteTimeout, $TestsTimeout);
+ }
+ return scalar(keys %$Builds) * $Timeout;
+}
+
1;
diff --git a/testbot/lib/WineTestBot/Patches.pm b/testbot/lib/WineTestBot/Patches.pm
index 96e4a0dda..f685e86b3 100644
--- a/testbot/lib/WineTestBot/Patches.pm
+++ b/testbot/lib/WineTestBot/Patches.pm
@@ -245,7 +245,7 @@ sub Submit($$$)
my $NewStep = $NewJob->Steps->Add();
$NewStep->FileName("patch.diff");
$NewStep->FileType("patch");
- $NewStep->Type("build");
+ $NewStep->Type("single");
$NewStep->DebugLevel(0);
# And a task for each VM
@@ -258,7 +258,8 @@ sub Submit($$$)
$Task->VM($VM);
# Only verify that the win32 version compiles
my $Builds = { "win32" => 1 };
- $Task->Timeout(GetBuildTimeout($Impacts, $Builds));
+ $Task->Timeout(GetBuildTimeout($Impacts, $Builds) +
+ GetTestTimeout($Impacts, $Builds));
$Task->CmdLineArg(join(",", keys %$Builds));
}
}
diff --git a/testbot/web/Submit.pl b/testbot/web/Submit.pl
index 9ad8fd5e0..d0da7a249 100644
--- a/testbot/web/Submit.pl
+++ b/testbot/web/Submit.pl
@@ -276,10 +276,6 @@ sub GenerateFields($)
$Status = " [". $VM->Status ."]";
$Checked = undef;
}
- elsif ($VM->Type eq "wine")
- {
- $Checked = undef;
- }
if ($Checked and
($self->GetParam("Page") == 1 || $self->GetParam($FieldName)))
{
@@ -876,7 +872,7 @@ sub SubmitJob($$$)
my $WineStep = $Steps->Add();
$WineStep->FileName($BaseName);
$WineStep->FileType($FileType);
- $WineStep->Type("build");
+ $WineStep->Type("single");
$WineStep->DebugLevel($self->GetParam("DebugLevel"));
$WineStep->ReportSuccessfulTests(defined($self->GetParam("ReportSuccessfulTests")));
$Tasks = $WineStep->Tasks;
@@ -884,7 +880,8 @@ sub SubmitJob($$$)
if (!defined $Timeout)
{
my $Builds = { $Build => 1 };
- $Timeout = GetBuildTimeout($Impacts, $Builds);
+ $Timeout = GetBuildTimeout($Impacts, $Builds) +
+ GetTestTimeout($Impacts, $Builds);
}
# Then add a task for this VM
--
2.19.0
More information about the wine-devel
mailing list