Firefox-Marionette
view release on metacpan or search on metacpan
t/author/bulk_test.pl view on Meta::CPAN
my $oldfh = select STDOUT; $OUTPUT_AUTOFLUSH = 1; select $oldfh;
$oldfh = select STDERR; $OUTPUT_AUTOFLUSH = 1; select $oldfh;
my @sig_names = split q[ ], $Config{sig_name};
our $start_time = time;
print "Start time is " . (localtime $start_time) . "\n";
if (exists $ENV{COUNT}) {
$0 = "Test run number $ENV{COUNT}";
}
system { 'ssh-add' } 'ssh-add', '-l' and die "The SSH agent needs to be loaded with keys";
my $background_failed;
my $parent_pid = $PID;
my $devel_cover_db_format = 'JSON';
my $cover_db_path = '/tmp';
my $cover_db_name = 'cover_db';
my $devel_cover_inc = '-MDevel::Cover=-silent,1';
my $devel_cover_inc_with_space = $devel_cover_inc ? " $devel_cover_inc" : q[];
my $local_devel_cover_inc = $devel_cover_inc ? "$devel_cover_inc,-db,$cover_db_path/$cover_db_name" : q[];
my $local_devel_cover_inc_with_space = $local_devel_cover_inc ? " $local_devel_cover_inc" : q[];
my $test_marionette_file = 't/01-marionette.t';
my $reset_time = 600; # 10 minutes
my $max_attempts = 3;
my $reboot_sleep_time = 60;
$ENV{RELEASE_TESTING} = 1;
$ENV{FIREFOX_ALARM} = 900;
$ENV{DEVEL_COVER_DB_FORMAT} = $devel_cover_db_format;
system { 'cover' } 'cover', '-delete', $cover_db_name and die "Failed to 'cover' for " . ($ENV{FIREFOX_BINARY} || 'firefox');
system { 'cover' } 'cover', '-delete', "$cover_db_path/$cover_db_name" and die "Failed to 'cover' for " . ($ENV{FIREFOX_BINARY} || 'firefox');
MAIN: {
my $cwd = Cwd::cwd();
my $test_directory = File::Spec->catdir($cwd, 't');
my $test_directory_handle = DirHandle->new($test_directory);
my @syscall_entries;
if ($test_directory_handle) {
while(my $entry = $test_directory_handle->read()) {
next if ($entry eq File::Spec->updir());
next if ($entry eq File::Spec->curdir());
next if ($entry !~ /03\-/smx);
push @syscall_entries, File::Spec->catfile($test_directory, $entry);
}
} else {
die "Failed to open test directory:$!";
}
my @servers;
my $csv = Text::CSV_XS->new ({ binary => 1, auto_diag => 1 });
my $servers_path = $cwd . '/servers.csv';
if (open my $handle, "<:encoding(utf8)", $servers_path) {
my %headers;
my $count = 0;
foreach my $name ($csv->header($handle, { detect_bom => 1, munge_column_names => sub { lc (s/[ ]/_/grsmx ) }})) {
$headers{$name} = $count;
$count += 1;
}
while (my $row = $csv->getline ($handle)) {
my $server = {};
foreach my $key (sort { $a cmp $b } keys %headers) {
$server->{$key} = $row->[$headers{$key}];
}
$server->{port} ||= $server->{os} eq 'android' ? 5555 : 22;
$server->{user} ||= getpwuid $UID;
push @servers, $server;
}
close $handle or die "Failed to close $servers_path:$EXTENDED_OS_ERROR";
} elsif ($OS_ERROR == POSIX::ENOENT()) {
} else {
die "Failed to open $servers_path for reading: $EXTENDED_OS_ERROR";
}
my $win32_remote_alarm = 7800;
my $win32_via_alarm = 7800;
my $background_pids = {};
foreach my $server (@servers) {
if (my $pid = fork) {
$background_pids->{$pid} = $server;
} elsif (defined $pid) {
eval {
my $win32_local_alarm = 1200;
my $cygwin_local_alarm = 2700;
my $cygwin_remote_alarm = 7800;
my $physical_local_alarm = 1200;
$ENV{FIREFOX_ALARM} = $win32_remote_alarm;
$ENV{FIREFOX_NO_RECONNECT} = 1;
if ((lc $server->{type}) eq 'virsh') {
if (_virsh_node_running($server)) {
_determine_address($server);
_virsh_shutdown($server);
_sleep_until_shutdown($server);
}
_execute($server, undef, 'sudo', 'virsh', 'start', $server->{name});
_determine_address($server);
my $socket = _sleep_until_tcp_available($server);
if ($socket) {
close $socket;
if ($server->{os} eq 'win32') {
$server->{initial_command} = 'cd %TMP%';
_wait_for_server_to_boot($server);
_cleanup_server($server);
my $remote_tmp_directory = join q[], _remote_contents($server, undef, 'echo %TMP%');
$remote_tmp_directory =~ s/[\r\n]+$//smx;
$remote_tmp_directory =~ s/\\/\//smxg;
if (!$remote_tmp_directory) {
die "Unable to find remote temp directory";
}
my $cygwin_tmp_directory = $remote_tmp_directory;
$cygwin_tmp_directory =~ s/^C:/\/cygdrive\/c/smx;
my $local_username = getpwuid $EFFECTIVE_USER_ID;
$server->{cygwin_command} = "cd $cygwin_tmp_directory";
_cleanup_cygwin($server);
my $cover_db_format = join q[], _remote_contents($server, undef, 'echo %DEVEL_COVER_DB_FORMAT%');
$cover_db_format =~ s/[\r\n]+$//smx;
$cover_db_format =~ s/\\/\//smxg;
if ($cover_db_format ne $devel_cover_db_format) {
die "Bad DEVEL_COVER_DB_FORMAT Environment variable";
}
my $count = 0;
REMOTE_WIN32_FIREFOX: {
local $ENV{FIREFOX_NO_UPDATE} = 1;
local $ENV{FIREFOX_USER} = $server->{user};
local $ENV{FIREFOX_HOST} = $server->{address};
$count += 1;
my $start_execute_time = time;
my $result = _execute($server, { alarm_after => $ENV{FIREFOX_ALARM}, return_result => 1 }, $^X, ($local_devel_cover_inc ? $local_devel_cover_inc : ()), '-Ilib', $test_marionette_file);
my $total_execute_time = time - $start_execute_time;
if ($result != 0) {
if ($count < $max_attempts) {
my $error_message = _error_message($^X, $CHILD_ERROR);
_log_stderr($server, "Failed '$^X$local_devel_cover_inc_with_space -Ilib $test_marionette_file' with FIREFOX_USER=$server->{user} and FIREFOX_HOST=$server->{address} at " . localtime . " exited with a '$error_message' after $total_execute_t...
if (_restart_server($server, $count)) {
redo REMOTE_WIN32_FIREFOX;
} else {
die "Failed to restart remote $server->{name} on time $count";
}
} else {
die "Failed to make $count times";
}
}
}
$count = 0;
if ($server->{cygwin}) {
REMOTE_CYGWIN_FIREFOX: {
local $ENV{FIREFOX_NO_UPDATE} = 1;
local $ENV{FIREFOX_USER} = $server->{user};
my $port = $server->{cygwin};
local $ENV{FIREFOX_PORT} = $port;
local $ENV{FIREFOX_HOST} = $server->{address};
$count += 1;
my $start_execute_time = time;
my $result = _execute($server, { alarm_after => $ENV{FIREFOX_ALARM}, return_result => 1 }, $^X, ($local_devel_cover_inc ? $local_devel_cover_inc : ()), '-Ilib', $test_marionette_file);
my $total_execute_time = time - $start_execute_time;
if ($result != 0) {
if ($count < $max_attempts) {
my $error_message = _error_message($^X, $CHILD_ERROR);
_log_stderr($server, "Failed '$^X$local_devel_cover_inc_with_space -Ilib $test_marionette_file' with FIREFOX_USER=$server->{user} and FIREFOX_HOST=$server->{address}:$port at " . localtime . " exited with a '$error_message' after $total_ex...
if (_restart_server($server, $count)) {
redo REMOTE_CYGWIN_FIREFOX;
} else {
die "Failed to restart remote $server->{name} on time $count";
}
} else {
die "Failed to make $count times";
}
}
}
}
_remote_execute($server, {}, "mkdir $remote_tmp_directory/firefox-marionette");
_execute($server, undef, 'scp', '-r', '-P', $server->{port}, Cwd::cwd() . '/lib', Cwd::cwd() . '/t', $server->{user} . q[@] . $server->{address} . q[:] . $remote_tmp_directory . '/firefox-marionette');
t/author/bulk_test.pl view on Meta::CPAN
}
} else {
die "Failed to make $count times";
}
}
}
}
if ($devel_cover_inc) {
_execute($server, undef, 'scp', '-r', '-P', $server->{port}, $server->{user} . q[@] . $server->{address} . q[:/] . $remote_tmp_directory . q[/firefox-marionette/] . $cover_db_name, $cover_db_path . '/');
}
_cleanup_server($server);
_virsh_shutdown($server);
_sleep_until_shutdown($server);
} elsif ($server->{os} eq 'android') {
my $count = 0;
_execute($server, { alarm_after => $ENV{FIREFOX_ALARM}, return_result => 1 }, $^X, ($local_devel_cover_inc ? $local_devel_cover_inc : ()), '-Ilib', '-MFirefox::Marionette', '-e', "Firefox::Marionette->new(adb => '$server->{address}');");
_execute($server, { alarm_after => $ENV{FIREFOX_ALARM}, return_result => 1 }, $^X, ($local_devel_cover_inc ? $local_devel_cover_inc : ()), '-Ilib', '-MFirefox::Marionette', '-e', "Firefox::Marionette->new(adb => '$server->{address}', port => $...
_execute($server, undef, 'adb', 'shell', 'poweroff');
}
} else {
die "SSH server is not detected";
}
} elsif ((lc $server->{type}) eq 'physical') {
my $socket = _sleep_until_tcp_available($server);
if ($socket) {
my $remote_tmp_directory = join q[], _remote_contents($server, undef, 'echo $TMPDIR');
_remote_execute($server, undef, "rm -Rf $remote_tmp_directory/firefox-marionette");
_remote_execute($server, undef, "mkdir $remote_tmp_directory/firefox-marionette");
_execute($server, undef, 'scp', '-r', '-P', $server->{port}, Cwd::cwd() . '/lib', Cwd::cwd() . '/t', $server->{user} . q[@] . $server->{address} . q[:] . $remote_tmp_directory . '/firefox-marionette');
$server->{initial_command} = "cd ${remote_tmp_directory}firefox-marionette";
my $count = 0;
REMOTE_PHYSICAL_FIREFOX: {
local $ENV{FIREFOX_NO_UPDATE} = 1;
local $ENV{FIREFOX_NO_VISIBLE} = 1;
local $ENV{FIREFOX_USER} = 'firefox';
local $ENV{FIREFOX_HOST} = $server->{address};
$count += 1;
my $start_execute_time = time;
my $result = _execute($server, { alarm_after => $ENV{FIREFOX_ALARM}, return_result => 1 }, $^X, ($local_devel_cover_inc ? $local_devel_cover_inc : ()), '-Ilib', $test_marionette_file);
my $total_execute_time = time - $start_execute_time;
if ($result != 0) {
if ($count < $max_attempts) {
my $error_message = _error_message($^X, $CHILD_ERROR);
_log_stderr($server, "Failed '$^X$local_devel_cover_inc_with_space -Ilib $test_marionette_file' with FIREFOX_USER=$server->{user} and FIREFOX_HOST=$server->{address} at " . localtime . " exited with a '$error_message' after $total_execute_ti...
redo REMOTE_PHYSICAL_FIREFOX;
} else {
die "Failed to make $count times";
}
}
}
my $via_address;
my $remote_address;
my $remote_user;
foreach my $remote (@servers) {
if ((lc $remote->{type}) eq 'virsh') {
if ($remote->{os} eq 'win32') {
while (!_virsh_node_running($remote)) {
sleep 5;
}
_determine_address($remote);
my $local_username = getpwuid $EFFECTIVE_USER_ID;
my $jump_ip_address = _get_best_local_ip_match($server->{address});
$via_address = 'jump' . q[@] . $jump_ip_address;
$remote_user = $remote->{user};
$remote_address = $remote->{address};
}
}
}
foreach my $command (
{ alarm_after => $win32_via_alarm, command_line => "DEVEL_COVER_DB_FORMAT=JSON RELEASE_TESTING=1 FIREFOX_VIA=$via_address FIREFOX_USER=$remote_user FIREFOX_HOST=$remote_address FIREFOX_NO_RECONNECT=1 FIREFOX_NO_UPDATE=1 perl$devel_cover_inc...
{ alarm_after => $physical_local_alarm, command_line => "DEVEL_COVER_DB_FORMAT=JSON FIREFOX_NO_VISIBLE=1 RELEASE_TESTING=1 FIREFOX_NO_UPDATE=1 perl$devel_cover_inc_with_space -Ilib $test_marionette_file" },
{ alarm_after => $physical_local_alarm, command_line => "DEVEL_COVER_DB_FORMAT=JSON FIREFOX_NO_VISIBLE=1 FIREFOX_DEVELOPER=1 RELEASE_TESTING=1 FIREFOX_NO_UPDATE=1 perl$devel_cover_inc_with_space -Ilib $test_marionette_file" },
{ alarm_after => $physical_local_alarm, command_line => "DEVEL_COVER_DB_FORMAT=JSON FIREFOX_NO_VISIBLE=1 FIREFOX_NIGHTLY=1 RELEASE_TESTING=1 FIREFOX_NO_UPDATE=1 perl$devel_cover_inc_with_space -Ilib $test_marionette_file" },
{ alarm_after => $physical_local_alarm, command_line => "DEVEL_COVER_DB_FORMAT=JSON FIREFOX_NO_VISIBLE=1 WATERFOX=1 FIREFOX_NO_RECONNECT=1 FIREFOX_NO_NETWORK=1 RELEASE_TESTING=1 FIREFOX_NO_UPDATE=1 perl$devel_cover_inc_with_space -Ilib $tes...
{ alarm_after => $physical_local_alarm, command_line => "DEVEL_COVER_DB_FORMAT=JSON FIREFOX_NO_VISIBLE=1 WATERFOX_VIA_FIREFOX=1 FIREFOX_NO_RECONNECT=1 FIREFOX_NO_NETWORK=1 RELEASE_TESTING=1 FIREFOX_NO_UPDATE=1 perl$devel_cover_inc_with_spac...
) {
$count = 0;
REMOTE_FIREFOX: {
$count += 1;
my $start_execute_time = time;
_remote_execute($server, undef, 'killall firefox || true');
_remote_execute($server, undef, 'killall perl || true');
my $result = _remote_execute($server, { alarm_after => $command->{alarm_after}, return_result => 1 }, $command->{command_line});
my $total_execute_time = time - $start_execute_time;
if ($result != 0) {
if ($count < $max_attempts) {
my $error_message = _error_message('ssh', $CHILD_ERROR);
_log_stderr($server, "Failed '$command->{command_line}' at " . localtime . " exited with a '$error_message' after $total_execute_time seconds. Sleeping for $reset_time seconds");
_remote_execute($server, undef, 'killall firefox || true');
_remote_execute($server, undef, 'killall perl || true');
redo REMOTE_FIREFOX;
} else {
die "Failed to make $count times";
}
}
}
}
if ($devel_cover_inc) {
_execute($server, undef, 'scp', '-r', '-P', $server->{port}, $server->{user} . q[@] . $server->{address} . q[:] . $remote_tmp_directory . q[firefox-marionette/] . $cover_db_name, $cover_db_path . '/');
}
} else {
die "SSH server is not detected at $server->{address}";
}
} else {
die "Unknown server type '$server->{type}' in $servers_path";
}
_log_stderr($server, "Test Suite for " . ($server->{name} || $server->{address}) . " has completed successfully");
exit 0;
} or do {
_log_stderr($server, "Caught an exception while remote testing:$EVAL_ERROR");
};
exit 1;
} else {
die "Failed to fork:$EXTENDED_OS_ERROR";
}
}
my $path = File::Spec->catdir(File::HomeDir::my_home(), 'den');
my $initial_upgrade_package = 'firefox-52.0esr.tar.bz2';
my $initial_upgrade_directory = 'firefox-upgrade';
sub setup_upgrade {
if (-e "$path/$initial_upgrade_package") {
( run in 1.912 second using v1.01-cache-2.11-cpan-f56aa216473 )