blob: 09c8a942e56cb0cb2c3945648ff31f6558d1ee10 [file]
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:async';
import 'dart:io';
import 'package:smith/smith.dart';
import '../test_progress.dart';
const safariDriverPort = 7055;
class WebDriverService extends EventListener {
static final _instances = <Runtime, WebDriverService>{};
static final supportedRuntimes = <Runtime>{Runtime.safari};
bool _running = false;
Process _process;
final int port;
WebDriverService._(this.port, this._process) {
_process.exitCode.then((exitCode) {
if (_running) {
print('WebDriverService stopped unexpectedly: $exitCode');
_running = false;
}
});
}
@override
void allDone() {
_process.kill();
_running = false;
}
static Future<WebDriverService> startServiceForRuntime(
Runtime runtime,
) async {
var service = _instances[runtime];
String driverExecutable;
List<String> driverArguments;
int port;
if (service != null) {
return service;
}
switch (runtime) {
case Runtime.safari:
driverExecutable = '/usr/bin/safaridriver';
driverArguments = const [];
port = safariDriverPort;
break;
default:
throw ArgumentError.value(runtime, 'runtime', 'Unsupported runtime');
}
try {
var process = await Process.start(driverExecutable, [
'--port',
'$port',
...driverArguments,
]);
print('Started WebDriverService on port $port');
return _instances[runtime] = WebDriverService._(
safariDriverPort,
process,
);
} catch (error) {
print('Failed to start $runtime web driver service: $error');
rethrow;
}
}
factory WebDriverService.fromRuntime(Runtime runtime) {
return _instances[runtime] ??
(throw ArgumentError.value(runtime, 'runtime', 'Service unavailable'));
}
}