Unverified Commit d4e48a15 authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

[flutter_tools] remove mocks from android emulator tests (#81548)

parent 3a0abac7
...@@ -149,7 +149,7 @@ class AndroidEmulator extends Emulator { ...@@ -149,7 +149,7 @@ class AndroidEmulator extends Emulator {
String _prop(String name) => _properties != null ? _properties[name] : null; String _prop(String name) => _properties != null ? _properties[name] : null;
@override @override
Future<void> launch() async { Future<void> launch({@visibleForTesting Duration startupDuration}) async {
final Process process = await _processUtils.start( final Process process = await _processUtils.start(
<String>[_androidSdk.emulatorPath, '-avd', id], <String>[_androidSdk.emulatorPath, '-avd', id],
); );
...@@ -200,7 +200,7 @@ class AndroidEmulator extends Emulator { ...@@ -200,7 +200,7 @@ class AndroidEmulator extends Emulator {
})); }));
// Wait a few seconds for the emulator to start. // Wait a few seconds for the emulator to start.
await Future<void>.delayed(const Duration(seconds: 3)); await Future<void>.delayed(startupDuration ?? const Duration(seconds: 3));
earlyFailure = false; earlyFailure = false;
return; return;
} }
......
...@@ -6,16 +6,14 @@ ...@@ -6,16 +6,14 @@
import 'dart:async'; import 'dart:async';
import 'package:fake_async/fake_async.dart';
import 'package:flutter_tools/src/android/android_emulator.dart'; import 'package:flutter_tools/src/android/android_emulator.dart';
import 'package:flutter_tools/src/base/common.dart'; import 'package:flutter_tools/src/android/android_sdk.dart';
import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/device.dart'; import 'package:flutter_tools/src/device.dart';
import 'package:mockito/mockito.dart'; import 'package:test/fake.dart';
import '../../src/common.dart'; import '../../src/common.dart';
import '../../src/fake_process_manager.dart'; import '../../src/fake_process_manager.dart';
import '../../src/mocks.dart' show MockAndroidSdk;
const String emulatorID = 'i1234'; const String emulatorID = 'i1234';
const String errorText = '[Android emulator test error]'; const String errorText = '[Android emulator test error]';
...@@ -32,7 +30,7 @@ void main() { ...@@ -32,7 +30,7 @@ void main() {
emulatorID, emulatorID,
logger: BufferLogger.test(), logger: BufferLogger.test(),
processManager: FakeProcessManager.any(), processManager: FakeProcessManager.any(),
androidSdk: MockAndroidSdk(), androidSdk: FakeAndroidSdk(),
); );
expect(emulator.id, emulatorID); expect(emulator.id, emulatorID);
expect(emulator.hasConfig, false); expect(emulator.hasConfig, false);
...@@ -45,7 +43,7 @@ void main() { ...@@ -45,7 +43,7 @@ void main() {
properties: const <String, String>{'name': 'test'}, properties: const <String, String>{'name': 'test'},
logger: BufferLogger.test(), logger: BufferLogger.test(),
processManager: FakeProcessManager.any(), processManager: FakeProcessManager.any(),
androidSdk: MockAndroidSdk(), androidSdk: FakeAndroidSdk(),
); );
expect(emulator.id, emulatorID); expect(emulator.id, emulatorID);
...@@ -65,7 +63,7 @@ void main() { ...@@ -65,7 +63,7 @@ void main() {
properties: properties, properties: properties,
logger: BufferLogger.test(), logger: BufferLogger.test(),
processManager: FakeProcessManager.any(), processManager: FakeProcessManager.any(),
androidSdk: MockAndroidSdk(), androidSdk: FakeAndroidSdk(),
); );
expect(emulator.id, emulatorID); expect(emulator.id, emulatorID);
...@@ -86,7 +84,7 @@ void main() { ...@@ -86,7 +84,7 @@ void main() {
properties: properties, properties: properties,
logger: BufferLogger.test(), logger: BufferLogger.test(),
processManager: FakeProcessManager.any(), processManager: FakeProcessManager.any(),
androidSdk: MockAndroidSdk(), androidSdk: FakeAndroidSdk(),
); );
expect(emulator.name, displayName); expect(emulator.name, displayName);
...@@ -104,7 +102,7 @@ void main() { ...@@ -104,7 +102,7 @@ void main() {
properties: properties, properties: properties,
logger: BufferLogger.test(), logger: BufferLogger.test(),
processManager: FakeProcessManager.any(), processManager: FakeProcessManager.any(),
androidSdk: MockAndroidSdk(), androidSdk: FakeAndroidSdk(),
); );
expect(emulator.name, 'This is my ID'); expect(emulator.name, 'This is my ID');
...@@ -127,11 +125,11 @@ void main() { ...@@ -127,11 +125,11 @@ void main() {
}); });
group('Android emulator launch ', () { group('Android emulator launch ', () {
MockAndroidSdk mockSdk; FakeAndroidSdk mockSdk;
setUp(() { setUp(() {
mockSdk = MockAndroidSdk(); mockSdk = FakeAndroidSdk();
when(mockSdk.emulatorPath).thenReturn('emulator'); mockSdk.emulatorPath = 'emulator';
}); });
testWithoutContext('succeeds', () async { testWithoutContext('succeeds', () async {
...@@ -143,13 +141,7 @@ void main() { ...@@ -143,13 +141,7 @@ void main() {
logger: BufferLogger.test(), logger: BufferLogger.test(),
); );
final Completer<void> completer = Completer<void>(); await emulator.launch(startupDuration: Duration.zero);
FakeAsync().run((FakeAsync time) {
unawaited(emulator.launch().whenComplete(completer.complete));
time.elapse(const Duration(seconds: 5));
time.flushMicrotasks();
});
await completer.future;
}); });
testWithoutContext('prints error on failure', () async { testWithoutContext('prints error on failure', () async {
...@@ -161,20 +153,13 @@ void main() { ...@@ -161,20 +153,13 @@ void main() {
exitCode: 1, exitCode: 1,
stderr: errorText, stderr: errorText,
stdout: 'dummy text', stdout: 'dummy text',
duration: Duration(seconds: 1),
), ),
]), ]),
androidSdk: mockSdk, androidSdk: mockSdk,
logger: logger, logger: logger,
); );
final Completer<void> completer = Completer<void>(); await emulator.launch(startupDuration: Duration.zero);
FakeAsync().run((FakeAsync time) {
unawaited(emulator.launch().whenComplete(completer.complete));
time.elapse(const Duration(seconds: 5));
time.flushMicrotasks();
});
await completer.future;
expect(logger.errorText, contains(errorText)); expect(logger.errorText, contains(errorText));
}); });
...@@ -183,26 +168,25 @@ void main() { ...@@ -183,26 +168,25 @@ void main() {
final BufferLogger logger = BufferLogger.test(); final BufferLogger logger = BufferLogger.test();
final AndroidEmulator emulator = AndroidEmulator(emulatorID, final AndroidEmulator emulator = AndroidEmulator(emulatorID,
processManager: FakeProcessManager.list(<FakeCommand>[ processManager: FakeProcessManager.list(<FakeCommand>[
const FakeCommand( FakeCommand(
command: kEmulatorLaunchCommand, command: kEmulatorLaunchCommand,
exitCode: 1, exitCode: 1,
stderr: '', stderr: '',
stdout: 'dummy text', stdout: 'dummy text',
duration: Duration(seconds: 4), completer: Completer<void>(),
), ),
]), ]),
androidSdk: mockSdk, androidSdk: mockSdk,
logger: logger, logger: logger,
); );
final Completer<void> completer = Completer<void>(); await emulator.launch(startupDuration: Duration.zero);
await FakeAsync().run((FakeAsync time) async {
unawaited(emulator.launch().whenComplete(completer.complete));
time.elapse(const Duration(seconds: 5));
time.flushMicrotasks();
});
await completer.future;
expect(logger.errorText, isEmpty); expect(logger.errorText, isEmpty);
}, skip: true); // TODO(jonahwilliams): clean up with https://github.com/flutter/flutter/issues/60675 });
}); });
} }
class FakeAndroidSdk extends Fake implements AndroidSdk {
@override
String emulatorPath;
}
...@@ -6,18 +6,18 @@ ...@@ -6,18 +6,18 @@
import 'package:file/file.dart'; import 'package:file/file.dart';
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_workflow.dart'; import 'package:flutter_tools/src/android/android_workflow.dart';
import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/device.dart'; import 'package:flutter_tools/src/device.dart';
import 'package:flutter_tools/src/emulator.dart'; import 'package:flutter_tools/src/emulator.dart';
import 'package:flutter_tools/src/ios/ios_emulators.dart'; import 'package:flutter_tools/src/ios/ios_emulators.dart';
import 'package:flutter_tools/src/macos/xcode.dart'; import 'package:flutter_tools/src/macos/xcode.dart';
import 'package:mockito/mockito.dart'; import 'package:test/fake.dart';
import '../src/common.dart'; import '../src/common.dart';
import '../src/context.dart'; import '../src/context.dart';
import '../src/fakes.dart'; import '../src/fakes.dart';
import '../src/mocks.dart';
const FakeEmulator emulator1 = FakeEmulator('Nexus_5', 'Nexus 5', 'Google'); const FakeEmulator emulator1 = FakeEmulator('Nexus_5', 'Nexus 5', 'Google');
const FakeEmulator emulator2 = FakeEmulator('Nexus_5X_API_27_x86', 'Nexus 5X', 'Google'); const FakeEmulator emulator2 = FakeEmulator('Nexus_5X_API_27_x86', 'Nexus 5X', 'Google');
...@@ -29,7 +29,7 @@ const List<Emulator> emulators = <Emulator>[ ...@@ -29,7 +29,7 @@ const List<Emulator> emulators = <Emulator>[
]; ];
// We have to send a command that fails in order to get the list of valid // We have to send a command that fails in order to get the list of valid
// system images paths. This is an example of the output to use in the mock. // system images paths. This is an example of the output to use in the fake.
const String fakeCreateFailureOutput = const String fakeCreateFailureOutput =
'Error: Package path (-k) not specified. Valid system image paths are:\n' 'Error: Package path (-k) not specified. Valid system image paths are:\n'
'system-images;android-27;google_apis;x86\n' 'system-images;android-27;google_apis;x86\n'
...@@ -45,20 +45,20 @@ const FakeCommand kListEmulatorsCommand = FakeCommand( ...@@ -45,20 +45,20 @@ const FakeCommand kListEmulatorsCommand = FakeCommand(
void main() { void main() {
FakeProcessManager fakeProcessManager; FakeProcessManager fakeProcessManager;
MockAndroidSdk mockSdk; FakeAndroidSdk sdk;
FileSystem fileSystem; FileSystem fileSystem;
Xcode xcode; Xcode xcode;
setUp(() { setUp(() {
fileSystem = MemoryFileSystem.test(); fileSystem = MemoryFileSystem.test();
fakeProcessManager = FakeProcessManager.empty(); fakeProcessManager = FakeProcessManager.empty();
mockSdk = MockAndroidSdk(); sdk = FakeAndroidSdk();
xcode = Xcode.test(processManager: fakeProcessManager, fileSystem: fileSystem); xcode = Xcode.test(processManager: fakeProcessManager, fileSystem: fileSystem);
when(mockSdk.avdManagerPath).thenReturn('avdmanager'); sdk
when(mockSdk.getAvdManagerPath()).thenReturn('avdmanager'); ..avdManagerPath = 'avdmanager'
when(mockSdk.emulatorPath).thenReturn('emulator'); ..emulatorPath = 'emulator'
when(mockSdk.adbPath).thenReturn('adb'); ..adbPath = 'adb';
}); });
group('EmulatorManager', () { group('EmulatorManager', () {
...@@ -74,9 +74,9 @@ void main() { ...@@ -74,9 +74,9 @@ void main() {
stdout: 'existing-avd-1', stdout: 'existing-avd-1',
), ),
]), ]),
androidSdk: mockSdk, androidSdk: sdk,
androidWorkflow: AndroidWorkflow( androidWorkflow: AndroidWorkflow(
androidSdk: mockSdk, androidSdk: sdk,
featureFlags: TestFeatureFlags(), featureFlags: TestFeatureFlags(),
operatingSystemUtils: FakeOperatingSystemUtils(), operatingSystemUtils: FakeOperatingSystemUtils(),
), ),
...@@ -121,8 +121,7 @@ void main() { ...@@ -121,8 +121,7 @@ void main() {
}); });
testUsingContext('create emulator with a missing avdmanager does not crash.', () async { testUsingContext('create emulator with a missing avdmanager does not crash.', () async {
when(mockSdk.avdManagerPath).thenReturn(null); sdk.avdManagerPath = null;
when(mockSdk.getAvdManagerPath()).thenReturn(null);
final EmulatorManager emulatorManager = EmulatorManager( final EmulatorManager emulatorManager = EmulatorManager(
fileSystem: MemoryFileSystem.test(), fileSystem: MemoryFileSystem.test(),
logger: BufferLogger.test(), logger: BufferLogger.test(),
...@@ -132,9 +131,9 @@ void main() { ...@@ -132,9 +131,9 @@ void main() {
stdout: 'existing-avd-1', stdout: 'existing-avd-1',
), ),
]), ]),
androidSdk: mockSdk, androidSdk: sdk,
androidWorkflow: AndroidWorkflow( androidWorkflow: AndroidWorkflow(
androidSdk: mockSdk, androidSdk: sdk,
featureFlags: TestFeatureFlags(), featureFlags: TestFeatureFlags(),
operatingSystemUtils: FakeOperatingSystemUtils(), operatingSystemUtils: FakeOperatingSystemUtils(),
), ),
...@@ -174,9 +173,9 @@ void main() { ...@@ -174,9 +173,9 @@ void main() {
], ],
) )
]), ]),
androidSdk: mockSdk, androidSdk: sdk,
androidWorkflow: AndroidWorkflow( androidWorkflow: AndroidWorkflow(
androidSdk: mockSdk, androidSdk: sdk,
featureFlags: TestFeatureFlags(), featureFlags: TestFeatureFlags(),
operatingSystemUtils: FakeOperatingSystemUtils(), operatingSystemUtils: FakeOperatingSystemUtils(),
), ),
...@@ -211,9 +210,9 @@ void main() { ...@@ -211,9 +210,9 @@ void main() {
], ],
) )
]), ]),
androidSdk: mockSdk, androidSdk: sdk,
androidWorkflow: AndroidWorkflow( androidWorkflow: AndroidWorkflow(
androidSdk: mockSdk, androidSdk: sdk,
featureFlags: TestFeatureFlags(), featureFlags: TestFeatureFlags(),
operatingSystemUtils: FakeOperatingSystemUtils(), operatingSystemUtils: FakeOperatingSystemUtils(),
), ),
...@@ -250,9 +249,9 @@ void main() { ...@@ -250,9 +249,9 @@ void main() {
'Use --force if you want to replace it.' 'Use --force if you want to replace it.'
) )
]), ]),
androidSdk: mockSdk, androidSdk: sdk,
androidWorkflow: AndroidWorkflow( androidWorkflow: AndroidWorkflow(
androidSdk: mockSdk, androidSdk: sdk,
featureFlags: TestFeatureFlags(), featureFlags: TestFeatureFlags(),
operatingSystemUtils: FakeOperatingSystemUtils(), operatingSystemUtils: FakeOperatingSystemUtils(),
), ),
...@@ -292,9 +291,9 @@ void main() { ...@@ -292,9 +291,9 @@ void main() {
], ],
) )
]), ]),
androidSdk: mockSdk, androidSdk: sdk,
androidWorkflow: AndroidWorkflow( androidWorkflow: AndroidWorkflow(
androidSdk: mockSdk, androidSdk: sdk,
featureFlags: TestFeatureFlags(), featureFlags: TestFeatureFlags(),
operatingSystemUtils: FakeOperatingSystemUtils(), operatingSystemUtils: FakeOperatingSystemUtils(),
), ),
...@@ -372,3 +371,23 @@ class FakeEmulator extends Emulator { ...@@ -372,3 +371,23 @@ class FakeEmulator extends Emulator {
throw UnimplementedError('Not implemented in Mock'); throw UnimplementedError('Not implemented in Mock');
} }
} }
class FakeAndroidSdk extends Fake implements AndroidSdk {
@override
String avdManagerPath;
@override
String emulatorPath;
@override
String adbPath;
@override
String getAvdManagerPath() => avdManagerPath;
@override
String getAvdPath() => 'avd';
@override
Map<String, String> get sdkManagerEnv => <String, String>{};
}
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