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/",