Francois Gouget : testbot/TestWTBS: Allow checking the patches disposition.

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


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

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

testbot/TestWTBS: Allow checking the patches disposition.

This allows verifying that patches that should not result in a TestBot
job are indeed ignored for the right reason (aka disposition).

For instance:
----- TestWTBS -----
p patch.Disposition Does not impact the Wine build
----- TestWTBS -----

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

---

 testbot/tests/TestWTBS | 115 +++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 106 insertions(+), 9 deletions(-)

diff --git a/testbot/tests/TestWTBS b/testbot/tests/TestWTBS
index 58bf8a7..5686428 100755
--- a/testbot/tests/TestWTBS
+++ b/testbot/tests/TestWTBS
@@ -48,6 +48,7 @@ use WineTestBot::Config; # For $PatchesMailingList
 use WineTestBot::Jobs;
 use WineTestBot::Log;
 use WineTestBot::LogUtils;
+use WineTestBot::Patches;
 use WineTestBot::VMs;
 
 
@@ -161,9 +162,10 @@ if (defined $Usage)
   print "\n";
   print "Where:\n";
   print "  --jobs RANGES Only check the jobs in one of the specified comma-separated\n";
-  print "                job id ranges. Each range is either a single job id, or of the\n";
-  print "                form 'FIRST..LAST' where FIRST and LAST are either the empty\n";
-  print "                string or a job id.\n";
+  print "                job id ranges. This also causes patches not related to one of\n";
+  print "                these jobs to be ignored. Each range is either a single job id,\n";
+  print "                or of the form 'FIRST..LAST' where FIRST and LAST are either the\n";
+  print "                empty string or a job id.\n";
   print "  --help        Shows this usage message.\n";
   exit 0;
 }
@@ -318,9 +320,12 @@ sub LoadTestInfo($)
   return undef if (!$HasTestInfo);
 
   # Fill in some useful defaults
-  SetDefault($TestInfo, "job", "Status", "completed");
-  SetDefault($TestInfo, "tasks", "Status", "completed");
-  SetDefault($TestInfo, "tasks", "HasTask", 1);
+  if (!defined $TestInfo->{patch}->{Disposition})
+  {
+    SetDefault($TestInfo, "job", "Status", "completed");
+    SetDefault($TestInfo, "tasks", "Status", "completed");
+    SetDefault($TestInfo, "tasks", "HasTask", 1);
+  }
 
   # Then propagate the defaults
   foreach my $Pair (["tasks", ["build", "tests"]],
@@ -666,6 +671,10 @@ sub CheckJob($$)
   {
     is($Job->Status, $JobInfo->{Status}, "Check Status for job ". $Job->Id);
   }
+  elsif (CheckValue($TestInfo->{patch}->{Disposition}))
+  {
+    fail("The '$TestInfo->{patch}->{Disposition}' patch disposition is incompatible with job ". $Job->Id);
+  }
 }
 
 sub IsJobInRange($)
@@ -681,6 +690,8 @@ sub IsJobInRange($)
   return 0;
 }
 
+my %CheckedJobs;
+
 =pod
 
 =item <tasks.HasTask>
@@ -705,12 +716,15 @@ p win.TestUnits cabinet:extract cabinet:fdi
 
 =cut
 
-sub CheckJobTree($)
+sub CheckJobTree($;$)
 {
-  my ($Job) = @_;
+  my ($Job, $TestInfo) = @_;
   return if (!IsJobInRange($Job));
 
-  my ($TestInfo, $HasTask);
+  return if ($CheckedJobs{$Job->Id});
+  $CheckedJobs{$Job->Id} = 1;
+
+  my $HasTask;
   my $TestUnits = { wine => {} };
 
   my $Steps = $Job->Steps;
@@ -783,6 +797,85 @@ sub CheckJobs()
 }
 
 
+#
+# Verify the Patches and the patches site
+#
+
+=pod
+
+=item <patch.Disposition>
+
+Checks the patch's disposition.
+By default the disposition is supposed to point to the relevant job, in which
+case default values are provided for the job.Status, tasks.Status and
+tasks.HasTask properties. If a specific disposition is specified, then these
+defaults are not provided since no job should be created in that case.
+
+For instance:
+p patch.Disposition Does not impact the Wine build
+
+=cut
+
+sub CheckPatch($$$)
+{
+  my ($Jobs, $Patch, $TestInfo) = @_;
+
+  my $Job;
+  if ($Patch->Disposition =~ /^Submitted job (\d+)$/)
+  {
+    $Job = $Jobs->GetItem($1);
+  }
+  # The job range restriction extends to their associated patches...
+  return if ($Job and !IsJobInRange($Job));
+  # ..and to patches with no job
+  return if (!$Job and @JobRanges);
+
+  my $PatchInfo = $TestInfo->{patch};
+  if (CheckValue($PatchInfo->{Disposition}))
+  {
+    is($Patch->Disposition, $PatchInfo->{Disposition}, "Check Disposition for patch ". $Patch->Id .": ". $Patch->Subject);
+  }
+  elsif ($Patch->Disposition =~ /^Submitted job (.*)$/)
+  {
+    isnt($Job, undef, "Check job $1 for patch ". $Patch->Id .": ". $Patch->Subject);
+    if (!$Job or $Job->Status eq "canceled")
+    {
+      ; # Nothing to check
+    }
+    elsif ($Job->Status =~ /^(?:queued|running)$/)
+    {
+      print "...skipping job ". $Job->Id ." because it is not complete yet (". $Job->Status .")\n";
+    }
+    else
+    {
+      # Provide defaults for the job checks
+      my $Remarks = $Patch->Subject;
+      $Remarks =~ s~^\[\d+/\d+\]\s~~; # In case submitted as a patch series
+      $Remarks =~ s~\s+$~~;
+      SetDefault($TestInfo, "job", "Remarks", $Remarks);
+      CheckJobTree($Job, $TestInfo);
+    }
+  }
+  else
+  {
+    fail("Patch ". $Patch->Id ."(". $Patch->Subject .") should have an associated job but Disposition is: ". $Patch->Disposition);
+  }
+}
+
+sub CheckPatches()
+{
+  my $Jobs = CreateJobs();
+  my $Patches = CreatePatches();
+  foreach my $Patch (sort { $b->Id <=> $a->Id } @{$Patches->GetItems()})
+  {
+    my $PatchFileName = "$DataDir/patches/". $Patch->Id;
+    next if (!-f $PatchFileName);
+    my $TestInfo = LoadTestInfo($PatchFileName);
+    CheckPatch($Jobs, $Patch, $TestInfo) if ($TestInfo);
+  }
+}
+
+
 #
 # Run the tests
 #
@@ -799,6 +892,10 @@ if (!$HasBaseVM->{build})
   delete $HasBaseVM->{win64};
 }
 
+print "***** Checking Patches *****\n";
+CheckPatches();
+
+print "\n***** Checking Jobs *****\n";
 CheckJobs();
 
 done_testing();




More information about the wine-cvs mailing list