[infra] Improve port selection for safaridriver

Bug: b/208186791
Cq-Include-Trybots: luci.dart.try:dart2js-strong-mac-x64-safari-try
Change-Id: I654ce8a60746c79d2922eebbda4cced822c821cf
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/242871
Auto-Submit: Alexander Thomas <athom@google.com>
Reviewed-by: William Hesse <whesse@google.com>
Commit-Queue: William Hesse <whesse@google.com>
This commit is contained in:
Alexander Thomas 2022-04-29 12:55:41 +00:00 committed by Commit Bot
parent 38438fb165
commit d45ae603f7

View file

@ -261,8 +261,6 @@ abstract class Browser {
}
abstract class WebDriverBrowser extends Browser {
static int _nextPort = 4444;
final int _port = _nextPort++;
WebDriver _driver;
String get driverExecutable;
@ -272,11 +270,12 @@ abstract class WebDriverBrowser extends Browser {
@override
Future<bool> start(String url) async {
_logEvent('Starting $this browser on: $url');
var port = await _findUnusedPort();
if (!await startBrowserProcess(
driverExecutable, ['--port', '$_port', ...driverArguments])) {
driverExecutable, ['--port', '$port', ...driverArguments])) {
return false;
}
await _createDriver();
await _createDriver(port);
await _driver.get(url);
try {
_logEvent('Got version: ${await version}');
@ -287,13 +286,13 @@ abstract class WebDriverBrowser extends Browser {
return true;
}
Future<void> _createDriver() async {
Future<void> _createDriver(int port) async {
for (var i = 5; i >= 0; i--) {
// Give the driver process some time to be ready to accept connections.
await Future.delayed(const Duration(seconds: 1));
try {
_driver = await createDriver(
uri: Uri.parse('http://localhost:$_port/'),
uri: Uri.parse('http://localhost:$port/'),
desired: desiredCapabilities);
} catch (error) {
if (i > 0) {
@ -309,6 +308,24 @@ abstract class WebDriverBrowser extends Browser {
}
}
/// Returns a port that is probably, but not definitely, not in use.
///
/// This has a built-in race condition: another process may bind this port at
/// any time after this call has returned.
static Future<int> _findUnusedPort() async {
int port;
ServerSocket socket;
try {
socket = await ServerSocket.bind(InternetAddress.loopbackIPv6, 0,
v6Only: true);
} on SocketException {
socket = await ServerSocket.bind(InternetAddress.loopbackIPv4, 0);
}
port = socket.port;
await socket.close();
return port;
}
@override
Future<bool> close() async {
try {