Chromium Code Reviews| Index: runtime/observatory/lib/src/service/object.dart |
| diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart |
| index 0459a5a982e9d23d137a7bae13a2e0c7350e83dc..25d2cfa8a5ee7fb36b2f1cc24ecfa220d34e32b0 100644 |
| --- a/runtime/observatory/lib/src/service/object.dart |
| +++ b/runtime/observatory/lib/src/service/object.dart |
| @@ -593,6 +593,73 @@ abstract class VM extends ServiceObjectOwner { |
| } |
| } |
| +class FakeVM extends VM { |
|
turnidge
2015/04/23 17:03:33
Lovely. This is so slick.
|
| + final Map _responses = {}; |
| + FakeVM(Map responses) { |
| + if (responses == null) { |
| + return; |
| + } |
| + responses.forEach((uri, response) { |
| + // Encode as string. |
| + _responses[_canonicalizeUri(Uri.parse(uri))] = JSON.encode(response); |
| + }); |
| + } |
| + |
| + String _canonicalizeUri(Uri uri) { |
|
turnidge
2015/04/23 17:03:33
Add comment to this function:
Canonicalize urls,
Cutch
2015/04/24 00:05:32
Done.
|
| + var method = uri.path; |
| + // Create a map sorted on insertion order. |
| + var parameters = new Map(); |
| + // Sort keys. |
| + var sortedKeys = uri.queryParameters.keys.toList(); |
| + sortedKeys.sort(); |
| + // Filter keys. |
| + if (method == 'getStack') { |
| + // Remove the 'full' parameter. |
| + sortedKeys.remove('full'); |
| + } |
| + // Insert parameters in sorted order. |
| + for (var key in sortedKeys) { |
| + parameters[key] = uri.queryParameters[key]; |
| + } |
| + return new Uri(path: method, queryParameters: parameters).toString(); |
| + } |
| + |
| + /// Force the VM to disconnect. |
| + void disconnect() { |
| + _onDisconnect.complete(this); |
| + } |
| + |
| + // Always connected. |
| + Future _onConnect; |
| + Future get onConnect { |
| + if (_onConnect != null) { |
| + return _onConnect; |
| + } |
| + _onConnect = new Future.value(this); |
| + return _onConnect; |
| + } |
| + // Only complete when requested. |
| + Completer _onDisconnect = new Completer(); |
| + Future get onDisconnect => _onDisconnect.future; |
| + |
| + Future<String> invokeRpcRaw(String method, Map params) { |
| + if (params.isEmpty) { |
| + params = null; |
| + } |
| + var key = _canonicalizeUri(new Uri(path: method, queryParameters: params)); |
| + var response = _responses[key]; |
| + if (response == null) { |
| + return new Future.error(JSON.encode({ |
| + 'type': 'ServiceException', |
| + 'kind': 'NotContainedInResponses', |
| + 'key': key |
| + })); |
| + } |
| + return new Future.value(response); |
| + } |
| +} |
| + |
| + |
| /// Snapshot in time of tag counters. |
| class TagProfileSnapshot { |
| final double seconds; |