Francois Gouget : testbot/TestWTBS: Allow checking the web patches status.

Alexandre Julliard julliard at winehq.org
Mon Jan 25 16:41:52 CST 2021


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

Author: Francois Gouget <fgouget at codeweavers.com>
Date:   Mon Jan 25 14:52:37 2021 +0100

testbot/TestWTBS: Allow checking the web patches status.

Checks the Failed / OK status on Wine's 'Patch status' page.

For instance:
----- TestWTBS -----
p webpatch.Status Failed
----- TestWTBS -----

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

---

 testbot/tests/TestWTBS | 100 +++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 97 insertions(+), 3 deletions(-)

diff --git a/testbot/tests/TestWTBS b/testbot/tests/TestWTBS
index 5686428..0980081 100755
--- a/testbot/tests/TestWTBS
+++ b/testbot/tests/TestWTBS
@@ -202,7 +202,7 @@ sub DumpTestInfo($)
 {
   my ($TestInfo) = @_;
 
-  foreach my $Category ("patch", "job", "tasks", "tests", "win",
+  foreach my $Category ("webpatch", "patch", "job", "tasks", "tests", "win",
                         "build", "win32", "win64", "wine")
   {
     WineTestBot::LogUtils::_WriteLogErrorsToFh(*STDERR, $TestInfo->{$Category});
@@ -225,6 +225,12 @@ sub CheckValue($)
   return (defined $Value and $Value ne "ignore");
 }
 
+sub SkipCheck($)
+{
+  my ($Value) = @_;
+  return (defined $Value and $Value eq "ignore");
+}
+
 sub LoadTestInfo($)
 {
   my ($FileName) = @_;
@@ -280,7 +286,7 @@ sub LoadTestInfo($)
 
   # Split up the information to jobs, tasks, etc.
   my $TestInfo = {
-    patch => {}, job => {},
+    webpatch => {}, patch => {}, job => {},
     tasks => {}, tests => {}, win => {},
     build => {}, win32 => {}, win64 => {}, wine => {},
   };
@@ -288,7 +294,7 @@ sub LoadTestInfo($)
   foreach my $Entry (keys %{$RawInfo})
   {
     my $Field = lcfirst($Entry);
-    if ($Field =~ s/^(patch|job|tasks|tests|win|build|win32|win64|wine)\.//)
+    if ($Field =~ s/^(webpatch|patch|job|tasks|tests|win|build|win32|win64|wine)\.//)
     {
       my $TaskType = $1;
       $TestInfo->{$TaskType}->{$Field} = $RawInfo->{$Entry};
@@ -374,6 +380,20 @@ sub LoadTestInfo($)
     }
   }
 
+  # Automatically check webpatch.Status in simple cases
+  if (!defined $TestInfo->{patch}->{Disposition} and
+      CheckValue($TestInfo->{job}->{Status}) and
+      !SkipCheck($TestInfo->{win32}->{TestFailures}) and
+      !SkipCheck($TestInfo->{win64}->{TestFailures}) and
+      !SkipCheck($TestInfo->{wine}->{TestFailures}))
+  {
+    my $Status = ($TestInfo->{job}->{Status} ne 'completed' or
+                  $TestInfo->{win32}->{TestFailures} or
+                  $TestInfo->{win64}->{TestFailures} or
+                  $TestInfo->{wine}->{TestFailures}) ? "Failed" : "OK";
+    SetDefault($TestInfo, "webpatch", "Status", $Status);
+  }
+
   return $TestInfo;
 }
 
@@ -803,6 +823,78 @@ sub CheckJobs()
 
 =pod
 
+=item <webpatch.Status>
+
+Checks the webpatch's status.
+This is the 'Failed' or 'OK' status on the Wine 'Patch status' page (outside
+the TestBot).
+If patch.Disposition is not set the default is to expect the status to be
+'Failed' if job.Status is not 'completed' or any of the tests has a non-zero
+TestFailures field; and 'OK' otherwise.
+
+For instance:
+p webpatch.Status Failed
+
+=cut
+
+sub CheckWebPatch($$$)
+{
+  my ($Patch, $Job, $TestInfo) = @_;
+
+  # Only patches submitted through WinePatchesWebSubmit.pl get a WebPatchId.
+  return if (!$Patch->WebPatchId or !-d "$DataDir/webpatches");
+
+  my $WebFileName = "$DataDir/webpatches/". $Patch->WebPatchId;
+  ok(-f $WebFileName, "Check presence of the ". $Patch->WebPatchId ." webpatch");
+
+  my $WebResultFile = "$WebFileName.testbot";
+  if (!$Job or $Job->Status !~ /^(completed|badpatch|badbuild|boterror)$/)
+  {
+    ok(!-f $WebResultFile, "Check absence of the ". $Patch->WebPatchId ." TestBot result file");
+    return;
+  }
+
+  ok(-f $WebResultFile, "Check presence of the ". $Patch->WebPatchId ." TestBot result file for job ". $Job->Id);
+
+  if (open(my $ResultFh, "<", $WebResultFile))
+  {
+    my ($HasStatus, $HasJobId, $HasURL);
+    while (my $Line = <$ResultFh>)
+    {
+      if ($Line =~ /^Status: (\w+)$/)
+      {
+        my $WebStatus = $1;
+        if (CheckValue($TestInfo->{webpatch}->{Status}))
+        {
+          is($WebStatus, $TestInfo->{webpatch}->{Status}, "Check the ". $Patch->WebPatchId ." web patch status (job ". $Job->Id .")");
+        }
+        $HasStatus = 1;
+      }
+      elsif ($Line =~ /^Job-ID: (\d+)$/)
+      {
+        is($1, $Job->Id, "Check the ". $Patch->WebPatchId ." job id");
+        $HasJobId = 1;
+      }
+      elsif ($Line =~ /^URL: (.+)$/)
+      {
+        my $JobId = $Job->Id;
+        ok($1 =~ m~\Q/$WebHostName\E/JobDetails\.pl\?Key=$JobId$~,
+           "Check the ". $Patch->WebPatchId ." URL");
+        $HasURL = 1;
+      }
+      # Ignore the rest of the file
+      last if ($HasStatus and $HasJobId and $HasURL);
+    }
+    close($ResultFh);
+  }
+  else
+  {
+    fail("Could not open $WebResultFile for reading: $!");
+  }
+}
+
+=pod
+
 =item <patch.Disposition>
 
 Checks the patch's disposition.
@@ -860,6 +952,8 @@ sub CheckPatch($$$)
   {
     fail("Patch ". $Patch->Id ."(". $Patch->Subject .") should have an associated job but Disposition is: ". $Patch->Disposition);
   }
+
+  CheckWebPatch($Patch, $Job, $TestInfo);
 }
 
 sub CheckPatches()




More information about the wine-cvs mailing list