44
55import 'dart:async' ;
66
7+ import 'package:async/async.dart' ;
78import 'package:stream_channel/stream_channel.dart' ;
89import 'package:term_glyph/term_glyph.dart' as glyph;
910
@@ -20,6 +21,7 @@ import '../frontend/test_chain.dart';
2021import '../util/remote_exception.dart' ;
2122import '../util/stack_trace_mapper.dart' ;
2223import '../utils.dart' ;
24+ import 'suite_channel_manager.dart' ;
2325
2426class RemoteListener {
2527 /// The test suite to run.
@@ -52,66 +54,79 @@ class RemoteListener {
5254 var verboseChain = true ;
5355
5456 var printZone = hidePrints ? null : Zone .current;
55- runZoned (() async {
56- var main;
57- try {
58- main = getMain ();
59- } on NoSuchMethodError catch (_) {
60- _sendLoadException (channel, "No top-level main() function defined." );
61- return ;
62- } catch (error, stackTrace) {
63- _sendError (channel, error, stackTrace, verboseChain);
64- return ;
65- }
66-
67- if (main is ! Function ) {
68- _sendLoadException (channel, "Top-level main getter is not a function." );
69- return ;
70- } else if (main is ! AsyncFunction ) {
71- _sendLoadException (
72- channel, "Top-level main() function takes arguments." );
73- return ;
74- }
75-
76- var message = await channel.stream.first;
77-
78- if (message['asciiGlyphs' ] ?? false ) glyph.ascii = true ;
79- var metadata = new Metadata .deserialize (message['metadata' ]);
80- verboseChain = metadata.verboseTrace;
81- var declarer = new Declarer (
82- metadata: metadata,
83- platformVariables: new Set .from (message['platformVariables' ]),
84- collectTraces: message['collectTraces' ],
85- noRetry: message['noRetry' ]);
86-
87- configureTestChaining (
88- mapper: StackTraceMapper .deserialize (message['stackTraceMapper' ]),
89- exceptPackages: _deserializeSet (message['foldTraceExcept' ]),
90- onlyPackages: _deserializeSet (message['foldTraceOnly' ]));
91-
92- await declarer.declare (main);
93-
94- var suite = new Suite (declarer.build (),
95- platform: new TestPlatform .deserialize (message['platform' ]),
96- os: message['os' ] == null
97- ? null
98- : OperatingSystem .find (message['os' ]),
99- path: message['path' ]);
100-
101- runZoned (() {
102- Invoker .guard (
103- () => new RemoteListener ._(suite, printZone)._listen (channel));
104- },
105- // Make the declarer visible to running tests so that they'll throw
106- // useful errors when calling `test()` and `group()` within a test,
107- // and so they can add to the declarer's `tearDownAll()` list.
108- zoneValues: {#test.declarer: declarer});
109- }, onError: (error, stackTrace) {
110- _sendError (channel, error, stackTrace, verboseChain);
111- }, zoneSpecification: new ZoneSpecification (print: (_, __, ___, line) {
57+ var spec = new ZoneSpecification (print: (_, __, ___, line) {
11258 if (printZone != null ) printZone.print (line);
11359 channel.sink.add ({"type" : "print" , "line" : line});
114- }));
60+ });
61+
62+ runZoned (() {
63+ new SuiteChannelManager ().asCurrent (() async {
64+ var main;
65+ try {
66+ main = getMain ();
67+ } on NoSuchMethodError catch (_) {
68+ _sendLoadException (channel, "No top-level main() function defined." );
69+ return ;
70+ } catch (error, stackTrace) {
71+ _sendError (channel, error, stackTrace, verboseChain);
72+ return ;
73+ }
74+
75+ if (main is ! Function ) {
76+ _sendLoadException (
77+ channel, "Top-level main getter is not a function." );
78+ return ;
79+ } else if (main is ! AsyncFunction ) {
80+ _sendLoadException (
81+ channel, "Top-level main() function takes arguments." );
82+ return ;
83+ }
84+
85+ var queue = new StreamQueue (channel.stream);
86+ var message = await queue.next;
87+ assert (message['type' ] == 'initial' );
88+
89+ queue.rest.listen ((message) {
90+ assert (message["type" ] == "suiteChannel" );
91+ SuiteChannelManager .current.connectIn (
92+ message['name' ], channel.virtualChannel (message['id' ]));
93+ });
94+
95+ if (message['asciiGlyphs' ] ?? false ) glyph.ascii = true ;
96+ var metadata = new Metadata .deserialize (message['metadata' ]);
97+ verboseChain = metadata.verboseTrace;
98+ var declarer = new Declarer (
99+ metadata: metadata,
100+ platformVariables: new Set .from (message['platformVariables' ]),
101+ collectTraces: message['collectTraces' ],
102+ noRetry: message['noRetry' ]);
103+
104+ configureTestChaining (
105+ mapper: StackTraceMapper .deserialize (message['stackTraceMapper' ]),
106+ exceptPackages: _deserializeSet (message['foldTraceExcept' ]),
107+ onlyPackages: _deserializeSet (message['foldTraceOnly' ]));
108+
109+ await declarer.declare (main);
110+
111+ var suite = new Suite (declarer.build (),
112+ platform: new TestPlatform .deserialize (message['platform' ]),
113+ os: message['os' ] == null
114+ ? null
115+ : OperatingSystem .find (message['os' ]),
116+ path: message['path' ]);
117+
118+ runZoned (() {
119+ Invoker .guard (
120+ () => new RemoteListener ._(suite, printZone)._listen (channel));
121+ },
122+ // Make the declarer visible to running tests so that they'll throw
123+ // useful errors when calling `test()` and `group()` within a test,
124+ // and so they can add to the declarer's `tearDownAll()` list.
125+ zoneValues: {#test.declarer: declarer});
126+ });
127+ }, onError: (error, stackTrace) {
128+ _sendError (channel, error, stackTrace, verboseChain);
129+ }, zoneSpecification: spec);
115130
116131 return controller.foreign;
117132 }
0 commit comments