// Copyright (c) 2021, 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:convert';
import 'dart:io';

import 'package:test/test.dart';

import '../utils.dart';

void main() {
  group('devtools', devtools, timeout: longTimeout);
}

void devtools() {
  TestProject p;

  tearDown(() async => await p?.dispose());

  test('--help', () async {
    p = project();
    var result = await p.run(['devtools', '--help']);
    expect(result.exitCode, 0);
    expect(result.stderr, isEmpty);
    expect(result.stdout, contains('Open DevTools'));
    expect(result.stdout,
        contains('Usage: dart devtools [arguments] [service protocol uri]'));

    // Does not show verbose help.
    expect(result.stdout.contains('--try-ports'), isFalse);
  });

  test('--help --verbose', () async {
    p = project();
    var result = await p.run(['devtools', '--help', '--verbose']);
    expect(result.exitCode, 0);
    expect(result.stderr, isEmpty);
    expect(result.stdout, contains('Open DevTools'));
    expect(result.stdout,
        contains('Usage: dart devtools [arguments] [service protocol uri]'));

    // Shows verbose help.
    expect(result.stdout, contains('--try-ports'));
  });

  group('integration', () {
    Process process;

    tearDown(() {
      process?.kill();
    });

    test('serves resources', () async {
      p = project();

      // start the devtools server
      process = await p.start(['devtools', '--no-launch-browser', '--machine']);

      final Stream<String> inStream = process.stdout
          .transform<String>(utf8.decoder)
          .transform<String>(const LineSplitter());

      final line = await inStream.first;
      final json = jsonDecode(line);

      // {"event":"server.started","method":"server.started","params":{
      //   "host":"127.0.0.1","port":9100,"pid":93508,"protocolVersion":"1.1.0"
      // }}
      expect(json['event'], 'server.started');
      expect(json['params'], isNotNull);

      final host = json['params']['host'];
      final port = json['params']['port'];
      expect(host, isA<String>());
      expect(port, isA<int>());

      // Connect to the port and confirm we can load a devtools resource.
      HttpClient client = HttpClient();
      final httpRequest = await client.get(host, port, 'index.html');
      final httpResponse = await httpRequest.close();

      final contents =
          (await httpResponse.transform(utf8.decoder).toList()).join();
      client.close();

      expect(contents, contains('DevTools'));

      // kill the process
      process.kill();
      process = null;
    });
  });
}
