@@ -7,6 +7,7 @@ import 'dart:convert';
77import 'dart:io' ;
88
99import 'package:_test_common/common.dart' ;
10+ import 'package:async/async.dart' ;
1011import 'package:build/build.dart' ;
1112import 'package:build_runner/src/entrypoint/options.dart' ;
1213import 'package:build_runner/src/generate/watch_impl.dart' ;
@@ -24,6 +25,76 @@ import 'package:test/fake.dart';
2425import 'package:test/test.dart' ;
2526import 'package:web_socket_channel/web_socket_channel.dart' ;
2627
28+ class FakeSink extends DelegatingStreamSink implements WebSocketSink {
29+ final FakeWebSocketChannel _channel;
30+
31+ FakeSink (this ._channel) : super (_channel._controller.sink);
32+
33+ @override
34+ Future close ([int ? closeCode, String ? closeReason]) async {
35+ await super .close ();
36+ _channel._isClosed = true ;
37+ _channel._closeCode = closeCode;
38+ _channel._closeReason = closeReason;
39+ await _channel._closed (closeCode, closeReason);
40+ }
41+ }
42+
43+ class FakeWebSocketChannel extends StreamChannelMixin
44+ implements WebSocketChannel {
45+ final StreamChannel _controller;
46+ final Future Function (int ? closeCode, String ? closeReason) _closed;
47+
48+ bool _isClosed = false ;
49+ int ? _closeCode;
50+ String ? _closeReason;
51+
52+ FakeWebSocketChannel (this ._controller, this ._closed);
53+
54+ @override
55+ int ? get closeCode => _closeCode;
56+
57+ @override
58+ String ? get closeReason => _closeReason;
59+
60+ @override
61+ String ? get protocol => throw UnimplementedError ();
62+
63+ @override
64+ Future <void > get ready => Future .value ();
65+
66+ @override
67+ WebSocketSink get sink => FakeSink (this );
68+
69+ @override
70+ Stream get stream => _controller.stream;
71+
72+ Future _remoteClosed (int closeCode, String ? closeReason) async {
73+ if (! _isClosed) {
74+ await sink.close (closeCode, closeReason);
75+ }
76+ }
77+ }
78+
79+ (WebSocketChannel , WebSocketChannel ) createFakes () {
80+ final peer1Write = StreamController <dynamic >();
81+ final peer2Write = StreamController <dynamic >();
82+
83+ late FakeWebSocketChannel foreign;
84+ late FakeWebSocketChannel local;
85+
86+ foreign = FakeWebSocketChannel (
87+ StreamChannel (peer2Write.stream, peer1Write.sink),
88+ (closeCode, closeReason) =>
89+ local._remoteClosed (closeCode ?? 1005 , closeReason));
90+ local = FakeWebSocketChannel (
91+ StreamChannel (peer1Write.stream, peer2Write.sink),
92+ (closeCode, closeReason) =>
93+ foreign._remoteClosed (closeCode ?? 1005 , closeReason));
94+
95+ return (foreign, local);
96+ }
97+
2798void main () {
2899 late ServeHandler serveHandler;
29100 late InMemoryRunnerAssetReader reader;
@@ -283,13 +354,6 @@ void main() {
283354 late BuildUpdatesWebSocketHandler handler;
284355 late Future <void > Function (WebSocketChannel , String ) createMockConnection;
285356
286- // client to server stream controlllers
287- late StreamController <List <int >> c2sController1;
288- late StreamController <List <int >> c2sController2;
289- // server to client stream controlllers
290- late StreamController <List <int >> s2cController1;
291- late StreamController <List <int >> s2cController2;
292-
293357 late WebSocketChannel clientChannel1;
294358 late WebSocketChannel clientChannel2;
295359 late WebSocketChannel serverChannel1;
@@ -312,30 +376,15 @@ void main() {
312376
313377 handler = BuildUpdatesWebSocketHandler (watchImpl, mockHandlerFactory);
314378
315- c2sController1 = StreamController <List <int >>();
316- s2cController1 = StreamController <List <int >>();
317- serverChannel1 = WebSocketChannel (
318- StreamChannel (c2sController1.stream, s2cController1.sink),
319- serverSide: true );
320- clientChannel1 = WebSocketChannel (
321- StreamChannel (s2cController1.stream, c2sController1.sink),
322- serverSide: false );
323-
324- c2sController2 = StreamController <List <int >>();
325- s2cController2 = StreamController <List <int >>();
326- serverChannel2 = WebSocketChannel (
327- StreamChannel (c2sController2.stream, s2cController2.sink),
328- serverSide: true );
329- clientChannel2 = WebSocketChannel (
330- StreamChannel (s2cController2.stream, c2sController2.sink),
331- serverSide: false );
379+ (serverChannel1, clientChannel1) = createFakes ();
380+ (serverChannel2, clientChannel2) = createFakes ();
332381 });
333382
334383 tearDown (() {
335- c2sController1 .close ();
336- s2cController1 .close ();
337- c2sController2 .close ();
338- s2cController2 .close ();
384+ serverChannel1.sink .close ();
385+ clientChannel1.sink .close ();
386+ serverChannel2.sink .close ();
387+ clientChannel2.sink .close ();
339388 });
340389
341390 test ('emmits a message to all listners' , () async {
0 commit comments