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 )