From 026adb8cc7c17a9ebadbd860a4ff43b62596deb4 Mon Sep 17 00:00:00 2001 From: chunhtai <47866232+chunhtai@users.noreply.github.com> Date: Mon, 6 Mar 2023 14:37:55 -0800 Subject: [PATCH] Adds vmservices for getting iOS build options (#121736) Adds vmservices for getting iOS build options --- .../lib/src/isolated/resident_web_runner.dart | 15 +- .../lib/src/resident_runner.dart | 1 + packages/flutter_tools/lib/src/vmservice.dart | 88 +++++++---- .../test/general.shard/cold_test.dart | 2 + .../drive/drive_service_test.dart | 2 + .../test/general.shard/hot_test.dart | 2 + .../integration_test_device_test.dart | 6 + .../general.shard/resident_runner_test.dart | 9 ++ .../resident_web_runner_test.dart | 5 + .../test/general.shard/vmservice_test.dart | 147 ++++++++++++------ .../vmservice_integration_test.dart | 8 +- 11 files changed, 198 insertions(+), 87 deletions(-) diff --git a/packages/flutter_tools/lib/src/isolated/resident_web_runner.dart b/packages/flutter_tools/lib/src/isolated/resident_web_runner.dart index 3f7912ced9..035fe08862 100644 --- a/packages/flutter_tools/lib/src/isolated/resident_web_runner.dart +++ b/packages/flutter_tools/lib/src/isolated/resident_web_runner.dart @@ -560,18 +560,13 @@ class ResidentWebRunner extends ResidentRunner { // thrown if we're not already subscribed. } await setUpVmService( - (String isolateId, { - bool? force, - bool? pause, - }) async { + reloadSources: (String isolateId, {bool? force, bool? pause}) async { await restart(pause: pause); }, - null, - null, - device!.device, - null, - printStructuredErrorLog, - _vmService.service, + device: device!.device, + flutterProject: flutterProject, + printStructuredErrorLogMethod: printStructuredErrorLog, + vmService: _vmService.service, ); diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart index d9008652ae..1ec5659ed9 100644 --- a/packages/flutter_tools/lib/src/resident_runner.dart +++ b/packages/flutter_tools/lib/src/resident_runner.dart @@ -329,6 +329,7 @@ class FlutterDevice { restart: restart, compileExpression: compileExpression, getSkSLMethod: getSkSLMethod, + flutterProject: FlutterProject.current(), printStructuredErrorLogMethod: printStructuredErrorLogMethod, device: device, logger: globals.logger, diff --git a/packages/flutter_tools/lib/src/vmservice.dart b/packages/flutter_tools/lib/src/vmservice.dart index f0096a066d..163c711481 100644 --- a/packages/flutter_tools/lib/src/vmservice.dart +++ b/packages/flutter_tools/lib/src/vmservice.dart @@ -14,8 +14,13 @@ import 'base/logger.dart'; import 'base/utils.dart'; import 'convert.dart'; import 'device.dart'; +import 'ios/xcodeproj.dart'; +import 'project.dart'; import 'version.dart'; +const String kResultType = 'type'; +const String kResultTypeSuccess = 'Success'; + const String kGetSkSLsMethod = '_flutter.getSkSLs'; const String kSetAssetBundlePathMethod = '_flutter.setAssetBundlePath'; const String kFlushUIThreadTasksMethod = '_flutter.flushUIThreadTasks'; @@ -165,6 +170,7 @@ typedef VMServiceConnector = Future Function(Uri httpUri, { Restart? restart, CompileExpression? compileExpression, GetSkSLMethod? getSkSLMethod, + FlutterProject? flutterProject, PrintStructuredErrorLogMethod? printStructuredErrorLogMethod, io.CompressionOptions compression, Device? device, @@ -175,15 +181,16 @@ typedef VMServiceConnector = Future Function(Uri httpUri, { /// callbacks. /// /// All parameters besides [vmService] may be null. -Future setUpVmService( +Future setUpVmService({ ReloadSources? reloadSources, Restart? restart, CompileExpression? compileExpression, Device? device, GetSkSLMethod? skSLMethod, + FlutterProject? flutterProject, PrintStructuredErrorLogMethod? printStructuredErrorLogMethod, - vm_service.VmService vmService -) async { + required vm_service.VmService vmService, +}) async { // Each service registration requires a request to the attached VM service. Since the // order of these requests does not matter, store each future in a list and await // all at the end of this method. @@ -198,7 +205,7 @@ Future setUpVmService( return { 'result': { - 'type': 'Success', + kResultType: kResultTypeSuccess, }, }; }); @@ -211,7 +218,7 @@ Future setUpVmService( await restart(pause: pause); return { 'result': { - 'type': 'Success', + kResultType: kResultTypeSuccess, }, }; }); @@ -225,7 +232,7 @@ Future setUpVmService( versionJson['engineRevisionShort'] = version.engineRevisionShort; return { 'result': { - 'type': 'Success', + kResultType: kResultTypeSuccess, ...versionJson, }, }; @@ -246,7 +253,7 @@ Future setUpVmService( expression, definitions, typeDefinitions, libraryUri, klass, isStatic); return { - 'type': 'Success', + kResultType: kResultTypeSuccess, 'result': {'kernelBytes': kernelBytesBase64}, }; }); @@ -257,7 +264,7 @@ Future setUpVmService( final MemoryInfo result = await device.queryMemoryInfo(); return { 'result': { - 'type': 'Success', + kResultType: kResultTypeSuccess, ...result.toJson(), }, }; @@ -270,19 +277,44 @@ Future setUpVmService( if (filename == null) { return { 'result': { - 'type': 'Success', + kResultType: kResultTypeSuccess, }, }; } return { 'result': { - 'type': 'Success', + kResultType: kResultTypeSuccess, 'filename': filename, }, }; }); registrationRequests.add(vmService.registerService('flutterGetSkSL', 'Flutter Tools')); } + + if (flutterProject != null) { + vmService.registerServiceCallback('flutterGetIOSBuildOptions', (Map params) async { + final XcodeProjectInfo? info = await flutterProject.ios.projectInfo(); + if (info == null) { + return { + 'result': { + kResultType: kResultTypeSuccess, + }, + }; + } + return { + 'result': { + kResultType: kResultTypeSuccess, + 'targets': info.targets, + 'schemes': info.schemes, + 'buildConfigurations': info.buildConfigurations, + }, + }; + }); + registrationRequests.add( + vmService.registerService('flutterGetIOSBuildOptions', 'Flutter Tools'), + ); + } + if (printStructuredErrorLogMethod != null) { vmService.onExtensionEvent.listen(printStructuredErrorLogMethod); registrationRequests.add(vmService @@ -319,15 +351,16 @@ Future setUpVmService( /// See: https://github.com/dart-lang/sdk/commit/df8bf384eb815cf38450cb50a0f4b62230fba217 Future connectToVmService( Uri httpUri, { - ReloadSources? reloadSources, - Restart? restart, - CompileExpression? compileExpression, - GetSkSLMethod? getSkSLMethod, - PrintStructuredErrorLogMethod? printStructuredErrorLogMethod, - io.CompressionOptions compression = io.CompressionOptions.compressionDefault, - Device? device, - required Logger logger, - }) async { + ReloadSources? reloadSources, + Restart? restart, + CompileExpression? compileExpression, + GetSkSLMethod? getSkSLMethod, + FlutterProject? flutterProject, + PrintStructuredErrorLogMethod? printStructuredErrorLogMethod, + io.CompressionOptions compression = io.CompressionOptions.compressionDefault, + Device? device, + required Logger logger, +}) async { final VMServiceConnector connector = context.get() ?? _connect; return connector(httpUri, reloadSources: reloadSources, @@ -336,6 +369,7 @@ Future connectToVmService( compression: compression, device: device, getSkSLMethod: getSkSLMethod, + flutterProject: flutterProject, printStructuredErrorLogMethod: printStructuredErrorLogMethod, logger: logger, ); @@ -362,6 +396,7 @@ Future _connect( Restart? restart, CompileExpression? compileExpression, GetSkSLMethod? getSkSLMethod, + FlutterProject? flutterProject, PrintStructuredErrorLogMethod? printStructuredErrorLogMethod, io.CompressionOptions compression = io.CompressionOptions.compressionDefault, Device? device, @@ -373,13 +408,14 @@ Future _connect( ); final vm_service.VmService service = await setUpVmService( - reloadSources, - restart, - compileExpression, - device, - getSkSLMethod, - printStructuredErrorLogMethod, - delegateService, + reloadSources: reloadSources, + restart: restart, + compileExpression: compileExpression, + device: device, + skSLMethod: getSkSLMethod, + flutterProject: flutterProject, + printStructuredErrorLogMethod: printStructuredErrorLogMethod, + vmService: delegateService, ); // This call is to ensure we are able to establish a connection instead of diff --git a/packages/flutter_tools/test/general.shard/cold_test.dart b/packages/flutter_tools/test/general.shard/cold_test.dart index 868816686a..9da63d4188 100644 --- a/packages/flutter_tools/test/general.shard/cold_test.dart +++ b/packages/flutter_tools/test/general.shard/cold_test.dart @@ -11,6 +11,7 @@ import 'package:flutter_tools/src/build_system/targets/shader_compiler.dart'; import 'package:flutter_tools/src/compile.dart'; import 'package:flutter_tools/src/devfs.dart'; import 'package:flutter_tools/src/device.dart'; +import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/resident_runner.dart'; import 'package:flutter_tools/src/run_cold.dart'; import 'package:flutter_tools/src/tracing.dart'; @@ -213,6 +214,7 @@ class TestFlutterDevice extends FlutterDevice { Restart? restart, CompileExpression? compileExpression, GetSkSLMethod? getSkSLMethod, + FlutterProject? flutterProject, PrintStructuredErrorLogMethod? printStructuredErrorLogMethod, bool enableDds = true, bool cacheStartupProfile = false, diff --git a/packages/flutter_tools/test/general.shard/drive/drive_service_test.dart b/packages/flutter_tools/test/general.shard/drive/drive_service_test.dart index dc68e7de0d..6a6b527910 100644 --- a/packages/flutter_tools/test/general.shard/drive/drive_service_test.dart +++ b/packages/flutter_tools/test/general.shard/drive/drive_service_test.dart @@ -15,6 +15,7 @@ import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/convert.dart'; import 'package:flutter_tools/src/device.dart'; import 'package:flutter_tools/src/drive/drive_service.dart'; +import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/resident_runner.dart'; import 'package:flutter_tools/src/version.dart'; import 'package:flutter_tools/src/vmservice.dart'; @@ -443,6 +444,7 @@ FlutterDriverService setUpDriverService({ Restart? restart, CompileExpression? compileExpression, GetSkSLMethod? getSkSLMethod, + FlutterProject? flutterProject, PrintStructuredErrorLogMethod? printStructuredErrorLogMethod, io.CompressionOptions compression = io.CompressionOptions.compressionDefault, Device? device, diff --git a/packages/flutter_tools/test/general.shard/hot_test.dart b/packages/flutter_tools/test/general.shard/hot_test.dart index 29149c07b6..97f0210dc1 100644 --- a/packages/flutter_tools/test/general.shard/hot_test.dart +++ b/packages/flutter_tools/test/general.shard/hot_test.dart @@ -16,6 +16,7 @@ import 'package:flutter_tools/src/build_system/targets/shader_compiler.dart'; import 'package:flutter_tools/src/compile.dart'; import 'package:flutter_tools/src/devfs.dart'; import 'package:flutter_tools/src/device.dart'; +import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:flutter_tools/src/resident_devtools_handler.dart'; import 'package:flutter_tools/src/resident_runner.dart'; @@ -678,6 +679,7 @@ class TestFlutterDevice extends FlutterDevice { Restart? restart, CompileExpression? compileExpression, GetSkSLMethod? getSkSLMethod, + FlutterProject? flutterProject, PrintStructuredErrorLogMethod? printStructuredErrorLogMethod, bool disableServiceAuthCodes = false, bool enableDds = true, diff --git a/packages/flutter_tools/test/general.shard/integration_test_device_test.dart b/packages/flutter_tools/test/general.shard/integration_test_device_test.dart index 804275eb84..c3cf3cbe16 100644 --- a/packages/flutter_tools/test/general.shard/integration_test_device_test.dart +++ b/packages/flutter_tools/test/general.shard/integration_test_device_test.dart @@ -8,6 +8,7 @@ import 'package:flutter_tools/src/base/io.dart' as io; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/device.dart'; +import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/test/integration_test_device.dart'; import 'package:flutter_tools/src/test/test_device.dart'; import 'package:flutter_tools/src/vmservice.dart'; @@ -135,6 +136,7 @@ void main() { Restart? restart, CompileExpression? compileExpression, GetSkSLMethod? getSkSLMethod, + FlutterProject? flutterProject, PrintStructuredErrorLogMethod? printStructuredErrorLogMethod, io.CompressionOptions? compression, Device? device, @@ -154,6 +156,7 @@ void main() { Restart? restart, CompileExpression? compileExpression, GetSkSLMethod? getSkSLMethod, + FlutterProject? flutterProject, PrintStructuredErrorLogMethod? printStructuredErrorLogMethod, io.CompressionOptions? compression, Device? device, @@ -184,6 +187,7 @@ void main() { Restart? restart, CompileExpression? compileExpression, GetSkSLMethod? getSkSLMethod, + FlutterProject? flutterProject, PrintStructuredErrorLogMethod? printStructuredErrorLogMethod, io.CompressionOptions? compression, Device? device, @@ -213,6 +217,7 @@ void main() { Restart? restart, CompileExpression? compileExpression, GetSkSLMethod? getSkSLMethod, + FlutterProject? flutterProject, PrintStructuredErrorLogMethod? printStructuredErrorLogMethod, io.CompressionOptions? compression, Device? device, @@ -230,6 +235,7 @@ void main() { Restart? restart, CompileExpression? compileExpression, GetSkSLMethod? getSkSLMethod, + FlutterProject? flutterProject, PrintStructuredErrorLogMethod? printStructuredErrorLogMethod, io.CompressionOptions? compression, Device? device, diff --git a/packages/flutter_tools/test/general.shard/resident_runner_test.dart b/packages/flutter_tools/test/general.shard/resident_runner_test.dart index aab4d506fc..deee43d290 100644 --- a/packages/flutter_tools/test/general.shard/resident_runner_test.dart +++ b/packages/flutter_tools/test/general.shard/resident_runner_test.dart @@ -27,6 +27,7 @@ import 'package:flutter_tools/src/device.dart'; import 'package:flutter_tools/src/device_port_forwarder.dart'; import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/globals.dart' as globals; +import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:flutter_tools/src/resident_devtools_handler.dart'; import 'package:flutter_tools/src/resident_runner.dart'; @@ -2147,6 +2148,7 @@ flutter: Restart? restart, CompileExpression? compileExpression, GetSkSLMethod? getSkSLMethod, + FlutterProject? flutterProject, PrintStructuredErrorLogMethod? printStructuredErrorLogMethod, io.CompressionOptions? compression, Device? device, @@ -2181,6 +2183,7 @@ flutter: Restart? restart, CompileExpression? compileExpression, GetSkSLMethod? getSkSLMethod, + FlutterProject? flutterProject, PrintStructuredErrorLogMethod? printStructuredErrorLogMethod, io.CompressionOptions? compression, Device? device, @@ -2214,6 +2217,7 @@ flutter: Restart? restart, CompileExpression? compileExpression, GetSkSLMethod? getSkSLMethod, + FlutterProject? flutterProject, PrintStructuredErrorLogMethod? printStructuredErrorLogMethod, io.CompressionOptions? compression, Device? device, @@ -2248,6 +2252,7 @@ flutter: Restart? restart, CompileExpression? compileExpression, GetSkSLMethod? getSkSLMethod, + FlutterProject? flutterProject, PrintStructuredErrorLogMethod? printStructuredErrorLogMethod, io.CompressionOptions? compression, Device? device, @@ -2289,6 +2294,7 @@ flutter: Restart? restart, CompileExpression? compileExpression, GetSkSLMethod? getSkSLMethod, + FlutterProject? flutterProject, PrintStructuredErrorLogMethod? printStructuredErrorLogMethod, io.CompressionOptions compression = io.CompressionOptions.compressionDefault, Device? device, @@ -2344,6 +2350,7 @@ flutter: Restart? restart, CompileExpression? compileExpression, GetSkSLMethod? getSkSLMethod, + FlutterProject? flutterProject, PrintStructuredErrorLogMethod? printStructuredErrorLogMethod, io.CompressionOptions compression = io.CompressionOptions.compressionDefault, Device? device, @@ -2576,6 +2583,7 @@ class FakeFlutterDevice extends Fake implements FlutterDevice { Restart? restart, CompileExpression? compileExpression, GetSkSLMethod? getSkSLMethod, + FlutterProject? flutterProject, PrintStructuredErrorLogMethod? printStructuredErrorLogMethod, int? hostVmServicePort, int? ddsPort, @@ -2629,6 +2637,7 @@ class FakeDelegateFlutterDevice extends FlutterDevice { bool ipv6 = false, CompileExpression? compileExpression, GetSkSLMethod? getSkSLMethod, + FlutterProject? flutterProject, int? hostVmServicePort, int? ddsPort, PrintStructuredErrorLogMethod? printStructuredErrorLogMethod, diff --git a/packages/flutter_tools/test/general.shard/resident_web_runner_test.dart b/packages/flutter_tools/test/general.shard/resident_web_runner_test.dart index d00bbba29b..f360542e30 100644 --- a/packages/flutter_tools/test/general.shard/resident_web_runner_test.dart +++ b/packages/flutter_tools/test/general.shard/resident_web_runner_test.dart @@ -74,6 +74,10 @@ const List kAttachIsolateExpectations = 'service': 'flutterMemoryInfo', 'alias': 'Flutter Tools', }), + FakeVmServiceRequest(method: 'registerService', args: { + 'service': 'flutterGetIOSBuildOptions', + 'alias': 'Flutter Tools', + }), FakeVmServiceRequest( method: 'streamListen', args: { @@ -1637,6 +1641,7 @@ class FakeFlutterDevice extends Fake implements FlutterDevice { Restart? restart, CompileExpression? compileExpression, GetSkSLMethod? getSkSLMethod, + FlutterProject? flutterProject, PrintStructuredErrorLogMethod? printStructuredErrorLogMethod, int? hostVmServicePort, int? ddsPort, diff --git a/packages/flutter_tools/test/general.shard/vmservice_test.dart b/packages/flutter_tools/test/general.shard/vmservice_test.dart index c5238a37ad..6f7b562df9 100644 --- a/packages/flutter_tools/test/general.shard/vmservice_test.dart +++ b/packages/flutter_tools/test/general.shard/vmservice_test.dart @@ -9,6 +9,8 @@ import 'package:flutter_tools/src/base/io.dart' as io; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/convert.dart'; import 'package:flutter_tools/src/device.dart'; +import 'package:flutter_tools/src/ios/xcodeproj.dart'; +import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/vmservice.dart'; import 'package:test/fake.dart'; import 'package:vm_service/vm_service.dart' as vm_service; @@ -64,13 +66,8 @@ void main() { final MockVMService mockVMService = MockVMService(); await setUpVmService( - reloadSources, - null, - null, - null, - null, - null, - mockVMService, + reloadSources: reloadSources, + vmService: mockVMService, ); expect(mockVMService.services, containsPair('reloadSources', 'Flutter Tools')); @@ -81,28 +78,31 @@ void main() { final MockVMService mockVMService = MockVMService(); await setUpVmService( - null, - null, - null, - mockDevice, - null, - null, - mockVMService, + device: mockDevice, + vmService: mockVMService, ); expect(mockVMService.services, containsPair('flutterMemoryInfo', 'Flutter Tools')); }); + testWithoutContext('VmService registers flutterGetIOSBuildOptions service', () async { + final MockVMService mockVMService = MockVMService(); + final FlutterProject mockedVMService = MockFlutterProject( + mockedIos: MockIosProject(), + ); + await setUpVmService( + flutterProject: mockedVMService, + vmService: mockVMService, + ); + + expect(mockVMService.services, containsPair('flutterGetIOSBuildOptions', 'Flutter Tools')); + }); + testWithoutContext('VM Service registers flutterGetSkSL service', () async { final MockVMService mockVMService = MockVMService(); await setUpVmService( - null, - null, - null, - null, - () async => 'hello', - null, - mockVMService, + skSLMethod: () async => 'hello', + vmService: mockVMService, ); expect(mockVMService.services, containsPair('flutterGetSkSL', 'Flutter Tools')); @@ -113,13 +113,8 @@ void main() { ..errorOnRegisterService = true; await expectLater(() async => setUpVmService( - null, - null, - null, - null, - () async => 'hello', - null, - mockVMService, + skSLMethod: () async => 'hello', + vmService: mockVMService, ), throwsToolExit()); }); @@ -128,26 +123,17 @@ void main() { ..errorOnRegisterService = true; await expectLater(() async => setUpVmService( - null, - null, - null, - null, - () async => 'hello', - (vm_service.Event event) { }, - mockVMService, + skSLMethod: () async => 'hello', + printStructuredErrorLogMethod: (vm_service.Event event) { }, + vmService: mockVMService, ), throwsToolExit()); }); testWithoutContext('VM Service registers flutterPrintStructuredErrorLogMethod', () async { final MockVMService mockVMService = MockVMService(); await setUpVmService( - null, - null, - null, - null, - null, - (vm_service.Event event) async => 'hello', - mockVMService, + printStructuredErrorLogMethod: (vm_service.Event event) async => 'hello', + vmService: mockVMService, ); expect(mockVMService.listenedStreams, contains(vm_service.EventStreams.kExtension)); }); @@ -155,13 +141,7 @@ void main() { testWithoutContext('VM Service returns correct FlutterVersion', () async { final MockVMService mockVMService = MockVMService(); await setUpVmService( - null, - null, - null, - null, - null, - null, - mockVMService, + vmService: mockVMService, ); expect(mockVMService.services, containsPair('flutterVersion', 'Flutter Tools')); @@ -299,6 +279,50 @@ void main() { ])); }); + testWithoutContext('VmService forward flutterGetIOSBuildOptions request and response correctly', () async { + final MockVMService vmService = MockVMService(); + final XcodeProjectInfo expectedProjectInfo = XcodeProjectInfo( + ['target1', 'target2'], + ['config1', 'config2'], + ['scheme1', 'scheme2'], + MockLogger(), + ); + final FlutterProject mockedVMService = MockFlutterProject( + mockedIos: MockIosProject(mockedInfo: expectedProjectInfo), + ); + await setUpVmService( + flutterProject: mockedVMService, + vmService: vmService + ); + final vm_service.ServiceCallback cb = vmService.serviceCallBacks['flutterGetIOSBuildOptions']!; + + final Map response = await cb({}); + final Map result = response['result']! as Map; + expect(result[kResultType], kResultTypeSuccess); + expect(result['targets'], expectedProjectInfo.targets); + expect(result['buildConfigurations'], expectedProjectInfo.buildConfigurations); + expect(result['schemes'], expectedProjectInfo.schemes); + }); + + testWithoutContext('VmService forward flutterGetIOSBuildOptions request and response correctly when no iOS project', () async { + final MockVMService vmService = MockVMService(); + final FlutterProject mockedVMService = MockFlutterProject( + mockedIos: MockIosProject(), + ); + await setUpVmService( + flutterProject: mockedVMService, + vmService: vmService + ); + final vm_service.ServiceCallback cb = vmService.serviceCallBacks['flutterGetIOSBuildOptions']!; + + final Map response = await cb({}); + final Map result = response['result']! as Map; + expect(result[kResultType], kResultTypeSuccess); + expect(result['targets'], isNull); + expect(result['buildConfigurations'], isNull); + expect(result['schemes'], isNull); + }); + testWithoutContext('runInView forwards arguments correctly', () async { final FakeVmServiceHost fakeVmServiceHost = FakeVmServiceHost( requests: [ @@ -846,13 +870,36 @@ void main() { }); } +class MockFlutterProject extends Fake implements FlutterProject { + MockFlutterProject({ + required IosProject mockedIos + }) : ios = mockedIos; + + @override + final IosProject ios; +} + +class MockIosProject extends Fake implements IosProject { + MockIosProject({this.mockedInfo}); + + final XcodeProjectInfo? mockedInfo; + + @override + Future projectInfo() async => mockedInfo; +} + +class MockLogger extends Fake implements Logger { } + class MockVMService extends Fake implements vm_service.VmService { final Map services = {}; + final Map serviceCallBacks = {}; final Set listenedStreams = {}; bool errorOnRegisterService = false; @override - void registerServiceCallback(String service, vm_service.ServiceCallback cb) {} + void registerServiceCallback(String service, vm_service.ServiceCallback cb) { + serviceCallBacks[service] = cb; + } @override Future registerService(String service, String alias) async { diff --git a/packages/flutter_tools/test/integration.shard/vmservice_integration_test.dart b/packages/flutter_tools/test/integration.shard/vmservice_integration_test.dart index c03a403bd7..7768150930 100644 --- a/packages/flutter_tools/test/integration.shard/vmservice_integration_test.dart +++ b/packages/flutter_tools/test/integration.shard/vmservice_integration_test.dart @@ -55,7 +55,13 @@ void main() { testWithoutContext('flutterMemoryInfo can be called', () async { final Response response = - await vmService.callServiceExtension('s0.flutterMemoryInfo'); + await vmService.callServiceExtension('s0.flutterMemoryInfo'); + expect(response.type, 'Success'); + }); + + testWithoutContext('flutterGetIOSBuildOptions can be called', () async { + final Response response = + await vmService.callServiceExtension('s0.flutterGetIOSBuildOptions'); expect(response.type, 'Success'); });