| // Copyright 2013 The Flutter Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| // @dart = 2.6 | |
| import 'dart:async'; | |
| import 'dart:io' as io; | |
| import 'package:args/args.dart'; | |
| import 'package:http/http.dart'; | |
| import 'package:path/path.dart' as path; | |
| import 'common.dart'; | |
| import 'environment.dart'; | |
| class EdgeArgParser extends BrowserArgParser { | |
| static final EdgeArgParser _singletonInstance = EdgeArgParser._(); | |
| /// The [EdgeArgParser] singleton. | |
| static EdgeArgParser get instance => _singletonInstance; | |
| String _version; | |
| EdgeArgParser._(); | |
| @override | |
| void populateOptions(ArgParser argParser) { | |
| argParser | |
| ..addOption( | |
| 'edge-version', | |
| defaultsTo: 'system', | |
| help: 'The Edge version to use while running tests. The Edge ' | |
| 'browser installed on the system is used as the only option now.', | |
| ); | |
| } | |
| @override | |
| void parseOptions(ArgResults argResults) { | |
| _version = argResults['edge-version'] as String; | |
| assert(_version == 'system'); | |
| } | |
| @override | |
| String get version => _version; | |
| } | |
| /// Returns the installation of Edge. | |
| /// | |
| /// Currently uses the Edge version installed on the operating system. | |
| /// | |
| /// As explained on the Microsoft help page: `Microsoft Edge comes | |
| /// exclusively with Windows 10 and cannot be downloaded or installed separately.` | |
| /// See: https://support.microsoft.com/en-us/help/17171/microsoft-edge-get-to-know | |
| /// | |
| // TODO(nurhan): Investigate running tests for the tech preview downloads | |
| // from the beta channel. | |
| Future<BrowserInstallation> getEdgeInstallation( | |
| String requestedVersion, { | |
| StringSink infoLog, | |
| }) async { | |
| // For now these tests are aimed to run only on Windows machines local or on LUCI/CI. | |
| // In the future we can investigate to run them on Android or on MacOS. | |
| if (!io.Platform.isWindows) { | |
| throw UnimplementedError( | |
| 'Tests for Edge on ${io.Platform.operatingSystem} is' | |
| ' not supported.'); | |
| } | |
| infoLog ??= io.stdout; | |
| if (requestedVersion == 'system') { | |
| // Since Edge is included in Windows, always assume there will be one on the | |
| // system. | |
| infoLog.writeln('Using the system version that is already installed.'); | |
| final EdgeLauncher edgeLauncher = EdgeLauncher(); | |
| if (edgeLauncher.isInstalled) { | |
| infoLog.writeln('Launcher installation was skipped, already installed.'); | |
| } else { | |
| infoLog.writeln('Installing MicrosoftEdgeLauncher'); | |
| await edgeLauncher.install(); | |
| infoLog.writeln( | |
| 'Installations complete. To launch it run ${edgeLauncher.executable}'); | |
| } | |
| return BrowserInstallation( | |
| version: 'system', | |
| executable: io.Directory(path.join( | |
| edgeLauncher.launcherInstallationDir.path, | |
| '${PlatformBinding.instance.getCommandToRunEdge()}')) | |
| .path, | |
| ); | |
| } else { | |
| infoLog.writeln('Unsupported version $requestedVersion.'); | |
| throw UnimplementedError(); | |
| } | |
| } | |
| /// `MicrosoftEdgeLauncher` is an executable for launching Edge. | |
| /// | |
| /// It is useful for starting Edge from comand line or from a | |
| /// batch script. | |
| /// | |
| /// See: https://github.com/MicrosoftEdge/edge-launcher | |
| class EdgeLauncher { | |
| /// Path to the directory that contains `MicrosoftEdgeLauncher.exe`. | |
| io.Directory get launcherInstallationDir => io.Directory( | |
| path.join(environment.webUiDartToolDir.path, 'microsoftedgelauncher', | |
| version), | |
| ); | |
| io.File get executable => io.File( | |
| path.join(launcherInstallationDir.path, 'MicrosoftEdgeLauncher.exe')); | |
| bool get isInstalled => executable.existsSync(); | |
| /// Version number launcher executable `MicrosoftEdgeLauncher`. | |
| final String version; | |
| /// Url for downloading `MicrosoftEdgeLauncher`. | |
| /// | |
| /// Only useful in Windows, hence not added to [PlatformBinding]. | |
| String get windowsEdgeLauncherDownloadUrl => | |
| 'https://github.com/MicrosoftEdge/edge-launcher/releases/download/$version/MicrosoftEdgeLauncher.exe'; | |
| EdgeLauncher() | |
| : version = | |
| BrowserLock.instance.configuration['edge']['launcher_version'] as String; | |
| /// Install the launcher if it does not exist in this system. | |
| void install() async { | |
| // Checks if the `MicrosoftEdgeLauncher` executable exists. | |
| if (isInstalled) { | |
| return; | |
| } | |
| // Create directory for download. | |
| if (!launcherInstallationDir.existsSync()) { | |
| launcherInstallationDir.createSync(recursive: true); | |
| } | |
| final Client client = Client(); | |
| try { | |
| // Download executable from Github. | |
| final StreamedResponse download = await client.send(Request( | |
| 'GET', | |
| Uri.parse(windowsEdgeLauncherDownloadUrl), | |
| )); | |
| await download.stream.pipe(executable.openWrite()); | |
| } finally { | |
| client.close(); | |
| } | |
| } | |
| } |