Francois Gouget : testbot: Specify which test units to rerun with the ' test' mission option.

Alexandre Julliard julliard at winehq.org
Tue Oct 30 13:16:11 CDT 2018


Module: tools
Branch: master
Commit: 290f9e17ce7e375ac3dee55d43b4915fa58539fe
URL:    https://source.winehq.org/git/tools.git/?a=commit;h=290f9e17ce7e375ac3dee55d43b4915fa58539fe

Author: Francois Gouget <fgouget at codeweavers.com>
Date:   Tue Oct 30 14:08:39 2018 +0100

testbot: Specify which test units to rerun with the 'test' mission option.

If set to 'all', then any non-test patch will cause a full WineTest run.
If set to 'module', then only the patched module's tests will be run.
If set to 'test' or unset, then the current behavior is preserved so
that only patched test units are run.
If set to 'build', then only verify that the patch builds.

Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 testbot/bin/build/WineReconfig.pl     |  8 ++++---
 testbot/bin/build/WineTest.pl         | 43 +++++++++++++++++++++++++++--------
 testbot/lib/WineTestBot/Missions.pm   |  6 ++++-
 testbot/lib/WineTestBot/PatchUtils.pm | 25 ++++++++++++++------
 testbot/web/admin/VMDetails.pl        |  1 +
 5 files changed, 62 insertions(+), 21 deletions(-)

diff --git a/testbot/bin/build/WineReconfig.pl b/testbot/bin/build/WineReconfig.pl
index f46408b..53ce319 100755
--- a/testbot/bin/build/WineReconfig.pl
+++ b/testbot/bin/build/WineReconfig.pl
@@ -104,13 +104,15 @@ sub UpdateWinePrefixes($)
   # Set up brand new WinePrefixes ready for use for testing.
   # This way we do it once instead of doing it for every test, thus saving
   # time. Note that this requires using a different wineprefix for each build.
-  foreach my $Build ("win32", "wow64", "wow32")
+  foreach my $Mission (@{$TaskMissions->{Missions}})
   {
-    next if (!$TaskMissions->{Builds}->{$Build});
+    next if ($Mission->{test} eq "build");
+
+    SetupWineEnvironment($Build);
+    InfoMsg "\nRecreating the $Mission->{Build} wineprefix\n";
 
     # Wait for the wineprefix creation to complete so it is really done
     # before the snapshot gets updated.
-    SetupWineEnvironment($Build);
     my $ErrMessage = CreateWinePrefix($Build, "wait");
     if (defined $ErrMessage)
     {
diff --git a/testbot/bin/build/WineTest.pl b/testbot/bin/build/WineTest.pl
index ecb3299..078f01b 100755
--- a/testbot/bin/build/WineTest.pl
+++ b/testbot/bin/build/WineTest.pl
@@ -122,25 +122,48 @@ sub TestPatch($$)
 {
   my ($Mission, $Impacts) = @_;
 
+  return 1 if ($Mission->{test} eq "build");
+
   my @TestList;
-  foreach my $Module (sort keys %{$Impacts->{Tests}})
+  if ($Mission->{test} eq "all" and
+      ($Impacts->{PatchedRoot} or $Impacts->{PatchedModules}))
   {
-    my $TestInfo = $Impacts->{Tests}->{$Module};
-    if ($TestInfo->{All})
-    {
-      push @TestList, $Module;
-    }
-    else
+    push @TestList, "-m", "do.not.submit";
+  }
+  else
+  {
+    foreach my $Module (sort keys %{$Impacts->{Tests}})
     {
-      foreach my $Unit (sort keys %{$TestInfo->{Units}})
+      my $TestInfo = $Impacts->{Tests}->{$Module};
+      if ($TestInfo->{All} or
+          ($Mission->{test} eq "module" and $TestInfo->{PatchedModule}))
       {
-        push @TestList, "$Module:$Unit";
+        # When given a module name WineTest runs all its tests.
+        # But make sure the module actually has tests first!
+        push @TestList, $Module if (%{$TestInfo->{Units}});
+      }
+      else
+      {
+        foreach my $Unit (sort keys %{$TestInfo->{Units}})
+        {
+          push @TestList, "$Module:$Unit";
+        }
       }
     }
+    return 1 if (!@TestList);
   }
-  return 1 if (!@TestList);
 
   SetupTest("the tests", $Mission);
+  if (!-d $ENV{WINEPREFIX})
+  {
+    # FIXME Wait for the wineserver as a workaround for bug 41713.
+    my $ErrMessage = CreateWinePrefix($Mission, "wait");
+    if (defined $ErrMessage)
+    {
+      LogMsg "Could not create the $Mission->{Build} wineprefix: $ErrMessage\n";
+      return 0;
+    }
+  }
 
   # Run WineTest. Ignore the exit code since it returns non-zero whenever
   # there are test failures.
diff --git a/testbot/lib/WineTestBot/Missions.pm b/testbot/lib/WineTestBot/Missions.pm
index 58b3340..80c1d97 100644
--- a/testbot/lib/WineTestBot/Missions.pm
+++ b/testbot/lib/WineTestBot/Missions.pm
@@ -64,7 +64,11 @@ sub ParseMissionStatement($)
       }
       $Build = $1; # untaint
       $TaskMissions->{Builds}->{$Build} = 1;
-      my $Mission = { Build => $Build, Statement => $Statement };
+      my $Mission = {
+        Build => $Build,
+        Statement => $Statement,
+        test => "test", # Set the default value
+      };
       push @{$TaskMissions->{Missions}}, $Mission;
 
       foreach my $Option (@Options)
diff --git a/testbot/lib/WineTestBot/PatchUtils.pm b/testbot/lib/WineTestBot/PatchUtils.pm
index fb4f886..0e17a70 100644
--- a/testbot/lib/WineTestBot/PatchUtils.pm
+++ b/testbot/lib/WineTestBot/PatchUtils.pm
@@ -492,15 +492,26 @@ sub GetTestTimeout($$)
 {
   my ($Impacts, $TaskMissions) = @_;
 
-  my $Timeout = $SuiteTimeout;
-  if ($Impacts)
+  my $Timeout = 0;
+  foreach my $Mission (@{$TaskMissions->{Missions}})
   {
-    my $UnitCount = $Impacts->{TestUnitCount};
-    my $TestsTimeout = min(2, $UnitCount) * $SingleTimeout +
-                       max(0, $UnitCount - 2) * $SingleAvgTime;
-    $Timeout = min($SuiteTimeout, $TestsTimeout);
+    if (!$Impacts or ($Mission->{test} eq "all" and
+                      ($Impacts->{PatchedRoot} or $Impacts->{PatchedModules})))
+    {
+      $Timeout += $SuiteTimeout;
+    }
+    elsif ($Mission->{test} ne "build")
+    {
+      # Note: If only test units have been patched then
+      #       ModuleUnitCount == TestUnitCount.
+      my $UnitCount = $Mission->{test} eq "test" ? $Impacts->{TestUnitCount} :
+                                                   $Impacts->{ModuleUnitCount};
+      my $TestsTimeout = min(2, $UnitCount) * $SingleTimeout +
+                         max(0, $UnitCount - 2) * $SingleAvgTime;
+      $Timeout += min($SuiteTimeout, $TestsTimeout);
+    }
   }
-  return @{$TaskMissions->{Missions}} * $Timeout;
+  return $Timeout;
 }
 
 1;
diff --git a/testbot/web/admin/VMDetails.pl b/testbot/web/admin/VMDetails.pl
index 5f49c68..4b7799a 100644
--- a/testbot/web/admin/VMDetails.pl
+++ b/testbot/web/admin/VMDetails.pl
@@ -78,6 +78,7 @@ sub GenerateFooter($)
   print "Each mission is composed of a build and options separated by commas: <i>build,option1=value,option2,...</i>. The value can be omitted for boolean options and defaults to true.<br>\n";
   print "The supported builds are <i>build</i> for build VMs; <i>exe32</i> and <i>exe64</i> for Windows VMs;<i> win32</i>, <i>wow32</i> and <i>wow64</i> for Wine VMs.</p>\n";
   print "<p>On Wine VMs:<br>\n";
+  print "The <i>test</i> option can be set to <i>build</i> to only test building, <i>test</i> to only rerun patched tests, <i>module</i> to rerun all of a patched dll or program's tests, or <i>all</i> to always rerun all the tests.<br>\n";
   print "If set, the <i>nosubmit</i> option specifies that the WineTest results should not be published online.</p>\n";
   print "</td></tr></tbody>\n";
   print "</table></div>\n";




More information about the wine-cvs mailing list