@@ -7,6 +7,7 @@ import 'dart:io';
77
88import 'package:logging/logging.dart' ;
99import 'package:shelf/shelf.dart' ;
10+ import 'package:stream_channel/stream_channel.dart' ;
1011import 'package:test/test.dart' ;
1112
1213import 'package:build_runner/build_runner.dart' ;
@@ -20,6 +21,7 @@ import 'package:build_runner/src/server/server.dart';
2021
2122import 'package:_test_common/common.dart' ;
2223import 'package:_test_common/package_graphs.dart' ;
24+ import 'package:web_socket_channel/web_socket_channel.dart' ;
2325
2426void main () {
2527 ServeHandler serveHandler;
@@ -162,6 +164,137 @@ void main() {
162164 expect (await response.readAsString (), contains ('--track-performance' ));
163165 });
164166 });
167+
168+ group ('build updates' , () {
169+ test ('injects client code if enabled' , () async {
170+ _addSource ('a|web/some.js' , entrypointExtensionMarker + '\n alert(1)' );
171+ var response = await serveHandler.handlerFor ('web' , liveReload: true )(
172+ new Request ('GET' , Uri .parse ('http://server.com/some.js' )));
173+ expect (await response.readAsString (), contains ('\$ livereload' ));
174+ });
175+
176+ test ('doesn\' t inject client code if disabled' , () async {
177+ _addSource ('a|web/some.js' , entrypointExtensionMarker + '\n alert(1)' );
178+ var response = await serveHandler.handlerFor ('web' , liveReload: false )(
179+ new Request ('GET' , Uri .parse ('http://server.com/some.js' )));
180+ expect (await response.readAsString (), isNot (contains ('\$ livereload' )));
181+ });
182+
183+ test ('doesn\' t inject client code in non-js files' , () async {
184+ _addSource ('a|web/some.html' , entrypointExtensionMarker + '\n <br>some' );
185+ var response = await serveHandler.handlerFor ('web' , liveReload: true )(
186+ new Request ('GET' , Uri .parse ('http://server.com/some.html' )));
187+ expect (await response.readAsString (), isNot (contains ('\$ livereload' )));
188+ });
189+
190+ test ('doesn\' t inject client code in non-marked files' , () async {
191+ _addSource ('a|web/some.js' , 'alert(1)' );
192+ var response = await serveHandler.handlerFor ('web' , liveReload: true )(
193+ new Request ('GET' , Uri .parse ('http://server.com/some.js' )));
194+ expect (await response.readAsString (), isNot (contains ('\$ livereload' )));
195+ });
196+
197+ test ('expect websocket connection if enabled' , () async {
198+ _addSource ('a|web/index.html' , 'content' );
199+ expect (
200+ serveHandler.handlerFor ('web' , liveReload: true )(
201+ new Request ('GET' , Uri .parse ('ws://server.com/' ),
202+ headers: {
203+ 'Connection' : 'Upgrade' ,
204+ 'Upgrade' : 'websocket' ,
205+ 'Sec-WebSocket-Version' : '13' ,
206+ 'Sec-WebSocket-Key' : 'abc' ,
207+ },
208+ onHijack: (f) {})),
209+ throwsA (TypeMatcher <HijackException >()));
210+ });
211+
212+ test ('reject websocket connection if disabled' , () async {
213+ _addSource ('a|web/index.html' , 'content' );
214+ var response = await serveHandler.handlerFor ('web' , liveReload: false )(
215+ new Request ('GET' , Uri .parse ('ws://server.com/' ), headers: {
216+ 'Connection' : 'Upgrade' ,
217+ 'Upgrade' : 'websocket' ,
218+ 'Sec-WebSocket-Version' : '13' ,
219+ 'Sec-WebSocket-Key' : 'abc' ,
220+ }));
221+ expect (response.statusCode, 200 );
222+ expect (await response.readAsString (), 'content' );
223+ });
224+
225+ group ('WebSocket handler' , () {
226+ BuildUpdatesWebSocketHandler buildUpdatesWebSocketHandler;
227+ Function createMockConection;
228+
229+ // client to server stream controlllers
230+ StreamController <List <int >> c2sController1;
231+ StreamController <List <int >> c2sController2;
232+ // server to client stream controlllers
233+ StreamController <List <int >> s2cController1;
234+ StreamController <List <int >> s2cController2;
235+
236+ WebSocketChannel clientChannel1;
237+ WebSocketChannel clientChannel2;
238+ WebSocketChannel serverChannel1;
239+ WebSocketChannel serverChannel2;
240+
241+ setUp (() {
242+ var mockHandlerFactory = (Function onConnect, {protocols}) {
243+ createMockConection =
244+ (WebSocketChannel serverChannel) => onConnect (serverChannel, '' );
245+ };
246+ buildUpdatesWebSocketHandler =
247+ BuildUpdatesWebSocketHandler (mockHandlerFactory);
248+
249+ c2sController1 = StreamController <List <int >>();
250+ s2cController1 = StreamController <List <int >>();
251+ serverChannel1 = WebSocketChannel (
252+ StreamChannel (c2sController1.stream, s2cController1.sink),
253+ serverSide: true );
254+ clientChannel1 = WebSocketChannel (
255+ StreamChannel (s2cController1.stream, c2sController1.sink),
256+ serverSide: false );
257+
258+ c2sController2 = StreamController <List <int >>();
259+ s2cController2 = StreamController <List <int >>();
260+ serverChannel2 = WebSocketChannel (
261+ StreamChannel (c2sController2.stream, s2cController2.sink),
262+ serverSide: true );
263+ clientChannel2 = WebSocketChannel (
264+ StreamChannel (s2cController2.stream, c2sController2.sink),
265+ serverSide: false );
266+ });
267+
268+ tearDown (() {
269+ c2sController1.close ();
270+ s2cController1.close ();
271+ c2sController2.close ();
272+ s2cController2.close ();
273+ });
274+
275+ test ('emmits a message to all listners' , () async {
276+ expect (clientChannel1.stream, emitsInOrder (['update' , emitsDone]));
277+ expect (clientChannel2.stream, emitsInOrder (['update' , emitsDone]));
278+ createMockConection (serverChannel1);
279+ createMockConection (serverChannel2);
280+ buildUpdatesWebSocketHandler.emitUpdateMessage (null );
281+ await clientChannel1.sink.close ();
282+ await clientChannel2.sink.close ();
283+ });
284+
285+ test ('deletes listners on disconect' , () async {
286+ expect (clientChannel1.stream,
287+ emitsInOrder (['update' , 'update' , emitsDone]));
288+ expect (clientChannel2.stream, emitsInOrder (['update' , emitsDone]));
289+ createMockConection (serverChannel1);
290+ createMockConection (serverChannel2);
291+ buildUpdatesWebSocketHandler.emitUpdateMessage (null );
292+ await clientChannel2.sink.close ();
293+ buildUpdatesWebSocketHandler.emitUpdateMessage (null );
294+ await clientChannel1.sink.close ();
295+ });
296+ });
297+ });
165298}
166299
167300class MockWatchImpl implements WatchImpl {
0 commit comments