Module: tools
Branch: master
Commit: 17e6b89d14e6bb90bf611e323f444cfe6268bb63
URL: https://source.winehq.org/git/tools.git/?a=commit;h=17e6b89d14e6bb90bf611e3…
Author: Francois Gouget <fgouget(a)codeweavers.com>
Date: Wed Mar 4 16:30:11 2020 +0100
testbot: Allow specifying extra mission capabilities.
This allows specifying extra builds or locales that a VM can handle,
without having these used for every mailing list patch or WineTest run.
The extra capabilities can then be used when manually scheduling a job
on the TestBot.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47853
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
testbot/ddl/update42.sql | 5 +++++
testbot/ddl/winetestbot.sql | 1 +
testbot/doc/winetestbot-schema.dia | 23 +++++++++++++++++++++++
testbot/lib/WineTestBot/Missions.pm | 26 ++++++++++++++++++++++++--
testbot/lib/WineTestBot/VMs.pm | 10 +++++++++-
testbot/web/Submit.pl | 2 +-
testbot/web/admin/VMDetails.pl | 3 ++-
7 files changed, 65 insertions(+), 5 deletions(-)
diff --git a/testbot/ddl/update42.sql b/testbot/ddl/update42.sql
new file mode 100644
index 0000000..f38833e
--- /dev/null
+++ b/testbot/ddl/update42.sql
@@ -0,0 +1,5 @@
+USE winetestbot;
+
+ALTER TABLE VMs
+ ADD MissionCaps VARCHAR(512) NOT NULL
+ AFTER Missions;
diff --git a/testbot/ddl/winetestbot.sql b/testbot/ddl/winetestbot.sql
index e6114e0..e1cb571 100644
--- a/testbot/ddl/winetestbot.sql
+++ b/testbot/ddl/winetestbot.sql
@@ -49,6 +49,7 @@ CREATE TABLE VMs
Type ENUM('win32', 'win64', 'build', 'wine') NOT NULL,
Role ENUM('extra', 'base', 'winetest', 'retired', 'deleted') NOT NULL,
Missions VARCHAR(256) NOT NULL,
+ MissionCaps VARCHAR(512) NOT NULL,
Status ENUM('dirty', 'reverting', 'sleeping', 'idle', 'running', 'off', 'offline', 'maintenance') NOT NULL,
Errors INT(2) NULL,
ChildPid INT(5) NULL,
diff --git a/testbot/doc/winetestbot-schema.dia b/testbot/doc/winetestbot-schema.dia
index 372d3bf..81ab656 100644
--- a/testbot/doc/winetestbot-schema.dia
+++ b/testbot/doc/winetestbot-schema.dia
@@ -2406,6 +2406,29 @@
<dia:string>##</dia:string>
</dia:attribute>
</dia:composite>
+ <dia:composite type="table_attribute">
+ <dia:attribute name="name">
+ <dia:string>#MissionCaps#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="type">
+ <dia:string>#VARCHAR(512)#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="comment">
+ <dia:string>##</dia:string>
+ </dia:attribute>
+ <dia:attribute name="primary_key">
+ <dia:boolean val="false"/>
+ </dia:attribute>
+ <dia:attribute name="nullable">
+ <dia:boolean val="false"/>
+ </dia:attribute>
+ <dia:attribute name="unique">
+ <dia:boolean val="false"/>
+ </dia:attribute>
+ <dia:attribute name="default_value">
+ <dia:string>##</dia:string>
+ </dia:attribute>
+ </dia:composite>
<dia:composite type="table_attribute">
<dia:attribute name="name">
<dia:string>#Status#</dia:string>
diff --git a/testbot/lib/WineTestBot/Missions.pm b/testbot/lib/WineTestBot/Missions.pm
index 4f83875..810eb4d 100644
--- a/testbot/lib/WineTestBot/Missions.pm
+++ b/testbot/lib/WineTestBot/Missions.pm
@@ -142,9 +142,10 @@ sub GetTaskMissionDescription($$)
return $Description;
}
-sub GetMissionCaps($)
+sub GetMissionCaps($$)
{
- my ($MissionStatement) = @_;
+ my ($MissionStatement, $MissionCaps) = @_;
+
my $Capabilities = { build => {}, lang => {} };
# Extract capabilities from the mission statement
@@ -165,6 +166,27 @@ sub GetMissionCaps($)
}
}
}
+
+ # Parse the additional capabilities
+ foreach my $Capability (split /,/, $MissionCaps || "")
+ {
+ if ($Capability =~ s/^lang=//)
+ {
+ foreach my $Lang (split /[|]/, $Capability)
+ {
+ $Capabilities->{lang}->{$Lang} = 1;
+ }
+ }
+ elsif ($Capability =~ /^(?:win32|wow32|wow64)$/)
+ {
+ $Capabilities->{build}->{$Capability} = 1;
+ }
+ else
+ {
+ $ErrMessage ||= "Invalid option capability '$Capability'";
+ }
+ }
+
if (%{$Capabilities->{lang}})
{
# en_US is the default for Wine VMs and must always be supported
diff --git a/testbot/lib/WineTestBot/VMs.pm b/testbot/lib/WineTestBot/VMs.pm
index 6c3c8b7..6dd1ff2 100644
--- a/testbot/lib/WineTestBot/VMs.pm
+++ b/testbot/lib/WineTestBot/VMs.pm
@@ -311,6 +311,7 @@ sub ResetModified($)
$self->SUPER::ResetModified();
$self->{OldType} = $self->Type;
$self->{OldMissions} = $self->Missions;
+ $self->{OldMissionCaps} = $self->MissionCaps;
}
my $_SupportedMissions = {
@@ -347,7 +348,8 @@ sub Validate($)
return ("Role", "Only win32, win64 and wine VMs can have a role of '" . $self->Role . "'");
}
if ($self->ValuesDiffer($self->{OldType}, $self->Type) or
- $self->ValuesDiffer($self->{OldMissions}, $self->Missions))
+ $self->ValuesDiffer($self->{OldMissions}, $self->Missions) or
+ $self->ValuesDiffer($self->{OldMissionCaps}, $self->MissionCaps))
{
my ($ErrMessage, $Missions) = ParseMissionStatement($self->Missions);
return ("Missions", $ErrMessage) if (defined $ErrMessage);
@@ -366,8 +368,13 @@ sub Validate($)
}
}
}
+
+ ($ErrMessage, my $_Caps) = GetMissionCaps("", $self->MissionCaps);
+ return ("MissionCaps", $ErrMessage) if (defined $ErrMessage);
+
$self->{OldType} = $self->Type;
$self->{OldMissions} = $self->Missions;
+ $self->{OldMissionCaps} = $self->MissionCaps;
}
return $self->SUPER::Validate();
@@ -734,6 +741,7 @@ my @PropertyDescriptors = (
CreateEnumPropertyDescriptor("Type", "Type of VM", !1, 1, ['win32', 'win64', 'build', 'wine']),
CreateEnumPropertyDescriptor("Role", "VM Role", !1, 1, ['extra', 'base', 'winetest', 'retired', 'deleted']),
CreateBasicPropertyDescriptor("Missions", "Missions", !1, 1, "A", 256),
+ CreateBasicPropertyDescriptor("MissionCaps", "Mission Capabilities", !1, !1, "A", 512),
CreateEnumPropertyDescriptor("Status", "Current status", !1, 1, ['dirty', 'reverting', 'sleeping', 'idle', 'running', 'off', 'offline', 'maintenance']),
CreateBasicPropertyDescriptor("Errors", "Errors", !1, !1, "N", 2),
CreateBasicPropertyDescriptor("ChildPid", "Child process id", !1, !1, "N", 5),
diff --git a/testbot/web/Submit.pl b/testbot/web/Submit.pl
index f76ca6e..5e9a61e 100644
--- a/testbot/web/Submit.pl
+++ b/testbot/web/Submit.pl
@@ -484,7 +484,7 @@ sub _initialize($$$)
foreach my $VMKey (@$SortedKeys)
{
my $VM = $VMs->GetItem($VMKey);
- my ($ErrMessage, $Caps) = GetMissionCaps($VM->Missions);
+ my ($ErrMessage, $Caps) = GetMissionCaps($VM->Missions, $VM->MissionCaps);
LogMsg "$ErrMessage\n" if (defined $ErrMessage);
my @Builds = $VM->Type eq "wine" ? keys %{$Caps->{build}} : ("vm");
diff --git a/testbot/web/admin/VMDetails.pl b/testbot/web/admin/VMDetails.pl
index 095de3a..27ffd2f 100644
--- a/testbot/web/admin/VMDetails.pl
+++ b/testbot/web/admin/VMDetails.pl
@@ -74,7 +74,7 @@ sub GenerateFooter($)
print "<thead><tr><th class='Record'>Legend</th></tr></thead>\n";
print "<tbody><tr><td class='Record'>\n";
- print "<p>The Missions syntax is <i>mission1:mission2:...|mission3|...</i> where <i>mission1</i> and <i>mission2</i> will be run in the same task, and <i>mission3</i> in a separate task.<br>\n";
+ print "<p>The <b>Missions</b> syntax is <i>mission1:mission2:...|mission3|...</i> where <i>mission1</i> and <i>mission2</i> will be run in the same task, and <i>mission3</i> in a separate task.<br>\n";
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";
@@ -82,6 +82,7 @@ sub GenerateFooter($)
print "The <i>lang</i> option can be set to run the tests in the specified \$LANG locale. The default is en_US (<i>.UTF-8</i> can be omitted).<br>\n";
print "The <i>dir</i> option can be set to specify the directory in which to run the tests. A path starting with a single letter followed by a slash specifies the drive, for instance 'c/' for 'c:' (the default).<br>\n";
print "If set, the <i>nosubmit</i> option specifies that the WineTest results should not be published online.</p>\n";
+ print "<p>The <b>MissionCaps</b> syntax is <i>option1,option2=value1|value2,...</i> where <i>option1</i> is either a build or an option name, and <i>option2</i> is the name of an option that can be set to either <i>value1</i> or <i>value2</i>.<br>\n";
print "</td></tr></tbody>\n";
print "</table></div>\n";
$self->SUPER::GenerateFooter();
Module: tools
Branch: master
Commit: 24ec563556c4f359a9049643c8d80ec97d197468
URL: https://source.winehq.org/git/tools.git/?a=commit;h=24ec563556c4f359a904964…
Author: Francois Gouget <fgouget(a)codeweavers.com>
Date: Wed Mar 4 09:47:57 2020 +0100
winetest/dissect: Fix handling of near timeouts.
Sometimes WineTest times out waiting for a test but that test completes
at almost the same time so that there is still a valid result line. This
was causing dissect to complain about the inconsistency between the
test's failure count and the 258 'exit code'.
With this change dissect matches the TestBot Wine report parser.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
winetest/dissect | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/winetest/dissect b/winetest/dissect
index 87fdc65..8f30ccd 100755
--- a/winetest/dissect
+++ b/winetest/dissect
@@ -739,17 +739,17 @@ while ($line = <IN>) {
my $class = $l_rc ? "failed" : "";
add_test_line($class, escapeHTML($line));
- if ((!$l_pid and !%pids) or ($l_pid and !$pids{$l_pid} and !$pids{0}))
+ if ($l_rc == 258)
+ {
+ add_test_line("end", "Test failed: timed out");
+ $summary = "failed 258";
+ $extra_failures++;
+ $broken = 1;
+ }
+ elsif ((!$l_pid and !%pids) or ($l_pid and !$pids{$l_pid} and !$pids{0}))
{
# The main summary line is missing
- if ($l_rc == 258)
- {
- add_test_line("end", "Test failed: timed out");
- $summary = "failed 258";
- $extra_failures++;
- $broken = 1;
- }
- elsif ($l_rc & 0xc0000000)
+ if ($l_rc & 0xc0000000)
{
add_test_line("end", sprintf("Test failed: crash (%08x)", $l_rc & 0xffffffff));
$summary = "failed crash";