Revert "Reland "[ Service / package:dds ] Add stream support to package:dds and enable DDS for VM service tests""

This reverts commit e5b85792dabe40b65e790fdbd95fed7c2774f4e0 as it seems to have broken service/pause_on_start_and_exit_with_child_test/service https://ci.chromium.org/p/dart/builders/ci.sandbox/app-kernel-linux-debug-x64/5877

Change-Id: Idb9df51816eebfb58137c449c6461731c77409f0
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/143881
Reviewed-by: Ben Konyi <bkonyi@google.com>
Commit-Queue: Ben Konyi <bkonyi@google.com>
diff --git a/DEPS b/DEPS
index 3b96c94..1f170d2 100644
--- a/DEPS
+++ b/DEPS
@@ -146,7 +146,7 @@
   "usage_tag": "3.4.0",
   "watcher_rev": "0.9.7+14",
   "web_components_rev": "8f57dac273412a7172c8ade6f361b407e2e4ed02",
-  "web_socket_channel_tag": "1.1.0",
+  "web_socket_channel_tag": "1.0.15",
   "WebCore_rev": "fb11e887f77919450e497344da570d780e078bc8",
   "yaml_tag": "2.2.0",
   "zlib_rev": "c44fb7248079cc3d5563b14b3f758aee60d6b415",
diff --git a/pkg/dds/lib/dds.dart b/pkg/dds/lib/dds.dart
index 03ced9f..d2bb5ea 100644
--- a/pkg/dds/lib/dds.dart
+++ b/pkg/dds/lib/dds.dart
@@ -7,24 +7,15 @@
 library dds;
 
 import 'dart:async';
-import 'dart:convert';
 import 'dart:io';
-import 'dart:typed_data';
 
-import 'package:async/async.dart';
-import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc;
-import 'package:pedantic/pedantic.dart';
 import 'package:shelf/shelf.dart';
 import 'package:shelf/shelf_io.dart' as io;
 import 'package:shelf_proxy/shelf_proxy.dart';
 import 'package:shelf_web_socket/shelf_web_socket.dart';
-import 'package:stream_channel/stream_channel.dart';
 import 'package:web_socket_channel/web_socket_channel.dart';
 
-part 'src/binary_compatible_peer.dart';
-part 'src/client.dart';
 part 'src/dds_impl.dart';
-part 'src/stream_manager.dart';
 
 /// An intermediary between a Dart VM service and its clients that offers
 /// additional functionality on top of the standard VM service protocol.
diff --git a/pkg/dds/lib/src/binary_compatible_peer.dart b/pkg/dds/lib/src/binary_compatible_peer.dart
deleted file mode 100644
index 7c5b83b..0000000
--- a/pkg/dds/lib/src/binary_compatible_peer.dart
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (c) 2020, 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.
-
-part of dds;
-
-/// Adds support for binary events send from the VM service, which are not part
-/// of the official JSON RPC 2.0 specification.
-///
-/// A binary event from the VM service has the form:
-/// ```
-/// type BinaryEvent {
-///  dataOffset : uint32,
-///  metadata : uint8[dataOffset-4],
-///  data : uint8[],
-/// }
-/// ```
-/// where `metadata` is the JSON body of the event.
-///
-/// [_BinaryCompatiblePeer] assumes that only stream events can contain a
-/// binary payload (e.g., clients cannot send a `BinaryEvent` to the VM service).
-class _BinaryCompatiblePeer extends json_rpc.Peer {
-  _BinaryCompatiblePeer(WebSocketChannel ws, _StreamManager streamManager)
-      : super(
-          ws.transform<String>(
-            StreamChannelTransformer(
-              StreamTransformer<dynamic, String>.fromHandlers(
-                  handleData: (data, EventSink<String> sink) =>
-                      _transformStream(streamManager, data, sink)),
-              StreamSinkTransformer<String, dynamic>.fromHandlers(
-                handleData: (String data, EventSink<dynamic> sink) {
-                  sink.add(data);
-                },
-              ),
-            ),
-          ),
-        );
-
-  static void _transformStream(
-      _StreamManager streamManager, dynamic data, EventSink<String> sink) {
-    if (data is String) {
-      // Non-binary messages come in as Strings. Simply forward to the sink.
-      sink.add(data);
-    } else if (data is Uint8List) {
-      // Only binary events will result in `data` being of type Uint8List. We
-      // need to manually forward them here.
-      final bytesView =
-          ByteData.view(data.buffer, data.offsetInBytes, data.lengthInBytes);
-      const metadataOffset = 4;
-      final dataOffset = bytesView.getUint32(0, Endian.little);
-      final metadataLength = dataOffset - metadataOffset;
-      final metadata = Utf8Decoder().convert(new Uint8List.view(
-          bytesView.buffer,
-          bytesView.offsetInBytes + metadataOffset,
-          metadataLength));
-      final decodedMetadata = json.decode(metadata);
-      streamManager.streamNotify(decodedMetadata['params']['streamId'], data);
-    }
-  }
-}
diff --git a/pkg/dds/lib/src/client.dart b/pkg/dds/lib/src/client.dart
deleted file mode 100644
index 11dac82..0000000
--- a/pkg/dds/lib/src/client.dart
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright (c) 2020, 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.
-
-part of dds;
-
-/// Representation of a single DDS client which manages the connection and
-/// DDS request intercepting / forwarding.
-class _DartDevelopmentServiceClient {
-  _DartDevelopmentServiceClient(
-    this.dds,
-    this.ws,
-    json_rpc.Peer vmServicePeer,
-  ) : _vmServicePeer = vmServicePeer {
-    _clientPeer = json_rpc.Peer(ws.cast<String>());
-    _registerJsonRpcMethods();
-  }
-
-  /// Start receiving JSON RPC requests from the client.
-  ///
-  /// Returned future completes when the peer is closed.
-  Future<void> listen() => _clientPeer.listen().then(
-        (_) => dds.streamManager.clientDisconnect(this),
-      );
-
-  /// Close the connection to the client.
-  Future<void> close() async {
-    // Cleanup the JSON RPC server for this connection if DDS has shutdown.
-    await _clientPeer.close();
-  }
-
-  /// Send a JSON RPC notification to the client.
-  void sendNotification(String method, [dynamic parameters]) async {
-    if (_clientPeer.isClosed) {
-      return;
-    }
-    _clientPeer.sendNotification(method, parameters);
-  }
-
-  /// Registers handlers for JSON RPC methods which need to be intercepted by
-  /// DDS as well as fallback request forwarder.
-  void _registerJsonRpcMethods() {
-    _clientPeer.registerMethod('streamListen', (parameters) async {
-      final streamId = parameters['streamId'].asString;
-      await dds.streamManager.streamListen(this, streamId);
-      return _success;
-    });
-
-    _clientPeer.registerMethod('streamCancel', (parameters) async {
-      final streamId = parameters['streamId'].asString;
-      await dds.streamManager.streamCancel(this, streamId);
-      return _success;
-    });
-
-    // Unless otherwise specified, the request is forwarded to the VM service.
-    _clientPeer.registerFallback((parameters) async =>
-        await _vmServicePeer.sendRequest(parameters.method, parameters.asMap));
-  }
-
-  static const _success = <String, dynamic>{
-    'type': 'Success',
-  };
-
-  final _DartDevelopmentService dds;
-  final json_rpc.Peer _vmServicePeer;
-  final WebSocketChannel ws;
-  json_rpc.Peer _clientPeer;
-}
diff --git a/pkg/dds/lib/src/dds_impl.dart b/pkg/dds/lib/src/dds_impl.dart
index fb2bf74..37f019a 100644
--- a/pkg/dds/lib/src/dds_impl.dart
+++ b/pkg/dds/lib/src/dds_impl.dart
@@ -5,20 +5,12 @@
 part of dds;
 
 class _DartDevelopmentService implements DartDevelopmentService {
-  _DartDevelopmentService(this._remoteVmServiceUri, this._uri) {
-    _streamManager = _StreamManager(this);
-  }
+  _DartDevelopmentService(this._remoteVmServiceUri, this._uri);
 
   Future<void> startService() async {
     // Establish the connection to the VM service.
-    _vmServiceSocket = WebSocketChannel.connect(remoteVmServiceWsUri);
-    _vmServiceClient = _BinaryCompatiblePeer(_vmServiceSocket, _streamManager);
-    // Setup the JSON RPC client with the VM service.
-    unawaited(_vmServiceClient.listen());
-
-    // Setup stream event handling.
-    streamManager.listen();
-
+    _vmServiceSocket = await WebSocket.connect(remoteVmServiceWsUri.toString());
+    _vmServiceStream = _vmServiceSocket.asBroadcastStream();
     // Once we have a connection to the VM service, we're ready to spawn the intermediary.
     await _startDDSServer();
   }
@@ -36,20 +28,8 @@
 
   /// Stop accepting requests after gracefully handling existing requests.
   Future<void> shutdown() async {
-    // Don't accept anymore HTTP requests.
     await _server.close();
-
-    // Close all incoming websocket connections.
-    final futures = <Future>[];
-    for (final client in _clients) {
-      futures.add(client.close());
-    }
-    await Future.wait(futures);
-
-    // Close connection to VM service.
-    await _vmServiceSocket.sink.close();
-
-    _done.complete();
+    await _vmServiceSocket.close();
   }
 
   // Attempt to upgrade HTTP requests to a websocket before processing them as
@@ -58,18 +38,16 @@
   Cascade _handlers() => Cascade().add(_webSocketHandler()).add(_httpHandler());
 
   Handler _webSocketHandler() => webSocketHandler((WebSocketChannel ws) {
-        final client = _DartDevelopmentServiceClient(
-          this,
-          ws,
-          _vmServiceClient,
+        // TODO(bkonyi): actually process requests instead of blindly forwarding them.
+        _vmServiceStream.listen(
+          (event) => ws.sink.add(event),
+          onDone: () => ws.sink.close(),
         );
-        _clients.add(client);
-        client.listen().then((_) => _clients.remove(client));
+        ws.stream.listen((event) => _vmServiceSocket.add(event));
       });
 
   Handler _httpHandler() {
-    // DDS doesn't support any HTTP requests itself, so we just forward all of
-    // them to the VM service.
+    // TODO(bkonyi): actually process requests instead of blindly forwarding them.
     final cascade = Cascade().add(proxyHandler(remoteVmServiceUri));
     return cascade.handler;
   }
@@ -101,15 +79,7 @@
 
   bool get isRunning => _uri != null;
 
-  Future<void> get done => _done.future;
-  Completer _done = Completer<void>();
-
-  _StreamManager get streamManager => _streamManager;
-  _StreamManager _streamManager;
-
-  final List<_DartDevelopmentServiceClient> _clients = [];
-
-  json_rpc.Peer _vmServiceClient;
-  WebSocketChannel _vmServiceSocket;
+  WebSocket _vmServiceSocket;
+  Stream _vmServiceStream;
   HttpServer _server;
 }
diff --git a/pkg/dds/lib/src/stream_manager.dart b/pkg/dds/lib/src/stream_manager.dart
deleted file mode 100644
index 318cc39..0000000
--- a/pkg/dds/lib/src/stream_manager.dart
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright (c) 2020, 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.
-
-part of dds;
-
-class _StreamManager {
-  _StreamManager(this.dds);
-
-  /// Send `streamNotify` notifications to clients subscribed to `streamId`.
-  ///
-  /// If `data` is of type `Uint8List`, the notification is assumed to be a
-  /// binary event and is forwarded directly over the subscriber's websocket.
-  /// Otherwise, the event is sent via the JSON RPC client.
-  void streamNotify(String streamId, data) {
-    if (streamListeners.containsKey(streamId)) {
-      final listeners = streamListeners[streamId];
-      final isBinaryData = data is Uint8List;
-      for (final listener in listeners) {
-        if (isBinaryData) {
-          listener.ws.sink.add(data);
-        } else {
-          listener.sendNotification('streamNotify', data);
-        }
-      }
-    }
-  }
-
-  /// Start listening for `streamNotify` events from the VM service and forward
-  /// them to the clients which have subscribed to the stream.
-  void listen() => dds._vmServiceClient.registerMethod(
-        'streamNotify',
-        (parameters) {
-          final streamId = parameters['streamId'].asString;
-          streamNotify(streamId, parameters.value);
-        },
-      );
-
-  /// Subscribes `client` to a stream.
-  ///
-  /// If `client` is the first client to listen to `stream`, DDS will send a
-  /// `streamListen` request for `stream` to the VM service.
-  Future<void> streamListen(
-    _DartDevelopmentServiceClient client,
-    String stream,
-  ) async {
-    assert(stream != null && stream.isNotEmpty);
-    if (!streamListeners.containsKey(stream)) {
-      // This will return an RPC exception if the stream doesn't exist. This
-      // will throw and the exception will be forwarded to the client.
-      final result = await dds._vmServiceClient.sendRequest('streamListen', {
-        'streamId': stream,
-      });
-      assert(result['type'] == 'Success');
-      streamListeners[stream] = <_DartDevelopmentServiceClient>[];
-    }
-    if (streamListeners[stream].contains(client)) {
-      throw kStreamAlreadySubscribedException;
-    }
-    streamListeners[stream].add(client);
-  }
-
-  /// Unsubscribes `client` from a stream.
-  ///
-  /// If `client` is the last client to unsubscribe from `stream`, DDS will
-  /// send a `streamCancel` request for `stream` to the VM service.
-  Future<void> streamCancel(
-    _DartDevelopmentServiceClient client,
-    String stream,
-  ) async {
-    assert(stream != null && stream.isNotEmpty);
-    final listeners = streamListeners[stream];
-    if (listeners == null || !listeners.contains(client)) {
-      throw kStreamNotSubscribedException;
-    }
-    listeners.remove(client);
-    if (listeners.isEmpty) {
-      streamListeners.remove(stream);
-      final result = await dds._vmServiceClient.sendRequest('streamCancel', {
-        'streamId': stream,
-      });
-      assert(result['type'] == 'Success');
-    } else {
-      streamListeners[stream] = listeners;
-    }
-  }
-
-  /// Cleanup stream subscriptions for `client` when it has disconnected.
-  void clientDisconnect(_DartDevelopmentServiceClient client) {
-    for (final streamId in streamListeners.keys.toList()) {
-      streamCancel(client, streamId);
-    }
-  }
-
-  // These error codes must be kept in sync with those in vm/json_stream.h and
-  // vmservice.dart.
-  static const kStreamAlreadySubscribed = 103;
-  static const kStreamNotSubscribed = 104;
-
-  // Keep these messages in sync with the VM service.
-  static final kStreamAlreadySubscribedException = json_rpc.RpcException(
-    kStreamAlreadySubscribed,
-    'Stream already subscribed',
-  );
-
-  static final kStreamNotSubscribedException = json_rpc.RpcException(
-    kStreamNotSubscribed,
-    'Stream not subscribed',
-  );
-
-  final _DartDevelopmentService dds;
-  final streamListeners = <String, List<_DartDevelopmentServiceClient>>{};
-}
diff --git a/pkg/dds/pubspec.yaml b/pkg/dds/pubspec.yaml
index 9dbb70e..8734df5 100644
--- a/pkg/dds/pubspec.yaml
+++ b/pkg/dds/pubspec.yaml
@@ -11,15 +11,13 @@
   sdk: '>=2.6.0 <3.0.0'
 
 dependencies:
-  async: ^2.4.1
   json_rpc_2: ^2.1.0
-  pedantic: ^1.7.0
   shelf: ^0.7.5
   shelf_proxy: ^0.1.0+7
   shelf_web_socket: ^0.2.3
-  stream_channel: ^2.0.0
   web_socket_channel: ^1.1.0
 
 dev_dependencies:
+  pedantic: ^1.7.0
   test: ^1.0.0
   vm_service: ^4.0.0
diff --git a/pkg/test_runner/lib/src/test_suite.dart b/pkg/test_runner/lib/src/test_suite.dart
index 6ac30e0..b0cb187 100644
--- a/pkg/test_runner/lib/src/test_suite.dart
+++ b/pkg/test_runner/lib/src/test_suite.dart
@@ -583,8 +583,6 @@
       _enqueueStandardTest(testFile, expectationSet, onTest);
     } else if (configuration.runtime.isBrowser) {
       _enqueueBrowserTest(testFile, expectationSet, onTest);
-    } else if (suiteName == 'service') {
-      _enqueueServiceTest(testFile, expectationSet, onTest);
     } else {
       _enqueueStandardTest(testFile, expectationSet, onTest);
     }
@@ -618,45 +616,6 @@
     }
   }
 
-  void _enqueueServiceTest(
-      TestFile testFile, Set<Expectation> expectations, TestCaseEvent onTest) {
-    var commonArguments = _commonArgumentsFromFile(testFile);
-
-    var vmOptionsList = getVmOptions(testFile);
-    assert(!vmOptionsList.isEmpty);
-
-    bool emitDdsTest = false;
-    for (int i = 0; i < 2; ++i) {
-      for (var vmOptionsVariant = 0;
-          vmOptionsVariant < vmOptionsList.length;
-          vmOptionsVariant++) {
-        var vmOptions = vmOptionsList[vmOptionsVariant];
-        var allVmOptions = vmOptions;
-        if (!extraVmOptions.isEmpty) {
-          allVmOptions = vmOptions.toList()..addAll(extraVmOptions);
-        }
-        if (emitDdsTest) {
-          allVmOptions.add('-DUSE_DDS=true');
-        }
-        var isCrashExpected = expectations.contains(Expectation.crash);
-        var commands = _makeCommands(
-            testFile,
-            vmOptionsVariant + (vmOptionsList.length * i),
-            allVmOptions,
-            commonArguments,
-            isCrashExpected);
-        var variantTestName =
-            testFile.name + '/${emitDdsTest ? 'dds' : 'service'}';
-        if (vmOptionsList.length > 1) {
-          variantTestName = "${testFile.name}_$vmOptionsVariant";
-        }
-
-        _addTestCase(testFile, variantTestName, commands, expectations, onTest);
-      }
-      emitDdsTest = true;
-    }
-  }
-
   List<Command> _makeCommands(TestFile testFile, int vmOptionsVariant,
       List<String> vmOptions, List<String> args, bool isCrashExpected) {
     var commands = <Command>[];
diff --git a/pkg/vm_service/CHANGELOG.md b/pkg/vm_service/CHANGELOG.md
index 292e393..39645a7 100644
--- a/pkg/vm_service/CHANGELOG.md
+++ b/pkg/vm_service/CHANGELOG.md
@@ -1,9 +1,5 @@
 # Changelog
 
-## Unreleased
-- Fixed issue where RPC format did not conform to the JSON-RPC 2.0
-  specification.
-
 ## 4.0.1
 - Improved documentation.
 - Fixed analysis issues.
diff --git a/pkg/vm_service/lib/src/vm_service.dart b/pkg/vm_service/lib/src/vm_service.dart
index a766007..03d939e 100644
--- a/pkg/vm_service/lib/src/vm_service.dart
+++ b/pkg/vm_service/lib/src/vm_service.dart
@@ -1955,17 +1955,13 @@
 
   Future get onDone => _onDoneCompleter.future;
 
-  Future<T> _call<T>(String method, [Map args = const {}]) {
+  Future<T> _call<T>(String method, [Map args]) {
     String id = '${++_id}';
     Completer<T> completer = Completer<T>();
     _completers[id] = completer;
     _methodCalls[id] = method;
-    Map m = {
-      'jsonrpc': '2.0',
-      'id': id,
-      'method': method,
-      'params': args,
-    };
+    Map m = {'id': id, 'method': method};
+    if (args != null) m['params'] = args;
     String message = jsonEncode(m);
     _onSend.add(message);
     _writeMessage(message);
diff --git a/pkg/vm_service/tool/dart/generate_dart.dart b/pkg/vm_service/tool/dart/generate_dart.dart
index b85bc8c..0e85f27 100644
--- a/pkg/vm_service/tool/dart/generate_dart.dart
+++ b/pkg/vm_service/tool/dart/generate_dart.dart
@@ -118,12 +118,13 @@
 
   Future get onDone => _onDoneCompleter.future;
 
-  Future<T> _call<T>(String method, [Map args = const {}]) {
+  Future<T> _call<T>(String method, [Map args]) {
     String id = '${++_id}';
     Completer<T> completer = Completer<T>();
     _completers[id] = completer;
     _methodCalls[id] = method;
-    Map m = {'jsonrpc': '2.0', 'id': id, 'method': method, 'params': args,};
+    Map m = {'id': id, 'method': method};
+    if (args != null) m['params'] = args;
     String message = jsonEncode(m);
     _onSend.add(message);
     _writeMessage(message);
diff --git a/runtime/observatory/lib/service_common.dart b/runtime/observatory/lib/service_common.dart
index 48181ff..66ff984 100644
--- a/runtime/observatory/lib/service_common.dart
+++ b/runtime/observatory/lib/service_common.dart
@@ -318,12 +318,8 @@
         'params': {'id': serial, 'query': request.method}
       });
     } else {
-      message = json.encode({
-        'jsonrpc': '2.0',
-        'id': serial,
-        'method': request.method,
-        'params': request.params
-      });
+      message = json.encode(
+          {'id': serial, 'method': request.method, 'params': request.params});
     }
     if (request.method != 'getTagProfile' &&
         request.method != 'getIsolateMetric' &&
diff --git a/runtime/observatory/tests/service/break_on_default_constructor_test.dart b/runtime/observatory/tests/service/break_on_default_constructor_test.dart
index d968ca2..bc504c74 100644
--- a/runtime/observatory/tests/service/break_on_default_constructor_test.dart
+++ b/runtime/observatory/tests/service/break_on_default_constructor_test.dart
@@ -66,7 +66,7 @@
       fail("Expected to find function");
     }
 
-    await isolate.resume();
+    isolate.resume();
   }
 ];
 
diff --git a/runtime/observatory/tests/service/client_name_rpc_test.dart b/runtime/observatory/tests/service/client_name_rpc_test.dart
index fa20430..41cbe4f 100644
--- a/runtime/observatory/tests/service/client_name_rpc_test.dart
+++ b/runtime/observatory/tests/service/client_name_rpc_test.dart
@@ -63,9 +63,4 @@
   },
 ];
 
-main(args) async => runVMTests(
-      args,
-      tests,
-      // TODO(bkonyi): client names are not yet supported in DDS.
-      enableDds: false,
-    );
+main(args) async => runVMTests(args, tests);
diff --git a/runtime/observatory/tests/service/client_resume_approvals_approve_then_disconnect_test.dart b/runtime/observatory/tests/service/client_resume_approvals_approve_then_disconnect_test.dart
index 462e3dc4..427706f 100644
--- a/runtime/observatory/tests/service/client_resume_approvals_approve_then_disconnect_test.dart
+++ b/runtime/observatory/tests/service/client_resume_approvals_approve_then_disconnect_test.dart
@@ -60,12 +60,5 @@
   hasStoppedAtExit,
 ];
 
-Future<void> main(args) => runIsolateTests(
-      args,
-      test,
-      testeeConcurrent: fooBar,
-      pause_on_start: true,
-      pause_on_exit: true,
-      // TODO(bkonyi): client names are not yet supported in DDS.
-      enableDds: false,
-    );
+Future<void> main(args) => runIsolateTests(args, test,
+    testeeConcurrent: fooBar, pause_on_start: true, pause_on_exit: true);
diff --git a/runtime/observatory/tests/service/client_resume_approvals_disconnect_test.dart b/runtime/observatory/tests/service/client_resume_approvals_disconnect_test.dart
index 50c5d34..9d23522 100644
--- a/runtime/observatory/tests/service/client_resume_approvals_disconnect_test.dart
+++ b/runtime/observatory/tests/service/client_resume_approvals_disconnect_test.dart
@@ -58,12 +58,5 @@
   hasStoppedAtExit,
 ];
 
-Future<void> main(args) => runIsolateTests(
-      args,
-      test,
-      testeeConcurrent: fooBar,
-      pause_on_start: true,
-      pause_on_exit: true,
-      // TODO(bkonyi): client names are not yet supported in DDS.
-      enableDds: false,
-    );
+Future<void> main(args) => runIsolateTests(args, test,
+    testeeConcurrent: fooBar, pause_on_start: true, pause_on_exit: true);
diff --git a/runtime/observatory/tests/service/client_resume_approvals_identical_names_test.dart b/runtime/observatory/tests/service/client_resume_approvals_identical_names_test.dart
index 27e026c..d3a09a9 100644
--- a/runtime/observatory/tests/service/client_resume_approvals_identical_names_test.dart
+++ b/runtime/observatory/tests/service/client_resume_approvals_identical_names_test.dart
@@ -40,12 +40,5 @@
   hasStoppedAtExit,
 ];
 
-Future<void> main(args) => runIsolateTests(
-      args,
-      sameClientNamesTest,
-      testeeConcurrent: fooBar,
-      pause_on_start: true,
-      pause_on_exit: true,
-      // TODO(bkonyi): client names are not yet supported in DDS.
-      enableDds: false,
-    );
+Future<void> main(args) => runIsolateTests(args, sameClientNamesTest,
+    testeeConcurrent: fooBar, pause_on_start: true, pause_on_exit: true);
diff --git a/runtime/observatory/tests/service/client_resume_approvals_multiple_names_test.dart b/runtime/observatory/tests/service/client_resume_approvals_multiple_names_test.dart
index e92442c..5f26a9c 100644
--- a/runtime/observatory/tests/service/client_resume_approvals_multiple_names_test.dart
+++ b/runtime/observatory/tests/service/client_resume_approvals_multiple_names_test.dart
@@ -58,12 +58,5 @@
   },
 ];
 
-Future<void> main(args) => runIsolateTests(
-      args,
-      multipleClientNamesTest,
-      testeeConcurrent: fooBar,
-      pause_on_start: true,
-      pause_on_exit: true,
-      // TODO(bkonyi): client names are not yet supported in DDS.
-      enableDds: false,
-    );
+Future<void> main(args) => runIsolateTests(args, multipleClientNamesTest,
+    testeeConcurrent: fooBar, pause_on_start: true, pause_on_exit: true);
diff --git a/runtime/observatory/tests/service/client_resume_approvals_name_change_test.dart b/runtime/observatory/tests/service/client_resume_approvals_name_change_test.dart
index b20a593..3d33112 100644
--- a/runtime/observatory/tests/service/client_resume_approvals_name_change_test.dart
+++ b/runtime/observatory/tests/service/client_resume_approvals_name_change_test.dart
@@ -51,12 +51,5 @@
   hasStoppedAtExit,
 ];
 
-Future<void> main(args) => runIsolateTests(
-      args,
-      nameChangeTest,
-      testeeConcurrent: fooBar,
-      pause_on_start: true,
-      pause_on_exit: true,
-      // TODO(bkonyi): client names are not yet supported in DDS.
-      enableDds: false,
-    );
+Future<void> main(args) => runIsolateTests(args, nameChangeTest,
+    testeeConcurrent: fooBar, pause_on_start: true, pause_on_exit: true);
diff --git a/runtime/observatory/tests/service/client_resume_approvals_reload_test.dart b/runtime/observatory/tests/service/client_resume_approvals_reload_test.dart
index 50f7f45..250d349 100644
--- a/runtime/observatory/tests/service/client_resume_approvals_reload_test.dart
+++ b/runtime/observatory/tests/service/client_resume_approvals_reload_test.dart
@@ -60,11 +60,5 @@
   },
 ];
 
-Future<void> main(args) => runIsolateTests(
-      args,
-      hotReloadTest,
-      testeeConcurrent: fooBar,
-      pause_on_start: true,
-      // TODO(bkonyi): client names are not yet supported in DDS.
-      enableDds: false,
-    );
+Future<void> main(args) => runIsolateTests(args, hotReloadTest,
+    testeeConcurrent: fooBar, pause_on_start: true);
diff --git a/runtime/observatory/tests/service/enable_service_port_fallback_positive_test.dart b/runtime/observatory/tests/service/enable_service_port_fallback_positive_test.dart
index bbac574..ca25d5f 100644
--- a/runtime/observatory/tests/service/enable_service_port_fallback_positive_test.dart
+++ b/runtime/observatory/tests/service/enable_service_port_fallback_positive_test.dart
@@ -21,15 +21,11 @@
 
 main(args) async {
   selectedPort = await _getUnusedPort();
-  await runVMTests(
-    args, tests,
-    enable_service_port_fallback: true,
-    // Choose a port number that should always be open.
-    port: selectedPort,
-    extraArgs: [],
-    // TODO(bkonyi): investigate failure.
-    enableDds: false,
-  );
+  await runVMTests(args, tests,
+      enable_service_port_fallback: true,
+      // Choose a port number that should always be open.
+      port: selectedPort,
+      extraArgs: []);
 }
 
 Future<int> _getUnusedPort() async {
diff --git a/runtime/observatory/tests/service/external_service_asynchronous_invocation_test.dart b/runtime/observatory/tests/service/external_service_asynchronous_invocation_test.dart
index 58d44de..2778167 100644
--- a/runtime/observatory/tests/service/external_service_asynchronous_invocation_test.dart
+++ b/runtime/observatory/tests/service/external_service_asynchronous_invocation_test.dart
@@ -164,8 +164,4 @@
   },
 ];
 
-main(args) => runIsolateTests(
-      args, tests,
-      // TODO(bkonyi): service extensions are not yet supported in DDS.
-      enableDds: false,
-    );
+main(args) => runIsolateTests(args, tests);
diff --git a/runtime/observatory/tests/service/external_service_disappear_test.dart b/runtime/observatory/tests/service/external_service_disappear_test.dart
index a015686..eafe5a6 100644
--- a/runtime/observatory/tests/service/external_service_disappear_test.dart
+++ b/runtime/observatory/tests/service/external_service_disappear_test.dart
@@ -89,8 +89,4 @@
   },
 ];
 
-main(args) => runIsolateTests(
-      args, tests,
-      // TODO(bkonyi): service extensions are not yet supported in DDS.
-      enableDds: false,
-    );
+main(args) => runIsolateTests(args, tests);
diff --git a/runtime/observatory/tests/service/external_service_notification_invocation_test.dart b/runtime/observatory/tests/service/external_service_notification_invocation_test.dart
index a5bfd64..3b1e695 100644
--- a/runtime/observatory/tests/service/external_service_notification_invocation_test.dart
+++ b/runtime/observatory/tests/service/external_service_notification_invocation_test.dart
@@ -83,9 +83,4 @@
   },
 ];
 
-main(args) => runIsolateTests(
-      args,
-      tests,
-      // TODO(bkonyi): service extensions are not yet supported in DDS.
-      enableDds: false,
-    );
+main(args) => runIsolateTests(args, tests);
diff --git a/runtime/observatory/tests/service/external_service_registration_test.dart b/runtime/observatory/tests/service/external_service_registration_test.dart
index ce0aea9..2ec0d95 100644
--- a/runtime/observatory/tests/service/external_service_registration_test.dart
+++ b/runtime/observatory/tests/service/external_service_registration_test.dart
@@ -123,9 +123,4 @@
   },
 ];
 
-main(args) => runIsolateTests(
-      args,
-      tests,
-      // TODO(bkonyi): service extensions are not yet supported in DDS.
-      enableDds: false,
-    );
+main(args) => runIsolateTests(args, tests);
diff --git a/runtime/observatory/tests/service/external_service_registration_via_notification_test.dart b/runtime/observatory/tests/service/external_service_registration_via_notification_test.dart
index 80729ce..333c24e 100644
--- a/runtime/observatory/tests/service/external_service_registration_via_notification_test.dart
+++ b/runtime/observatory/tests/service/external_service_registration_via_notification_test.dart
@@ -103,8 +103,4 @@
   },
 ];
 
-main(args) => runIsolateTests(
-      args, tests,
-      // TODO(bkonyi): service extensions are not yet supported in DDS.
-      enableDds: false,
-    );
+main(args) => runIsolateTests(args, tests);
diff --git a/runtime/observatory/tests/service/external_service_synchronous_invocation_test.dart b/runtime/observatory/tests/service/external_service_synchronous_invocation_test.dart
index 45c58d8..97917b3 100644
--- a/runtime/observatory/tests/service/external_service_synchronous_invocation_test.dart
+++ b/runtime/observatory/tests/service/external_service_synchronous_invocation_test.dart
@@ -126,8 +126,4 @@
   },
 ];
 
-main(args) => runIsolateTests(
-      args, tests,
-      // TODO(bkonyi): service extensions are not yet supported in DDS.
-      enableDds: false,
-    );
+main(args) => runIsolateTests(args, tests);
diff --git a/runtime/observatory/tests/service/get_client_name_rpc_test.dart b/runtime/observatory/tests/service/get_client_name_rpc_test.dart
index 33f2c21..d503a91 100644
--- a/runtime/observatory/tests/service/get_client_name_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_client_name_rpc_test.dart
@@ -37,10 +37,4 @@
   },
 ];
 
-Future<void> main(args) => runIsolateTests(
-      args,
-      test,
-      testeeBefore: fooBar,
-      // TODO(bkonyi): client names are not yet supported in DDS.
-      enableDds: false,
-    );
+Future<void> main(args) => runIsolateTests(args, test, testeeBefore: fooBar);
diff --git a/runtime/observatory/tests/service/malformed_test.dart b/runtime/observatory/tests/service/malformed_test.dart
index 9e277c8..5fff3fd 100644
--- a/runtime/observatory/tests/service/malformed_test.dart
+++ b/runtime/observatory/tests/service/malformed_test.dart
@@ -37,11 +37,4 @@
   },
 ];
 
-main(args) => runIsolateTests(
-      args,
-      tests,
-      // This test hangs with DDS as package:json_rpc_2 can't parse the JSON
-      // response and is unable to determine the request ID, so the malformed
-      // JSON request will never complete.
-      enableDds: false,
-    );
+main(args) => runIsolateTests(args, tests);
diff --git a/runtime/observatory/tests/service/observatory_assets_test.dart b/runtime/observatory/tests/service/observatory_assets_test.dart
index a78f448..4b8f8e2 100644
--- a/runtime/observatory/tests/service/observatory_assets_test.dart
+++ b/runtime/observatory/tests/service/observatory_assets_test.dart
@@ -22,8 +22,4 @@
   }
 ];
 
-main(args) async => runVMTests(
-      args, tests,
-      // TODO(bkonyi): DDS doesn't forward Observatory assets properly yet.
-      enableDds: false,
-    );
+main(args) async => runVMTests(args, tests);
diff --git a/runtime/observatory/tests/service/pause_on_start_and_exit_with_child_test.dart b/runtime/observatory/tests/service/pause_on_start_and_exit_with_child_test.dart
index cb4b288..1d3a8bf 100644
--- a/runtime/observatory/tests/service/pause_on_start_and_exit_with_child_test.dart
+++ b/runtime/observatory/tests/service/pause_on_start_and_exit_with_child_test.dart
@@ -101,16 +101,12 @@
   },
 ];
 
-main(args) => runIsolateTests(
-      args, tests,
-      testeeConcurrent: testMain,
-      pause_on_start: true,
-      pause_on_exit: true,
-      verbose_vm: true,
-      extraArgs: [
-        '--trace-service',
-        '--trace-service-verbose',
-      ],
-      // TODO(bkonyi): investigate failure.
-      enableDds: false,
-    );
+main(args) => runIsolateTests(args, tests,
+        testeeConcurrent: testMain,
+        pause_on_start: true,
+        pause_on_exit: true,
+        verbose_vm: true,
+        extraArgs: [
+          '--trace-service',
+          '--trace-service-verbose',
+        ]);
diff --git a/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions2_test.dart b/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions2_test.dart
index 6f98284..850177a 100644
--- a/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions2_test.dart
+++ b/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions2_test.dart
@@ -61,13 +61,7 @@
   }
 ];
 
-main(args) => runIsolateTests(
-      args,
-      tests,
-      pause_on_unhandled_exceptions: true,
-      testeeConcurrent: testeeMain,
-      extraArgs: extraDebuggingArgs,
-      // TODO(bkonyi): causes ASSERT in debug mode, unrelated to DDS.
-      // See https://github.com/dart-lang/sdk/issues/41379.
-      enableDds: false,
-    );
+main(args) => runIsolateTests(args, tests,
+    pause_on_unhandled_exceptions: true,
+    testeeConcurrent: testeeMain,
+    extraArgs: extraDebuggingArgs);
diff --git a/runtime/observatory/tests/service/service.status b/runtime/observatory/tests/service/service.status
index cf5797a..20cc72a 100644
--- a/runtime/observatory/tests/service/service.status
+++ b/runtime/observatory/tests/service/service.status
@@ -29,7 +29,6 @@
 *: SkipByDesign
 
 [ $system == windows ]
-*: Slow
 async_generator_breakpoint_test: Skip # Issue 29145
 dev_fs_http_put_weird_char_test: Skip # Windows disallows carriage returns in paths
 dev_fs_weird_char_test: Skip # Windows disallows question mark in paths
diff --git a/runtime/observatory/tests/service/stream_subscription_test.dart b/runtime/observatory/tests/service/stream_subscription_test.dart
deleted file mode 100644
index 56f8420..0000000
--- a/runtime/observatory/tests/service/stream_subscription_test.dart
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (c) 2020, 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 'package:observatory/service_io.dart';
-import 'package:test/test.dart';
-
-import 'test_helper.dart';
-
-Future streamListen(VM vm, String streamId) async =>
-    await vm.invokeRpcNoUpgrade(
-      'streamListen',
-      {
-        'streamId': streamId,
-      },
-    );
-
-Future streamCancel(VM vm, String streamId) async =>
-    await vm.invokeRpcNoUpgrade(
-      'streamCancel',
-      {
-        'streamId': streamId,
-      },
-    );
-
-var tests = <VMTest>[
-  // Check double subscription fails.
-  (VM vm) async {
-    await streamListen(vm, '_Echo');
-    try {
-      await streamListen(vm, '_Echo');
-      fail('Subscribed to stream twice');
-    } on ServerRpcException catch (e) {
-      expect(e.message, 'Stream already subscribed');
-    }
-  },
-  // Check double cancellation fails.
-  (VM vm) async {
-    await streamCancel(vm, '_Echo');
-    try {
-      await streamCancel(vm, '_Echo');
-      fail('Double cancellation of stream successful');
-    } on ServerRpcException catch (e) {
-      expect(e.message, 'Stream not subscribed');
-    }
-  },
-  // Check subscription to invalid stream fails.
-  (VM vm) async {
-    try {
-      await streamListen(vm, 'Foo');
-      fail('Subscribed to invalid stream');
-    } on ServerRpcException catch (e) {
-      expect(e.message, "streamListen: invalid 'streamId' parameter: Foo");
-    }
-  }
-];
-
-main(args) => runVMTests(args, tests);
diff --git a/runtime/observatory/tests/service/test_helper.dart b/runtime/observatory/tests/service/test_helper.dart
index e13bbb1..1dd5989 100644
--- a/runtime/observatory/tests/service/test_helper.dart
+++ b/runtime/observatory/tests/service/test_helper.dart
@@ -7,7 +7,6 @@
 import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
-import 'package:dds/dds.dart';
 import 'package:observatory/service_io.dart';
 import 'package:test/test.dart';
 import 'service_test_common.dart';
@@ -17,9 +16,6 @@
 const bool useCausalAsyncStacks =
     const bool.fromEnvironment('dart.developer.causal_async_stacks');
 
-/// Determines whether DDS is enabled for this test run.
-const bool useDds = const bool.fromEnvironment('USE_DDS');
-
 /// The extra arguments to use
 const List<String> extraDebuggingArgs = useCausalAsyncStacks
     ? const ['--causal-async-stacks', '--no-lazy-async-stacks']
@@ -101,8 +97,6 @@
 class _ServiceTesteeLauncher {
   Process process;
   final List<String> args;
-  Future<void> get exited => _processCompleter.future;
-  final _processCompleter = Completer<void>();
   bool killedByTester = false;
 
   _ServiceTesteeLauncher() : args = [Platform.script.toFilePath()] {}
@@ -292,7 +286,6 @@
           throw "Testee exited with $exitCode";
         }
         print("** Process exited");
-        _processCompleter.complete();
       });
 
       // Wait for the blank line which signals that we're ready to run.
@@ -302,16 +295,9 @@
       }
       final content = await serviceInfoFile.readAsString();
       final infoJson = json.decode(content);
-      String rawUri = infoJson['uri'];
-
-      // If rawUri ends with a /, Uri.parse will include an empty string as the
-      // last path segment. Make sure it's not there to ensure we have a
-      // consistent Uri.
-      if (rawUri.endsWith('/')) {
-        rawUri = rawUri.substring(0, rawUri.length - 1);
-      }
-      uri = Uri.parse(rawUri);
+      uri = Uri.parse(infoJson['uri']);
       completer.complete(uri);
+      print('** Signaled to run test queries on $uri');
     });
     return completer.future;
   }
@@ -328,7 +314,7 @@
 
 void setupAddresses(Uri serverAddress) {
   serviceWebsocketAddress =
-      'ws://${serverAddress.authority}${serverAddress.path}/ws';
+      'ws://${serverAddress.authority}${serverAddress.path}ws';
   serviceHttpAddress = 'http://${serverAddress.authority}${serverAddress.path}';
 }
 
@@ -345,18 +331,16 @@
     bool pause_on_unhandled_exceptions: false,
     bool enable_service_port_fallback: false,
     bool testeeControlsServer: false,
-    bool enableDds: true,
     int port = 0,
   }) {
     if (executableArgs == null) {
       executableArgs = Platform.executableArguments;
     }
-    DartDevelopmentService dds;
-    WebSocketVM vm;
-    _ServiceTesteeLauncher process;
 
+    final process = new _ServiceTesteeLauncher();
+    final name = Platform.script.pathSegments.last;
+    WebSocketVM vm;
     setUp(() async {
-      process = _ServiceTesteeLauncher();
       await process
           .launch(
               pause_on_start,
@@ -374,15 +358,7 @@
           print("Testee has pid $pid, waiting $wait before continuing");
           sleep(wait);
         }
-        if (useDds) {
-          dds = await DartDevelopmentService.startDartDevelopmentService(
-              serverAddress);
-          setupAddresses(dds.uri);
-        } else {
-          setupAddresses(serverAddress);
-        }
-        print('** Signaled to run test queries on $serviceHttpAddress'
-            ' (${useDds ? "DDS" : "VM Service"})');
+        setupAddresses(serverAddress);
         vm = new WebSocketVM(new WebSocketVMTarget(serviceWebsocketAddress));
         print('Loading VM...');
         await vm.load();
@@ -390,66 +366,43 @@
       });
     });
 
-    tearDown(() async {
-      if (useDds) {
-        await dds.shutdown();
-      }
+    test(
+      name,
+      () async {
+        // Run vm tests.
+        if (vmTests != null) {
+          int testIndex = 1;
+          final totalTests = vmTests.length;
+          for (var test in vmTests) {
+            vm.verbose = verbose_vm;
+            print('Running $name [$testIndex/$totalTests]');
+            testIndex++;
+            await test(vm);
+          }
+        }
+
+        // Run isolate tests.
+        if (isolateTests != null) {
+          final isolate = await getFirstIsolate(vm);
+          int testIndex = 1;
+          final totalTests = isolateTests.length;
+          for (var test in isolateTests) {
+            vm.verbose = verbose_vm;
+            print('Running $name [$testIndex/$totalTests]');
+            testIndex++;
+            await test(isolate);
+          }
+        }
+      },
+      retry: 0,
+      // Some service tests run fairly long (e.g., valid_source_locations_test).
+      timeout: Timeout.none,
+    );
+
+    tearDown(() {
+      print('All service tests completed successfully.');
       process.requestExit();
     });
-
-    final name = Platform.script.pathSegments.last;
-    runTest(String name) {
-      test(
-        '$name (${useDds ? 'DDS' : 'VM Service'})',
-        () async {
-          bool testsDone = false;
-          try {
-            // Run vm tests.
-            if (vmTests != null) {
-              int testIndex = 1;
-              final totalTests = vmTests.length;
-              for (var test in vmTests) {
-                vm.verbose = verbose_vm;
-                print('Running $name [$testIndex/$totalTests]');
-                testIndex++;
-                await test(vm);
-              }
-            }
-
-            // Run isolate tests.
-            if (isolateTests != null) {
-              final isolate = await getFirstIsolate(vm);
-              int testIndex = 1;
-              final totalTests = isolateTests.length;
-              for (var test in isolateTests) {
-                vm.verbose = verbose_vm;
-                print('Running $name [$testIndex/$totalTests]');
-                testIndex++;
-                await test(isolate);
-              }
-            }
-
-            print('All service tests completed successfully.');
-            testsDone = true;
-          } catch (error, stackTrace) {
-            if (testsDone) {
-              print('Ignoring late exception during process exit:\n'
-                  '$error\n$stackTrace');
-            } else {
-              rethrow;
-            }
-          }
-        },
-        // Some service tests run fairly long (e.g., valid_source_locations_test).
-        timeout: Timeout.none,
-      );
-    }
-
-    if (useDds && !enableDds) {
-      print('Skipping DDS run for $name');
-    } else {
-      runTest(name);
-    }
   }
 
   Future<Isolate> getFirstIsolate(WebSocketVM vm) async {
@@ -507,7 +460,6 @@
     bool verbose_vm: false,
     bool pause_on_unhandled_exceptions: false,
     bool testeeControlsServer: false,
-    bool enableDds: true,
     List<String> extraArgs}) async {
   assert(!pause_on_start || testeeBefore == null);
   if (_isTestee()) {
@@ -525,8 +477,7 @@
         pause_on_exit: pause_on_exit,
         verbose_vm: verbose_vm,
         pause_on_unhandled_exceptions: pause_on_unhandled_exceptions,
-        testeeControlsServer: testeeControlsServer,
-        enableDds: enableDds);
+        testeeControlsServer: testeeControlsServer);
   }
 }
 
@@ -578,7 +529,6 @@
     bool verbose_vm: false,
     bool pause_on_unhandled_exceptions: false,
     bool enable_service_port_fallback: false,
-    bool enableDds: true,
     int port = 0,
     List<String> extraArgs,
     List<String> executableArgs}) async {
@@ -599,7 +549,6 @@
       verbose_vm: verbose_vm,
       pause_on_unhandled_exceptions: pause_on_unhandled_exceptions,
       enable_service_port_fallback: enable_service_port_fallback,
-      enableDds: enableDds,
       port: port,
     );
   }
diff --git a/runtime/observatory/tests/service/verify_http_timeline_test.dart b/runtime/observatory/tests/service/verify_http_timeline_test.dart
index 22fae9b..a555b11 100644
--- a/runtime/observatory/tests/service/verify_http_timeline_test.dart
+++ b/runtime/observatory/tests/service/verify_http_timeline_test.dart
@@ -62,7 +62,7 @@
 }
 
 Future<HttpServer> startServer() async {
-  final server = await HttpServer.bind(InternetAddress.loopbackIPv4, 0);
+  final server = await HttpServer.bind(InternetAddress.loopbackIPv4, 8011);
   server.listen((request) async {
     final response = request.response;
     randomlyAddCookie(response);
diff --git a/runtime/observatory/tests/service/vm_timeline_events_test.dart b/runtime/observatory/tests/service/vm_timeline_events_test.dart
index a47bcf2..1b77ed1 100644
--- a/runtime/observatory/tests/service/vm_timeline_events_test.dart
+++ b/runtime/observatory/tests/service/vm_timeline_events_test.dart
@@ -9,14 +9,10 @@
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
-primeDartTimeline() async {
+primeDartTimeline() {
   while (true) {
     Timeline.startSync('apple');
     Timeline.finishSync();
-    // Give the VM a chance to send the timeline events. This test is
-    // significantly slower if we loop without yielding control after each
-    // iteration.
-    await Future.delayed(const Duration(milliseconds: 1));
   }
 }
 
@@ -26,8 +22,8 @@
   return events.where(filter).toList();
 }
 
-Completer completer;
-int eventCount;
+Completer completer = new Completer();
+int eventCount = 0;
 
 onTimelineEvent(ServiceEvent event) {
   eventCount++;
@@ -39,11 +35,6 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    // Clear global state.
-    eventCount = 0;
-    completer = Completer<void>();
-  },
-  (Isolate isolate) async {
     // Subscribe to the Timeline stream.
     await subscribeToStream(isolate.vm, VM.kTimelineStream, onTimelineEvent);
   },
diff --git a/sdk/lib/vmservice/vmservice.dart b/sdk/lib/vmservice/vmservice.dart
index 81a2ac7..6943f13 100644
--- a/sdk/lib/vmservice/vmservice.dart
+++ b/sdk/lib/vmservice/vmservice.dart
@@ -49,8 +49,7 @@
 final Map<int, IsolateEmbedderData> isolateEmbedderData =
     new Map<int, IsolateEmbedderData>();
 
-// These must be kept in sync with the declarations in vm/json_stream.h and
-// pkg/dds/lib/src/stream_manager.dart.
+// These must be kept in sync with the declarations in vm/json_stream.h.
 const kParseError = -32700;
 const kInvalidRequest = -32600;
 const kMethodNotFound = -32601;
diff --git a/sdk_nnbd/lib/vmservice/vmservice.dart b/sdk_nnbd/lib/vmservice/vmservice.dart
index 807fd00..f5a176e 100644
--- a/sdk_nnbd/lib/vmservice/vmservice.dart
+++ b/sdk_nnbd/lib/vmservice/vmservice.dart
@@ -46,8 +46,7 @@
 // the cleanup method will be invoked after being removed from the map.
 final isolateEmbedderData = <int, IsolateEmbedderData>{};
 
-// These must be kept in sync with the declarations in vm/json_stream.h and
-// pkg/dds/lib/src/stream_manager.dart.
+// These must be kept in sync with the declarations in vm/json_stream.h.
 const kParseError = -32700;
 const kInvalidRequest = -32600;
 const kMethodNotFound = -32601;
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index c549bb6..e4602d8 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -327,7 +327,6 @@
       "pkg/dart_internal/",
       "pkg/dart2native/",
       "pkg/dart2js_tools/",
-      "pkg/dds/",
       "pkg/expect/",
       "pkg/front_end/",
       "pkg/js/",
@@ -413,7 +412,6 @@
       "pkg/dart_internal/",
       "pkg/dart2native/",
       "pkg/dart2js_tools/",
-      "pkg/dds/",
       "pkg/expect/",
       "pkg/front_end/",
       "pkg/js/",