// 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));
    });
  }
}
