blob: 45da89ad4c67e8c0a212d56a157f5c8f397a1e37 [file] [log] [blame]
// 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;
}