Unverified Commit e4c84987 authored by Dan Field's avatar Dan Field Committed by GitHub

no more mockito for fuchsia remote debug protocol (#74755)

parent fa8bf67c
...@@ -17,7 +17,6 @@ dependencies: ...@@ -17,7 +17,6 @@ dependencies:
platform: 3.0.0-nullsafety.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" platform: 3.0.0-nullsafety.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
dev_dependencies: dev_dependencies:
mockito: 4.1.1
test: 1.16.0-nullsafety.16 test: 1.16.0-nullsafety.16
_fe_analyzer_shared: 14.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" _fe_analyzer_shared: 14.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
...@@ -65,4 +64,4 @@ dev_dependencies: ...@@ -65,4 +64,4 @@ dev_dependencies:
webkit_inspection_protocol: 0.7.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" webkit_inspection_protocol: 0.7.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
yaml: 2.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" yaml: 2.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
# PUBSPEC CHECKSUM: 0795 # PUBSPEC CHECKSUM: 384f
...@@ -5,8 +5,8 @@ ...@@ -5,8 +5,8 @@
import 'dart:async'; import 'dart:async';
import 'package:fuchsia_remote_debug_protocol/src/dart/dart_vm.dart'; import 'package:fuchsia_remote_debug_protocol/src/dart/dart_vm.dart';
import 'package:test/fake.dart';
import 'package:vm_service/vm_service.dart' as vms; import 'package:vm_service/vm_service.dart' as vms;
import 'package:mockito/mockito.dart';
import '../../common.dart'; import '../../common.dart';
...@@ -17,41 +17,40 @@ void main() { ...@@ -17,41 +17,40 @@ void main() {
}); });
test('null connector', () async { test('null connector', () async {
Future<vms.VmService> mockServiceFunction( Future<vms.VmService> fakeServiceFunction(
Uri uri, { Uri uri, {
Duration timeout, Duration timeout,
}) { }) {
return Future<vms.VmService>(() => null); return Future<vms.VmService>(() => null);
} }
fuchsiaVmServiceConnectionFunction = mockServiceFunction; fuchsiaVmServiceConnectionFunction = fakeServiceFunction;
expect(await DartVm.connect(Uri.parse('http://this.whatever/ws')), expect(await DartVm.connect(Uri.parse('http://this.whatever/ws')),
equals(null)); equals(null));
}); });
test('disconnect closes peer', () async { test('disconnect closes peer', () async {
final MockVmService service = MockVmService(); final FakeVmService service = FakeVmService();
Future<vms.VmService> mockServiceFunction( Future<vms.VmService> fakeServiceFunction(
Uri uri, { Uri uri, {
Duration timeout, Duration timeout,
}) { }) {
return Future<vms.VmService>(() => service); return Future<vms.VmService>(() => service);
} }
fuchsiaVmServiceConnectionFunction = mockServiceFunction; fuchsiaVmServiceConnectionFunction = fakeServiceFunction;
final DartVm vm = final DartVm vm = await DartVm.connect(Uri.parse('http://this.whatever/ws'));
await DartVm.connect(Uri.parse('http://this.whatever/ws'));
expect(vm, isNot(null)); expect(vm, isNot(null));
await vm.stop(); await vm.stop();
verify(service.dispose()); expect(service.disposed, true);
}); });
}); });
group('DartVm.getAllFlutterViews', () { group('DartVm.getAllFlutterViews', () {
MockVmService mockService; FakeVmService fakeService;
setUp(() { setUp(() {
mockService = MockVmService(); fakeService = FakeVmService();
}); });
tearDown(() { tearDown(() {
...@@ -90,18 +89,16 @@ void main() { ...@@ -90,18 +89,16 @@ void main() {
], ],
}; };
Future<vms.VmService> mockVmConnectionFunction( Future<vms.VmService> fakeVmConnectionFunction(
Uri uri, { Uri uri, {
Duration timeout, Duration timeout,
}) { }) {
when(mockService.callMethod('_flutter.listViews')).thenAnswer((_) async => fakeService.flutterListViews = vms.Response.parse(flutterViewCannedResponses);
vms.Response.parse(flutterViewCannedResponses)); return Future<vms.VmService>(() => fakeService);
return Future<vms.VmService>(() => mockService);
} }
fuchsiaVmServiceConnectionFunction = mockVmConnectionFunction; fuchsiaVmServiceConnectionFunction = fakeVmConnectionFunction;
final DartVm vm = final DartVm vm = await DartVm.connect(Uri.parse('http://whatever.com/ws'));
await DartVm.connect(Uri.parse('http://whatever.com/ws'));
expect(vm, isNot(null)); expect(vm, isNot(null));
final List<FlutterView> views = await vm.getAllFlutterViews(); final List<FlutterView> views = await vm.getAllFlutterViews();
expect(views.length, 3); expect(views.length, 3);
...@@ -148,18 +145,16 @@ void main() { ...@@ -148,18 +145,16 @@ void main() {
], ],
}; };
Future<vms.VmService> mockVmConnectionFunction( Future<vms.VmService> fakeVmConnectionFunction(
Uri uri, { Uri uri, {
Duration timeout, Duration timeout,
}) { }) {
when(mockService.callMethod('_flutter.listViews')).thenAnswer((_) async => fakeService.flutterListViews = vms.Response.parse(flutterViewCannedResponses);
vms.Response.parse(flutterViewCannedResponses)); return Future<vms.VmService>(() => fakeService);
return Future<vms.VmService>(() => mockService);
} }
fuchsiaVmServiceConnectionFunction = mockVmConnectionFunction; fuchsiaVmServiceConnectionFunction = fakeVmConnectionFunction;
final DartVm vm = final DartVm vm = await DartVm.connect(Uri.parse('http://whatever.com/ws'));
await DartVm.connect(Uri.parse('http://whatever.com/ws'));
expect(vm, isNot(null)); expect(vm, isNot(null));
final List<FlutterView> views = await vm.getAllFlutterViews(); final List<FlutterView> views = await vm.getAllFlutterViews();
expect(views.length, 3); expect(views.length, 3);
...@@ -175,8 +170,7 @@ void main() { ...@@ -175,8 +170,7 @@ void main() {
}); });
test('invalid flutter view missing ID', () async { test('invalid flutter view missing ID', () async {
final Map<String, dynamic> flutterViewCannedResponseMissingId = final Map<String, dynamic> flutterViewCannedResponseMissingId = <String, dynamic>{
<String, dynamic>{
'views': <Map<String, dynamic>>[ 'views': <Map<String, dynamic>>[
// Valid flutter view. // Valid flutter view.
<String, dynamic>{ <String, dynamic>{
...@@ -198,18 +192,16 @@ void main() { ...@@ -198,18 +192,16 @@ void main() {
], ],
}; };
Future<vms.VmService> mockVmConnectionFunction( Future<vms.VmService> fakeVmConnectionFunction(
Uri uri, { Uri uri, {
Duration timeout, Duration timeout,
}) { }) {
when(mockService.callMethod('_flutter.listViews')).thenAnswer((_) async => fakeService.flutterListViews = vms.Response.parse(flutterViewCannedResponseMissingId);
vms.Response.parse(flutterViewCannedResponseMissingId)); return Future<vms.VmService>(() => fakeService);
return Future<vms.VmService>(() => mockService);
} }
fuchsiaVmServiceConnectionFunction = mockVmConnectionFunction; fuchsiaVmServiceConnectionFunction = fakeVmConnectionFunction;
final DartVm vm = final DartVm vm = await DartVm.connect(Uri.parse('http://whatever.com/ws'));
await DartVm.connect(Uri.parse('http://whatever.com/ws'));
expect(vm, isNot(null)); expect(vm, isNot(null));
Future<void> failingFunction() async { Future<void> failingFunction() async {
await vm.getAllFlutterViews(); await vm.getAllFlutterViews();
...@@ -251,29 +243,25 @@ void main() { ...@@ -251,29 +243,25 @@ void main() {
}), }),
]; ];
Future<vms.VmService> mockVmConnectionFunction( Future<vms.VmService> fakeVmConnectionFunction(
Uri uri, { Uri uri, {
Duration timeout, Duration timeout,
}) { }) {
when(mockService.getVM()).thenAnswer((_) async => fakeService.vm = FakeVM(isolates: isolates);
FakeVM(isolates: isolates)); return Future<vms.VmService>(() => fakeService);
return Future<vms.VmService>(() => mockService);
} }
fuchsiaVmServiceConnectionFunction = mockVmConnectionFunction; fuchsiaVmServiceConnectionFunction = fakeVmConnectionFunction;
final DartVm vm = final DartVm vm = await DartVm.connect(Uri.parse('http://whatever.com/ws'));
await DartVm.connect(Uri.parse('http://whatever.com/ws'));
expect(vm, isNot(null)); expect(vm, isNot(null));
final List<IsolateRef> matchingFlutterIsolates = final List<IsolateRef> matchingFlutterIsolates = await vm.getMainIsolatesByPattern('flutterBinary.cmx');
await vm.getMainIsolatesByPattern('flutterBinary.cmx');
expect(matchingFlutterIsolates.length, 1); expect(matchingFlutterIsolates.length, 1);
final List<IsolateRef> allIsolates = await vm.getMainIsolatesByPattern(''); final List<IsolateRef> allIsolates = await vm.getMainIsolatesByPattern('');
expect(allIsolates.length, 4); expect(allIsolates.length, 4);
}); });
test('invalid flutter view missing ID', () async { test('invalid flutter view missing ID', () async {
final Map<String, dynamic> flutterViewCannedResponseMissingIsolateName = final Map<String, dynamic> flutterViewCannedResponseMissingIsolateName = <String, dynamic>{
<String, dynamic>{
'views': <Map<String, dynamic>>[ 'views': <Map<String, dynamic>>[
// Missing isolate name. // Missing isolate name.
<String, dynamic>{ <String, dynamic>{
...@@ -289,18 +277,16 @@ void main() { ...@@ -289,18 +277,16 @@ void main() {
], ],
}; };
Future<vms.VmService> mockVmConnectionFunction( Future<vms.VmService> fakeVmConnectionFunction(
Uri uri, { Uri uri, {
Duration timeout, Duration timeout,
}) { }) {
when(mockService.callMethod(any)).thenAnswer((_) async => fakeService.flutterListViews = vms.Response.parse(flutterViewCannedResponseMissingIsolateName);
vms.Response.parse(flutterViewCannedResponseMissingIsolateName)); return Future<vms.VmService>(() => fakeService);
return Future<vms.VmService>(() => mockService);
} }
fuchsiaVmServiceConnectionFunction = mockVmConnectionFunction; fuchsiaVmServiceConnectionFunction = fakeVmConnectionFunction;
final DartVm vm = final DartVm vm = await DartVm.connect(Uri.parse('http://whatever.com/ws'));
await DartVm.connect(Uri.parse('http://whatever.com/ws'));
expect(vm, isNot(null)); expect(vm, isNot(null));
Future<void> failingFunction() async { Future<void> failingFunction() async {
await vm.getAllFlutterViews(); await vm.getAllFlutterViews();
...@@ -312,7 +298,30 @@ void main() { ...@@ -312,7 +298,30 @@ void main() {
}); });
} }
class MockVmService extends Mock implements vms.VmService {} class FakeVmService extends Fake implements vms.VmService {
bool disposed = false;
vms.Response flutterListViews;
vms.VM vm;
@override
Future<vms.VM> getVM() async => vm;
@override
Future<void> dispose() async {
disposed = true;
}
@override
Future<vms.Response> callMethod(String method, {String isolateId, Map<String, dynamic> args}) async {
if (method == '_flutter.listViews') {
return flutterListViews;
}
throw UnimplementedError(method);
}
@override
Future<void> onDone;
}
class FakeVM extends Fake implements vms.VM { class FakeVM extends Fake implements vms.VM {
FakeVM({ FakeVM({
......
...@@ -2,11 +2,12 @@ ...@@ -2,11 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
import 'dart:io' show ProcessResult; import 'dart:convert';
import 'dart:io' show ProcessResult, systemEncoding;
import 'package:mockito/mockito.dart';
import 'package:process/process.dart'; import 'package:process/process.dart';
import 'package:fuchsia_remote_debug_protocol/src/runners/ssh_command_runner.dart'; import 'package:fuchsia_remote_debug_protocol/src/runners/ssh_command_runner.dart';
import 'package:test/fake.dart';
import '../../common.dart'; import '../../common.dart';
...@@ -32,68 +33,59 @@ void main() { ...@@ -32,68 +33,59 @@ void main() {
}); });
group('SshCommandRunner.run', () { group('SshCommandRunner.run', () {
MockProcessManager mockProcessManager; FakeProcessManager fakeProcessManager;
MockProcessResult mockProcessResult; FakeProcessResult fakeProcessResult;
SshCommandRunner runner; SshCommandRunner runner;
setUp(() { setUp(() {
mockProcessManager = MockProcessManager(); fakeProcessResult = FakeProcessResult();
mockProcessResult = MockProcessResult(); fakeProcessManager = FakeProcessManager()..fakeResult = fakeProcessResult;
when(mockProcessManager.run(any)).thenAnswer(
(_) => Future<MockProcessResult>.value(mockProcessResult));
}); });
test('verify interface is appended to ipv6 address', () async { test('verify interface is appended to ipv6 address', () async {
const String ipV6Addr = 'fe80::8eae:4cff:fef4:9247'; const String ipV6Addr = 'fe80::8eae:4cff:fef4:9247';
const String interface = 'eno1'; const String interface = 'eno1';
runner = SshCommandRunner.withProcessManager( runner = SshCommandRunner.withProcessManager(
mockProcessManager, fakeProcessManager,
address: ipV6Addr, address: ipV6Addr,
interface: interface, interface: interface,
sshConfigPath: '/whatever', sshConfigPath: '/whatever',
); );
when<dynamic>(mockProcessResult.stdout).thenReturn('somestuff'); fakeProcessResult.stdout = 'somestuff';
when(mockProcessResult.exitCode).thenReturn(0); await runner.run('ls /whatever');
await runner.run('ls /whatever'); expect(fakeProcessManager.runCommands.single, contains('$ipV6Addr%$interface'));
final List<String> passedCommand =
verify(mockProcessManager.run(captureAny)).captured.single as List<String>;
expect(passedCommand, contains('$ipV6Addr%$interface'));
}); });
test('verify no percentage symbol is added when no ipv6 interface', () async { test('verify no percentage symbol is added when no ipv6 interface', () async {
const String ipV6Addr = 'fe80::8eae:4cff:fef4:9247'; const String ipV6Addr = 'fe80::8eae:4cff:fef4:9247';
runner = SshCommandRunner.withProcessManager( runner = SshCommandRunner.withProcessManager(
mockProcessManager, fakeProcessManager,
address: ipV6Addr, address: ipV6Addr,
); );
when<dynamic>(mockProcessResult.stdout).thenReturn('somestuff'); fakeProcessResult.stdout = 'somestuff';
when(mockProcessResult.exitCode).thenReturn(0);
await runner.run('ls /whatever'); await runner.run('ls /whatever');
final List<String> passedCommand = expect(fakeProcessManager.runCommands.single, contains(ipV6Addr));
verify(mockProcessManager.run(captureAny)).captured.single as List<String>;
expect(passedCommand, contains(ipV6Addr));
}); });
test('verify commands are split into multiple lines', () async { test('verify commands are split into multiple lines', () async {
const String addr = '192.168.1.1'; const String addr = '192.168.1.1';
runner = SshCommandRunner.withProcessManager(mockProcessManager, runner = SshCommandRunner.withProcessManager(fakeProcessManager,
address: addr); address: addr);
when<dynamic>(mockProcessResult.stdout).thenReturn(''' fakeProcessResult.stdout = '''
this this
has has
four four
lines'''); lines''';
when(mockProcessResult.exitCode).thenReturn(0);
final List<String> result = await runner.run('oihaw'); final List<String> result = await runner.run('oihaw');
expect(result, hasLength(4)); expect(result, hasLength(4));
}); });
test('verify exception on nonzero process result exit code', () async { test('verify exception on nonzero process result exit code', () async {
const String addr = '192.168.1.1'; const String addr = '192.168.1.1';
runner = SshCommandRunner.withProcessManager(mockProcessManager, runner = SshCommandRunner.withProcessManager(fakeProcessManager,
address: addr); address: addr);
when<dynamic>(mockProcessResult.stdout).thenReturn('whatever'); fakeProcessResult.stdout = 'whatever';
when(mockProcessResult.exitCode).thenReturn(1); fakeProcessResult.exitCode = 1;
Future<void> failingFunction() async { Future<void> failingFunction() async {
await runner.run('oihaw'); await runner.run('oihaw');
} }
...@@ -105,15 +97,13 @@ void main() { ...@@ -105,15 +97,13 @@ void main() {
const String addr = 'fe80::8eae:4cff:fef4:9247'; const String addr = 'fe80::8eae:4cff:fef4:9247';
const String config = '/this/that/this/and/uh'; const String config = '/this/that/this/and/uh';
runner = SshCommandRunner.withProcessManager( runner = SshCommandRunner.withProcessManager(
mockProcessManager, fakeProcessManager,
address: addr, address: addr,
sshConfigPath: config, sshConfigPath: config,
); );
when<dynamic>(mockProcessResult.stdout).thenReturn('somestuff'); fakeProcessResult.stdout = 'somestuff';
when(mockProcessResult.exitCode).thenReturn(0);
await runner.run('ls /whatever'); await runner.run('ls /whatever');
final List<String> passedCommand = final List<String> passedCommand = fakeProcessManager.runCommands.single as List<String>;
verify(mockProcessManager.run(captureAny)).captured.single as List<String>;
expect(passedCommand, contains('-F')); expect(passedCommand, contains('-F'));
final int indexOfFlag = passedCommand.indexOf('-F'); final int indexOfFlag = passedCommand.indexOf('-F');
final String passedConfig = passedCommand[indexOfFlag + 1]; final String passedConfig = passedCommand[indexOfFlag + 1];
...@@ -123,20 +113,44 @@ void main() { ...@@ -123,20 +113,44 @@ void main() {
test('verify config is excluded correctly', () async { test('verify config is excluded correctly', () async {
const String addr = 'fe80::8eae:4cff:fef4:9247'; const String addr = 'fe80::8eae:4cff:fef4:9247';
runner = SshCommandRunner.withProcessManager( runner = SshCommandRunner.withProcessManager(
mockProcessManager, fakeProcessManager,
address: addr, address: addr,
); );
when<dynamic>(mockProcessResult.stdout).thenReturn('somestuff'); fakeProcessResult.stdout = 'somestuff';
when(mockProcessResult.exitCode).thenReturn(0);
await runner.run('ls /whatever'); await runner.run('ls /whatever');
final List<String> passedCommand = final List<String> passedCommand = fakeProcessManager.runCommands.single as List<String>;
verify(mockProcessManager.run(captureAny)).captured.single as List<String>;
final int indexOfFlag = passedCommand.indexOf('-F'); final int indexOfFlag = passedCommand.indexOf('-F');
expect(indexOfFlag, equals(-1)); expect(indexOfFlag, equals(-1));
}); });
}); });
} }
class MockProcessManager extends Mock implements ProcessManager {} class FakeProcessManager extends Fake implements ProcessManager {
FakeProcessResult fakeResult;
List<List<dynamic>> runCommands = <List<dynamic>>[];
@override
Future<ProcessResult> run(List<dynamic> command, {
String workingDirectory,
Map<String, String> environment,
bool includeParentEnvironment = true,
bool runInShell = false,
Encoding stdoutEncoding = systemEncoding,
Encoding stderrEncoding = systemEncoding,
}) async {
runCommands.add(command);
return fakeResult;
}
}
class FakeProcessResult extends Fake implements ProcessResult {
@override
int exitCode = 0;
class MockProcessResult extends Mock implements ProcessResult {} @override
dynamic stdout;
@override
dynamic stderr;
}
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