| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS d.file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS d.file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library pub_tests; | 5 library pub_tests; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:convert'; | 8 import 'dart:convert'; |
| 9 import 'dart:io'; | 9 import 'dart:io'; |
| 10 | 10 |
| (...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 // Use the existing one if already connected. | 286 // Use the existing one if already connected. |
| 287 if (_webSocket != null) return new Future.value(); | 287 if (_webSocket != null) return new Future.value(); |
| 288 | 288 |
| 289 // Server should already be running. | 289 // Server should already be running. |
| 290 expect(_pubServer, isNotNull); | 290 expect(_pubServer, isNotNull); |
| 291 expect(_adminPort, isNotNull); | 291 expect(_adminPort, isNotNull); |
| 292 | 292 |
| 293 return WebSocket.connect("ws://127.0.0.1:$_adminPort").then((socket) { | 293 return WebSocket.connect("ws://127.0.0.1:$_adminPort").then((socket) { |
| 294 _webSocket = socket; | 294 _webSocket = socket; |
| 295 // TODO(rnystrom): Works around #13913. | 295 // TODO(rnystrom): Works around #13913. |
| 296 _webSocketBroadcastStream = _webSocket.asBroadcastStream(); | 296 _webSocketBroadcastStream = _webSocket.map(JSON.decode).asBroadcastStream(); |
| 297 }); | 297 }); |
| 298 } | 298 } |
| 299 | 299 |
| 300 /// Sends a JSON RPC 2.0 request to the running pub serve's web socket | 300 /// Sends a JSON RPC 2.0 request to the running pub serve's web socket |
| 301 /// connection. |
| 302 /// |
| 303 /// This calls a method named [method] with the given [params]. [params] may |
| 304 /// contain Futures, in which case this will wait until they've completed before |
| 305 /// sending the request. |
| 306 /// |
| 307 /// This schedules the request, but doesn't block the schedule on the response. |
| 308 /// It returns the response as a [Future]. |
| 309 Future<Map> webSocketRequest(String method, Map params) { |
| 310 var completer = new Completer(); |
| 311 schedule(() { |
| 312 return Future.wait([ |
| 313 _ensureWebSocket(), |
| 314 awaitObject(params), |
| 315 ]).then((results) { |
| 316 var resolvedParams = results[1]; |
| 317 chainToCompleter( |
| 318 currentSchedule.wrapFuture(_jsonRpcRequest(method, resolvedParams)), |
| 319 completer); |
| 320 }); |
| 321 }, "send $method with $params to web socket"); |
| 322 return completer.future; |
| 323 } |
| 324 |
| 325 /// Sends a JSON RPC 2.0 request to the running pub serve's web socket |
| 301 /// connection, waits for a reply, then verifies the result. | 326 /// connection, waits for a reply, then verifies the result. |
| 302 /// | 327 /// |
| 303 /// This calls a method named [method] with the given [params]. [params] may | 328 /// This calls a method named [method] with the given [params]. [params] may |
| 304 /// contain Futures, in which case this will wait until they've completed before | 329 /// contain Futures, in which case this will wait until they've completed before |
| 305 /// sending the request. | 330 /// sending the request. |
| 306 /// | 331 /// |
| 307 /// The result is validated using [result], which may be a [Matcher] or a [Map] | 332 /// The result is validated using [result], which may be a [Matcher] or a [Map] |
| 308 /// containing [Matcher]s and [Future]s. This will wait until any futures are | 333 /// containing [Matcher]s and [Future]s. This will wait until any futures are |
| 309 /// completed before sending the request. | 334 /// completed before sending the request. |
| 310 /// | 335 /// |
| 311 /// Returns a [Future] that completes to the call's result. | 336 /// Returns a [Future] that completes to the call's result. |
| 312 Future<Map> expectWebSocketResult(String method, Map params, result) { | 337 Future<Map> expectWebSocketResult(String method, Map params, result) { |
| 313 return schedule(() { | 338 return schedule(() { |
| 314 return Future.wait([ | 339 return Future.wait([ |
| 315 _ensureWebSocket(), | 340 webSocketRequest(method, params), |
| 316 awaitObject(params), | |
| 317 awaitObject(result) | 341 awaitObject(result) |
| 318 ]).then((results) { | 342 ]).then((results) { |
| 319 var resolvedParams = results[1]; | 343 var response = results[0]; |
| 320 var resolvedResult = results[2]; | 344 var resolvedResult = results[1]; |
| 321 | 345 expect(response["result"], resolvedResult); |
| 322 return _jsonRpcRequest(method, resolvedParams).then((response) { | 346 return response["result"]; |
| 323 expect(response["result"], resolvedResult); | |
| 324 return response["result"]; | |
| 325 }); | |
| 326 }); | 347 }); |
| 327 }, "send $method with $params to web socket and expect $result"); | 348 }, "send $method with $params to web socket and expect $result"); |
| 328 } | 349 } |
| 329 | 350 |
| 330 /// Sends a JSON RPC 2.0 request to the running pub serve's web socket | 351 /// Sends a JSON RPC 2.0 request to the running pub serve's web socket |
| 331 /// connection, waits for a reply, then verifies the error response. | 352 /// connection, waits for a reply, then verifies the error response. |
| 332 /// | 353 /// |
| 333 /// This calls a method named [method] with the given [params]. [params] may | 354 /// This calls a method named [method] with the given [params]. [params] may |
| 334 /// contain Futures, in which case this will wait until they've completed before | 355 /// contain Futures, in which case this will wait until they've completed before |
| 335 /// sending the request. | 356 /// sending the request. |
| 336 /// | 357 /// |
| 337 /// The error response is validated using [errorCode] and [errorMessage]. Both | 358 /// The error response is validated using [errorCode] and [errorMessage]. Both |
| 338 /// of these must be provided. The error code is checked against [errorCode] and | 359 /// of these must be provided. The error code is checked against [errorCode] and |
| 339 /// the error message is checked against [errorMessage]. Either of these may be | 360 /// the error message is checked against [errorMessage]. Either of these may be |
| 340 /// matchers. | 361 /// matchers. |
| 341 /// | 362 /// |
| 342 /// Returns a [Future] that completes to the error's [data] field. | 363 /// Returns a [Future] that completes to the error's [data] field. |
| 343 Future expectWebSocketError(String method, Map params, errorCode, | 364 Future expectWebSocketError(String method, Map params, errorCode, |
| 344 errorMessage) { | 365 errorMessage) { |
| 345 return schedule(() { | 366 return schedule(() { |
| 346 return Future.wait([ | 367 return webSocketRequest(method, params).then((response) { |
| 347 _ensureWebSocket(), | |
| 348 awaitObject(params) | |
| 349 ]).then((results) { | |
| 350 var resolvedParams = results[1]; | |
| 351 return _jsonRpcRequest(method, resolvedParams); | |
| 352 }).then((response) { | |
| 353 expect(response["error"]["code"], errorCode); | 368 expect(response["error"]["code"], errorCode); |
| 354 expect(response["error"]["message"], errorMessage); | 369 expect(response["error"]["message"], errorMessage); |
| 355 | |
| 356 return response["error"]["data"]; | 370 return response["error"]["data"]; |
| 357 }); | 371 }); |
| 358 }, "send $method with $params to web socket and expect error $errorCode"); | 372 }, "send $method with $params to web socket and expect error $errorCode"); |
| 359 } | 373 } |
| 360 | 374 |
| 361 /// Validates that [root] was not bound to a port when pub serve started. | 375 /// Validates that [root] was not bound to a port when pub serve started. |
| 362 Future expectNotServed(String root) { | 376 Future expectNotServed(String root) { |
| 363 return schedule(() { | 377 return schedule(() { |
| 364 expect(_ports.containsKey(root), isFalse); | 378 expect(_ports.containsKey(root), isFalse); |
| 365 }); | 379 }); |
| 366 } | 380 } |
| 367 | 381 |
| 368 /// The next id to use for a JSON-RPC 2.0 request. | 382 /// The next id to use for a JSON-RPC 2.0 request. |
| 369 var _rpcId = 0; | 383 var _rpcId = 0; |
| 370 | 384 |
| 371 /// Sends a JSON-RPC 2.0 request calling [method] with [params]. | 385 /// Sends a JSON-RPC 2.0 request calling [method] with [params]. |
| 372 /// | 386 /// |
| 373 /// Returns the response object. | 387 /// Returns the response object. |
| 374 Future<Map> _jsonRpcRequest(String method, Map params) { | 388 Future<Map> _jsonRpcRequest(String method, Map params) { |
| 375 var id = _rpcId++; | 389 var id = _rpcId++; |
| 376 _webSocket.add(JSON.encode({ | 390 _webSocket.add(JSON.encode({ |
| 377 "jsonrpc": "2.0", | 391 "jsonrpc": "2.0", |
| 378 "method": method, | 392 "method": method, |
| 379 "params": params, | 393 "params": params, |
| 380 "id": id | 394 "id": id |
| 381 })); | 395 })); |
| 382 | 396 |
| 383 return _webSocketBroadcastStream.first.then((value) { | 397 return _webSocketBroadcastStream |
| 384 value = JSON.decode(value); | 398 .firstWhere((response) => response["id"] == id).then((value) { |
| 385 currentSchedule.addDebugInfo( | 399 currentSchedule.addDebugInfo( |
| 386 "Web Socket request $method with params $params\n" | 400 "Web Socket request $method with params $params\n" |
| 387 "Result: $value"); | 401 "Result: $value"); |
| 388 | 402 |
| 389 expect(value["id"], equals(id)); | 403 expect(value["id"], equals(id)); |
| 390 return value; | 404 return value; |
| 391 }); | 405 }); |
| 392 } | 406 } |
| 393 | 407 |
| 394 /// Returns a [Future] that completes to a URL string for the server serving | 408 /// Returns a [Future] that completes to a URL string for the server serving |
| (...skipping 19 matching lines...) Expand all Loading... |
| 414 /// included. Unlike [getServerUrl], this should only be called after the ports | 428 /// included. Unlike [getServerUrl], this should only be called after the ports |
| 415 /// are known. | 429 /// are known. |
| 416 String _getServerUrlSync([String root, String path]) { | 430 String _getServerUrlSync([String root, String path]) { |
| 417 if (root == null) root = 'web'; | 431 if (root == null) root = 'web'; |
| 418 expect(_ports, contains(root)); | 432 expect(_ports, contains(root)); |
| 419 var url = "http://127.0.0.1:${_ports[root]}"; | 433 var url = "http://127.0.0.1:${_ports[root]}"; |
| 420 if (path != null) url = "$url/$path"; | 434 if (path != null) url = "$url/$path"; |
| 421 return url; | 435 return url; |
| 422 } | 436 } |
| 423 | 437 |
| OLD | NEW |