Unverified Commit e11a1a83 authored by Jenn Magder's avatar Jenn Magder Committed by GitHub

Remove mocks from fucshia_pm_test, reduce createMockProcess usage (#80321)

parent 7e24faf0
...@@ -13,6 +13,7 @@ import 'package:flutter_tools/src/base/file_system.dart'; ...@@ -13,6 +13,7 @@ import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/commands/build_apk.dart'; import 'package:flutter_tools/src/commands/build_apk.dart';
import 'package:flutter_tools/src/convert.dart';
import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/project.dart';
import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:flutter_tools/src/reporting/reporting.dart';
import 'package:flutter_tools/src/globals_null_migrated.dart' as globals; import 'package:flutter_tools/src/globals_null_migrated.dart' as globals;
...@@ -22,7 +23,6 @@ import 'package:process/process.dart'; ...@@ -22,7 +23,6 @@ import 'package:process/process.dart';
import '../../src/android_common.dart'; import '../../src/android_common.dart';
import '../../src/common.dart'; import '../../src/common.dart';
import '../../src/context.dart'; import '../../src/context.dart';
import '../../src/mocks.dart' hide MockAndroidSdk;
import '../../src/test_flutter_command_runner.dart'; import '../../src/test_flutter_command_runner.dart';
void main() { void main() {
...@@ -537,3 +537,21 @@ class FakeAndroidSdk extends Fake implements AndroidSdk { ...@@ -537,3 +537,21 @@ class FakeAndroidSdk extends Fake implements AndroidSdk {
} }
class MockProcessManager extends Mock implements ProcessManager {} class MockProcessManager extends Mock implements ProcessManager {}
/// Creates a mock process that returns with the given [exitCode], [stdout] and [stderr].
Process createMockProcess({ int exitCode = 0, String stdout = '', String stderr = '' }) {
final Stream<List<int>> stdoutStream = Stream<List<int>>.fromIterable(<List<int>>[
utf8.encode(stdout),
]);
final Stream<List<int>> stderrStream = Stream<List<int>>.fromIterable(<List<int>>[
utf8.encode(stderr),
]);
final Process process = _MockBasicProcess();
when(process.stdout).thenAnswer((_) => stdoutStream);
when(process.stderr).thenAnswer((_) => stderrStream);
when(process.exitCode).thenAnswer((_) => Future<int>.value(exitCode));
return process;
}
class _MockBasicProcess extends Mock implements Process {}
...@@ -9,7 +9,6 @@ import 'package:file/memory.dart'; ...@@ -9,7 +9,6 @@ import 'package:file/memory.dart';
import 'package:flutter_tools/src/base/bot_detector.dart'; import 'package:flutter_tools/src/base/bot_detector.dart';
import 'package:flutter_tools/src/base/common.dart'; import 'package:flutter_tools/src/base/common.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';
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/cache.dart'; import 'package:flutter_tools/src/cache.dart';
...@@ -19,7 +18,6 @@ import 'package:fake_async/fake_async.dart'; ...@@ -19,7 +18,6 @@ import 'package:fake_async/fake_async.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' as mocks;
void main() { void main() {
setUpAll(() { setUpAll(() {
...@@ -292,13 +290,34 @@ void main() { ...@@ -292,13 +290,34 @@ void main() {
testWithoutContext('pub get 69', () async { testWithoutContext('pub get 69', () async {
String error; String error;
final MockProcessManager processMock = MockProcessManager(69); const FakeCommand pubGetCommand = FakeCommand(
command: <String>[
'bin/cache/dart-sdk/bin/pub',
'--verbosity=warning',
'get',
'--no-precompile',
],
exitCode: 69,
environment: <String, String>{'FLUTTER_ROOT': '', 'PUB_ENVIRONMENT': 'flutter_cli:flutter_tests'},
);
final FakeProcessManager processManager = FakeProcessManager.list(<FakeCommand>[
pubGetCommand,
pubGetCommand,
pubGetCommand,
pubGetCommand,
pubGetCommand,
pubGetCommand,
pubGetCommand,
pubGetCommand,
pubGetCommand,
pubGetCommand,
]);
final BufferLogger logger = BufferLogger.test(); final BufferLogger logger = BufferLogger.test();
final FileSystem fileSystem = MemoryFileSystem.test(); final FileSystem fileSystem = MemoryFileSystem.test();
final Pub pub = Pub( final Pub pub = Pub(
fileSystem: fileSystem, fileSystem: fileSystem,
logger: logger, logger: logger,
processManager: processMock, processManager: processManager,
usage: TestUsage(), usage: TestUsage(),
platform: FakePlatform( platform: FakePlatform(
environment: const <String, String>{}, environment: const <String, String>{},
...@@ -307,7 +326,6 @@ void main() { ...@@ -307,7 +326,6 @@ void main() {
); );
FakeAsync().run((FakeAsync time) { FakeAsync().run((FakeAsync time) {
expect(processMock.lastPubEnvironment, isNull);
expect(logger.statusText, ''); expect(logger.statusText, '');
pub.get(context: PubContext.flutterTests).then((void value) { pub.get(context: PubContext.flutterTests).then((void value) {
error = 'test completed unexpectedly'; error = 'test completed unexpectedly';
...@@ -319,8 +337,7 @@ void main() { ...@@ -319,8 +337,7 @@ void main() {
'Running "flutter pub get" in /...\n' 'Running "flutter pub get" in /...\n'
'pub get failed (server unavailable) -- attempting retry 1 in 1 second...\n', 'pub get failed (server unavailable) -- attempting retry 1 in 1 second...\n',
); );
expect(processMock.lastPubEnvironment, contains('flutter_cli:flutter_tests'));
expect(processMock.lastPubCache, isNull);
time.elapse(const Duration(milliseconds: 500)); time.elapse(const Duration(milliseconds: 500));
expect(logger.statusText, expect(logger.statusText,
'Running "flutter pub get" in /...\n' 'Running "flutter pub get" in /...\n'
...@@ -361,18 +378,35 @@ void main() { ...@@ -361,18 +378,35 @@ void main() {
}); });
expect(logger.errorText, isEmpty); expect(logger.errorText, isEmpty);
expect(error, isNull); expect(error, isNull);
expect(processManager, hasNoRemainingExpectations);
}); });
testWithoutContext('pub get 66 shows message from pub', () async { testWithoutContext('pub get 66 shows message from pub', () async {
final BufferLogger logger = BufferLogger.test(); final BufferLogger logger = BufferLogger.test();
final FileSystem fileSystem = MemoryFileSystem.test(); final FileSystem fileSystem = MemoryFileSystem.test();
final FakeProcessManager processManager = FakeProcessManager.list(<FakeCommand>[
const FakeCommand(
command: <String>[
'bin/cache/dart-sdk/bin/pub',
'--verbosity=warning',
'get',
'--no-precompile',
],
exitCode: 66,
stderr: 'err1\nerr2\nerr3\n',
stdout: 'out1\nout2\nout3\n',
environment: <String, String>{'FLUTTER_ROOT': '', 'PUB_ENVIRONMENT': 'flutter_cli:flutter_tests'},
),
]);
final Pub pub = Pub( final Pub pub = Pub(
platform: FakePlatform(environment: const <String, String>{}), platform: FakePlatform(environment: const <String, String>{}),
fileSystem: fileSystem, fileSystem: fileSystem,
logger: logger, logger: logger,
usage: TestUsage(), usage: TestUsage(),
botDetector: const BotDetectorAlwaysNo(), botDetector: const BotDetectorAlwaysNo(),
processManager: MockProcessManager(66, stderr: 'err1\nerr2\nerr3\n', stdout: 'out1\nout2\nout3\n'), processManager: processManager,
); );
try { try {
await pub.get(context: PubContext.flutterTests); await pub.get(context: PubContext.flutterTests);
...@@ -391,46 +425,74 @@ void main() { ...@@ -391,46 +425,74 @@ void main() {
'err2\n' 'err2\n'
'err3\n' 'err3\n'
); );
expect(processManager, hasNoRemainingExpectations);
}); });
testWithoutContext('pub cache in root is used', () async { testWithoutContext('pub cache in root is used', () async {
String error; String error;
final MockProcessManager processMock = MockProcessManager(69);
final FileSystem fileSystem = MemoryFileSystem.test(); final FileSystem fileSystem = MemoryFileSystem.test();
fileSystem.directory(Cache.flutterRoot).childDirectory('.pub-cache').createSync(); final Directory pubCache = fileSystem.directory(Cache.flutterRoot).childDirectory('.pub-cache')..createSync();
final FakeProcessManager processManager = FakeProcessManager.list(<FakeCommand>[
FakeCommand(
command: const <String>[
'bin/cache/dart-sdk/bin/pub',
'--verbosity=warning',
'get',
'--no-precompile',
],
exitCode: 69,
environment: <String, String>{
'FLUTTER_ROOT': '',
'PUB_ENVIRONMENT': 'flutter_cli:flutter_tests',
'PUB_CACHE': pubCache.path,
},
),
]);
final Pub pub = Pub( final Pub pub = Pub(
platform: FakePlatform(environment: const <String, String>{}), platform: FakePlatform(environment: const <String, String>{}),
usage: TestUsage(), usage: TestUsage(),
fileSystem: fileSystem, fileSystem: fileSystem,
logger: BufferLogger.test(), logger: BufferLogger.test(),
processManager: processMock, processManager: processManager,
botDetector: const BotDetectorAlwaysNo(), botDetector: const BotDetectorAlwaysNo(),
); );
FakeAsync().run((FakeAsync time) { FakeAsync().run((FakeAsync time) {
expect(processMock.lastPubEnvironment, isNull);
expect(processMock.lastPubCache, isNull);
pub.get(context: PubContext.flutterTests).then((void value) { pub.get(context: PubContext.flutterTests).then((void value) {
error = 'test completed unexpectedly'; error = 'test completed unexpectedly';
}, onError: (dynamic thrownError) { }, onError: (dynamic thrownError) {
error = 'test failed unexpectedly: $thrownError'; error = 'test failed unexpectedly: $thrownError';
}); });
time.elapse(const Duration(milliseconds: 500)); time.elapse(const Duration(milliseconds: 500));
expect(processMock.lastPubCache, equals(fileSystem.path.join(Cache.flutterRoot, '.pub-cache')));
expect(error, isNull); expect(error, isNull);
expect(processManager, hasNoRemainingExpectations);
}); });
}); });
testWithoutContext('pub cache in environment is used', () async { testWithoutContext('pub cache in environment is used', () async {
final FileSystem fileSystem = MemoryFileSystem.test(); final FileSystem fileSystem = MemoryFileSystem.test();
fileSystem.directory('custom/pub-cache/path').createSync(recursive: true); fileSystem.directory('custom/pub-cache/path').createSync(recursive: true);
final MockProcessManager processMock = MockProcessManager(69); final FakeProcessManager processManager = FakeProcessManager.list(<FakeCommand>[
const FakeCommand(
command: <String>[
'bin/cache/dart-sdk/bin/pub',
'--verbosity=warning',
'get',
'--no-precompile',
],
exitCode: 69,
environment: <String, String>{
'FLUTTER_ROOT': '',
'PUB_ENVIRONMENT': 'flutter_cli:flutter_tests',
'PUB_CACHE': 'custom/pub-cache/path',
},
),
]);
final Pub pub = Pub( final Pub pub = Pub(
fileSystem: fileSystem, fileSystem: fileSystem,
logger: BufferLogger.test(), logger: BufferLogger.test(),
processManager: processMock, processManager: processManager,
usage: TestUsage(), usage: TestUsage(),
botDetector: const BotDetectorAlwaysNo(), botDetector: const BotDetectorAlwaysNo(),
platform: FakePlatform( platform: FakePlatform(
...@@ -441,9 +503,6 @@ void main() { ...@@ -441,9 +503,6 @@ void main() {
); );
FakeAsync().run((FakeAsync time) { FakeAsync().run((FakeAsync time) {
expect(processMock.lastPubEnvironment, isNull);
expect(processMock.lastPubCache, isNull);
String error; String error;
pub.get(context: PubContext.flutterTests).then((void value) { pub.get(context: PubContext.flutterTests).then((void value) {
error = 'test completed unexpectedly'; error = 'test completed unexpectedly';
...@@ -451,9 +510,8 @@ void main() { ...@@ -451,9 +510,8 @@ void main() {
error = 'test failed unexpectedly: $thrownError'; error = 'test failed unexpectedly: $thrownError';
}); });
time.elapse(const Duration(milliseconds: 500)); time.elapse(const Duration(milliseconds: 500));
expect(processMock.lastPubCache, equals('custom/pub-cache/path'));
expect(error, isNull); expect(error, isNull);
expect(processManager, hasNoRemainingExpectations);
}); });
}); });
...@@ -463,7 +521,7 @@ void main() { ...@@ -463,7 +521,7 @@ void main() {
final Pub pub = Pub( final Pub pub = Pub(
fileSystem: fileSystem, fileSystem: fileSystem,
logger: BufferLogger.test(), logger: BufferLogger.test(),
processManager: MockProcessManager(0), processManager: FakeProcessManager.any(),
botDetector: const BotDetectorAlwaysNo(), botDetector: const BotDetectorAlwaysNo(),
usage: usage, usage: usage,
platform: FakePlatform( platform: FakePlatform(
...@@ -493,7 +551,7 @@ void main() { ...@@ -493,7 +551,7 @@ void main() {
final Pub pub = Pub( final Pub pub = Pub(
fileSystem: fileSystem, fileSystem: fileSystem,
logger: BufferLogger.test(), logger: BufferLogger.test(),
processManager: MockProcessManager(0), processManager: FakeProcessManager.any(),
botDetector: const BotDetectorAlwaysNo(), botDetector: const BotDetectorAlwaysNo(),
usage: usage, usage: usage,
platform: FakePlatform( platform: FakePlatform(
...@@ -536,11 +594,24 @@ void main() { ...@@ -536,11 +594,24 @@ void main() {
final FileSystem fileSystem = MemoryFileSystem.test(); final FileSystem fileSystem = MemoryFileSystem.test();
fileSystem.directory('custom/pub-cache/path').createSync(recursive: true); fileSystem.directory('custom/pub-cache/path').createSync(recursive: true);
final TestUsage usage = TestUsage(); final TestUsage usage = TestUsage();
final FakeProcessManager processManager = FakeProcessManager.list(<FakeCommand>[
const FakeCommand(
command: <String>[
'bin/cache/dart-sdk/bin/pub',
'--verbosity=warning',
'get',
'--no-precompile',
],
exitCode: 1,
),
]);
final Pub pub = Pub( final Pub pub = Pub(
usage: usage, usage: usage,
fileSystem: fileSystem, fileSystem: fileSystem,
logger: BufferLogger.test(), logger: BufferLogger.test(),
processManager: MockProcessManager(1), processManager: processManager,
botDetector: const BotDetectorAlwaysNo(), botDetector: const BotDetectorAlwaysNo(),
platform: FakePlatform( platform: FakePlatform(
environment: const <String, String>{ environment: const <String, String>{
...@@ -557,18 +628,31 @@ void main() { ...@@ -557,18 +628,31 @@ void main() {
expect(usage.events, contains( expect(usage.events, contains(
const TestUsageEvent('pub-result', 'flutter-tests', label: 'failure'), const TestUsageEvent('pub-result', 'flutter-tests', label: 'failure'),
)); ));
expect(processManager, hasNoRemainingExpectations);
}); });
testWithoutContext('analytics sent on failed version solve', () async { testWithoutContext('analytics sent on failed version solve', () async {
final TestUsage usage = TestUsage(); final TestUsage usage = TestUsage();
final FileSystem fileSystem = MemoryFileSystem.test(); final FileSystem fileSystem = MemoryFileSystem.test();
final FakeProcessManager processManager = FakeProcessManager.list(<FakeCommand>[
const FakeCommand(
command: <String>[
'bin/cache/dart-sdk/bin/pub',
'--verbosity=warning',
'get',
'--no-precompile',
],
exitCode: 1,
stderr: 'version solving failed',
),
]);
final Pub pub = Pub( final Pub pub = Pub(
fileSystem: fileSystem, fileSystem: fileSystem,
logger: BufferLogger.test(), logger: BufferLogger.test(),
processManager: MockProcessManager( processManager: processManager,
1,
stderr: 'version solving failed',
),
platform: FakePlatform( platform: FakePlatform(
environment: <String, String>{ environment: <String, String>{
'PUB_CACHE': 'custom/pub-cache/path', 'PUB_CACHE': 'custom/pub-cache/path',
...@@ -588,6 +672,7 @@ void main() { ...@@ -588,6 +672,7 @@ void main() {
expect(usage.events, contains( expect(usage.events, contains(
const TestUsageEvent('pub-result', 'flutter-tests', label: 'version-solving-failed'), const TestUsageEvent('pub-result', 'flutter-tests', label: 'version-solving-failed'),
)); ));
expect(processManager, hasNoRemainingExpectations);
}); });
testWithoutContext('Pub error handling', () async { testWithoutContext('Pub error handling', () async {
...@@ -682,40 +767,3 @@ class BotDetectorAlwaysNo implements BotDetector { ...@@ -682,40 +767,3 @@ class BotDetectorAlwaysNo implements BotDetector {
@override @override
Future<bool> get isRunningOnBot async => false; Future<bool> get isRunningOnBot async => false;
} }
typedef StartCallback = void Function(List<dynamic> command);
class MockProcessManager implements ProcessManager {
MockProcessManager(this.fakeExitCode, {
this.stdout = '',
this.stderr = '',
});
final int fakeExitCode;
final String stdout;
final String stderr;
String lastPubEnvironment;
String lastPubCache;
@override
Future<Process> start(
List<dynamic> command, {
String workingDirectory,
Map<String, String> environment,
bool includeParentEnvironment = true,
bool runInShell = false,
ProcessStartMode mode = ProcessStartMode.normal,
}) {
lastPubEnvironment = environment['PUB_ENVIRONMENT'];
lastPubCache = environment['PUB_CACHE'];
return Future<Process>.value(mocks.createMockProcess(
exitCode: fakeExitCode,
stdout: stdout,
stderr: stderr,
));
}
@override
dynamic noSuchMethod(Invocation invocation) => null;
}
...@@ -6,71 +6,66 @@ ...@@ -6,71 +6,66 @@
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/io.dart';
import 'package:flutter_tools/src/fuchsia/fuchsia_pm.dart'; import 'package:flutter_tools/src/fuchsia/fuchsia_pm.dart';
import 'package:flutter_tools/src/fuchsia/fuchsia_sdk.dart'; import 'package:flutter_tools/src/fuchsia/fuchsia_sdk.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/mocks.dart'; import '../../src/fake_process_manager.dart';
void main() { void main() {
group('FuchsiaPM', () { group('FuchsiaPM', () {
File pm; File pm;
MockProcessManager mockProcessManager; FakeProcessManager fakeProcessManager;
MockFuchsiaArtifacts mockFuchsiaArtifacts; FakeFuchsiaArtifacts fakeFuchsiaArtifacts;
setUp(() { setUp(() {
pm = MemoryFileSystem.test().file('pm'); pm = MemoryFileSystem.test().file('pm');
mockFuchsiaArtifacts = MockFuchsiaArtifacts(); fakeFuchsiaArtifacts = FakeFuchsiaArtifacts(pm);
when(mockFuchsiaArtifacts.pm).thenReturn(pm); fakeProcessManager = FakeProcessManager.empty();
mockProcessManager = MockProcessManager();
}); });
testUsingContext('serve - IPv4 address', () async { testUsingContext('serve - IPv4 address', () async {
when(mockProcessManager.start(any)).thenAnswer((_) { fakeProcessManager.addCommand(const FakeCommand(command: <String>[
return Future<Process>.value(createMockProcess());
});
await FuchsiaPM().serve('<repo>', '127.0.0.1', 43819);
verify(mockProcessManager.start(<String>[
'pm', 'pm',
'serve', 'serve',
'-repo', '-repo',
'<repo>', '<repo>',
'-l', '-l',
'127.0.0.1:43819', '127.0.0.1:43819',
])).called(1); ]));
await FuchsiaPM().serve('<repo>', '127.0.0.1', 43819);
expect(fakeProcessManager, hasNoRemainingExpectations);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FuchsiaArtifacts: () => mockFuchsiaArtifacts, FuchsiaArtifacts: () => fakeFuchsiaArtifacts,
ProcessManager: () => mockProcessManager, ProcessManager: () => fakeProcessManager,
}); });
testUsingContext('serve - IPv6 address', () async { testUsingContext('serve - IPv6 address', () async {
when(mockProcessManager.start(any)).thenAnswer((_) { fakeProcessManager.addCommand(const FakeCommand(command: <String>[
return Future<Process>.value(createMockProcess());
});
await FuchsiaPM().serve('<repo>', 'fe80::ec4:7aff:fecc:ea8f%eno2', 43819);
verify(mockProcessManager.start(<String>[
'pm', 'pm',
'serve', 'serve',
'-repo', '-repo',
'<repo>', '<repo>',
'-l', '-l',
'[fe80::ec4:7aff:fecc:ea8f%eno2]:43819', '[fe80::ec4:7aff:fecc:ea8f%eno2]:43819',
])).called(1); ]));
await FuchsiaPM().serve('<repo>', 'fe80::ec4:7aff:fecc:ea8f%eno2', 43819);
expect(fakeProcessManager, hasNoRemainingExpectations);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FuchsiaArtifacts: () => mockFuchsiaArtifacts, FuchsiaArtifacts: () => fakeFuchsiaArtifacts,
ProcessManager: () => mockProcessManager, ProcessManager: () => fakeProcessManager,
}); });
}); });
} }
class MockFuchsiaArtifacts extends Mock implements FuchsiaArtifacts {} class FakeFuchsiaArtifacts extends Fake implements FuchsiaArtifacts {
class MockProcessManager extends Mock implements ProcessManager {} FakeFuchsiaArtifacts(this.pm);
@override
final File pm;
}
...@@ -191,6 +191,7 @@ abstract class FakeProcessManager implements ProcessManager { ...@@ -191,6 +191,7 @@ abstract class FakeProcessManager implements ProcessManager {
/// last command and verify its execution is successful, to ensure that all /// last command and verify its execution is successful, to ensure that all
/// the specified commands are actually called. /// the specified commands are actually called.
factory FakeProcessManager.list(List<FakeCommand> commands) = _SequenceProcessManager; factory FakeProcessManager.list(List<FakeCommand> commands) = _SequenceProcessManager;
factory FakeProcessManager.empty() => _SequenceProcessManager(<FakeCommand>[]);
FakeProcessManager._(); FakeProcessManager._();
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
// @dart = 2.8 // @dart = 2.8
import 'dart:async'; import 'dart:async';
import 'dart:convert';
import 'package:flutter_tools/src/android/android_device.dart'; import 'package:flutter_tools/src/android/android_device.dart';
import 'package:flutter_tools/src/android/android_sdk.dart' show AndroidSdk; import 'package:flutter_tools/src/android/android_sdk.dart' show AndroidSdk;
...@@ -156,24 +155,6 @@ _ProcessFactory flakyProcessFactory({ ...@@ -156,24 +155,6 @@ _ProcessFactory flakyProcessFactory({
}; };
} }
/// Creates a mock process that returns with the given [exitCode], [stdout] and [stderr].
Process createMockProcess({ int exitCode = 0, String stdout = '', String stderr = '' }) {
final Stream<List<int>> stdoutStream = Stream<List<int>>.fromIterable(<List<int>>[
utf8.encode(stdout),
]);
final Stream<List<int>> stderrStream = Stream<List<int>>.fromIterable(<List<int>>[
utf8.encode(stderr),
]);
final Process process = _MockBasicProcess();
when(process.stdout).thenAnswer((_) => stdoutStream);
when(process.stderr).thenAnswer((_) => stderrStream);
when(process.exitCode).thenAnswer((_) => Future<int>.value(exitCode));
return process;
}
class _MockBasicProcess extends Mock implements Process {}
class MockAndroidDevice extends Mock implements AndroidDevice { class MockAndroidDevice extends Mock implements AndroidDevice {
@override @override
Future<TargetPlatform> get targetPlatform async => TargetPlatform.android_arm; Future<TargetPlatform> get targetPlatform async => TargetPlatform.android_arm;
......
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