diff --git a/pkg/dds/test/control_web_server_starts_dds_test.dart b/pkg/dds/test/control_web_server_starts_dds_test.dart deleted file mode 100644 index e18743329abe..000000000000 --- a/pkg/dds/test/control_web_server_starts_dds_test.dart +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -import 'dart:convert'; -import 'dart:developer'; -import 'dart:io'; - -import 'package:test/test.dart'; -import 'package:vm_service/vm_service.dart'; -import 'package:vm_service/vm_service_io.dart'; - -void main() { - HttpClient? client; - VmService? service; - - tearDown(() async { - client?.close(); - await service?.dispose(); - }); - - test('Enabling the VM service starts DDS and serves DevTools', () async { - var serviceInfo = await Service.getInfo(); - expect(serviceInfo.serverUri, isNull); - - serviceInfo = await Service.controlWebServer( - enable: true, - silenceOutput: true, - ); - print('VM service started'); - expect(serviceInfo.serverUri, isNotNull); - final serverWebSocketUri = serviceInfo.serverWebSocketUri!; - service = await vmServiceConnectUri( - serverWebSocketUri.toString(), - ); - - // Check that DDS has been launched. - final supportedProtocols = - (await service!.getSupportedProtocols()).protocols!; - expect(supportedProtocols.length, 2); - expect(supportedProtocols.map((e) => e.protocolName), contains('DDS')); - - // Check that DevTools assets are accessible. - client = HttpClient(); - final devtoolsRequest = await client!.getUrl(serviceInfo.serverUri!); - final devtoolsResponse = await devtoolsRequest.close(); - expect(devtoolsResponse.statusCode, 200); - final devtoolsContent = - await devtoolsResponse.transform(utf8.decoder).join(); - expect(devtoolsContent, startsWith('')); - }); -} diff --git a/pkg/dds/test/control_web_server_starts_dds_with_dart_on_path_test.dart b/pkg/dds/test/control_web_server_starts_dds_with_dart_on_path_test.dart deleted file mode 100644 index d498cd0c7238..000000000000 --- a/pkg/dds/test/control_web_server_starts_dds_with_dart_on_path_test.dart +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -import 'dart:async'; -import 'dart:convert'; -import 'dart:io'; - -import 'package:path/path.dart' as path; -import 'package:test/test.dart'; - -// Regression test for https://github.com/dart-lang/sdk/issues/56087 - -void main() { - late final Process? process; - - tearDown(() { - process?.kill(); - }); - - test('Enabling the VM service with dart on PATH spawns DDS', () async { - final script = path.join( - path.dirname(Platform.script.toString()), - 'control_web_server_starts_dds_test.dart', - ); - process = await Process.start( - 'dart', - [script], - environment: {'PATH': path.dirname(Platform.resolvedExecutable)}, - ); - - final completer = Completer(); - late final StreamSubscription? stdoutSub; - late final StreamSubscription? stderrSub; - stdoutSub = process!.stdout - .transform(utf8.decoder) - .transform(const LineSplitter()) - .listen((event) { - if (event == 'VM service started') { - stdoutSub!.cancel(); - stderrSub?.cancel(); - completer.complete(); - } - }); - - stderrSub = process!.stderr.transform(utf8.decoder).listen((_) { - stdoutSub!.cancel(); - stderrSub!.cancel(); - completer.completeError( - 'Unexpected output on stderr! DDS likely failed to start', - ); - }); - - await completer.future; - }); -} diff --git a/runtime/observatory/tests/service/developer_server_control_test.dart b/runtime/observatory/tests/service/developer_server_control_test.dart index 3e6c2a8b9bd7..18498f233b42 100644 --- a/runtime/observatory/tests/service/developer_server_control_test.dart +++ b/runtime/observatory/tests/service/developer_server_control_test.dart @@ -15,7 +15,7 @@ Uri? wsServerUri; Future testeeBefore() async { print('testee before'); - // First grab the URL where the VM service is listening and the + // First grab the URL where the observatory is listening on and the // service protocol version numbers. We expect the URL to be null as // the server has not been started yet. ServiceProtocolInfo info = await Service.getInfo(); diff --git a/sdk/lib/_internal/vm/bin/vmservice_io.dart b/sdk/lib/_internal/vm/bin/vmservice_io.dart index 2ff457c1ed34..d16187640b80 100644 --- a/sdk/lib/_internal/vm/bin/vmservice_io.dart +++ b/sdk/lib/_internal/vm/bin/vmservice_io.dart @@ -96,21 +96,11 @@ class _DebuggingSession { bool disableServiceAuthCodes, bool enableDevTools, ) async { - final dartDir = File(Platform.executable).parent.path; - final dart = 'dart${Platform.isWindows ? '.exe' : ''}'; - var executable = [ + final dartDir = File(Platform.resolvedExecutable).parent.path; + final executable = [ dartDir, - dart, + 'dart${Platform.isWindows ? '.exe' : ''}', ].join(Platform.pathSeparator); - - // If the directory of dart is '.' it's likely that dart is on the user's - // PATH. If so, './dart' might not exist and we should be using 'dart' - // instead. - if (dartDir == '.' && - (await FileSystemEntity.type(executable)) == - FileSystemEntityType.notFound) { - executable = dart; - } _process = await Process.start( executable, [ @@ -143,7 +133,7 @@ class _DebuggingSession { // is changed to ensure consistency. const devToolsMessagePrefix = 'The Dart DevTools debugger and profiler is available at:'; - serverPrint('$devToolsMessagePrefix $devToolsUri'); + print('$devToolsMessagePrefix $devToolsUri'); } if (result case { @@ -151,7 +141,7 @@ class _DebuggingSession { 'uri': String dtdUri, } } when _printDtd) { - serverPrint('The Dart Tooling Daemon (DTD) is available at: $dtdUri'); + print('The Dart Tooling Daemon (DTD) is available at: $dtdUri'); } } else { printError(result['error'] ?? result); @@ -318,37 +308,18 @@ Future>> listFilesCallback(Uri dirPath) async { Uri? serverInformationCallback() => _lazyServerBoot().serverAddress; -Future _toggleWebServer(Server server) async { - // Toggle HTTP server. - if (server.running) { - await server.shutdown(true).then((_) async { - ddsInstance?.shutdown(); - ddsInstance = null; - await VMService().clearState(); - serverFuture = null; - }); - } else { - await server.startup().then((_) async { - if (_waitForDdsToAdvertiseService) { - ddsInstance = _DebuggingSession(); - await ddsInstance!.start( - _ddsIP, - _ddsPort.toString(), - _authCodesDisabled, - _serveDevtools, - ); - } - }); - } -} - Future webServerControlCallback(bool enable, bool? silenceOutput) async { if (silenceOutput != null) { silentObservatory = silenceOutput; } final _server = _lazyServerBoot(); if (_server.running != enable) { - await _toggleWebServer(_server); + if (enable) { + await _server.startup(); + // TODO: if dds is enabled a dds instance needs to be started. + } else { + await _server.shutdown(true); + } } return _server.serverAddress; } @@ -358,13 +329,32 @@ void webServerAcceptNewWebSocketConnections(bool enable) { _server.acceptNewWebSocketConnections = enable; } -Future _onSignal(ProcessSignal signal) async { +_onSignal(ProcessSignal signal) async { if (serverFuture != null) { // Still waiting. return; } - final server = _lazyServerBoot(); - await _toggleWebServer(server); + final _server = _lazyServerBoot(); + // Toggle HTTP server. + if (_server.running) { + _server.shutdown(true).then((_) async { + ddsInstance?.shutdown(); + await VMService().clearState(); + serverFuture = null; + }); + } else { + _server.startup().then((_) { + if (_waitForDdsToAdvertiseService) { + ddsInstance = _DebuggingSession() + ..start( + _ddsIP, + _ddsPort.toString(), + _authCodesDisabled, + _serveDevtools, + ); + } + }); + } } Timer? _registerSignalHandlerTimer; @@ -410,10 +400,18 @@ main() { // can be delivered and waiting loaders can be cancelled. VMService(); if (_autoStart) { - assert(server == null); final _server = _lazyServerBoot(); - assert(!_server.running); - _toggleWebServer(_server); + _server.startup().then((_) { + if (_waitForDdsToAdvertiseService) { + ddsInstance = _DebuggingSession() + ..start( + _ddsIP, + _ddsPort.toString(), + _authCodesDisabled, + _serveDevtools, + ); + } + }); // It's just here to push an event on the event loop so that we invoke the // scheduled microtasks. Timer.run(() {});