| // Copyright 2014 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. | |
| import 'dart:io' as io show Platform, stdin, stdout; | |
| /// Provides API parity with the `Platform` class in `dart:io`, but using | |
| /// instance properties rather than static properties. This difference enables | |
| /// the use of these APIs in tests, where you can provide mock implementations. | |
| abstract class Platform { | |
| /// Creates a new [Platform]. | |
| const Platform(); | |
| /// The number of processors of the machine. | |
| int get numberOfProcessors; | |
| /// The path separator used by the operating system to separate | |
| /// components in file paths. | |
| String get pathSeparator; | |
| /// A string (`linux`, `macos`, `windows`, `android`, `ios`, or `fuchsia`) | |
| /// representing the operating system. | |
| String get operatingSystem; | |
| /// A string representing the version of the operating system or platform. | |
| String get operatingSystemVersion; | |
| /// Get the local hostname for the system. | |
| String get localHostname; | |
| /// True if the operating system is Linux. | |
| bool get isLinux => operatingSystem == 'linux'; | |
| /// True if the operating system is OS X. | |
| bool get isMacOS => operatingSystem == 'macos'; | |
| /// True if the operating system is Windows. | |
| bool get isWindows => operatingSystem == 'windows'; | |
| /// True if the operating system is Android. | |
| bool get isAndroid => operatingSystem == 'android'; | |
| /// True if the operating system is iOS. | |
| bool get isIOS => operatingSystem == 'ios'; | |
| /// True if the operating system is Fuchsia. | |
| bool get isFuchsia => operatingSystem == 'fuchsia'; | |
| /// The environment for this process. | |
| /// | |
| /// The returned environment is an unmodifiable map whose content is | |
| /// retrieved from the operating system on its first use. | |
| /// | |
| /// Environment variables on Windows are case-insensitive. The map | |
| /// returned on Windows is therefore case-insensitive and will convert | |
| /// all keys to upper case. On other platforms the returned map is | |
| /// a standard case-sensitive map. | |
| Map<String, String> get environment; | |
| /// The path of the executable used to run the script in this isolate. | |
| /// | |
| /// The path returned is the literal path used to run the script. This | |
| /// path might be relative or just be a name from which the executable | |
| /// was found by searching the `PATH`. | |
| /// | |
| /// To get the absolute path to the resolved executable use | |
| /// [resolvedExecutable]. | |
| String get executable; | |
| /// The path of the executable used to run the script in this | |
| /// isolate after it has been resolved by the OS. | |
| /// | |
| /// This is the absolute path, with all symlinks resolved, to the | |
| /// executable used to run the script. | |
| String get resolvedExecutable; | |
| /// The absolute URI of the script being run in this | |
| /// isolate. | |
| /// | |
| /// If the script argument on the command line is relative, | |
| /// it is resolved to an absolute URI before fetching the script, and | |
| /// this absolute URI is returned. | |
| /// | |
| /// URI resolution only does string manipulation on the script path, and this | |
| /// may be different from the file system's path resolution behavior. For | |
| /// example, a symbolic link immediately followed by '..' will not be | |
| /// looked up. | |
| /// | |
| /// If the executable environment does not support [script] an empty | |
| /// [Uri] is returned. | |
| Uri get script; | |
| /// The flags passed to the executable used to run the script in this | |
| /// isolate. These are the command-line flags between the executable name | |
| /// and the script name. Each fetch of `executableArguments` returns a new | |
| /// list containing the flags passed to the executable. | |
| List<String> get executableArguments; | |
| /// The value of the `--packages` flag passed to the executable | |
| /// used to run the script in this isolate. This is the configuration which | |
| /// specifies how Dart packages are looked up. | |
| /// | |
| /// If there is no `--packages` flag, `null` is returned. | |
| String? get packageConfig; | |
| /// The version of the current Dart runtime. | |
| /// | |
| /// The returned `String` is formatted as the [semver](http://semver.org) | |
| /// version string of the current dart runtime, possibly followed by | |
| /// whitespace and other version and build details. | |
| String get version; | |
| /// When stdin is connected to a terminal, whether ANSI codes are supported. | |
| bool get stdinSupportsAnsi; | |
| /// When stdout is connected to a terminal, whether ANSI codes are supported. | |
| bool get stdoutSupportsAnsi; | |
| /// Get the name of the current locale. | |
| String get localeName; | |
| } | |
| /// `Platform` implementation that delegates directly to `dart:io`. | |
| class LocalPlatform extends Platform { | |
| /// Creates a new [LocalPlatform]. | |
| const LocalPlatform(); | |
| @override | |
| int get numberOfProcessors => io.Platform.numberOfProcessors; | |
| @override | |
| String get pathSeparator => io.Platform.pathSeparator; | |
| @override | |
| String get operatingSystem => io.Platform.operatingSystem; | |
| @override | |
| String get operatingSystemVersion => io.Platform.operatingSystemVersion; | |
| @override | |
| String get localHostname => io.Platform.localHostname; | |
| @override | |
| Map<String, String> get environment => io.Platform.environment; | |
| @override | |
| String get executable => io.Platform.executable; | |
| @override | |
| String get resolvedExecutable => io.Platform.resolvedExecutable; | |
| @override | |
| Uri get script => io.Platform.script; | |
| @override | |
| List<String> get executableArguments => io.Platform.executableArguments; | |
| @override | |
| String? get packageConfig => io.Platform.packageConfig; | |
| @override | |
| String get version => io.Platform.version; | |
| @override | |
| bool get stdinSupportsAnsi => io.stdin.supportsAnsiEscapes; | |
| @override | |
| bool get stdoutSupportsAnsi => io.stdout.supportsAnsiEscapes; | |
| @override | |
| String get localeName => io.Platform.localeName; | |
| } | |
| final Uri _empty = Uri.parse(''); | |
| /// Provides a mutable implementation of the [Platform] interface. | |
| class FakePlatform extends Platform { | |
| /// Creates a new [FakePlatform] with the specified properties. | |
| /// | |
| /// Unspecified properties will default to a 'linux' OS. | |
| FakePlatform({ | |
| this.numberOfProcessors = 1, | |
| this.pathSeparator = '/', | |
| this.operatingSystem = 'linux', | |
| this.operatingSystemVersion = '', | |
| this.localHostname = '', | |
| this.environment = const <String, String>{}, | |
| this.executable = '', | |
| this.resolvedExecutable = '', | |
| Uri? script, | |
| this.executableArguments = const <String>[], | |
| this.packageConfig, | |
| this.version = '', | |
| this.stdinSupportsAnsi = false, | |
| this.stdoutSupportsAnsi = false, | |
| this.localeName = '', | |
| }) : script = script ?? _empty; | |
| /// Creates a new [FakePlatform] with properties whose initial values mirror | |
| /// the specified [platform]. | |
| FakePlatform.fromPlatform(Platform platform) | |
| : numberOfProcessors = platform.numberOfProcessors, | |
| pathSeparator = platform.pathSeparator, | |
| operatingSystem = platform.operatingSystem, | |
| operatingSystemVersion = platform.operatingSystemVersion, | |
| localHostname = platform.localHostname, | |
| environment = Map<String, String>.from(platform.environment), | |
| executable = platform.executable, | |
| resolvedExecutable = platform.resolvedExecutable, | |
| script = platform.script, | |
| executableArguments = List<String>.from(platform.executableArguments), | |
| packageConfig = platform.packageConfig, | |
| version = platform.version, | |
| stdinSupportsAnsi = platform.stdinSupportsAnsi, | |
| stdoutSupportsAnsi = platform.stdoutSupportsAnsi, | |
| localeName = platform.localeName; | |
| @override | |
| int numberOfProcessors; | |
| @override | |
| String pathSeparator; | |
| @override | |
| String operatingSystem; | |
| @override | |
| String operatingSystemVersion; | |
| @override | |
| String localHostname; | |
| @override | |
| Map<String, String> environment; | |
| @override | |
| String executable; | |
| @override | |
| String resolvedExecutable; | |
| @override | |
| Uri script; | |
| @override | |
| List<String> executableArguments; | |
| @override | |
| String? packageConfig; | |
| @override | |
| String version; | |
| @override | |
| bool stdinSupportsAnsi; | |
| @override | |
| bool stdoutSupportsAnsi; | |
| @override | |
| String localeName; | |
| } |