blob: 5bb42a84c7a0dbc004bdcfdcb5a23cc08329fb9a [file] [log] [blame]
// Copyright 2022 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:devtools_shared/devtools_test_utils.dart';
import 'package:test/test.dart';
import 'devtools_server_driver.dart';
// Note: this test is broken out from devtools_server_test.dart so that the
// tests run faster and we do not have to mark them as slow.
late final DevToolsServerTestController testController;
void main() {
testController = DevToolsServerTestController();
setUp(() async {
await testController.setUp();
});
tearDown(() async {
await testController.tearDown();
});
for (final bool useVmService in [true, false]) {
group('Server (${useVmService ? 'VM Service' : 'API'})', () {
test(
'DevTools connects back to server API and registers that it is connected',
() async {
// Register the VM.
await testController.send(
'vm.register',
{'uri': testController.appFixture.serviceUri.toString()},
);
// Send a request to launch DevTools in a browser.
await testController.sendLaunchDevToolsRequest(
useVmService: useVmService,
);
final serverResponse =
await testController.waitForClients(requiredConnectionState: true);
expect(serverResponse, isNotNull);
expect(serverResponse['clients'], hasLength(1));
expect(serverResponse['clients'][0]['hasConnection'], isTrue);
expect(
serverResponse['clients'][0]['vmServiceUri'],
testController.appFixture.serviceUri.toString(),
);
}, timeout: const Timeout.factor(10));
test('DevTools reports disconnects from a VM', () async {
// Register the VM.
await testController.send(
'vm.register',
{'uri': testController.appFixture.serviceUri.toString()},
);
// Send a request to launch DevTools in a browser.
await testController.sendLaunchDevToolsRequest(
useVmService: useVmService,
);
// Wait for the DevTools to inform server that it's connected.
await testController.waitForClients(requiredConnectionState: true);
// Terminate the VM.
await testController.appFixture.teardown();
// Ensure the client is marked as disconnected.
final serverResponse = await testController.waitForClients(
requiredConnectionState: false,
);
expect(serverResponse['clients'], hasLength(1));
expect(serverResponse['clients'][0]['hasConnection'], isFalse);
expect(serverResponse['clients'][0]['vmServiceUri'], isNull);
}, timeout: const Timeout.factor(20));
test('server removes clients that disconnect from the API', () async {
final event = await testController.serverStartedEvent.future;
// Spawn our own Chrome process so we can terminate it.
final devToolsUri =
'http://${event['params']['host']}:${event['params']['port']}';
final chrome = await Chrome.locate()!.start(url: devToolsUri);
// Wait for DevTools to inform server that it's connected.
await testController.waitForClients();
// Close the browser, which will disconnect DevTools SSE connection
// back to the server.
chrome.kill();
// Await a long delay to wait for the SSE client to close.
await delay(duration: const Duration(seconds: 15));
// Ensure the client is completely removed from the list.
await testController.waitForClients(expectNone: true);
}, timeout: const Timeout.factor(20));
});
}
}