Unverified Commit 09f1764d authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

[flutter_tools] android test cleanups (#59996)

Fixes several tests that were failing under tester. Minor style cleanups otherwise
parent a734693f
...@@ -28,14 +28,12 @@ const Map<String, dynamic> macStudioInfoPlist = <String, dynamic>{ ...@@ -28,14 +28,12 @@ const Map<String, dynamic> macStudioInfoPlist = <String, dynamic>{
}, },
}; };
class MockPlistUtils extends Mock implements PlistParser {} final Platform linuxPlatform = FakePlatform(
operatingSystem: 'linux',
environment: <String, String>{'HOME': homeLinux},
);
Platform linuxPlatform() { class MockPlistUtils extends Mock implements PlistParser {}
return FakePlatform(
operatingSystem: 'linux',
environment: <String, String>{'HOME': homeLinux},
);
}
Platform macPlatform() { Platform macPlatform() {
return FakePlatform( return FakePlatform(
...@@ -45,45 +43,47 @@ Platform macPlatform() { ...@@ -45,45 +43,47 @@ Platform macPlatform() {
} }
void main() { void main() {
MemoryFileSystem fs; FileSystem fileSystem;
MockPlistUtils plistUtils;
setUp(() { setUp(() {
fs = MemoryFileSystem(); fileSystem = MemoryFileSystem.test();
plistUtils = MockPlistUtils();
}); });
group('pluginsPath on Linux', () { testUsingContext('pluginsPath on Linux extracts custom paths from home dir', () {
testUsingContext('extracts custom paths from home dir', () { const String installPath = '/opt/android-studio-with-cheese-5.0';
const String installPath = '/opt/android-studio-with-cheese-5.0'; const String studioHome = '$homeLinux/.AndroidStudioWithCheese5.0';
const String studioHome = '$homeLinux/.AndroidStudioWithCheese5.0'; const String homeFile = '$studioHome/system/.home';
const String homeFile = '$studioHome/system/.home'; globals.fs.directory(installPath).createSync(recursive: true);
globals.fs.directory(installPath).createSync(recursive: true); globals.fs.file(homeFile).createSync(recursive: true);
globals.fs.file(homeFile).createSync(recursive: true); globals.fs.file(homeFile).writeAsStringSync(installPath);
globals.fs.file(homeFile).writeAsStringSync(installPath);
final AndroidStudio studio = final AndroidStudio studio =
AndroidStudio.fromHomeDot(globals.fs.directory(studioHome)); AndroidStudio.fromHomeDot(globals.fs.directory(studioHome));
expect(studio, isNotNull); expect(studio, isNotNull);
expect(studio.pluginsPath, expect(studio.pluginsPath,
equals('/home/me/.AndroidStudioWithCheese5.0/config/plugins')); equals('/home/me/.AndroidStudioWithCheese5.0/config/plugins'));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fs, FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.any(), ProcessManager: () => FakeProcessManager.any(),
// Custom home paths are not supported on macOS nor Windows yet, // Custom home paths are not supported on macOS nor Windows yet,
// so we force the platform to fake Linux here. // so we force the platform to fake Linux here.
Platform: () => linuxPlatform(), Platform: () => linuxPlatform,
}); FileSystemUtils: () => FileSystemUtils(
fileSystem: fileSystem,
platform: linuxPlatform,
),
}); });
group('pluginsPath on Mac', () { group('pluginsPath on Mac', () {
FileSystemUtils fsUtils; FileSystemUtils fsUtils;
Platform platform; Platform platform;
MockPlistUtils plistUtils;
setUp(() { setUp(() {
plistUtils = MockPlistUtils();
platform = macPlatform(); platform = macPlatform();
fsUtils = FileSystemUtils( fsUtils = FileSystemUtils(
fileSystem: fs, fileSystem: fileSystem,
platform: platform, platform: platform,
); );
}); });
...@@ -110,7 +110,7 @@ void main() { ...@@ -110,7 +110,7 @@ void main() {
'AndroidStudio3.3', 'AndroidStudio3.3',
))); )));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fs, FileSystem: () => fileSystem,
FileSystemUtils: () => fsUtils, FileSystemUtils: () => fsUtils,
ProcessManager: () => FakeProcessManager.any(), ProcessManager: () => FakeProcessManager.any(),
// Custom home paths are not supported on macOS nor Windows yet, // Custom home paths are not supported on macOS nor Windows yet,
...@@ -168,7 +168,7 @@ void main() { ...@@ -168,7 +168,7 @@ void main() {
'AndroidStudio3.3', 'AndroidStudio3.3',
))); )));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fs, FileSystem: () => fileSystem,
FileSystemUtils: () => fsUtils, FileSystemUtils: () => fsUtils,
ProcessManager: () => FakeProcessManager.any(), ProcessManager: () => FakeProcessManager.any(),
// Custom home paths are not supported on macOS nor Windows yet, // Custom home paths are not supported on macOS nor Windows yet,
...@@ -176,6 +176,5 @@ void main() { ...@@ -176,6 +176,5 @@ void main() {
Platform: () => platform, Platform: () => platform,
PlistParser: () => plistUtils, PlistParser: () => plistUtils,
}); });
}); });
} }
...@@ -17,59 +17,56 @@ import '../../src/context.dart'; ...@@ -17,59 +17,56 @@ import '../../src/context.dart';
const String home = '/home/me'; const String home = '/home/me';
Platform linuxPlatform() { final Platform linuxPlatform = FakePlatform(
return FakePlatform( operatingSystem: 'linux',
operatingSystem: 'linux', environment: <String, String>{'HOME': home}
environment: <String, String>{'HOME': home} );
);
}
void main() { void main() {
FileSystem fileSystem;
setUp(() {
fileSystem = MemoryFileSystem.test();
});
group('NoAndroidStudioValidator', () { group('NoAndroidStudioValidator', () {
testUsingContext('shows Android Studio as "not available" when not available.', () async { testUsingContext('shows Android Studio as "not available" when not available.', () async {
final NoAndroidStudioValidator validator = NoAndroidStudioValidator(); final NoAndroidStudioValidator validator = NoAndroidStudioValidator();
expect((await validator.validate()).type, equals(ValidationType.notAvailable)); expect((await validator.validate()).type, equals(ValidationType.notAvailable));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
// Custom home paths are not supported on macOS nor Windows yet, Platform: () => linuxPlatform,
// so we force the platform to fake Linux here.
Platform: () => linuxPlatform(),
}); });
}); });
group('AndroidStudioValidator', () { testUsingContext('AndroidStudioValidator gives doctor error on java crash', () async {
MemoryFileSystem fs; when(globals.processManager.canRun(any)).thenReturn(true);
MockProcessManager mockProcessManager; when(globals.processManager.runSync(any)).thenAnswer((Invocation _) {
setUp(() { throw const ProcessException('java', <String>['--version']);
fs = MemoryFileSystem();
mockProcessManager = MockProcessManager();
}); });
const String installPath = '/opt/android-studio-with-cheese-5.0';
const String studioHome = '$home/.AndroidStudioWithCheese5.0';
const String homeFile = '$studioHome/system/.home';
globals.fs.directory(installPath).createSync(recursive: true);
globals.fs.file(homeFile).createSync(recursive: true);
globals.fs.file(homeFile).writeAsStringSync(installPath);
testUsingContext('gives doctor error on java crash', () async { // This checks that running the validator doesn't throw an unhandled
when(mockProcessManager.canRun(any)).thenReturn(true); // exception and that the ProcessException makes it into the error
when(mockProcessManager.runSync(any)).thenAnswer((Invocation _) { // message list.
throw const ProcessException('java', <String>['--version']); for (final DoctorValidator validator in AndroidStudioValidator.allValidators) {
}); final ValidationResult result = await validator.validate();
const String installPath = '/opt/android-studio-with-cheese-5.0'; expect(result.messages.where((ValidationMessage message) {
const String studioHome = '$home/.AndroidStudioWithCheese5.0'; return message.isError && message.message.contains('ProcessException');
const String homeFile = '$studioHome/system/.home'; }).isNotEmpty, true);
globals.fs.directory(installPath).createSync(recursive: true); }
globals.fs.file(homeFile).createSync(recursive: true); }, overrides: <Type, Generator>{
globals.fs.file(homeFile).writeAsStringSync(installPath); FileSystem: () => fileSystem,
ProcessManager: () => MockProcessManager(),
// This checks that running the validator doesn't throw an unhandled Platform: () => linuxPlatform,
// exception and that the ProcessException makes it into the error FileSystemUtils: () => FileSystemUtils(
// message list. fileSystem: fileSystem,
for (final DoctorValidator validator in AndroidStudioValidator.allValidators) { platform: linuxPlatform,
final ValidationResult result = await validator.validate(); ),
expect(result.messages.where((ValidationMessage message) {
return message.isError && message.message.contains('ProcessException');
}).isNotEmpty, true);
}
}, overrides: <Type, Generator>{
FileSystem: () => fs,
ProcessManager: () => mockProcessManager,
Platform: () => linuxPlatform(),
});
}); });
} }
......
...@@ -52,7 +52,7 @@ at org.gradle.wrapper.Install.createDist(Install.java:48) ...@@ -52,7 +52,7 @@ at org.gradle.wrapper.Install.createDist(Install.java:48)
at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:128) at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:128)
at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)'''; at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)''';
expect(testErrorMessage(errorMessage, networkErrorHandler), isTrue); expect(formatTestErrorMessage(errorMessage, networkErrorHandler), isTrue);
expect(await networkErrorHandler.handler(), equals(GradleBuildStatus.retry)); expect(await networkErrorHandler.handler(), equals(GradleBuildStatus.retry));
expect(testLogger.errorText, expect(testLogger.errorText,
...@@ -80,7 +80,7 @@ at org.gradle.wrapper.Install.createDist(Install.java:48) ...@@ -80,7 +80,7 @@ at org.gradle.wrapper.Install.createDist(Install.java:48)
at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:128) at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:128)
at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)'''; at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)''';
expect(testErrorMessage(errorMessage, networkErrorHandler), isTrue); expect(formatTestErrorMessage(errorMessage, networkErrorHandler), isTrue);
expect(await networkErrorHandler.handler(), equals(GradleBuildStatus.retry)); expect(await networkErrorHandler.handler(), equals(GradleBuildStatus.retry));
expect(testLogger.errorText, expect(testLogger.errorText,
...@@ -99,7 +99,7 @@ Exception in thread "main" java.lang.RuntimeException: Timeout of 120000 reached ...@@ -99,7 +99,7 @@ Exception in thread "main" java.lang.RuntimeException: Timeout of 120000 reached
at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:128) at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:128)
at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)'''; at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)''';
expect(testErrorMessage(errorMessage, networkErrorHandler), isTrue); expect(formatTestErrorMessage(errorMessage, networkErrorHandler), isTrue);
expect(await networkErrorHandler.handler(), equals(GradleBuildStatus.retry)); expect(await networkErrorHandler.handler(), equals(GradleBuildStatus.retry));
expect(testLogger.errorText, expect(testLogger.errorText,
...@@ -134,7 +134,7 @@ Exception in thread "main" javax.net.ssl.SSLHandshakeException: Remote host clos ...@@ -134,7 +134,7 @@ Exception in thread "main" javax.net.ssl.SSLHandshakeException: Remote host clos
at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:128) at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:128)
at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)'''; at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)''';
expect(testErrorMessage(errorMessage, networkErrorHandler), isTrue); expect(formatTestErrorMessage(errorMessage, networkErrorHandler), isTrue);
expect(await networkErrorHandler.handler(), equals(GradleBuildStatus.retry)); expect(await networkErrorHandler.handler(), equals(GradleBuildStatus.retry));
expect(testLogger.errorText, expect(testLogger.errorText,
...@@ -161,7 +161,7 @@ Exception in thread "main" java.io.FileNotFoundException: https://downloads.grad ...@@ -161,7 +161,7 @@ Exception in thread "main" java.io.FileNotFoundException: https://downloads.grad
at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:128) at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:128)
at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)'''; at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)''';
expect(testErrorMessage(errorMessage, networkErrorHandler), isTrue); expect(formatTestErrorMessage(errorMessage, networkErrorHandler), isTrue);
expect(await networkErrorHandler.handler(), equals(GradleBuildStatus.retry)); expect(await networkErrorHandler.handler(), equals(GradleBuildStatus.retry));
expect(testLogger.errorText, expect(testLogger.errorText,
...@@ -199,7 +199,7 @@ Exception in thread "main" java.net.SocketException: Connection reset ...@@ -199,7 +199,7 @@ Exception in thread "main" java.net.SocketException: Connection reset
at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:128) at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:128)
at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)'''; at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)''';
expect(testErrorMessage(errorMessage, networkErrorHandler), isTrue); expect(formatTestErrorMessage(errorMessage, networkErrorHandler), isTrue);
expect(await networkErrorHandler.handler(), equals(GradleBuildStatus.retry)); expect(await networkErrorHandler.handler(), equals(GradleBuildStatus.retry));
expect(testLogger.errorText, expect(testLogger.errorText,
...@@ -224,7 +224,7 @@ A problem occurred configuring root project 'android'. ...@@ -224,7 +224,7 @@ A problem occurred configuring root project 'android'.
> Could not get resource 'https://jcenter.bintray.com/net/sf/proguard/proguard-parent/6.0.3/proguard-parent-6.0.3.pom'. > Could not get resource 'https://jcenter.bintray.com/net/sf/proguard/proguard-parent/6.0.3/proguard-parent-6.0.3.pom'.
> Could not GET 'https://jcenter.bintray.com/net/sf/proguard/proguard-parent/6.0.3/proguard-parent-6.0.3.pom'. Received status code 504 from server: Gateway Time-out'''; > Could not GET 'https://jcenter.bintray.com/net/sf/proguard/proguard-parent/6.0.3/proguard-parent-6.0.3.pom'. Received status code 504 from server: Gateway Time-out''';
expect(testErrorMessage(errorMessage, networkErrorHandler), isTrue); expect(formatTestErrorMessage(errorMessage, networkErrorHandler), isTrue);
expect(await networkErrorHandler.handler(), equals(GradleBuildStatus.retry)); expect(await networkErrorHandler.handler(), equals(GradleBuildStatus.retry));
expect(testLogger.errorText, expect(testLogger.errorText,
...@@ -242,7 +242,7 @@ A problem occurred configuring root project 'android'. ...@@ -242,7 +242,7 @@ A problem occurred configuring root project 'android'.
Permission denied Permission denied
Command: /home/android/gradlew assembleRelease Command: /home/android/gradlew assembleRelease
'''; ''';
expect(testErrorMessage(errorMessage, permissionDeniedErrorHandler), isTrue); expect(formatTestErrorMessage(errorMessage, permissionDeniedErrorHandler), isTrue);
expect(await permissionDeniedErrorHandler.handler(), equals(GradleBuildStatus.exit)); expect(await permissionDeniedErrorHandler.handler(), equals(GradleBuildStatus.exit));
expect( expect(
...@@ -303,7 +303,7 @@ Command: /home/android/gradlew assembleRelease ...@@ -303,7 +303,7 @@ Command: /home/android/gradlew assembleRelease
expect(status, equals(GradleBuildStatus.exit)); expect(status, equals(GradleBuildStatus.exit));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => MemoryFileSystem(), FileSystem: () => MemoryFileSystem.test(),
ProcessManager: () => MockProcessManager(), ProcessManager: () => MockProcessManager(),
Usage: () => mockUsage, Usage: () => mockUsage,
}); });
...@@ -335,7 +335,7 @@ Command: /home/android/gradlew assembleRelease ...@@ -335,7 +335,7 @@ Command: /home/android/gradlew assembleRelease
expect(status, equals(GradleBuildStatus.exit)); expect(status, equals(GradleBuildStatus.exit));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => MemoryFileSystem(), FileSystem: () => MemoryFileSystem.test(),
ProcessManager: () => MockProcessManager(), ProcessManager: () => MockProcessManager(),
Usage: () => mockUsage, Usage: () => mockUsage,
}); });
...@@ -361,7 +361,7 @@ Command: /home/android/gradlew assembleRelease ...@@ -361,7 +361,7 @@ Command: /home/android/gradlew assembleRelease
expect(status, equals(GradleBuildStatus.exit)); expect(status, equals(GradleBuildStatus.exit));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => MemoryFileSystem(), FileSystem: () => MemoryFileSystem.test(),
ProcessManager: () => MockProcessManager(), ProcessManager: () => MockProcessManager(),
Usage: () => mockUsage, Usage: () => mockUsage,
}); });
...@@ -392,7 +392,7 @@ Command: /home/android/gradlew assembleRelease ...@@ -392,7 +392,7 @@ Command: /home/android/gradlew assembleRelease
)).called(1); )).called(1);
expect(status, equals(GradleBuildStatus.retryWithAarPlugins)); expect(status, equals(GradleBuildStatus.retryWithAarPlugins));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => MemoryFileSystem(), FileSystem: () => MemoryFileSystem.test(),
ProcessManager: () => MockProcessManager(), ProcessManager: () => MockProcessManager(),
Usage: () => mockUsage, Usage: () => mockUsage,
}); });
...@@ -404,7 +404,7 @@ Command: /home/android/gradlew assembleRelease ...@@ -404,7 +404,7 @@ Command: /home/android/gradlew assembleRelease
Permission denied Permission denied
Command: /home/android/gradlew assembleRelease Command: /home/android/gradlew assembleRelease
'''; ''';
expect(testErrorMessage(errorMessage, permissionDeniedErrorHandler), isTrue); expect(formatTestErrorMessage(errorMessage, permissionDeniedErrorHandler), isTrue);
}); });
testUsingContext('handler', () async { testUsingContext('handler', () async {
...@@ -539,6 +539,7 @@ assembleFooTest ...@@ -539,6 +539,7 @@ assembleFooTest
GradleUtils: () => FakeGradleUtils(), GradleUtils: () => FakeGradleUtils(),
Platform: () => fakePlatform('android'), Platform: () => fakePlatform('android'),
ProcessManager: () => mockProcessManager, ProcessManager: () => mockProcessManager,
FileSystem: () => MemoryFileSystem.test(),
}); });
testUsingContext('handler - without flavor', () async { testUsingContext('handler - without flavor', () async {
...@@ -586,13 +587,14 @@ assembleProfile ...@@ -586,13 +587,14 @@ assembleProfile
GradleUtils: () => FakeGradleUtils(), GradleUtils: () => FakeGradleUtils(),
Platform: () => fakePlatform('android'), Platform: () => fakePlatform('android'),
ProcessManager: () => mockProcessManager, ProcessManager: () => mockProcessManager,
FileSystem: () => MemoryFileSystem.test(),
}); });
}); });
} }
class MockUsage extends Mock implements Usage {} class MockUsage extends Mock implements Usage {}
bool testErrorMessage(String errorMessage, GradleHandledError error) { bool formatTestErrorMessage(String errorMessage, GradleHandledError error) {
return errorMessage return errorMessage
.split('\n') .split('\n')
.any((String line) => error.test(line)); .any((String line) => error.test(line));
...@@ -600,7 +602,9 @@ bool testErrorMessage(String errorMessage, GradleHandledError error) { ...@@ -600,7 +602,9 @@ bool testErrorMessage(String errorMessage, GradleHandledError error) {
Platform fakePlatform(String name) { Platform fakePlatform(String name) {
return FakePlatform( return FakePlatform(
environment: <String, String>{}, environment: <String, String>{
'HOME': '/',
},
operatingSystem: name, operatingSystem: name,
); );
} }
......
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