[PATCH] testbot: Add a 'lang' option for the Wine missions.
Francois Gouget
fgouget at codeweavers.com
Sun Nov 18 17:53:32 CST 2018
Appending ',lang=xxx' sets $LANG when running the Wine tests.
This allows running the Wine tests in multiple locales by creating
multiple missions with different lang values.
Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
---
testbot/lib/Build/Utils.pm | 7 ++++
testbot/lib/WineTestBot/LogUtils.pm | 59 +++++++++++++++++++--------
testbot/lib/WineTestBot/Missions.pm | 45 +++++++++++++++++++-
testbot/lib/WineTestBot/StepsTasks.pm | 18 +-------
testbot/lib/WineTestBot/Utils.pm | 15 ++++++-
testbot/web/admin/VMDetails.pl | 1 +
6 files changed, 108 insertions(+), 37 deletions(-)
diff --git a/testbot/lib/Build/Utils.pm b/testbot/lib/Build/Utils.pm
index 06fb3d87fc..4dda8d51fc 100644
--- a/testbot/lib/Build/Utils.pm
+++ b/testbot/lib/Build/Utils.pm
@@ -334,6 +334,13 @@ sub SetupWineEnvironment($)
$ENV{WINEPREFIX} = "$DataDir/wineprefix-$BaseName";
$ENV{DISPLAY} ||= ":0.0";
+ my $Lang = $Mission->{lang} || "en_US";
+ if ($Lang =~ /^[a-zA-Z0-9\@_.-]+$/)
+ {
+ $Lang .= ".UTF-8" if ($Lang !~ /\./);
+ $ENV{LANG} = $Lang;
+ }
+
return $BaseName;
}
diff --git a/testbot/lib/WineTestBot/LogUtils.pm b/testbot/lib/WineTestBot/LogUtils.pm
index f142982df4..fee4278105 100644
--- a/testbot/lib/WineTestBot/LogUtils.pm
+++ b/testbot/lib/WineTestBot/LogUtils.pm
@@ -36,6 +36,7 @@ use Algorithm::Diff;
use File::Basename;
use WineTestBot::Config; # For $MaxUnitSize
+use WineTestBot::Utils; # For LocaleName()
#
@@ -578,31 +579,47 @@ sub GetLogFileNames($;$)
{
my ($Dir, $IncludeOld) = @_;
- my @Candidates = ("exe32.report", "exe64.report",
- "win32.report", "wow32.report", "wow64.report",
- "log");
- push @Candidates, "old_log" if ($IncludeOld);
+ my @Globs = qw(exe32.report exe32_*.report
+ exe64.report exe64_*.report
+ win32.report win32_*.report
+ wow32.report wow32_*.report
+ wow64.report wow64_*.report
+ log);
+ push @Globs, "old_log" if ($IncludeOld);
- my @Logs;
- foreach my $FileName (@Candidates)
+ my (@Logs, %Seen);
+ foreach my $Glob (@Globs)
{
- if ((-f "$Dir/$FileName" and !-z "$Dir/$FileName") or
- (-f "$Dir/$FileName.err" and !-z "$Dir/$FileName.err"))
+ foreach my $FileName (glob("'$Dir/$Glob*'"))
{
- push @Logs, $FileName;
+ my $LogName = basename($FileName);
+ if ($LogName !~ s/\.err$// and $LogName !~ /\.report$/ and
+ $LogName ne $Glob) # 'log' case
+ {
+ # Not a valid log filename (where does this file come from?)
+ next;
+ }
+ next if ($Seen{$LogName});
+ $Seen{$LogName} = 1;
+
+ if ((-f "$Dir/$LogName" and !-z "$Dir/$LogName") or
+ (-f "$Dir/$LogName.err" and !-z "$Dir/$LogName.err"))
+ {
+ push @Logs, $LogName;
+ }
}
}
return \@Logs;
}
my %_LogFileLabels = (
- "exe32.report" => "32 bit report",
- "exe64.report" => "64 bit report",
- "win32.report" => "32 bit report",
- "wow32.report" => "32 bit WoW report",
- "wow64.report" => "64 bit WoW report",
- "log" => "task log",
- "old_log" => "old logs",
+ "exe32.report" => '32 bit%s report',
+ "exe64.report" => '64 bit%s report',
+ "win32.report" => '32 bit%s report',
+ "wow32.report" => '32 bit%s WoW report',
+ "wow64.report" => '64 bit%s WoW report',
+ "log" => 'task%s log',
+ "old_log" => 'old%s logs',
);
=pod
@@ -618,7 +635,15 @@ Returns a user-friendly description of the content of the specified log file.
sub GetLogLabel($)
{
my ($LogFileName) = @_;
- return $_LogFileLabels{$LogFileName};
+
+ my $Extra = "";
+ if ($LogFileName =~ /^([^_]+)_(.*)\.report$/)
+ {
+ $LogFileName = "$1.report";
+ $Extra = " ". LocaleName($2);
+ }
+ my $Label = $_LogFileLabels{$LogFileName};
+ return defined $Label ? sprintf($Label, $Extra) : $LogFileName;
}
diff --git a/testbot/lib/WineTestBot/Missions.pm b/testbot/lib/WineTestBot/Missions.pm
index 0dc812d6ba..dcaeb31d1d 100644
--- a/testbot/lib/WineTestBot/Missions.pm
+++ b/testbot/lib/WineTestBot/Missions.pm
@@ -26,9 +26,12 @@ WineTestBot::Missions - Missions parser and helper functions
=cut
use Exporter 'import';
-our @EXPORT = qw(DumpMissions GetMissionBaseName ParseMissionStatement
+our @EXPORT = qw(DumpMissions GetMissionBaseName GetTaskMissionDescription
+ ParseMissionStatement
MergeMissionStatementTasks SplitMissionStatementTasks);
+use WineTestBot::Utils;
+
sub DumpMissions($$)
{
@@ -89,7 +92,45 @@ sub ParseMissionStatement($)
sub GetMissionBaseName($)
{
my ($Mission) = @_;
- return $Mission->{Build};
+
+ my $BaseName = $Mission->{Build};
+
+ # Option values may be tainted if they come from the command line
+ my $Lang = $Mission->{lang} || "";
+ $BaseName .= "_$1" if ($Lang =~ /^([a-zA-Z0-9\@_.-]+)$/); # untaint
+
+ return $BaseName;
+}
+
+sub GetTaskMissionDescription($)
+{
+ my ($TaskMission) = @_;
+
+ my $Builds = $TaskMission->{Builds};
+ my $Description =
+ $Builds->{build} ? "build" :
+ ($Builds->{exe64} and ($Builds->{exe32} or $Builds->{exe32})) ? "32 & 64 bit executable" :
+ $Builds->{exe32} ? "32 bit executable" :
+ $Builds->{exe64} ? "64 bit executable" :
+ ($Builds->{wow64} and ($Builds->{win32} or $Builds->{wow32})) ? "32 & 64 bit" :
+ $Builds->{win32} ? "32 bit" :
+ $Builds->{wow32} ? "32 bit WoW" :
+ "64 bit WoW";
+
+ my $Lang;
+ foreach my $Mission (@{$TaskMission->{Missions}})
+ {
+ next if (!$Mission->{lang});
+ if (defined $Lang)
+ {
+ $Description .= " + Locales";
+ $Lang = undef;
+ last;
+ }
+ $Lang = $Mission->{lang};
+ }
+ $Description .= " ". LocaleName($Lang) if ($Lang);
+ return $Description;
}
sub MergeMissionStatementTasks($)
diff --git a/testbot/lib/WineTestBot/StepsTasks.pm b/testbot/lib/WineTestBot/StepsTasks.pm
index 8128bf9c57..4a803e775a 100644
--- a/testbot/lib/WineTestBot/StepsTasks.pm
+++ b/testbot/lib/WineTestBot/StepsTasks.pm
@@ -91,23 +91,7 @@ sub GetTitle($)
my ($ErrMessage, $Missions) = ParseMissionStatement($self->Missions);
if (!defined $ErrMessage and @$Missions == 1)
{
- my $Builds = $Missions->[0]->{Builds};
- if ($Builds->{build})
- {
- push @TitleParts, "build";
- }
- elsif ($Builds->{wow64} and ($Builds->{win32} or $Builds->{wow32}))
- {
- push @TitleParts, "32 & 64 bit";
- }
- elsif ($Builds->{win32} or $Builds->{wow32})
- {
- push @TitleParts, "32 bit";
- }
- elsif ($Builds->{wow64})
- {
- push @TitleParts, "64 bit";
- }
+ push @TitleParts, GetTaskMissionDescription($Missions->[0]);
}
}
if ($self->Type ne "suite" and $self->CmdLineArg)
diff --git a/testbot/lib/WineTestBot/Utils.pm b/testbot/lib/WineTestBot/Utils.pm
index 6fa0ccce7c..6681072caa 100644
--- a/testbot/lib/WineTestBot/Utils.pm
+++ b/testbot/lib/WineTestBot/Utils.pm
@@ -30,9 +30,11 @@ use Exporter 'import';
our @EXPORT = qw(MakeSecureURL SecureConnection GenerateRandomString
OpenNewFile CreateNewFile CreateNewLink CreateNewDir
DurationToString BuildEMailRecipient IsValidFileName
- BuildTag SanitizeTag ShQuote ShArgv2Cmd);
+ BuildTag SanitizeTag LocaleName ShQuote ShArgv2Cmd);
use Fcntl;
+use Locale::Language;
+use Locale::Country;
use WineTestBot::Config;
@@ -104,6 +106,17 @@ sub BuildEMailRecipient($$)
return $Recipient;
}
+sub LocaleName($)
+{
+ my ($Locale) = @_;
+
+ if ($Locale =~ /^([a-z]+)_([A-Z]+)(?:\.|$)/)
+ {
+ return (code2language($1) || $1) .":". (code2country($2) || $2);
+ }
+ return $Locale;
+}
+
#
# Temporary file helpers
diff --git a/testbot/web/admin/VMDetails.pl b/testbot/web/admin/VMDetails.pl
index 4b7799a8cf..4dd9e2501a 100644
--- a/testbot/web/admin/VMDetails.pl
+++ b/testbot/web/admin/VMDetails.pl
@@ -79,6 +79,7 @@ sub GenerateFooter($)
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 "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 "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";
--
2.19.1
More information about the wine-devel
mailing list