[tools 2/4] testbot/TestWTBS: Allow checking for specific strings in logs.

Francois Gouget fgouget at codeweavers.com
Mon Jan 25 07:52:31 CST 2021


Either for their presence or their absence.
This is particularly useful to check that specific build actions were
performed (or skipped) as expected.

For instance:
----- TestWTBS -----
a build.log.Grep ^Applying patch
a build.log.GrepV ^Running make_requests
a build.log.GrepV ^Running make_opengl
----- TestWTBS -----

Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
---
 testbot/tests/TestWTBS | 84 +++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 83 insertions(+), 1 deletion(-)

diff --git a/testbot/tests/TestWTBS b/testbot/tests/TestWTBS
index 01f46bfde..58bf8a756 100755
--- a/testbot/tests/TestWTBS
+++ b/testbot/tests/TestWTBS
@@ -3,7 +3,7 @@
 #
 # Automate checking the Wine TestBot test Suite results.
 #
-# Copyright 2020 Francois Gouget
+# Copyright 2020-2021 Francois Gouget
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -353,6 +353,22 @@ sub LoadTestInfo($)
     }
   }
 
+  # Validate and fix the Grep* fields
+  foreach my $GrepType ("Grep", "GrepV")
+  {
+    foreach my $TaskType ("tasks", "tests", "build", "win", "win32", "win64", "wine")
+    {
+      foreach my $LogType ("report", "log", "testbot")
+      {
+        my $Array = $TestInfo->{$TaskType}->{"$LogType.$GrepType"};
+        next if (!defined $Array);
+        next if (ref($Array) eq "ARRAY");
+        fail("$TaskType.$LogType.$GrepType should be an array (a lines)");
+        $TestInfo->{$TaskType}->{"$LogType.$GrepType"} = [ $Array ];
+      }
+    }
+  }
+
   return $TestInfo;
 }
 
@@ -488,6 +504,51 @@ sub CheckLogErrors($$$)
   }
 }
 
+sub GrepTaskLog($$$$)
+{
+  my ($Task, $LogName, $TaskInfo, $LogType) = @_;
+
+  my @Grep = @{$TaskInfo->{"$LogType.Grep"} || []};
+  my @GrepV = @{$TaskInfo->{"$LogType.GrepV"} || []};
+  return if (!@Grep and !@GrepV);
+
+  if (open(my $LogFile, "<", $Task->GetDir() ."/$LogName"))
+  {
+    my $LineNo;
+    foreach my $Line (<$LogFile>)
+    {
+      $LineNo++;
+      my $i = 0;
+      while ($i < @GrepV)
+      {
+        if ($Line =~ /$GrepV[$i]/)
+        {
+          fail(TaskKeyStr($Task) ."/$LogName:$LineNo should not match $GrepV[$i]");
+          splice @GrepV, $i, 1;
+          next;
+        }
+        $i++;
+      }
+      $i = 0;
+      while ($i < @Grep)
+      {
+        if ($Line =~ /$Grep[$i]/)
+        {
+          splice @Grep, $i, 1;
+          next;
+        }
+        $i++;
+      }
+      last if (!@Grep and !@GrepV);
+    }
+    close($LogFile);
+  }
+  foreach my $RegExp (@Grep)
+  {
+    fail(TaskKeyStr($Task) ."/$LogName should match $RegExp");
+  }
+}
+
 =pod
 
 =item <job.Status>
@@ -503,6 +564,26 @@ By default the Status field should be 'completed'.
 Checks the value of the task's TestFailures field.
 By default the TestFailures field is not checked.
 
+=item <tasks.(report|log|testbot).Grep>
+=item <tasks.(report|log|testbot).GrepV>
+
+Verifies the presence or absence of specific regular expressions in the
+specified error log or reports of the tasks in the specified category.
+Multiple regular expressions can be specified so this uses the array type of
+line ('a').
+
+For instance:
+a build.log.Grep ^Applying patch
+a build.log.GrepV ^Running make_requests
+a build.log.GrepV ^Running make_opengl
+
+Checks that the TestBot applied the patch and did not find it necessary to
+run make_requests and make_opengl.
+
+Finally, note that while the Grep* directives are inherited by subcategories,
+they are not merged. So if if both win and win32 have Grep directives, win32
+will not inherit anything from the win category.
+
 =cut
 
 sub CheckTask($$$$)
@@ -548,6 +629,7 @@ sub CheckTask($$$$)
       CheckLogErrors($LogInfo, $TaskInfo->{"$LogType.errors"},
                      TaskKeyStr($Task) ."/$LogName");
     }
+    GrepTaskLog($Task, $LogName, $TaskInfo, $LogType);
   }
   if ($Task->Status eq "completed" and CheckValue($TaskInfo->{TestFailures}))
   {
-- 
2.20.1




More information about the wine-devel mailing list