// Copyright (c) 2020, 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:io';

import 'package:dds/dds.dart';
import 'package:test/test.dart';

import 'common/test_helper.dart';

void main() {
  Process process;
  DartDevelopmentService dds;
  setUp(() async {
    process = await spawnDartProcess('smoke.dart');
  });

  tearDown(() async {
    await dds?.shutdown();
    process?.kill();
    dds = null;
    process = null;
  });

  Future<int> getAvailablePort() async {
    final tmpServer = await HttpServer.bind(InternetAddress.loopbackIPv4, 0);
    final port = tmpServer.port;
    await tmpServer.close();
    return port;
  }

  group('Ensure DDS URIs are consistent', () {
    test('without authentication codes', () async {
      final port = await getAvailablePort();
      final serviceUri = Uri.parse('http://127.0.0.1:$port/');
      dds = await DartDevelopmentService.startDartDevelopmentService(
        remoteVmServiceUri,
        serviceUri: serviceUri,
        enableAuthCodes: false,
      );

      expect(dds.uri, serviceUri);
      expect(
        dds.sseUri,
        serviceUri.replace(
          pathSegments: ['\$debugHandler'],
        ),
      );
      expect(
        dds.wsUri,
        serviceUri.replace(
          scheme: 'ws',
          pathSegments: ['ws'],
        ),
      );
    });

    test('with authentication codes', () async {
      final port = await getAvailablePort();
      final serviceUri = Uri.parse('http://127.0.0.1:$port/');
      dds = await DartDevelopmentService.startDartDevelopmentService(
        remoteVmServiceUri,
        serviceUri: serviceUri,
      );

      // We need to pull the authentication code out of the main DDS URI, so
      // just make sure that it's at the right address and port.
      expect(dds.uri.toString().contains(serviceUri.toString()), isTrue);

      expect(dds.uri.pathSegments, isNotEmpty);
      final authCode = dds.uri.pathSegments.first;
      expect(
        dds.sseUri,
        serviceUri.replace(
          pathSegments: [authCode, '\$debugHandler'],
        ),
      );
      expect(
        dds.wsUri,
        serviceUri.replace(
          scheme: 'ws',
          pathSegments: [authCode, 'ws'],
        ),
      );
    });
  });
}
