Index: packages/async/test/stream_zip_zone_test.dart |
diff --git a/packages/async/test/stream_zip_zone_test.dart b/packages/async/test/stream_zip_zone_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..47957a9444d7bb9801cd15dabe66bd706745f172 |
--- /dev/null |
+++ b/packages/async/test/stream_zip_zone_test.dart |
@@ -0,0 +1,65 @@ |
+// Copyright (c) 2013, 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 "package:test/test.dart"; |
+ |
+// Test that stream listener callbacks all happen in the zone where the |
+// listen occurred. |
+ |
+main() { |
+ StreamController controller; |
+ controller = new StreamController(); |
+ testStream("singlesub-async", controller, controller.stream); |
+ controller = new StreamController.broadcast(); |
+ testStream("broadcast-async", controller, controller.stream); |
+ controller = new StreamController(); |
+ testStream("asbroadcast-async", controller, |
+ controller.stream.asBroadcastStream()); |
+ |
+ controller = new StreamController(sync: true); |
+ testStream("singlesub-sync", controller, controller.stream); |
+ controller = new StreamController.broadcast(sync: true); |
+ testStream("broadcast-sync", controller, controller.stream); |
+ controller = new StreamController(sync: true); |
+ testStream("asbroadcast-sync", controller, |
+ controller.stream.asBroadcastStream()); |
+} |
+ |
+void testStream(String name, StreamController controller, Stream stream) { |
+ test(name, () { |
+ Zone outer = Zone.current; |
+ runZoned(() { |
+ Zone newZone1 = Zone.current; |
+ StreamSubscription sub; |
+ sub = stream.listen(expectAsync((v) { |
+ expect(v, 42); |
+ expect(Zone.current, newZone1); |
+ outer.run(() { |
+ sub.onData(expectAsync((v) { |
+ expect(v, 37); |
+ expect(Zone.current, newZone1); |
+ runZoned(() { |
+ sub.onData(expectAsync((v) { |
+ expect(v, 87); |
+ expect(Zone.current, newZone1); |
+ })); |
+ }); |
+ if (controller is SynchronousStreamController) { |
+ scheduleMicrotask(() => controller.add(87)); |
+ } else { |
+ controller.add(87); |
+ } |
+ })); |
+ }); |
+ if (controller is SynchronousStreamController) { |
+ scheduleMicrotask(() => controller.add(37)); |
+ } else { |
+ controller.add(37); |
+ } |
+ })); |
+ }); |
+ controller.add(42); |
+ }); |
+} |