// Copyright (c) 2022, 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. import 'dart:async'; import 'package:dds/src/devtools/client.dart'; import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc; import 'package:stream_channel/stream_channel.dart'; import 'package:test/test.dart'; void main() { late json_rpc.Peer client; late DevToolsClient devToolsClient; setUp(() { final requestController = StreamController(); final requestStream = requestController.stream; final requestSink = requestController.sink; final responseController = StreamController(); final responseStream = responseController.stream; final responseSink = responseController.sink; client = json_rpc.Peer(StreamChannel(responseStream, requestSink)); unawaited(client.listen()); devToolsClient = DevToolsClient( stream: requestStream, sink: responseSink, ); }); test('DevToolsClient API', () async { var response = await client.sendRequest('connected', { 'uri': 'http://127.0.0.1:8181', }); expect(response, isNull); expect(devToolsClient.hasConnection, true); expect(devToolsClient.vmServiceUri, Uri.parse('http://127.0.0.1:8181')); expect(devToolsClient.embedded, false); expect(devToolsClient.currentPage, isNull); response = await client.sendRequest('disconnected'); expect(response, isNull); expect(devToolsClient.hasConnection, false); expect(devToolsClient.vmServiceUri, isNull); expect(devToolsClient.embedded, false); expect(devToolsClient.currentPage, isNull); response = await client.sendRequest('currentPage', { 'id': 'foo', 'embedded': true, }); expect(response, isNull); expect(devToolsClient.hasConnection, false); expect(devToolsClient.vmServiceUri, isNull); expect(devToolsClient.embedded, true); expect(devToolsClient.currentPage, 'foo'); // TODO: add tests for package:devtools_shared/devtools_server.dart }); test('DevToolsClient notifications', () async { final enableNotifications = Completer(); client.registerMethod( 'enableNotifications', (_) => enableNotifications.complete(), ); devToolsClient.enableNotifications(); await enableNotifications.future; final showPage = Completer(); String? pageId; client.registerMethod('showPage', (parameters) { pageId = parameters['page'].asString; showPage.complete(); }); devToolsClient.showPage('foo'); await showPage.future; expect(pageId, 'foo'); final connectToVmService = Completer(); String? uri; bool notifyUser = false; client.registerMethod('connectToVm', (parameters) { uri = parameters['uri'].asString; notifyUser = parameters['notify'].asBool; connectToVmService.complete(); }); devToolsClient.connectToVmService(Uri.parse('http://127.0.0.1:8181'), true); await connectToVmService.future; expect(uri, 'http://127.0.0.1:8181'); expect(notifyUser, true); final notify = Completer(); client.registerMethod('notify', (_) => notify.complete()); devToolsClient.notify(); await notify.future; }); }