Unverified Commit 55e3770f authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

[flutter_tools] remove globals from base/android (#60480)

Remove unnecessary use of globals from base tests, and an android test. This changes the test to avoid bouncing through the global getters, which can lead to incorrectly cached zone values. Switches the memory filesystem implementation to the test implementation
parent 84f50d14
...@@ -4,10 +4,12 @@ ...@@ -4,10 +4,12 @@
import 'package:file/memory.dart'; import 'package:file/memory.dart';
import 'package:flutter_tools/src/android/android_sdk.dart'; import 'package:flutter_tools/src/android/android_sdk.dart';
import 'package:flutter_tools/src/base/config.dart';
import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/io.dart' show ProcessResult; import 'package:flutter_tools/src/base/io.dart' show ProcessResult;
import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/globals.dart' as globals; import 'package:meta/meta.dart';
import 'package:mockito/mockito.dart'; import 'package:mockito/mockito.dart';
import 'package:process/process.dart'; import 'package:process/process.dart';
...@@ -18,12 +20,18 @@ import '../../src/mocks.dart'; ...@@ -18,12 +20,18 @@ import '../../src/mocks.dart';
class MockProcessManager extends Mock implements ProcessManager {} class MockProcessManager extends Mock implements ProcessManager {}
void main() { void main() {
MemoryFileSystem fs; MemoryFileSystem fileSystem;
MockProcessManager processManager; MockProcessManager processManager;
Config config;
setUp(() { setUp(() {
fs = MemoryFileSystem(); fileSystem = MemoryFileSystem.test();
processManager = MockProcessManager(); processManager = MockProcessManager();
config = Config.test(
'test',
directory: fileSystem.currentDirectory,
logger: BufferLogger.test(),
);
}); });
group('android_sdk AndroidSdk', () { group('android_sdk AndroidSdk', () {
...@@ -38,101 +46,108 @@ void main() { ...@@ -38,101 +46,108 @@ void main() {
testUsingContext('parse sdk', () { testUsingContext('parse sdk', () {
sdkDir = MockAndroidSdk.createSdkDirectory(); sdkDir = MockAndroidSdk.createSdkDirectory();
globals.config.setValue('android-sdk', sdkDir.path); config.setValue('android-sdk', sdkDir.path);
final AndroidSdk sdk = AndroidSdk.locateAndroidSdk(); final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
expect(sdk.latestVersion, isNotNull); expect(sdk.latestVersion, isNotNull);
expect(sdk.latestVersion.sdkLevel, 23); expect(sdk.latestVersion.sdkLevel, 23);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fs, FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.any(), ProcessManager: () => FakeProcessManager.any(),
Config: () => config,
}); });
testUsingContext('parse sdk N', () { testUsingContext('parse sdk N', () {
sdkDir = MockAndroidSdk.createSdkDirectory(withAndroidN: true); sdkDir = MockAndroidSdk.createSdkDirectory(withAndroidN: true);
globals.config.setValue('android-sdk', sdkDir.path); config.setValue('android-sdk', sdkDir.path);
final AndroidSdk sdk = AndroidSdk.locateAndroidSdk(); final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
expect(sdk.latestVersion, isNotNull); expect(sdk.latestVersion, isNotNull);
expect(sdk.latestVersion.sdkLevel, 24); expect(sdk.latestVersion.sdkLevel, 24);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fs, FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.any(), ProcessManager: () => FakeProcessManager.any(),
Config: () => config,
}); });
testUsingContext('returns sdkmanager path under cmdline tools on Linux/macOS', () { testUsingContext('returns sdkmanager path under cmdline tools on Linux/macOS', () {
sdkDir = MockAndroidSdk.createSdkDirectory(); sdkDir = MockAndroidSdk.createSdkDirectory();
globals.config.setValue('android-sdk', sdkDir.path); config.setValue('android-sdk', sdkDir.path);
final AndroidSdk sdk = AndroidSdk.locateAndroidSdk(); final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
globals.fs.file( fileSystem.file(
globals.fs.path.join(sdk.directory, 'cmdline-tools', 'latest', 'bin', 'sdkmanager') fileSystem.path.join(sdk.directory, 'cmdline-tools', 'latest', 'bin', 'sdkmanager')
).createSync(recursive: true); ).createSync(recursive: true);
expect(sdk.sdkManagerPath, globals.fs.path.join(sdk.directory, 'cmdline-tools', 'latest', 'bin', 'sdkmanager')); expect(sdk.sdkManagerPath, fileSystem.path.join(sdk.directory, 'cmdline-tools', 'latest', 'bin', 'sdkmanager'));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fs, FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.any(), ProcessManager: () => FakeProcessManager.any(),
Platform: () => FakePlatform(operatingSystem: 'linux'), Platform: () => FakePlatform(operatingSystem: 'linux'),
Config: () => config,
}); });
testUsingContext('returns sdkmanager.bat path under cmdline tools for windows', () { testUsingContext('returns sdkmanager.bat path under cmdline tools for windows', () {
sdkDir = MockAndroidSdk.createSdkDirectory(); sdkDir = MockAndroidSdk.createSdkDirectory();
globals.config.setValue('android-sdk', sdkDir.path); config.setValue('android-sdk', sdkDir.path);
final AndroidSdk sdk = AndroidSdk.locateAndroidSdk(); final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
globals.fs.file( fileSystem.file(
globals.fs.path.join(sdk.directory, 'cmdline-tools', 'latest', 'bin', 'sdkmanager.bat') fileSystem.path.join(sdk.directory, 'cmdline-tools', 'latest', 'bin', 'sdkmanager.bat')
).createSync(recursive: true); ).createSync(recursive: true);
expect(sdk.sdkManagerPath, expect(sdk.sdkManagerPath,
globals.fs.path.join(sdk.directory, 'cmdline-tools', 'latest', 'bin', 'sdkmanager.bat')); fileSystem.path.join(sdk.directory, 'cmdline-tools', 'latest', 'bin', 'sdkmanager.bat'));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fs, FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.any(), ProcessManager: () => FakeProcessManager.any(),
Platform: () => FakePlatform(operatingSystem: 'windows'), Platform: () => FakePlatform(operatingSystem: 'windows'),
Config: () => config,
}); });
testUsingContext('returns sdkmanager path under tools if cmdline doesnt exist', () { testUsingContext('returns sdkmanager path under tools if cmdline doesnt exist', () {
sdkDir = MockAndroidSdk.createSdkDirectory(); sdkDir = MockAndroidSdk.createSdkDirectory();
globals.config.setValue('android-sdk', sdkDir.path); config.setValue('android-sdk', sdkDir.path);
final AndroidSdk sdk = AndroidSdk.locateAndroidSdk(); final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
expect(sdk.sdkManagerPath, globals.fs.path.join(sdk.directory, 'tools', 'bin', 'sdkmanager')); expect(sdk.sdkManagerPath, fileSystem.path.join(sdk.directory, 'tools', 'bin', 'sdkmanager'));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fs, FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.any(), ProcessManager: () => FakeProcessManager.any(),
Config: () => config,
}); });
testUsingContext('returns sdkmanager version', () { testUsingContext('returns sdkmanager version', () {
sdkDir = MockAndroidSdk.createSdkDirectory(); sdkDir = MockAndroidSdk.createSdkDirectory();
globals.config.setValue('android-sdk', sdkDir.path); config.setValue('android-sdk', sdkDir.path);
final AndroidSdk sdk = AndroidSdk.locateAndroidSdk(); final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
when(globals.processManager.canRun(sdk.sdkManagerPath)).thenReturn(true); when(processManager.canRun(sdk.sdkManagerPath)).thenReturn(true);
when(globals.processManager.runSync(<String>[sdk.sdkManagerPath, '--version'], when(processManager.runSync(<String>[sdk.sdkManagerPath, '--version'],
environment: argThat(isNotNull, named: 'environment'))) environment: argThat(isNotNull, named: 'environment')))
.thenReturn(ProcessResult(1, 0, '26.1.1\n', '')); .thenReturn(ProcessResult(1, 0, '26.1.1\n', ''));
if (globals.platform.isMacOS) { when(processManager.runSync(
when(globals.processManager.runSync( <String>['/usr/libexec/java_home', '-v', '1.8'],
<String>['/usr/libexec/java_home', '-v', '1.8'], workingDirectory: anyNamed('workingDirectory'),
workingDirectory: anyNamed('workingDirectory'), environment: anyNamed('environment'),
environment: anyNamed('environment'), )).thenReturn(ProcessResult(0, 0, '', ''));
)).thenReturn(ProcessResult(0, 0, '', ''));
}
expect(sdk.sdkManagerVersion, '26.1.1'); expect(sdk.sdkManagerVersion, '26.1.1');
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fs, FileSystem: () => fileSystem,
ProcessManager: () => processManager, ProcessManager: () => processManager,
Config: () => config,
}); });
testUsingContext('returns validate sdk is well formed', () { testUsingContext('returns validate sdk is well formed', () {
sdkDir = MockBrokenAndroidSdk.createSdkDirectory(); sdkDir = MockBrokenAndroidSdk.createSdkDirectory(
globals.config.setValue('android-sdk', sdkDir.path); fileSystem: fileSystem,
);
config.setValue('android-sdk', sdkDir.path);
final AndroidSdk sdk = AndroidSdk.locateAndroidSdk(); final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
when(globals.processManager.canRun(sdk.adbPath)).thenReturn(true); when(processManager.canRun(sdk.adbPath)).thenReturn(true);
final List<String> validationIssues = sdk.validateSdkWellFormed(); final List<String> validationIssues = sdk.validateSdkWellFormed();
expect(validationIssues.first, 'No valid Android SDK platforms found in' expect(validationIssues.first, 'No valid Android SDK platforms found in'
...@@ -140,42 +155,45 @@ void main() { ...@@ -140,42 +155,45 @@ void main() {
' - android-22\n' ' - android-22\n'
' - android-23'); ' - android-23');
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fs, FileSystem: () => fileSystem,
ProcessManager: () => processManager, ProcessManager: () => processManager,
Config: () => config,
Platform: () => FakePlatform(operatingSystem: 'linux'),
}); });
testUsingContext('does not throw on sdkmanager version check failure', () { testUsingContext('does not throw on sdkmanager version check failure', () {
sdkDir = MockAndroidSdk.createSdkDirectory(); sdkDir = MockAndroidSdk.createSdkDirectory();
globals.config.setValue('android-sdk', sdkDir.path); config.setValue('android-sdk', sdkDir.path);
final AndroidSdk sdk = AndroidSdk.locateAndroidSdk(); final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
when(globals.processManager.canRun(sdk.sdkManagerPath)).thenReturn(true); when(processManager.canRun(sdk.sdkManagerPath)).thenReturn(true);
when(globals.processManager.runSync(<String>[sdk.sdkManagerPath, '--version'], when(processManager.runSync(<String>[sdk.sdkManagerPath, '--version'],
environment: argThat(isNotNull, named: 'environment'))) environment: argThat(isNotNull, named: 'environment')))
.thenReturn(ProcessResult(1, 1, '26.1.1\n', 'Mystery error')); .thenReturn(ProcessResult(1, 1, '26.1.1\n', 'Mystery error'));
if (globals.platform.isMacOS) { when(processManager.runSync(
when(globals.processManager.runSync( <String>['/usr/libexec/java_home', '-v', '1.8'],
<String>['/usr/libexec/java_home', '-v', '1.8'], workingDirectory: anyNamed('workingDirectory'),
workingDirectory: anyNamed('workingDirectory'), environment: anyNamed('environment'),
environment: anyNamed('environment'), )).thenReturn(ProcessResult(0, 0, '', ''));
)).thenReturn(ProcessResult(0, 0, '', ''));
}
expect(sdk.sdkManagerVersion, isNull); expect(sdk.sdkManagerVersion, isNull);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fs, FileSystem: () => fileSystem,
ProcessManager: () => processManager, ProcessManager: () => processManager,
Config: () => config,
}); });
testUsingContext('throws on sdkmanager version check if sdkmanager not found', () { testUsingContext('throws on sdkmanager version check if sdkmanager not found', () {
sdkDir = MockAndroidSdk.createSdkDirectory(withSdkManager: false); sdkDir = MockAndroidSdk.createSdkDirectory(withSdkManager: false);
globals.config.setValue('android-sdk', sdkDir.path); config.setValue('android-sdk', sdkDir.path);
final AndroidSdk sdk = AndroidSdk.locateAndroidSdk(); final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
when(globals.processManager.canRun(sdk.sdkManagerPath)).thenReturn(false); when(processManager.canRun(sdk.sdkManagerPath)).thenReturn(false);
expect(() => sdk.sdkManagerVersion, throwsToolExit()); expect(() => sdk.sdkManagerVersion, throwsToolExit());
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fs, FileSystem: () => fileSystem,
ProcessManager: () => processManager, ProcessManager: () => processManager,
Config: () => config,
}); });
}); });
} }
...@@ -185,15 +203,15 @@ class MockBrokenAndroidSdk extends Mock implements AndroidSdk { ...@@ -185,15 +203,15 @@ class MockBrokenAndroidSdk extends Mock implements AndroidSdk {
static Directory createSdkDirectory({ static Directory createSdkDirectory({
bool withAndroidN = false, bool withAndroidN = false,
bool withSdkManager = true, bool withSdkManager = true,
@required FileSystem fileSystem,
}) { }) {
final Directory dir = globals.fs.systemTempDirectory.createTempSync('flutter_mock_android_sdk.'); final Directory dir = fileSystem.systemTempDirectory.createTempSync('flutter_mock_android_sdk.');
final String exe = globals.platform.isWindows ? '.exe' : '';
_createSdkFile(dir, 'licenses/dummy'); _createSdkFile(dir, 'licenses/dummy');
_createSdkFile(dir, 'platform-tools/adb$exe'); _createSdkFile(dir, 'platform-tools/adb');
_createSdkFile(dir, 'build-tools/sda/aapt$exe'); _createSdkFile(dir, 'build-tools/sda/aapt');
_createSdkFile(dir, 'build-tools/af/aapt$exe'); _createSdkFile(dir, 'build-tools/af/aapt');
_createSdkFile(dir, 'build-tools/ljkasd/aapt$exe'); _createSdkFile(dir, 'build-tools/ljkasd/aapt');
_createSdkFile(dir, 'platforms/android-22/android.jar'); _createSdkFile(dir, 'platforms/android-22/android.jar');
_createSdkFile(dir, 'platforms/android-23/android.jar'); _createSdkFile(dir, 'platforms/android-23/android.jar');
......
...@@ -7,10 +7,8 @@ import 'dart:convert' show json; ...@@ -7,10 +7,8 @@ import 'dart:convert' show json;
import 'package:file/memory.dart'; import 'package:file/memory.dart';
import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/fingerprint.dart'; import 'package:flutter_tools/src/base/fingerprint.dart';
import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/base/utils.dart'; import 'package:flutter_tools/src/base/utils.dart';
import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/build_info.dart';
import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/version.dart'; import 'package:flutter_tools/src/version.dart';
import 'package:mockito/mockito.dart'; import 'package:mockito/mockito.dart';
...@@ -21,24 +19,24 @@ void main() { ...@@ -21,24 +19,24 @@ void main() {
group('Fingerprinter', () { group('Fingerprinter', () {
const String kVersion = '123456abcdef'; const String kVersion = '123456abcdef';
MemoryFileSystem fs; MemoryFileSystem fileSystem;
MockFlutterVersion mockVersion; MockFlutterVersion mockVersion;
setUp(() { setUp(() {
fs = MemoryFileSystem(); fileSystem = MemoryFileSystem.test();
mockVersion = MockFlutterVersion(); mockVersion = MockFlutterVersion();
when(mockVersion.frameworkRevision).thenReturn(kVersion); when(mockVersion.frameworkRevision).thenReturn(kVersion);
}); });
final Map<Type, Generator> contextOverrides = <Type, Generator>{ final Map<Type, Generator> contextOverrides = <Type, Generator>{
FileSystem: () => fs, FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.any(), ProcessManager: () => FakeProcessManager.any(),
}; };
testUsingContext('throws when depfile is malformed', () { testUsingContext('throws when depfile is malformed', () {
globals.fs.file('a.dart').createSync(); fileSystem.file('a.dart').createSync();
globals.fs.file('b.dart').createSync(); fileSystem.file('b.dart').createSync();
globals.fs.file('depfile').createSync(); fileSystem.file('depfile').createSync();
final Fingerprinter fingerprinter = Fingerprinter( final Fingerprinter fingerprinter = Fingerprinter(
fingerprintPath: 'out.fingerprint', fingerprintPath: 'out.fingerprint',
...@@ -53,7 +51,7 @@ void main() { ...@@ -53,7 +51,7 @@ void main() {
}, overrides: contextOverrides); }, overrides: contextOverrides);
testUsingContext('creates fingerprint with specified properties and files', () { testUsingContext('creates fingerprint with specified properties and files', () {
globals.fs.file('a.dart').createSync(); fileSystem.file('a.dart').createSync();
final Fingerprinter fingerprinter = Fingerprinter( final Fingerprinter fingerprinter = Fingerprinter(
fingerprintPath: 'out.fingerprint', fingerprintPath: 'out.fingerprint',
...@@ -71,9 +69,9 @@ void main() { ...@@ -71,9 +69,9 @@ void main() {
}, overrides: contextOverrides); }, overrides: contextOverrides);
testUsingContext('creates fingerprint with file checksums', () { testUsingContext('creates fingerprint with file checksums', () {
globals.fs.file('a.dart').createSync(); fileSystem.file('a.dart').createSync();
globals.fs.file('b.dart').createSync(); fileSystem.file('b.dart').createSync();
globals.fs.file('depfile').writeAsStringSync('depfile : b.dart'); fileSystem.file('depfile').writeAsStringSync('depfile : b.dart');
final Fingerprinter fingerprinter = Fingerprinter( final Fingerprinter fingerprinter = Fingerprinter(
fingerprintPath: 'out.fingerprint', fingerprintPath: 'out.fingerprint',
...@@ -92,8 +90,8 @@ void main() { ...@@ -92,8 +90,8 @@ void main() {
}, overrides: contextOverrides); }, overrides: contextOverrides);
testUsingContext('fingerprint does not match if not present', () { testUsingContext('fingerprint does not match if not present', () {
globals.fs.file('a.dart').createSync(); fileSystem.file('a.dart').createSync();
globals.fs.file('b.dart').createSync(); fileSystem.file('b.dart').createSync();
final Fingerprinter fingerprinter = Fingerprinter( final Fingerprinter fingerprinter = Fingerprinter(
fingerprintPath: 'out.fingerprint', fingerprintPath: 'out.fingerprint',
...@@ -107,8 +105,8 @@ void main() { ...@@ -107,8 +105,8 @@ void main() {
}, overrides: contextOverrides); }, overrides: contextOverrides);
testUsingContext('fingerprint does match if different', () { testUsingContext('fingerprint does match if different', () {
globals.fs.file('a.dart').createSync(); fileSystem.file('a.dart').createSync();
globals.fs.file('b.dart').createSync(); fileSystem.file('b.dart').createSync();
final Fingerprinter fingerprinter1 = Fingerprinter( final Fingerprinter fingerprinter1 = Fingerprinter(
fingerprintPath: 'out.fingerprint', fingerprintPath: 'out.fingerprint',
...@@ -132,9 +130,9 @@ void main() { ...@@ -132,9 +130,9 @@ void main() {
}, overrides: contextOverrides); }, overrides: contextOverrides);
testUsingContext('fingerprint does not match if depfile is malformed', () { testUsingContext('fingerprint does not match if depfile is malformed', () {
globals.fs.file('a.dart').createSync(); fileSystem.file('a.dart').createSync();
globals.fs.file('b.dart').createSync(); fileSystem.file('b.dart').createSync();
globals.fs.file('depfile').writeAsStringSync('depfile : b.dart'); fileSystem.file('depfile').writeAsStringSync('depfile : b.dart');
// Write a valid fingerprint // Write a valid fingerprint
final Fingerprinter fingerprinter = Fingerprinter( final Fingerprinter fingerprinter = Fingerprinter(
...@@ -149,7 +147,7 @@ void main() { ...@@ -149,7 +147,7 @@ void main() {
fingerprinter.writeFingerprint(); fingerprinter.writeFingerprint();
// Write a corrupt depfile. // Write a corrupt depfile.
globals.fs.file('depfile').writeAsStringSync(''); fileSystem.file('depfile').writeAsStringSync('');
final Fingerprinter badFingerprinter = Fingerprinter( final Fingerprinter badFingerprinter = Fingerprinter(
fingerprintPath: 'out.fingerprint', fingerprintPath: 'out.fingerprint',
paths: <String>['a.dart', 'b.dart'], paths: <String>['a.dart', 'b.dart'],
...@@ -164,9 +162,9 @@ void main() { ...@@ -164,9 +162,9 @@ void main() {
}, overrides: contextOverrides); }, overrides: contextOverrides);
testUsingContext('fingerprint does not match if previous fingerprint is malformed', () { testUsingContext('fingerprint does not match if previous fingerprint is malformed', () {
globals.fs.file('a.dart').createSync(); fileSystem.file('a.dart').createSync();
globals.fs.file('b.dart').createSync(); fileSystem.file('b.dart').createSync();
globals.fs.file('out.fingerprint').writeAsStringSync('** not JSON **'); fileSystem.file('out.fingerprint').writeAsStringSync('** not JSON **');
final Fingerprinter fingerprinter = Fingerprinter( final Fingerprinter fingerprinter = Fingerprinter(
fingerprintPath: 'out.fingerprint', fingerprintPath: 'out.fingerprint',
...@@ -181,8 +179,8 @@ void main() { ...@@ -181,8 +179,8 @@ void main() {
}, overrides: contextOverrides); }, overrides: contextOverrides);
testUsingContext('fingerprint does match if identical', () { testUsingContext('fingerprint does match if identical', () {
globals.fs.file('a.dart').createSync(); fileSystem.file('a.dart').createSync();
globals.fs.file('b.dart').createSync(); fileSystem.file('b.dart').createSync();
final Fingerprinter fingerprinter = Fingerprinter( final Fingerprinter fingerprinter = Fingerprinter(
fingerprintPath: 'out.fingerprint', fingerprintPath: 'out.fingerprint',
...@@ -206,13 +204,13 @@ void main() { ...@@ -206,13 +204,13 @@ void main() {
}, },
); );
fingerprinter.writeFingerprint(); fingerprinter.writeFingerprint();
expect(globals.fs.file('out.fingerprint').existsSync(), isFalse); expect(fileSystem.file('out.fingerprint').existsSync(), isFalse);
}, overrides: contextOverrides); }, overrides: contextOverrides);
testUsingContext('applies path filter to inputs paths', () { testUsingContext('applies path filter to inputs paths', () {
globals.fs.file('a.dart').createSync(); fileSystem.file('a.dart').createSync();
globals.fs.file('ab.dart').createSync(); fileSystem.file('ab.dart').createSync();
globals.fs.file('depfile').writeAsStringSync('depfile : ab.dart c.dart'); fileSystem.file('depfile').writeAsStringSync('depfile : ab.dart c.dart');
final Fingerprinter fingerprinter = Fingerprinter( final Fingerprinter fingerprinter = Fingerprinter(
fingerprintPath: 'out.fingerprint', fingerprintPath: 'out.fingerprint',
...@@ -225,7 +223,7 @@ void main() { ...@@ -225,7 +223,7 @@ void main() {
pathFilter: (String path) => path.startsWith('a'), pathFilter: (String path) => path.startsWith('a'),
); );
fingerprinter.writeFingerprint(); fingerprinter.writeFingerprint();
expect(globals.fs.file('out.fingerprint').existsSync(), isTrue); expect(fileSystem.file('out.fingerprint').existsSync(), isTrue);
}, overrides: contextOverrides); }, overrides: contextOverrides);
}); });
...@@ -239,26 +237,26 @@ void main() { ...@@ -239,26 +237,26 @@ void main() {
}); });
group('fromBuildInputs', () { group('fromBuildInputs', () {
MemoryFileSystem fs; MemoryFileSystem fileSystem;
setUp(() { setUp(() {
fs = MemoryFileSystem(); fileSystem = MemoryFileSystem.test();
}); });
testUsingContext('throws if any input file does not exist', () { testUsingContext('throws if any input file does not exist', () {
globals.fs.file('a.dart').createSync(); fileSystem.file('a.dart').createSync();
expect( expect(
() => Fingerprint.fromBuildInputs(const <String, String>{}, const <String>['a.dart', 'b.dart']), () => Fingerprint.fromBuildInputs(const <String, String>{}, const <String>['a.dart', 'b.dart']),
throwsException, throwsException,
); );
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fs, FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.any(), ProcessManager: () => FakeProcessManager.any(),
}); });
testUsingContext('populates checksums for valid files', () { testUsingContext('populates checksums for valid files', () {
globals.fs.file('a.dart').writeAsStringSync('This is a'); fileSystem.file('a.dart').writeAsStringSync('This is a');
globals.fs.file('b.dart').writeAsStringSync('This is b'); fileSystem.file('b.dart').writeAsStringSync('This is b');
final Fingerprint fingerprint = Fingerprint.fromBuildInputs(const <String, String>{}, const <String>['a.dart', 'b.dart']); final Fingerprint fingerprint = Fingerprint.fromBuildInputs(const <String, String>{}, const <String>['a.dart', 'b.dart']);
final Map<String, dynamic> jsonObject = castStringKeyedMap(json.decode(fingerprint.toJson())); final Map<String, dynamic> jsonObject = castStringKeyedMap(json.decode(fingerprint.toJson()));
...@@ -266,7 +264,7 @@ void main() { ...@@ -266,7 +264,7 @@ void main() {
expect(jsonObject['files']['a.dart'], '8a21a15fad560b799f6731d436c1b698'); expect(jsonObject['files']['a.dart'], '8a21a15fad560b799f6731d436c1b698');
expect(jsonObject['files']['b.dart'], '6f144e08b58cd0925328610fad7ac07c'); expect(jsonObject['files']['b.dart'], '6f144e08b58cd0925328610fad7ac07c');
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fs, FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.any(), ProcessManager: () => FakeProcessManager.any(),
}); });
...@@ -441,24 +439,24 @@ void main() { ...@@ -441,24 +439,24 @@ void main() {
}); });
group('readDepfile', () { group('readDepfile', () {
MemoryFileSystem fs; MemoryFileSystem fileSystem;
setUp(() { setUp(() {
fs = MemoryFileSystem(); fileSystem = MemoryFileSystem.test();
}); });
final Map<Type, Generator> contextOverrides = <Type, Generator>{ final Map<Type, Generator> contextOverrides = <Type, Generator>{
FileSystem: () => fs, FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.any(), ProcessManager: () => FakeProcessManager.any(),
}; };
testUsingContext('returns one file if only one is listed', () { testUsingContext('returns one file if only one is listed', () {
globals.fs.file('a.d').writeAsStringSync('snapshot.d: /foo/a.dart'); fileSystem.file('a.d').writeAsStringSync('snapshot.d: /foo/a.dart');
expect(readDepfile('a.d'), unorderedEquals(<String>['/foo/a.dart'])); expect(readDepfile('a.d'), unorderedEquals(<String>['/foo/a.dart']));
}, overrides: contextOverrides); }, overrides: contextOverrides);
testUsingContext('returns multiple files', () { testUsingContext('returns multiple files', () {
globals.fs.file('a.d').writeAsStringSync('snapshot.d: /foo/a.dart /foo/b.dart'); fileSystem.file('a.d').writeAsStringSync('snapshot.d: /foo/a.dart /foo/b.dart');
expect(readDepfile('a.d'), unorderedEquals(<String>[ expect(readDepfile('a.d'), unorderedEquals(<String>[
'/foo/a.dart', '/foo/a.dart',
'/foo/b.dart', '/foo/b.dart',
...@@ -466,7 +464,7 @@ void main() { ...@@ -466,7 +464,7 @@ void main() {
}, overrides: contextOverrides); }, overrides: contextOverrides);
testUsingContext('trims extra spaces between files', () { testUsingContext('trims extra spaces between files', () {
globals.fs.file('a.d').writeAsStringSync('snapshot.d: /foo/a.dart /foo/b.dart /foo/c.dart'); fileSystem.file('a.d').writeAsStringSync('snapshot.d: /foo/a.dart /foo/b.dart /foo/c.dart');
expect(readDepfile('a.d'), unorderedEquals(<String>[ expect(readDepfile('a.d'), unorderedEquals(<String>[
'/foo/a.dart', '/foo/a.dart',
'/foo/b.dart', '/foo/b.dart',
...@@ -475,7 +473,7 @@ void main() { ...@@ -475,7 +473,7 @@ void main() {
}, overrides: contextOverrides); }, overrides: contextOverrides);
testUsingContext('returns files with spaces and backslashes', () { testUsingContext('returns files with spaces and backslashes', () {
globals.fs.file('a.d').writeAsStringSync(r'snapshot.d: /foo/a\ a.dart /foo/b\\b.dart /foo/c\\ c.dart'); fileSystem.file('a.d').writeAsStringSync(r'snapshot.d: /foo/a\ a.dart /foo/b\\b.dart /foo/c\\ c.dart');
expect(readDepfile('a.d'), unorderedEquals(<String>[ expect(readDepfile('a.d'), unorderedEquals(<String>[
r'/foo/a a.dart', r'/foo/a a.dart',
r'/foo/b\b.dart', r'/foo/b\b.dart',
...@@ -484,8 +482,3 @@ void main() { ...@@ -484,8 +482,3 @@ void main() {
}, overrides: contextOverrides); }, overrides: contextOverrides);
}); });
} }
class MockPlatform extends Mock implements Platform {
@override
Map<String, String> environment = <String, String>{};
}
...@@ -3,42 +3,46 @@ ...@@ -3,42 +3,46 @@
// found in the LICENSE file. // found in the LICENSE file.
import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/os.dart'; import 'package:flutter_tools/src/base/os.dart';
import 'package:flutter_tools/src/globals.dart' as globals; import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/base/signals.dart';
import 'package:process/process.dart';
import '../../src/common.dart'; import '../../src/common.dart';
import '../../src/context.dart';
void main() { void main() {
group('OperatingSystemUtils', () { group('OperatingSystemUtils', () {
Directory tempDir; Directory tempDir;
FileSystem fileSystem;
setUp(() { setUp(() {
tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_tools_os_utils_test.'); fileSystem = LocalFileSystem.test(signals: Signals.test());
tempDir = fileSystem.systemTempDirectory.createTempSync('flutter_tools_os_utils_test.');
}); });
tearDown(() { tearDown(() {
tryToDelete(tempDir); tryToDelete(tempDir);
}); });
testUsingContext('makeExecutable', () async { testWithoutContext('makeExecutable', () async {
final File file = globals.fs.file(globals.fs.path.join(tempDir.path, 'foo.script')); const Platform platform = LocalPlatform();
final OperatingSystemUtils operatingSystemUtils = OperatingSystemUtils(
fileSystem: fileSystem,
logger: BufferLogger.test(),
platform: platform,
processManager: const LocalProcessManager(),
);
final File file = fileSystem.file(fileSystem.path.join(tempDir.path, 'foo.script'));
file.writeAsStringSync('hello world'); file.writeAsStringSync('hello world');
globals.os.makeExecutable(file); operatingSystemUtils.makeExecutable(file);
// Skip this test on windows. // Skip this test on windows.
if (!globals.platform.isWindows) { if (!platform.isWindows) {
final String mode = file.statSync().modeString(); final String mode = file.statSync().modeString();
// rwxr--r-- // rwxr--r--
expect(mode.substring(0, 3), endsWith('x')); expect(mode.substring(0, 3), endsWith('x'));
} }
}, overrides: <Type, Generator>{
OperatingSystemUtils: () => OperatingSystemUtils(
fileSystem: globals.fs,
logger: globals.logger,
platform: globals.platform,
processManager: globals.processManager,
),
}); });
}); });
} }
...@@ -8,7 +8,6 @@ import 'package:flutter_tools/src/base/io.dart'; ...@@ -8,7 +8,6 @@ import 'package:flutter_tools/src/base/io.dart';
import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/base/terminal.dart'; import 'package:flutter_tools/src/base/terminal.dart';
import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:mockito/mockito.dart'; import 'package:mockito/mockito.dart';
import '../../src/common.dart'; import '../../src/common.dart';
...@@ -42,7 +41,7 @@ void main() { ...@@ -42,7 +41,7 @@ void main() {
setUp(() { setUp(() {
terminal = AnsiTerminal( terminal = AnsiTerminal(
stdio: globals.stdio, // Danger, using real stdio. stdio: Stdio(), // Danger, using real stdio.
platform: FakePlatform()..stdoutSupportsAnsi = true, platform: FakePlatform()..stdoutSupportsAnsi = true,
); );
}); });
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment