Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1319)

Unified Diff: pkg/analyzer_plugin/test/src/channel/isolate_channel_test.dart

Issue 2666143002: Add a channel to communication with server (Closed)
Patch Set: Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pkg/analyzer_plugin/test/src/channel/isolate_channel_test.dart
diff --git a/pkg/analyzer_plugin/test/src/channel/isolate_channel_test.dart b/pkg/analyzer_plugin/test/src/channel/isolate_channel_test.dart
new file mode 100644
index 0000000000000000000000000000000000000000..3918ebf2bb1b8ba85a3401335c5c12e04c57af8e
--- /dev/null
+++ b/pkg/analyzer_plugin/test/src/channel/isolate_channel_test.dart
@@ -0,0 +1,119 @@
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:isolate';
+
+import 'package:analyzer_plugin/protocol/generated_protocol.dart';
+import 'package:analyzer_plugin/protocol/protocol.dart';
+import 'package:analyzer_plugin/src/channel/isolate_channel.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+void main() {
+ defineReflectiveTests(IsolateChannelTest);
+}
+
+@reflectiveTest
+class IsolateChannelTest {
+ TestSendPort sendPort;
+ IsolateChannel channel;
+
+ void setUp() {
+ sendPort = new TestSendPort();
+ channel = new IsolateChannel(sendPort);
+ }
+
+ void tearDown() {
+ // If the test doesn't listen to the channel, then close will not cancel the
+ // subscription and the process will not terminate.
+ try {
+ channel.listen((request) {});
+ } catch (exception) {
+ // Ignore the exception if the test has already registered a listener.
+ }
+ channel.close();
+ }
+
+ @failingTest
+ Future<Null> test_close() async {
+ bool done = false;
+ channel.listen((Request request) {}, onDone: () {
+ done = true;
+ });
+ channel.close();
+ // TODO(brianwilkerson) Figure out how to wait until the handler has been
+ // called.
+ await _pumpEventQueue();
+ expect(done, isTrue);
+ }
+
+ Future<Null> test_listen() async {
+ Request sentRequest = new PluginShutdownParams().toRequest('5');
+ Request receivedRequest;
+ channel.listen((Request request) {
+ receivedRequest = request;
+ });
+ sendPort.receivePort.send(sentRequest.toJson());
+ await _pumpEventQueue(1);
+ expect(receivedRequest, sentRequest);
+ }
+
+ void test_sendNotification() {
+ Notification notification =
+ new PluginErrorParams(false, '', '').toNotification();
+ channel.sendNotification(notification);
+ expect(sendPort.sentMessages, hasLength(1));
+ expect(sendPort.sentMessages[0], notification.toJson());
+ }
+
+ void test_sendResponse() {
+ Response response = new PluginShutdownResult().toResponse('3');
+ channel.sendResponse(response);
+ expect(sendPort.sentMessages, hasLength(1));
+ expect(sendPort.sentMessages[0], response.toJson());
+ }
+
+ /**
+ * Returns a [Future] that completes after pumping the event queue [times]
+ * times. By default, this should pump the event queue enough times to allow
+ * any code to run, as long as it's not waiting on some external event.
+ */
+ Future<Null> _pumpEventQueue([int times = 5000]) {
+ if (times == 0) return new Future.value();
+ // We use a delayed future to allow microtask events to finish. The
+ // Future.value or Future() constructors use scheduleMicrotask themselves and
+ // would therefore not wait for microtask callbacks that are scheduled after
+ // invoking this method.
+ return new Future.delayed(Duration.ZERO, () => _pumpEventQueue(times - 1));
+ }
+}
+
+/**
+ * A send port used in tests.
+ */
+class TestSendPort implements SendPort {
+ /**
+ * The receive port used to receive messages from the server.
+ */
+ SendPort receivePort;
+
+ /**
+ * The messages sent to the server.
+ */
+ List<Object> sentMessages = <Object>[];
+
+ @override
+ void send(message) {
+ if (receivePort == null) {
+ if (message is SendPort) {
+ receivePort = message;
+ } else {
+ fail('Did not receive a receive port as the first communication.');
+ }
+ } else {
+ sentMessages.add(message);
+ }
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698