blob: dcee165bae01b35b54a63dba4a593f7c2d00ac6b [file] [log] [blame]
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// @dart = 2.9
import 'dart:async';
import 'dart:convert';
import 'package:built_collection/built_collection.dart';
import 'package:dwds/data/devtools_request.dart';
import 'package:dwds/data/extension_request.dart';
import 'package:dwds/data/serializers.dart';
import 'package:dwds/src/servers/extension_debugger.dart';
import 'package:pedantic/pedantic.dart';
import 'package:test/test.dart';
import 'fixtures/debugger_data.dart';
import 'fixtures/fakes.dart';
FakeSseConnection connection;
ExtensionDebugger extensionDebugger;
void main() async {
setUp(() async {
connection = FakeSseConnection();
extensionDebugger = ExtensionDebugger(connection);
});
tearDown(() {
connection.controllerIncoming.close();
connection.controllerOutgoing.close();
});
group('can receive', () {
test('an ExtensionResponse', () async {
var extensionResponse = ExtensionResponse((b) => b
..result = jsonEncode({
'result': {'value': 3.14}
})
..id = 0
..success = true);
var resultCompleter = Completer();
unawaited(extensionDebugger.sendCommand('Runtime.evaluate',
params: {'expression': '\$pi'}).then((response) {
resultCompleter.complete(response);
}));
connection.controllerIncoming.sink
.add(jsonEncode(serializers.serialize(extensionResponse)));
var response = await resultCompleter.future;
expect(response.result['result']['value'], 3.14);
});
test('an ExtensionEvent', () async {
var extensionEvent = ExtensionEvent((b) => b
..method = jsonEncode('Debugger.paused')
..params = jsonEncode(frames1Json[0]));
connection.controllerIncoming.sink
.add(jsonEncode(serializers.serialize(extensionEvent)));
var wipEvent = await extensionDebugger.onNotification.first;
expect(wipEvent.method, 'Debugger.paused');
expect(wipEvent.params, frames1Json[0]);
});
test('a BatchedEvents', () async {
var event1 = ExtensionEvent((b) => b
..method = jsonEncode('Debugger.scriptParsed')
..params = jsonEncode(scriptParsedParams));
var event2 = ExtensionEvent((b) => b
..method = jsonEncode('Debugger.scriptParsed')
..params = jsonEncode(scriptParsedParams));
var batch =
BatchedEvents((b) => b..events = ListBuilder([event1, event2]));
connection.controllerIncoming.sink
.add(jsonEncode(serializers.serialize(batch)));
var wipEvent = await extensionDebugger.onNotification.first;
expect(wipEvent.method, 'Debugger.scriptParsed');
expect(wipEvent.params, scriptParsedParams);
});
test('a DevToolsRequest', () async {
var devToolsRequest = DevToolsRequest((b) => b
..tabUrl = 'pi/calculus'
..appId = '3.14'
..instanceId = '6.28');
connection.controllerIncoming.sink
.add(jsonEncode(serializers.serialize(devToolsRequest)));
var request = await extensionDebugger.devToolsRequestStream.first;
expect(request.tabUrl, 'pi/calculus');
expect(request.appId, '3.14');
expect(request.instanceId, '6.28');
});
});
group('can send', () {
test('a request with empty params', () async {
var extensionRequest = ExtensionRequest((b) => b
..id = 0
..command = 'Debugger.pause'
..commandParams = jsonEncode({}));
unawaited(extensionDebugger.pause());
var request = serializers.deserialize(
jsonDecode(await connection.controllerOutgoing.stream.first));
expect(request, extensionRequest);
});
test('a request with some params', () async {
var params = {
'location': {'scriptId': '555', 'lineNumber': 28}
};
var extensionRequest = ExtensionRequest((b) => b
..id = 0
..command = 'Debugger.setBreakpoint'
..commandParams = jsonEncode(params));
unawaited(extensionDebugger.sendCommand('Debugger.setBreakpoint',
params: params));
var request = serializers.deserialize(
jsonDecode(await connection.controllerOutgoing.stream.first));
expect(request, extensionRequest);
});
});
}