From a17b3309807a2fadabf4482d2705edc841f5fcfa Mon Sep 17 00:00:00 2001 From: Ben Konyi Date: Wed, 16 Sep 2020 16:27:42 -0700 Subject: [PATCH] Reland "Re-enable the Dart Development Service (DDS) (#64671)" (#65873) This reverts commit 66b01c1f2905f6b4f845f7283abe3e458351fe2e. * Add DDS ipv6 support * Use --dds-port for DDS instead of hijacking --host-vmservice-port --- dev/bots/pubspec.yaml | 4 +-- dev/devicelab/pubspec.yaml | 4 +-- dev/integration_tests/ui/pubspec.yaml | 4 +-- packages/flutter_tools/lib/src/base/dds.dart | 18 +++++------ .../flutter_tools/lib/src/commands/drive.dart | 13 ++++++-- .../flutter_tools/lib/src/commands/run.dart | 17 +++++----- .../flutter_tools/lib/src/commands/test.dart | 2 ++ packages/flutter_tools/lib/src/device.dart | 3 ++ .../lib/src/fuchsia/fuchsia_device.dart | 14 ++++++--- .../flutter_tools/lib/src/ios/simulators.dart | 4 +-- .../flutter_tools/lib/src/mdns_discovery.dart | 6 ++-- .../lib/src/resident_runner.dart | 10 +++++- .../lib/src/runner/flutter_command.dart | 17 +++++++++- .../lib/src/test/flutter_platform.dart | 31 ++++++++++++++----- .../flutter_tools/lib/src/test/runner.dart | 3 ++ packages/flutter_tools/pubspec.yaml | 4 +-- .../commands.shard/hermetic/attach_test.dart | 13 +++++--- .../commands.shard/hermetic/drive_test.dart | 4 ++- .../commands.shard/hermetic/test_test.dart | 1 + .../test/general.shard/cold_test.dart | 3 ++ .../fuchsia/fuchsia_device_test.dart | 9 ++++-- .../test/general.shard/hot_test.dart | 3 ++ .../ios/ios_device_start_prebuilt_test.dart | 6 +++- .../general.shard/mdns_discovery_test.dart | 20 ++++++++++++ .../general.shard/resident_runner_test.dart | 6 +++- .../vmservice_integration_test.dart | 3 +- 26 files changed, 162 insertions(+), 60 deletions(-) diff --git a/dev/bots/pubspec.yaml b/dev/bots/pubspec.yaml index f5304464957..f313cba32bc 100644 --- a/dev/bots/pubspec.yaml +++ b/dev/bots/pubspec.yaml @@ -36,7 +36,7 @@ dependencies: glob: 1.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" html: 0.14.0+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" http_multi_server: 2.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - image: 2.1.14 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + image: 2.1.15 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" io: 0.3.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" js: 0.6.3-nullsafety # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" json_rpc_2: 2.2.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -76,4 +76,4 @@ dev_dependencies: mockito: 4.1.1 test_api: 0.2.19-nullsafety -# PUBSPEC CHECKSUM: 7ac4 +# PUBSPEC CHECKSUM: c8c5 diff --git a/dev/devicelab/pubspec.yaml b/dev/devicelab/pubspec.yaml index 7d4c32a6e2d..4ac4c9cfe8c 100644 --- a/dev/devicelab/pubspec.yaml +++ b/dev/devicelab/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: args: 1.6.0 file: 6.0.0-nullsafety.1 - image: 2.1.14 + image: 2.1.15 meta: 1.3.0-nullsafety.2 path: 1.8.0-nullsafety platform: 3.0.0-nullsafety.1 @@ -75,4 +75,4 @@ dev_dependencies: webkit_inspection_protocol: 0.7.3 # 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: a87f +# PUBSPEC CHECKSUM: da80 diff --git a/dev/integration_tests/ui/pubspec.yaml b/dev/integration_tests/ui/pubspec.yaml index 6e2bc0ca715..c2c1a691c92 100644 --- a/dev/integration_tests/ui/pubspec.yaml +++ b/dev/integration_tests/ui/pubspec.yaml @@ -6,7 +6,7 @@ environment: sdk: ">=2.8.0 <3.0.0" dependencies: - image: 2.1.14 + image: 2.1.15 flutter: sdk: flutter flutter_driver: @@ -84,4 +84,4 @@ dev_dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 2dc6 +# PUBSPEC CHECKSUM: 6fc7 diff --git a/packages/flutter_tools/lib/src/base/dds.dart b/packages/flutter_tools/lib/src/base/dds.dart index da9f8a8d0c0..7da8667b031 100644 --- a/packages/flutter_tools/lib/src/base/dds.dart +++ b/packages/flutter_tools/lib/src/base/dds.dart @@ -13,30 +13,24 @@ import 'logger.dart'; class DartDevelopmentService { DartDevelopmentService({@required this.logger}); - // TODO(bkonyi): enable once VM service can handle SSE forwarding for - // Devtools (https://github.com/flutter/flutter/issues/62507) - static const bool ddsDisabled = true; final Logger logger; dds.DartDevelopmentService _ddsInstance; + Uri get uri => _ddsInstance.uri; + Future startDartDevelopmentService( Uri observatoryUri, + int hostPort, bool ipv6, + bool disableServiceAuthCodes, ) async { - if (ddsDisabled) { - logger.printTrace( - 'DDS is currently disabled due to ' - 'https://github.com/flutter/flutter/issues/62507' - ); - return; - } final Uri ddsUri = Uri( scheme: 'http', host: (ipv6 ? io.InternetAddress.loopbackIPv6 : io.InternetAddress.loopbackIPv4 ).host, - port: 0, + port: hostPort ?? 0, ); logger.printTrace( 'Launching a Dart Developer Service (DDS) instance at $ddsUri, ' @@ -46,6 +40,8 @@ class DartDevelopmentService { _ddsInstance = await dds.DartDevelopmentService.startDartDevelopmentService( observatoryUri, serviceUri: ddsUri, + enableAuthCodes: !disableServiceAuthCodes, + ipv6: ipv6, ); logger.printTrace('DDS is listening at ${_ddsInstance.uri}.'); } on dds.DartDevelopmentServiceException catch (e) { diff --git a/packages/flutter_tools/lib/src/commands/drive.dart b/packages/flutter_tools/lib/src/commands/drive.dart index f9c587db5c3..08d086e5548 100644 --- a/packages/flutter_tools/lib/src/commands/drive.dart +++ b/packages/flutter_tools/lib/src/commands/drive.dart @@ -236,12 +236,18 @@ class DriveCommand extends RunCommandBase { } observatoryUri = result.observatoryUri.toString(); // TODO(bkonyi): add web support (https://github.com/flutter/flutter/issues/61259) - if (!isWebPlatform) { + if (!isWebPlatform && !disableDds) { try { // If there's another flutter_tools instance still connected to the target // application, DDS will already be running remotely and this call will fail. // We can ignore this and continue to use the remote DDS instance. - await device.dds.startDartDevelopmentService(Uri.parse(observatoryUri), ipv6); + await device.dds.startDartDevelopmentService( + Uri.parse(observatoryUri), + ddsPort, + ipv6, + disableServiceAuthCodes, + ); + observatoryUri = device.dds.uri.toString(); } on dds.DartDevelopmentServiceException catch(_) { globals.printTrace('Note: DDS is already connected to $observatoryUri.'); } @@ -480,7 +486,8 @@ Future _startApp( debuggingOptions: DebuggingOptions.enabled( command.getBuildInfo(), startPaused: true, - hostVmServicePort: command.hostVmservicePort, + hostVmServicePort: webUri != null ? command.hostVmservicePort : 0, + ddsPort: command.ddsPort, verboseSystemLogs: command.verboseSystemLogs, cacheSkSL: command.cacheSkSL, dumpSkpOnShaderCompilation: command.dumpSkpOnShaderCompilation, diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart index b70a1a73d9f..0c9ff713976 100644 --- a/packages/flutter_tools/lib/src/commands/run.dart +++ b/packages/flutter_tools/lib/src/commands/run.dart @@ -66,7 +66,12 @@ abstract class RunCommandBase extends FlutterCommand with DeviceBasedDevelopment help: 'A file to write the attached vmservice uri to after an' ' application is started.', valueHelp: 'project/example/out.txt' - ); + ) + ..addFlag('disable-service-auth-codes', + negatable: false, + hide: !verboseHelp, + help: 'No longer require an authentication code to connect to the VM ' + 'service (not recommended).'); usesWebOptions(hide: !verboseHelp); usesTargetOption(); usesPortOptions(); @@ -76,13 +81,14 @@ abstract class RunCommandBase extends FlutterCommand with DeviceBasedDevelopment addNullSafetyModeOptions(hide: !verboseHelp); usesDeviceUserOption(); usesDeviceTimeoutOption(); + addDdsOptions(verboseHelp: verboseHelp); } bool get traceStartup => boolArg('trace-startup'); bool get cacheSkSL => boolArg('cache-sksl'); bool get dumpSkpOnShaderCompilation => boolArg('dump-skp-on-shader-compilation'); bool get purgePersistentCache => boolArg('purge-persistent-cache'); - + bool get disableServiceAuthCodes => boolArg('disable-service-auth-codes'); String get route => stringArg('route'); } @@ -206,11 +212,6 @@ class RunCommand extends RunCommandBase { 'results out to "refresh_benchmark.json", and exit. This flag is ' 'intended for use in generating automated flutter benchmarks.', ) - ..addFlag('disable-service-auth-codes', - negatable: false, - hide: !verboseHelp, - help: 'No longer require an authentication code to connect to the VM ' - 'service (not recommended).') ..addFlag('web-initialize-platform', negatable: true, defaultsTo: true, @@ -227,7 +228,6 @@ class RunCommand extends RunCommandBase { 'Currently this is only supported on Android devices. This option ' 'cannot be paired with --use-application-binary.' ); - addDdsOptions(verboseHelp: verboseHelp); } @override @@ -408,6 +408,7 @@ class RunCommand extends RunCommandBase { purgePersistentCache: purgePersistentCache, deviceVmServicePort: deviceVmservicePort, hostVmServicePort: hostVmservicePort, + ddsPort: ddsPort, verboseSystemLogs: boolArg('verbose-system-logs'), initializePlatform: boolArg('web-initialize-platform'), hostname: featureFlags.isWebEnabled ? stringArg('web-hostname') : '', diff --git a/packages/flutter_tools/lib/src/commands/test.dart b/packages/flutter_tools/lib/src/commands/test.dart index c673f4fac8b..fe2391e7b92 100644 --- a/packages/flutter_tools/lib/src/commands/test.dart +++ b/packages/flutter_tools/lib/src/commands/test.dart @@ -131,6 +131,7 @@ class TestCommand extends FlutterCommand { 'This flag is ignored if --start-paused or coverage are requested. ' 'The vmservice will be enabled no matter what in those cases.' ); + addDdsOptions(verboseHelp: verboseHelp); } /// The interface for starting and configuring the tester. @@ -274,6 +275,7 @@ class TestCommand extends FlutterCommand { enableObservatory: collector != null || startPaused || boolArg('enable-vmservice'), startPaused: startPaused, disableServiceAuthCodes: disableServiceAuthCodes, + disableDds: disableDds, ipv6: boolArg('ipv6'), machine: machine, buildMode: BuildMode.debug, diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart index 52fff93b14c..83ab8b09fa4 100644 --- a/packages/flutter_tools/lib/src/device.dart +++ b/packages/flutter_tools/lib/src/device.dart @@ -789,6 +789,7 @@ class DebuggingOptions { this.verboseSystemLogs = false, this.hostVmServicePort, this.deviceVmServicePort, + this.ddsPort, this.initializePlatform = true, this.hostname, this.port, @@ -830,6 +831,7 @@ class DebuggingOptions { verboseSystemLogs = false, hostVmServicePort = null, deviceVmServicePort = null, + ddsPort = null, vmserviceOutFile = null, fastStart = false, webEnableExpressionEvaluation = false, @@ -857,6 +859,7 @@ class DebuggingOptions { final bool initializePlatform; final int hostVmServicePort; final int deviceVmServicePort; + final int ddsPort; final String port; final String hostname; final bool webEnableExposeUrl; diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart index 37fef4400cf..8ef7d929981 100644 --- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart +++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart @@ -55,8 +55,14 @@ Future _kDefaultFuchsiaIsolateDiscoveryConnector(Uri uri) Future _kDefaultDartDevelopmentServiceStarter( Device device, Uri observatoryUri, + bool disableServiceAuthCodes, ) async { - await device.dds.startDartDevelopmentService(observatoryUri, true); + await device.dds.startDartDevelopmentService( + observatoryUri, + 0, + true, + disableServiceAuthCodes, + ); } /// Read the log for a particular device. @@ -738,7 +744,7 @@ class FuchsiaIsolateDiscoveryProtocol { final String _isolateName; final Completer _foundUri = Completer(); final Future Function(Uri) _vmServiceConnector; - final Future Function(Device, Uri) _ddsStarter; + final Future Function(Device, Uri, bool) _ddsStarter; // whether to only poll once. final bool _pollOnce; Timer _pollingTimer; @@ -781,8 +787,8 @@ class FuchsiaIsolateDiscoveryProtocol { final int localPort = await _device.portForwarder.forward(port); try { final Uri uri = Uri.parse('http://[$_ipv6Loopback]:$localPort'); - await _ddsStarter(_device, uri); - service = await _vmServiceConnector(uri); + await _ddsStarter(_device, uri, true); + service = await _vmServiceConnector(_device.dds.uri); _ports[port] = service; } on SocketException catch (err) { globals.printTrace('Failed to connect to $localPort: $err'); diff --git a/packages/flutter_tools/lib/src/ios/simulators.dart b/packages/flutter_tools/lib/src/ios/simulators.dart index dcba2bbbc29..9e284ccaad7 100644 --- a/packages/flutter_tools/lib/src/ios/simulators.dart +++ b/packages/flutter_tools/lib/src/ios/simulators.dart @@ -424,8 +424,8 @@ class IOSSimulator extends Device { if (debuggingOptions.skiaDeterministicRendering) '--skia-deterministic-rendering', if (debuggingOptions.useTestFonts) '--use-test-fonts', if (debuggingOptions.traceAllowlist != null) '--trace-allowlist="${debuggingOptions.traceAllowlist}"', - if (dartVmFlags.isNotEmpty) '--dart-flags=$dartVmFlags' - '--observatory-port=${debuggingOptions.hostVmServicePort ?? 0}', + if (dartVmFlags.isNotEmpty) '--dart-flags=$dartVmFlags', + '--observatory-port=${debuggingOptions.hostVmServicePort ?? 0}' ], ]; diff --git a/packages/flutter_tools/lib/src/mdns_discovery.dart b/packages/flutter_tools/lib/src/mdns_discovery.dart index 878a85d2f43..3375e8d3e4b 100644 --- a/packages/flutter_tools/lib/src/mdns_discovery.dart +++ b/packages/flutter_tools/lib/src/mdns_discovery.dart @@ -237,7 +237,9 @@ Future buildObservatoryUri( if (!path.endsWith('/')) { path += '/'; } - final int actualHostPort = hostVmservicePort ?? await device - .portForwarder.forward(devicePort); + hostVmservicePort ??= 0; + final int actualHostPort = hostVmservicePort == 0 ? + await device.portForwarder.forward(devicePort) : + hostVmservicePort; return Uri(scheme: 'http', host: host, port: actualHostPort, path: path); } diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart index 9008f0389bb..dd8224044f2 100644 --- a/packages/flutter_tools/lib/src/resident_runner.dart +++ b/packages/flutter_tools/lib/src/resident_runner.dart @@ -205,6 +205,9 @@ class FlutterDevice { ReloadMethod reloadMethod, GetSkSLMethod getSkSLMethod, PrintStructuredErrorLogMethod printStructuredErrorLogMethod, + int hostVmServicePort, + int ddsPort, + bool disableServiceAuthCodes = false, bool disableDds = false, bool ipv6 = false, }) { @@ -220,12 +223,14 @@ class FlutterDevice { if (!disableDds) { await device.dds.startDartDevelopmentService( observatoryUri, + ddsPort, ipv6, + disableServiceAuthCodes, ); } try { service = await connectToVmService( - observatoryUri, + disableDds ? observatoryUri : device.dds.uri, reloadSources: reloadSources, restart: restart, compileExpression: compileExpression, @@ -1238,10 +1243,13 @@ abstract class ResidentRunner { restart: restart, compileExpression: compileExpression, disableDds: debuggingOptions.disableDds, + ddsPort: debuggingOptions.ddsPort, + hostVmServicePort: debuggingOptions.hostVmServicePort, reloadMethod: reloadMethod, getSkSLMethod: getSkSLMethod, printStructuredErrorLogMethod: printStructuredErrorLog, ipv6: ipv6, + disableServiceAuthCodes: debuggingOptions.disableServiceAuthCodes ); // This will wait for at least one flutter view before returning. final Status status = globals.logger.startProgress( diff --git a/packages/flutter_tools/lib/src/runner/flutter_command.dart b/packages/flutter_tools/lib/src/runner/flutter_command.dart index b83c1d3364b..766cf018515 100644 --- a/packages/flutter_tools/lib/src/runner/flutter_command.dart +++ b/packages/flutter_tools/lib/src/runner/flutter_command.dart @@ -285,7 +285,9 @@ abstract class FlutterCommand extends Command { argParser.addOption(observatoryPortOption, help: '(deprecated use host-vmservice-port instead) ' 'Listen to the given port for an observatory debugger connection.\n' - 'Specifying port 0 (the default) will find a random free port.', + 'Specifying port 0 (the default) will find a random free port.\nNote: ' + 'if the Dart Development Service (DDS) is enabled, this will not be the port ' + 'of the Observatory instance advertised on the command line.', ); argParser.addOption('device-vmservice-port', help: 'Look for vmservice connections only from the specified port.\n' @@ -301,6 +303,10 @@ abstract class FlutterCommand extends Command { } void addDdsOptions({@required bool verboseHelp}) { + argParser.addOption('dds-port', + help: 'When this value is provided, the Dart Development Service (DDS) will be ' + 'bound to the provided port.\nSpecifying port 0 (the default) will find ' + 'a random free port.'); argParser.addFlag( 'disable-dds', hide: !verboseHelp, @@ -313,6 +319,15 @@ abstract class FlutterCommand extends Command { ); } + bool get disableDds => boolArg('disable-dds'); + + int get ddsPort { + if (argResults.wasParsed('dds-port')) { + return int.tryParse(stringArg('dds-port')) ?? 0; + } + return 0; + } + /// Gets the vmservice port provided to in the 'observatory-port' or /// 'host-vmservice-port option. /// diff --git a/packages/flutter_tools/lib/src/test/flutter_platform.dart b/packages/flutter_tools/lib/src/test/flutter_platform.dart index 8fd501c4ba7..1146a38e05f 100644 --- a/packages/flutter_tools/lib/src/test/flutter_platform.dart +++ b/packages/flutter_tools/lib/src/test/flutter_platform.dart @@ -4,6 +4,7 @@ import 'dart:async'; +import 'package:dds/dds.dart'; import 'package:meta/meta.dart'; import 'package:package_config/package_config.dart'; import 'package:stream_channel/stream_channel.dart'; @@ -52,6 +53,7 @@ FlutterPlatform installHook({ bool machine = false, bool startPaused = false, bool disableServiceAuthCodes = false, + bool disableDds = false, int port = 0, String precompiledDillPath, Map precompiledDillFiles, @@ -89,6 +91,7 @@ FlutterPlatform installHook({ enableObservatory: enableObservatory, startPaused: startPaused, disableServiceAuthCodes: disableServiceAuthCodes, + disableDds: disableDds, explicitObservatoryPort: observatoryPort, host: _kHosts[serverType], port: port, @@ -233,6 +236,7 @@ class FlutterPlatform extends PlatformPlugin { this.machine, this.startPaused, this.disableServiceAuthCodes, + this.disableDds, this.explicitObservatoryPort, this.host, this.port, @@ -255,6 +259,7 @@ class FlutterPlatform extends PlatformPlugin { final bool machine; final bool startPaused; final bool disableServiceAuthCodes; + final bool disableDds; final int explicitObservatoryPort; final InternetAddress host; final int port; @@ -402,7 +407,7 @@ class FlutterPlatform extends PlatformPlugin { controllerSinkClosed = true; })); - // Prepare our WebSocket server to talk to the engine subproces. + // Prepare our WebSocket server to talk to the engine subprocess. final HttpServer server = await bind(host, port); finalizers.add(() async { globals.printTrace('test $ourTestCount: shutting down test harness socket server'); @@ -496,15 +501,17 @@ class FlutterPlatform extends PlatformPlugin { assert(processObservatoryUri == null); assert(explicitObservatoryPort == null || explicitObservatoryPort == detectedUri.port); - if (startPaused && !machine) { - globals.printStatus('The test process has been started.'); - globals.printStatus('You can now connect to it using observatory. To connect, load the following Web site in your browser:'); - globals.printStatus(' $detectedUri'); - globals.printStatus('You should first set appropriate breakpoints, then resume the test in the debugger.'); + if (!disableDds) { + final DartDevelopmentService dds = await DartDevelopmentService.startDartDevelopmentService( + detectedUri, + enableAuthCodes: !disableServiceAuthCodes, + ipv6: host.type == InternetAddressType.IPv6, + ); + processObservatoryUri = dds.uri; + globals.printTrace('Dart Development Service started at ${dds.uri}, forwarding to VM service at ${dds.remoteVmServiceUri}.'); } else { - globals.printTrace('test $ourTestCount: using observatory uri $detectedUri from pid ${process.pid}'); + processObservatoryUri = detectedUri; } - processObservatoryUri = detectedUri; { globals.printTrace('Connecting to service protocol: $processObservatoryUri'); final Future localVmService = connectToVmService(processObservatoryUri, @@ -513,6 +520,14 @@ class FlutterPlatform extends PlatformPlugin { globals.printTrace('Successfully connected to service protocol: $processObservatoryUri'); })); } + if (startPaused && !machine) { + globals.printStatus('The test process has been started.'); + globals.printStatus('You can now connect to it using observatory. To connect, load the following Web site in your browser:'); + globals.printStatus(' $processObservatoryUri'); + globals.printStatus('You should first set appropriate breakpoints, then resume the test in the debugger.'); + } else { + globals.printTrace('test $ourTestCount: using observatory uri $processObservatoryUri from pid ${process.pid}'); + } gotProcessObservatoryUri.complete(); watcher?.handleStartedProcess( ProcessEvent(ourTestCount, process, processObservatoryUri)); diff --git a/packages/flutter_tools/lib/src/test/runner.dart b/packages/flutter_tools/lib/src/test/runner.dart index 5b1c612e0b2..524f3f32352 100644 --- a/packages/flutter_tools/lib/src/test/runner.dart +++ b/packages/flutter_tools/lib/src/test/runner.dart @@ -34,6 +34,7 @@ abstract class FlutterTestRunner { bool enableObservatory = false, bool startPaused = false, bool disableServiceAuthCodes = false, + bool disableDds = false, bool ipv6 = false, bool machine = false, String precompiledDillPath, @@ -69,6 +70,7 @@ class _FlutterTestRunnerImpl implements FlutterTestRunner { bool enableObservatory = false, bool startPaused = false, bool disableServiceAuthCodes = false, + bool disableDds = false, bool ipv6 = false, bool machine = false, String precompiledDillPath, @@ -167,6 +169,7 @@ class _FlutterTestRunnerImpl implements FlutterTestRunner { machine: machine, startPaused: startPaused, disableServiceAuthCodes: disableServiceAuthCodes, + disableDds: disableDds, serverType: serverType, precompiledDillPath: precompiledDillPath, precompiledDillFiles: precompiledDillFiles, diff --git a/packages/flutter_tools/pubspec.yaml b/packages/flutter_tools/pubspec.yaml index 0e78512bf1f..e2d246eff80 100644 --- a/packages/flutter_tools/pubspec.yaml +++ b/packages/flutter_tools/pubspec.yaml @@ -11,7 +11,7 @@ dependencies: # To update these, use "flutter update-packages --force-upgrade". archive: 2.0.13 args: 1.6.0 - dds: 1.3.1 + dds: 1.3.4 dwds: 6.0.0 completion: 0.2.2 coverage: 0.14.1 @@ -113,4 +113,4 @@ dartdoc: # Exclude this package from the hosted API docs. nodoc: true -# PUBSPEC CHECKSUM: 7423 +# PUBSPEC CHECKSUM: 9526 diff --git a/packages/flutter_tools/test/commands.shard/hermetic/attach_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/attach_test.dart index c820e5af8af..116b48f9fee 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/attach_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/attach_test.dart @@ -90,8 +90,8 @@ void main() { when(portForwarder.unforward(any)) .thenAnswer((_) async {}); when(device.dds).thenReturn(mockDds); - when(mockDds.startDartDevelopmentService(any, false)).thenReturn(null); - + when(mockDds.startDartDevelopmentService(any, any, false, any)).thenReturn(null); + when(mockDds.uri).thenReturn(Uri.parse('http://localhost:8181')); final HttpClientRequest httpClientRequest = MockHttpClientRequest(); httpClient = MockHttpClient(); when(httpClient.putUrl(any)) @@ -317,7 +317,8 @@ void main() { )).thenReturn(mockHotRunner); when(mockHotRunner.exited).thenReturn(false); when(mockHotRunner.isWaitingForObservatory).thenReturn(false); - when(mockDds.startDartDevelopmentService(any, false)).thenReturn(null); + when(mockDds.startDartDevelopmentService(any, any, false, any)).thenReturn(null); + when(mockDds.uri).thenReturn(Uri.parse('http://localhost:8181')); testDeviceManager.addDevice(device); when(device.getLogReader(includePastLogs: anyNamed('includePastLogs'))) @@ -398,7 +399,8 @@ void main() { )).thenReturn(mockHotRunner); when(mockHotRunner.exited).thenReturn(false); when(mockHotRunner.isWaitingForObservatory).thenReturn(false); - when(mockDds.startDartDevelopmentService(any, false)).thenReturn(null); + when(mockDds.startDartDevelopmentService(any, any, false, any)).thenReturn(null); + when(mockDds.uri).thenReturn(Uri.parse('http://localhost:8181')); testDeviceManager.addDevice(device); @@ -444,8 +446,9 @@ void main() { .thenAnswer((_) async {}); when(device.dds) .thenReturn(mockDds); - when(mockDds.startDartDevelopmentService(any, any)) + when(mockDds.startDartDevelopmentService(any, any, any, any)) .thenReturn(null); + when(mockDds.uri).thenReturn(Uri.parse('http://localhost:8181')); }); testUsingContext('succeeds in ipv4 mode', () async { diff --git a/packages/flutter_tools/test/commands.shard/hermetic/drive_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/drive_test.dart index 19e79f39ff1..e0242ad7e1c 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/drive_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/drive_test.dart @@ -69,7 +69,8 @@ void main() { void applyDdsMocks(Device device) { final MockDartDevelopmentService mockDds = MockDartDevelopmentService(); when(device.dds).thenReturn(mockDds); - when(mockDds.startDartDevelopmentService(any, any)).thenReturn(null); + when(mockDds.startDartDevelopmentService(any, any, any, any)).thenReturn(null); + when(mockDds.uri).thenReturn(Uri.parse('http://localhost:8181')); } testUsingContext('returns 1 when test file is not found', () async { @@ -222,6 +223,7 @@ void main() { 'drive', '--target=$testApp', '--no-pub', + '--disable-dds', '--device-user', '10', ]; diff --git a/packages/flutter_tools/test/commands.shard/hermetic/test_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/test_test.dart index 83030d9a5e6..0788868c2d7 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/test_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/test_test.dart @@ -168,6 +168,7 @@ class FakeFlutterTestRunner implements FlutterTestRunner { String excludeTags, bool enableObservatory = false, bool startPaused = false, + bool disableDds = false, bool disableServiceAuthCodes = false, bool ipv6 = false, bool machine = false, diff --git a/packages/flutter_tools/test/general.shard/cold_test.dart b/packages/flutter_tools/test/general.shard/cold_test.dart index 9b51b5f61a7..a7af1843b67 100644 --- a/packages/flutter_tools/test/general.shard/cold_test.dart +++ b/packages/flutter_tools/test/general.shard/cold_test.dart @@ -138,6 +138,9 @@ class TestFlutterDevice extends FlutterDevice { GetSkSLMethod getSkSLMethod, PrintStructuredErrorLogMethod printStructuredErrorLogMethod, bool disableDds = false, + bool disableServiceAuthCodes = false, + int hostVmServicePort, + int ddsPort, bool ipv6 = false, }) async { throw exception; diff --git a/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart b/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart index 4c925003878..c6ed5a32144 100644 --- a/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart +++ b/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart @@ -10,6 +10,7 @@ import 'package:flutter_tools/src/application_package.dart'; import 'package:flutter_tools/src/artifacts.dart'; import 'package:flutter_tools/src/base/common.dart'; import 'package:flutter_tools/src/base/context.dart'; +import 'package:flutter_tools/src/base/dds.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'; @@ -769,10 +770,13 @@ void main() { fuchsiaDevice, expectedIsolateName, (Uri uri) async => fakeVmServiceHost.vmService, - (Device device, Uri uri) => null, + (Device device, Uri uri, bool enableServiceAuthCodes) => null, true, // only poll once. ); - + final MockDartDevelopmentService mockDds = MockDartDevelopmentService(); + when(fuchsiaDevice.dds).thenReturn(mockDds); + when(mockDds.startDartDevelopmentService(any, any, any, any)).thenReturn(null); + when(mockDds.uri).thenReturn(Uri.parse('example')); when(fuchsiaDevice.servicePorts()) .thenAnswer((Invocation invocation) async => [1]); when(portForwarder.forward(1)) @@ -1600,5 +1604,6 @@ class MockFuchsiaSdk extends Mock implements FuchsiaSdk { final FuchsiaDevFinder fuchsiaDevFinder; } +class MockDartDevelopmentService extends Mock implements DartDevelopmentService {} class MockFuchsiaWorkflow extends Mock implements FuchsiaWorkflow {} class MockCache extends Mock implements Cache {} diff --git a/packages/flutter_tools/test/general.shard/hot_test.dart b/packages/flutter_tools/test/general.shard/hot_test.dart index ffbe50edefe..2ba2d28fe6a 100644 --- a/packages/flutter_tools/test/general.shard/hot_test.dart +++ b/packages/flutter_tools/test/general.shard/hot_test.dart @@ -576,8 +576,11 @@ class TestFlutterDevice extends FlutterDevice { ReloadMethod reloadMethod, GetSkSLMethod getSkSLMethod, PrintStructuredErrorLogMethod printStructuredErrorLogMethod, + bool disableServiceAuthCodes = false, bool disableDds = false, bool ipv6 = false, + int hostVmServicePort, + int ddsPort, }) async { throw exception; } diff --git a/packages/flutter_tools/test/general.shard/ios/ios_device_start_prebuilt_test.dart b/packages/flutter_tools/test/general.shard/ios/ios_device_start_prebuilt_test.dart index 561ed850398..d4b38f0b580 100644 --- a/packages/flutter_tools/test/general.shard/ios/ios_device_start_prebuilt_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/ios_device_start_prebuilt_test.dart @@ -7,6 +7,7 @@ import 'dart:async'; import 'package:file/memory.dart'; import 'package:flutter_tools/src/application_package.dart'; import 'package:flutter_tools/src/artifacts.dart'; +import 'package:flutter_tools/src/base/dds.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart' as io; import 'package:flutter_tools/src/base/logger.dart'; @@ -135,7 +136,8 @@ void main() { when(MDnsObservatoryDiscovery.instance.getObservatoryUri( any, any, - usesIpv6: anyNamed('usesIpv6') + usesIpv6: anyNamed('usesIpv6'), + hostVmservicePort: anyNamed('hostVmservicePort') )).thenAnswer((Invocation invocation) async => uri); final LaunchResult launchResult = await device.startApp(iosApp, @@ -367,6 +369,7 @@ void main() { any, any, usesIpv6: anyNamed('usesIpv6'), + hostVmservicePort: anyNamed('hostVmservicePort') )).thenAnswer((Invocation invocation) async => uri); final LaunchResult launchResult = await device.startApp(iosApp, @@ -454,3 +457,4 @@ class MockMDnsObservatoryDiscovery extends Mock implements MDnsObservatoryDiscov class MockArtifacts extends Mock implements Artifacts {} class MockCache extends Mock implements Cache {} class MockVmService extends Mock implements VmService {} +class MockDartDevelopmentService extends Mock implements DartDevelopmentService {} diff --git a/packages/flutter_tools/test/general.shard/mdns_discovery_test.dart b/packages/flutter_tools/test/general.shard/mdns_discovery_test.dart index 32e4ae338e2..ed7fa154c3a 100644 --- a/packages/flutter_tools/test/general.shard/mdns_discovery_test.dart +++ b/packages/flutter_tools/test/general.shard/mdns_discovery_test.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. import 'package:flutter_tools/src/base/io.dart'; +import 'package:flutter_tools/src/device.dart'; import 'package:flutter_tools/src/mdns_discovery.dart'; import 'package:mockito/mockito.dart'; import 'package:multicast_dns/multicast_dns.dart'; @@ -205,6 +206,25 @@ void main() { throwsA(isA()), ); }); + + testUsingContext('Correctly builds Observatory URI with hostVmservicePort == 0', () async { + final MDnsClient client = getMockClient( + [ + PtrResourceRecord('foo', year3000, domainName: 'bar'), + ], + >{ + 'bar': [ + SrvResourceRecord('bar', year3000, port: 123, weight: 1, priority: 1, target: 'appId'), + ], + }, + ); + + final MockIOSDevice mockDevice = MockIOSDevice(); + when(mockDevice.portForwarder).thenReturn(const NoOpDevicePortForwarder()); + final MDnsObservatoryDiscovery portDiscovery = MDnsObservatoryDiscovery(mdnsClient: client); + final Uri uri = await portDiscovery.getObservatoryUri('bar', mockDevice, hostVmservicePort: 0); + expect(uri.toString(), 'http://127.0.0.1:123/'); + }); }); } 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 684a2b1b77f..62a2c5eeed7 100644 --- a/packages/flutter_tools/test/general.shard/resident_runner_test.dart +++ b/packages/flutter_tools/test/general.shard/resident_runner_test.dart @@ -2258,7 +2258,8 @@ void main() { final MockDeviceLogReader mockLogReader = MockDeviceLogReader(); when(mockDevice.getLogReader(app: anyNamed('app'))).thenReturn(mockLogReader); when(mockDevice.dds).thenReturn(mockDds); - when(mockDds.startDartDevelopmentService(any, any)).thenReturn(null); + when(mockDds.startDartDevelopmentService(any, any, any, any)).thenReturn(null); + when(mockDds.uri).thenReturn(Uri.parse('http://localhost:8181')); final TestFlutterDevice flutterDevice = TestFlutterDevice( mockDevice, @@ -2345,10 +2346,13 @@ class FakeFlutterDevice extends FlutterDevice { ReloadSources reloadSources, Restart restart, bool disableDds = false, + bool disableServiceAuthCodes = false, bool ipv6 = false, CompileExpression compileExpression, ReloadMethod reloadMethod, GetSkSLMethod getSkSLMethod, + int hostVmServicePort, + int ddsPort, PrintStructuredErrorLogMethod printStructuredErrorLogMethod, }) 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 20ce488c9c3..9ee13b0b5be 100644 --- a/packages/flutter_tools/test/integration.shard/vmservice_integration_test.dart +++ b/packages/flutter_tools/test/integration.shard/vmservice_integration_test.dart @@ -3,7 +3,6 @@ // found in the LICENSE file. import 'package:file/file.dart'; -import 'package:flutter_tools/src/base/dds.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:matcher/matcher.dart'; import 'package:vm_service/vm_service.dart'; @@ -44,7 +43,7 @@ void main() { for (final Protocol protocol in protocolList.protocols) { expect(protocol.protocolName, anyOf('VM Service', 'DDS')); } - }, skip: DartDevelopmentService.ddsDisabled); + }); testWithoutContext('flutterVersion can be called', () async { final Response response =