Remove mocks from fucshia_pm_test, reduce createMockProcess usage (#80321)
This commit is contained in:
parent
7e24faf0db
commit
e11a1a83af
@ -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/commands/build_apk.dart';
|
||||
import 'package:flutter_tools/src/convert.dart';
|
||||
import 'package:flutter_tools/src/project.dart';
|
||||
import 'package:flutter_tools/src/reporting/reporting.dart';
|
||||
import 'package:flutter_tools/src/globals_null_migrated.dart' as globals;
|
||||
@ -22,7 +23,6 @@ import 'package:process/process.dart';
|
||||
import '../../src/android_common.dart';
|
||||
import '../../src/common.dart';
|
||||
import '../../src/context.dart';
|
||||
import '../../src/mocks.dart' hide MockAndroidSdk;
|
||||
import '../../src/test_flutter_command_runner.dart';
|
||||
|
||||
void main() {
|
||||
@ -537,3 +537,21 @@ class FakeAndroidSdk extends Fake implements AndroidSdk {
|
||||
}
|
||||
|
||||
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';
|
||||
import 'package:flutter_tools/src/base/bot_detector.dart';
|
||||
import 'package:flutter_tools/src/base/common.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/platform.dart';
|
||||
import 'package:flutter_tools/src/cache.dart';
|
||||
@ -19,7 +18,6 @@ import 'package:fake_async/fake_async.dart';
|
||||
|
||||
import '../../src/common.dart';
|
||||
import '../../src/fake_process_manager.dart';
|
||||
import '../../src/mocks.dart' as mocks;
|
||||
|
||||
void main() {
|
||||
setUpAll(() {
|
||||
@ -292,13 +290,34 @@ void main() {
|
||||
testWithoutContext('pub get 69', () async {
|
||||
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 FileSystem fileSystem = MemoryFileSystem.test();
|
||||
final Pub pub = Pub(
|
||||
fileSystem: fileSystem,
|
||||
logger: logger,
|
||||
processManager: processMock,
|
||||
processManager: processManager,
|
||||
usage: TestUsage(),
|
||||
platform: FakePlatform(
|
||||
environment: const <String, String>{},
|
||||
@ -307,7 +326,6 @@ void main() {
|
||||
);
|
||||
|
||||
FakeAsync().run((FakeAsync time) {
|
||||
expect(processMock.lastPubEnvironment, isNull);
|
||||
expect(logger.statusText, '');
|
||||
pub.get(context: PubContext.flutterTests).then((void value) {
|
||||
error = 'test completed unexpectedly';
|
||||
@ -319,8 +337,7 @@ void main() {
|
||||
'Running "flutter pub get" in /...\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));
|
||||
expect(logger.statusText,
|
||||
'Running "flutter pub get" in /...\n'
|
||||
@ -361,18 +378,35 @@ void main() {
|
||||
});
|
||||
expect(logger.errorText, isEmpty);
|
||||
expect(error, isNull);
|
||||
expect(processManager, hasNoRemainingExpectations);
|
||||
});
|
||||
|
||||
testWithoutContext('pub get 66 shows message from pub', () async {
|
||||
final BufferLogger logger = BufferLogger.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(
|
||||
platform: FakePlatform(environment: const <String, String>{}),
|
||||
fileSystem: fileSystem,
|
||||
logger: logger,
|
||||
usage: TestUsage(),
|
||||
botDetector: const BotDetectorAlwaysNo(),
|
||||
processManager: MockProcessManager(66, stderr: 'err1\nerr2\nerr3\n', stdout: 'out1\nout2\nout3\n'),
|
||||
processManager: processManager,
|
||||
);
|
||||
try {
|
||||
await pub.get(context: PubContext.flutterTests);
|
||||
@ -391,46 +425,74 @@ void main() {
|
||||
'err2\n'
|
||||
'err3\n'
|
||||
);
|
||||
expect(processManager, hasNoRemainingExpectations);
|
||||
});
|
||||
|
||||
testWithoutContext('pub cache in root is used', () async {
|
||||
String error;
|
||||
final MockProcessManager processMock = MockProcessManager(69);
|
||||
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(
|
||||
platform: FakePlatform(environment: const <String, String>{}),
|
||||
usage: TestUsage(),
|
||||
fileSystem: fileSystem,
|
||||
logger: BufferLogger.test(),
|
||||
processManager: processMock,
|
||||
processManager: processManager,
|
||||
botDetector: const BotDetectorAlwaysNo(),
|
||||
);
|
||||
|
||||
FakeAsync().run((FakeAsync time) {
|
||||
expect(processMock.lastPubEnvironment, isNull);
|
||||
expect(processMock.lastPubCache, isNull);
|
||||
pub.get(context: PubContext.flutterTests).then((void value) {
|
||||
error = 'test completed unexpectedly';
|
||||
}, onError: (dynamic thrownError) {
|
||||
error = 'test failed unexpectedly: $thrownError';
|
||||
});
|
||||
time.elapse(const Duration(milliseconds: 500));
|
||||
|
||||
expect(processMock.lastPubCache, equals(fileSystem.path.join(Cache.flutterRoot, '.pub-cache')));
|
||||
expect(error, isNull);
|
||||
expect(processManager, hasNoRemainingExpectations);
|
||||
});
|
||||
});
|
||||
|
||||
testWithoutContext('pub cache in environment is used', () async {
|
||||
final FileSystem fileSystem = MemoryFileSystem.test();
|
||||
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(
|
||||
fileSystem: fileSystem,
|
||||
logger: BufferLogger.test(),
|
||||
processManager: processMock,
|
||||
processManager: processManager,
|
||||
usage: TestUsage(),
|
||||
botDetector: const BotDetectorAlwaysNo(),
|
||||
platform: FakePlatform(
|
||||
@ -441,9 +503,6 @@ void main() {
|
||||
);
|
||||
|
||||
FakeAsync().run((FakeAsync time) {
|
||||
expect(processMock.lastPubEnvironment, isNull);
|
||||
expect(processMock.lastPubCache, isNull);
|
||||
|
||||
String error;
|
||||
pub.get(context: PubContext.flutterTests).then((void value) {
|
||||
error = 'test completed unexpectedly';
|
||||
@ -451,9 +510,8 @@ void main() {
|
||||
error = 'test failed unexpectedly: $thrownError';
|
||||
});
|
||||
time.elapse(const Duration(milliseconds: 500));
|
||||
|
||||
expect(processMock.lastPubCache, equals('custom/pub-cache/path'));
|
||||
expect(error, isNull);
|
||||
expect(processManager, hasNoRemainingExpectations);
|
||||
});
|
||||
});
|
||||
|
||||
@ -463,7 +521,7 @@ void main() {
|
||||
final Pub pub = Pub(
|
||||
fileSystem: fileSystem,
|
||||
logger: BufferLogger.test(),
|
||||
processManager: MockProcessManager(0),
|
||||
processManager: FakeProcessManager.any(),
|
||||
botDetector: const BotDetectorAlwaysNo(),
|
||||
usage: usage,
|
||||
platform: FakePlatform(
|
||||
@ -493,7 +551,7 @@ void main() {
|
||||
final Pub pub = Pub(
|
||||
fileSystem: fileSystem,
|
||||
logger: BufferLogger.test(),
|
||||
processManager: MockProcessManager(0),
|
||||
processManager: FakeProcessManager.any(),
|
||||
botDetector: const BotDetectorAlwaysNo(),
|
||||
usage: usage,
|
||||
platform: FakePlatform(
|
||||
@ -536,11 +594,24 @@ void main() {
|
||||
final FileSystem fileSystem = MemoryFileSystem.test();
|
||||
fileSystem.directory('custom/pub-cache/path').createSync(recursive: true);
|
||||
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(
|
||||
usage: usage,
|
||||
fileSystem: fileSystem,
|
||||
logger: BufferLogger.test(),
|
||||
processManager: MockProcessManager(1),
|
||||
processManager: processManager,
|
||||
botDetector: const BotDetectorAlwaysNo(),
|
||||
platform: FakePlatform(
|
||||
environment: const <String, String>{
|
||||
@ -557,18 +628,31 @@ void main() {
|
||||
expect(usage.events, contains(
|
||||
const TestUsageEvent('pub-result', 'flutter-tests', label: 'failure'),
|
||||
));
|
||||
expect(processManager, hasNoRemainingExpectations);
|
||||
});
|
||||
|
||||
testWithoutContext('analytics sent on failed version solve', () async {
|
||||
final TestUsage usage = TestUsage();
|
||||
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(
|
||||
fileSystem: fileSystem,
|
||||
logger: BufferLogger.test(),
|
||||
processManager: MockProcessManager(
|
||||
1,
|
||||
stderr: 'version solving failed',
|
||||
),
|
||||
processManager: processManager,
|
||||
platform: FakePlatform(
|
||||
environment: <String, String>{
|
||||
'PUB_CACHE': 'custom/pub-cache/path',
|
||||
@ -588,6 +672,7 @@ void main() {
|
||||
expect(usage.events, contains(
|
||||
const TestUsageEvent('pub-result', 'flutter-tests', label: 'version-solving-failed'),
|
||||
));
|
||||
expect(processManager, hasNoRemainingExpectations);
|
||||
});
|
||||
|
||||
testWithoutContext('Pub error handling', () async {
|
||||
@ -682,40 +767,3 @@ class BotDetectorAlwaysNo implements BotDetector {
|
||||
@override
|
||||
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 @@
|
||||
|
||||
import 'package:file/memory.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_sdk.dart';
|
||||
import 'package:mockito/mockito.dart';
|
||||
import 'package:test/fake.dart';
|
||||
|
||||
import '../../src/common.dart';
|
||||
import '../../src/context.dart';
|
||||
import '../../src/mocks.dart';
|
||||
import '../../src/fake_process_manager.dart';
|
||||
|
||||
void main() {
|
||||
group('FuchsiaPM', () {
|
||||
File pm;
|
||||
MockProcessManager mockProcessManager;
|
||||
MockFuchsiaArtifacts mockFuchsiaArtifacts;
|
||||
FakeProcessManager fakeProcessManager;
|
||||
FakeFuchsiaArtifacts fakeFuchsiaArtifacts;
|
||||
|
||||
setUp(() {
|
||||
pm = MemoryFileSystem.test().file('pm');
|
||||
|
||||
mockFuchsiaArtifacts = MockFuchsiaArtifacts();
|
||||
when(mockFuchsiaArtifacts.pm).thenReturn(pm);
|
||||
|
||||
mockProcessManager = MockProcessManager();
|
||||
fakeFuchsiaArtifacts = FakeFuchsiaArtifacts(pm);
|
||||
fakeProcessManager = FakeProcessManager.empty();
|
||||
});
|
||||
|
||||
testUsingContext('serve - IPv4 address', () async {
|
||||
when(mockProcessManager.start(any)).thenAnswer((_) {
|
||||
return Future<Process>.value(createMockProcess());
|
||||
});
|
||||
|
||||
await FuchsiaPM().serve('<repo>', '127.0.0.1', 43819);
|
||||
|
||||
verify(mockProcessManager.start(<String>[
|
||||
fakeProcessManager.addCommand(const FakeCommand(command: <String>[
|
||||
'pm',
|
||||
'serve',
|
||||
'-repo',
|
||||
'<repo>',
|
||||
'-l',
|
||||
'127.0.0.1:43819',
|
||||
])).called(1);
|
||||
]));
|
||||
|
||||
await FuchsiaPM().serve('<repo>', '127.0.0.1', 43819);
|
||||
expect(fakeProcessManager, hasNoRemainingExpectations);
|
||||
}, overrides: <Type, Generator>{
|
||||
FuchsiaArtifacts: () => mockFuchsiaArtifacts,
|
||||
ProcessManager: () => mockProcessManager,
|
||||
FuchsiaArtifacts: () => fakeFuchsiaArtifacts,
|
||||
ProcessManager: () => fakeProcessManager,
|
||||
});
|
||||
|
||||
testUsingContext('serve - IPv6 address', () async {
|
||||
when(mockProcessManager.start(any)).thenAnswer((_) {
|
||||
return Future<Process>.value(createMockProcess());
|
||||
});
|
||||
|
||||
await FuchsiaPM().serve('<repo>', 'fe80::ec4:7aff:fecc:ea8f%eno2', 43819);
|
||||
|
||||
verify(mockProcessManager.start(<String>[
|
||||
fakeProcessManager.addCommand(const FakeCommand(command: <String>[
|
||||
'pm',
|
||||
'serve',
|
||||
'-repo',
|
||||
'<repo>',
|
||||
'-l',
|
||||
'[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>{
|
||||
FuchsiaArtifacts: () => mockFuchsiaArtifacts,
|
||||
ProcessManager: () => mockProcessManager,
|
||||
FuchsiaArtifacts: () => fakeFuchsiaArtifacts,
|
||||
ProcessManager: () => fakeProcessManager,
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
class MockFuchsiaArtifacts extends Mock implements FuchsiaArtifacts {}
|
||||
class MockProcessManager extends Mock implements ProcessManager {}
|
||||
class FakeFuchsiaArtifacts extends Fake implements FuchsiaArtifacts {
|
||||
FakeFuchsiaArtifacts(this.pm);
|
||||
|
||||
@override
|
||||
final File pm;
|
||||
}
|
||||
|
@ -191,6 +191,7 @@ abstract class FakeProcessManager implements ProcessManager {
|
||||
/// last command and verify its execution is successful, to ensure that all
|
||||
/// the specified commands are actually called.
|
||||
factory FakeProcessManager.list(List<FakeCommand> commands) = _SequenceProcessManager;
|
||||
factory FakeProcessManager.empty() => _SequenceProcessManager(<FakeCommand>[]);
|
||||
|
||||
FakeProcessManager._();
|
||||
|
||||
|
@ -5,7 +5,6 @@
|
||||
// @dart = 2.8
|
||||
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter_tools/src/android/android_device.dart';
|
||||
import 'package:flutter_tools/src/android/android_sdk.dart' show AndroidSdk;
|
||||
@ -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 {
|
||||
@override
|
||||
Future<TargetPlatform> get targetPlatform async => TargetPlatform.android_arm;
|
||||
|
Loading…
x
Reference in New Issue
Block a user