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; |