| // Copyright 2014 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'package:file/file.dart'; |
| import 'package:flutter_tools/src/base/file_system.dart'; |
| import 'package:vm_service/vm_service.dart'; |
| import 'package:vm_service/vm_service_io.dart'; |
| |
| import '../src/common.dart'; |
| import 'test_data/basic_project.dart'; |
| import 'test_driver.dart'; |
| import 'test_utils.dart'; |
| |
| void main() { |
| group('Flutter Tool VMService method', () { |
| late Directory tempDir; |
| late FlutterRunTestDriver flutter; |
| late VmService vmService; |
| |
| setUp(() async { |
| tempDir = createResolvedTempDirectorySync('vmservice_integration_test.'); |
| |
| final BasicProject project = BasicProject(); |
| await project.setUpIn(tempDir); |
| |
| flutter = FlutterRunTestDriver(tempDir); |
| await flutter.run(withDebugger: true); |
| final int? port = flutter.vmServicePort; |
| expect(port != null, true); |
| vmService = await vmServiceConnectUri('ws://localhost:$port/ws'); |
| }); |
| |
| tearDown(() async { |
| await flutter.stop(); |
| tryToDelete(tempDir); |
| }); |
| |
| testWithoutContext('getSupportedProtocols includes DDS', () async { |
| final ProtocolList protocolList = |
| await vmService.getSupportedProtocols(); |
| expect(protocolList.protocols, hasLength(2)); |
| for (final Protocol protocol in protocolList.protocols!) { |
| expect(protocol.protocolName, anyOf('VM Service', 'DDS')); |
| } |
| }); |
| |
| testWithoutContext('flutterVersion can be called', () async { |
| final Response response = |
| await vmService.callServiceExtension('s0.flutterVersion'); |
| expect(response.type, 'Success'); |
| expect(response.json, containsPair('frameworkRevisionShort', isNotNull)); |
| expect(response.json, containsPair('engineRevisionShort', isNotNull)); |
| }); |
| |
| testWithoutContext('flutterMemoryInfo can be called', () async { |
| final Response response = |
| await vmService.callServiceExtension('s0.flutterMemoryInfo'); |
| expect(response.type, 'Success'); |
| }); |
| |
| testWithoutContext('reloadSources can be called', () async { |
| final VM vm = await vmService.getVM(); |
| final IsolateRef? isolateRef = vm.isolates?.first; |
| expect(isolateRef != null, true); |
| final Response response = await vmService.callMethod('s0.reloadSources', |
| isolateId: isolateRef!.id); |
| expect(response.type, 'Success'); |
| }); |
| |
| testWithoutContext('reloadSources fails on bad params', () async { |
| final Future<Response> response = |
| vmService.callMethod('s0.reloadSources', isolateId: ''); |
| expect(response, throwsA(const TypeMatcher<RPCError>())); |
| }); |
| |
| testWithoutContext('hotRestart can be called', () async { |
| final VM vm = await vmService.getVM(); |
| final IsolateRef? isolateRef = vm.isolates?.first; |
| expect(isolateRef != null, true); |
| final Response response = |
| await vmService.callMethod('s0.hotRestart', isolateId: isolateRef!.id); |
| expect(response.type, 'Success'); |
| }); |
| |
| testWithoutContext('hotRestart fails on bad params', () async { |
| final Future<Response> response = vmService.callMethod('s0.hotRestart', |
| args: <String, dynamic>{'pause': 'not_a_bool'}); |
| expect(response, throwsA(const TypeMatcher<RPCError>())); |
| }); |
| |
| testWithoutContext('flutterGetSkSL can be called', () async { |
| final Response response = await vmService.callMethod('s0.flutterGetSkSL'); |
| |
| expect(response.type, 'Success'); |
| }); |
| |
| testWithoutContext('ext.flutter.brightnessOverride can toggle window brightness', () async { |
| final Isolate isolate = await waitForExtension(vmService, 'ext.flutter.brightnessOverride'); |
| final Response response = await vmService.callServiceExtension( |
| 'ext.flutter.brightnessOverride', |
| isolateId: isolate.id, |
| ); |
| expect(response.json?['value'], 'Brightness.light'); |
| |
| final Response updateResponse = await vmService.callServiceExtension( |
| 'ext.flutter.brightnessOverride', |
| isolateId: isolate.id, |
| args: <String, String>{ |
| 'value': 'Brightness.dark', |
| } |
| ); |
| expect(updateResponse.json?['value'], 'Brightness.dark'); |
| |
| // Change the brightness back to light |
| final Response verifyResponse = await vmService.callServiceExtension( |
| 'ext.flutter.brightnessOverride', |
| isolateId: isolate.id, |
| args: <String, String>{ |
| 'value': 'Brightness.light', |
| } |
| ); |
| expect(verifyResponse.json?['value'], 'Brightness.light'); |
| |
| // Change with a bogus value |
| final Response bogusResponse = await vmService.callServiceExtension( |
| 'ext.flutter.brightnessOverride', |
| isolateId: isolate.id, |
| args: <String, String>{ |
| 'value': 'dark', // Intentionally invalid value. |
| } |
| ); |
| expect(bogusResponse.json?['value'], 'Brightness.light'); |
| }); |
| |
| testWithoutContext('ext.flutter.debugPaint can toggle debug painting', () async { |
| final Isolate isolate = await waitForExtension(vmService, 'ext.flutter.debugPaint'); |
| final Response response = await vmService.callServiceExtension( |
| 'ext.flutter.debugPaint', |
| isolateId: isolate.id, |
| ); |
| expect(response.json?['enabled'], 'false'); |
| |
| final Response updateResponse = await vmService.callServiceExtension( |
| 'ext.flutter.debugPaint', |
| isolateId: isolate.id, |
| args: <String, String>{ |
| 'enabled': 'true', |
| } |
| ); |
| expect(updateResponse.json?['enabled'], 'true'); |
| }); |
| }); |
| } |