mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 01:30:32 +00:00
8760283247
A combination of `runZoned` and `runZonedGuarded` where only the latter allows an `onError` parameter, and only that has a nullable return type. Retains the `onError` parameter on `runZoned` for now because it's too breaking to remove it until packages have been migrated off of it. It will be removed in a follow-up CL. Change-Id: If0e86c8d14e13fa089c66f4af975aeacb2616cf6 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/137302 Reviewed-by: Jake Macdonald <jakemac@google.com> Reviewed-by: Nate Bosch <nbosch@google.com>
197 lines
5.1 KiB
Dart
197 lines
5.1 KiB
Dart
// Copyright (c) 2014, 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:async_helper/async_helper.dart';
|
|
import "package:expect/expect.dart";
|
|
import 'dart:async';
|
|
|
|
/// StreamController in nested runZoned. Trivial.
|
|
test1() {
|
|
var events = [];
|
|
var done = new Completer();
|
|
runZonedGuarded(() {
|
|
runZonedGuarded(() {
|
|
var c = new StreamController();
|
|
c.stream.listen((x) => events.add("stream: $x"),
|
|
onError: (x) => events.add("stream: error $x"),
|
|
onDone: done.complete);
|
|
c.add(1);
|
|
c.addError(2);
|
|
c.close();
|
|
}, (e, s) => events.add("rza: error $e"));
|
|
}, (e, s) => events.add("rzb: error $e"));
|
|
return [
|
|
done.future,
|
|
() {
|
|
Expect.listEquals(["stream: 1", "stream: error 2"], events);
|
|
}
|
|
];
|
|
}
|
|
|
|
/// Adding errors to the stream controller from an outside zone.
|
|
test2() {
|
|
var events = [];
|
|
var done = new Completer();
|
|
runZonedGuarded(() {
|
|
var c;
|
|
runZonedGuarded(() {
|
|
c = new StreamController();
|
|
c.stream.listen((x) => events.add("stream: $x"),
|
|
onError: (x) => events.add("stream: error $x"),
|
|
onDone: done.complete);
|
|
}, (e, s) => events.add("rza: error $e"));
|
|
c.add(1);
|
|
c.addError(2);
|
|
c.close();
|
|
}, (e, s) => events.add("rzb: error $e"));
|
|
return [
|
|
done.future,
|
|
() {
|
|
Expect.listEquals(["stream: 1", "stream: error 2"], events);
|
|
}
|
|
];
|
|
}
|
|
|
|
/// Adding errors to the stream controller from a more nested zone.
|
|
test3() {
|
|
var events = [];
|
|
var done = new Completer();
|
|
runZonedGuarded(() {
|
|
var c = new StreamController();
|
|
c.stream.listen((x) => events.add("stream: $x"),
|
|
onError: (x) => events.add("stream: error $x"), onDone: done.complete);
|
|
runZonedGuarded(() {
|
|
c.add(1);
|
|
c.addError(2);
|
|
c.close();
|
|
}, (e, s) => events.add("rza: error $e"));
|
|
}, (e, s) => events.add("rzb: error $e"));
|
|
return [
|
|
done.future,
|
|
() {
|
|
Expect.listEquals(["stream: 1", "stream: error 2"], events);
|
|
}
|
|
];
|
|
}
|
|
|
|
/// Feeding a stream from a different zone into another controller.
|
|
test4() {
|
|
var events = [];
|
|
var done = new Completer();
|
|
runZonedGuarded(() {
|
|
var c = new StreamController();
|
|
c.stream.listen((x) => events.add("stream: $x"),
|
|
onError: (x) => events.add("stream: error $x"), onDone: done.complete);
|
|
runZonedGuarded(() {
|
|
var c2 = new StreamController();
|
|
c.addStream(c2.stream).whenComplete(c.close);
|
|
c2.add(1);
|
|
c2.addError(2);
|
|
c2.close();
|
|
}, (e, s) => events.add("rza: error $e"));
|
|
}, (e, s) => events.add("rzb: error $e"));
|
|
return [
|
|
done.future,
|
|
() {
|
|
Expect.listEquals(["stream: 1", "stream: error 2"], events);
|
|
}
|
|
];
|
|
}
|
|
|
|
/// Feeding a stream from a different zone into another controller.
|
|
/// This time nesting is reversed wrt test4.
|
|
test5() {
|
|
var events = [];
|
|
var done = new Completer();
|
|
runZonedGuarded(() {
|
|
var c;
|
|
runZonedGuarded(() {
|
|
c = new StreamController();
|
|
c.stream.listen((x) => events.add("stream: $x"),
|
|
onError: (x) => events.add("stream: error $x"),
|
|
onDone: done.complete);
|
|
}, (e, s) => events.add("rza: error $e"));
|
|
var c2 = new StreamController();
|
|
c.addStream(c2.stream).whenComplete(c.close);
|
|
c2.add(1);
|
|
c2.addError(2);
|
|
c2.close();
|
|
}, (e, s) => events.add("rzb: error $e"));
|
|
return [
|
|
done.future,
|
|
() {
|
|
Expect.listEquals(["stream: 1", "stream: error 2"], events);
|
|
}
|
|
];
|
|
}
|
|
|
|
test6() {
|
|
var events = [];
|
|
var done = new Completer();
|
|
var c;
|
|
runZonedGuarded(() {
|
|
c = new StreamController();
|
|
c.stream.listen((x) => events.add("stream: $x"),
|
|
onError: (x) => events.add("stream: error $x"), onDone: done.complete);
|
|
}, (e, s) => events.add("rza: error $e"));
|
|
runZonedGuarded(() {
|
|
var c2 = new StreamController();
|
|
c.addStream(c2.stream).whenComplete(c.close);
|
|
c2.add(1);
|
|
c2.addError(2);
|
|
c2.close();
|
|
}, (e, s) => events.add("rzb: error $e, s"));
|
|
return [
|
|
done.future,
|
|
() {
|
|
Expect.listEquals(["stream: 1", "stream: error 2"], events);
|
|
}
|
|
];
|
|
}
|
|
|
|
/// Adding errors to the stream controller from a parallel zone.
|
|
test7() {
|
|
var events = [];
|
|
var done = new Completer();
|
|
var c;
|
|
runZonedGuarded(() {
|
|
c = new StreamController();
|
|
c.stream.listen((x) => events.add("stream: $x"),
|
|
onError: (x) => events.add("stream: error $x"), onDone: done.complete);
|
|
}, (e, s) => events.add("rza: error $e"));
|
|
runZonedGuarded(() {
|
|
c.add(1);
|
|
c.addError(2);
|
|
c.close();
|
|
}, (e, s) => events.add("rzb: error $e"));
|
|
return [
|
|
done.future,
|
|
() {
|
|
Expect.listEquals(["stream: 1", "stream: error 2"], events);
|
|
}
|
|
];
|
|
}
|
|
|
|
main() {
|
|
asyncStart();
|
|
|
|
var tests = [
|
|
test1(),
|
|
test2(),
|
|
test3(),
|
|
test4(),
|
|
test5(),
|
|
test6(),
|
|
test7(),
|
|
];
|
|
|
|
Future.wait(tests.map((l) => l.first as Future)).then((_) {
|
|
// Give time to complete all pending actions.
|
|
Timer.run(() {
|
|
tests.forEach((l) => (l.last)());
|
|
asyncEnd();
|
|
});
|
|
});
|
|
}
|