// 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:async';
import 'dart:io';

import 'package:dds/dds.dart';
import 'package:test/test.dart';
import 'package:vm_service/vm_service.dart';
import 'package:vm_service/vm_service_io.dart';
import 'common/test_helper.dart';

void main() {
  late Process process;
  DartDevelopmentService? dds;

  setUp(() async {
    process = await spawnDartProcess(
      'get_cached_cpu_samples_script.dart',
      disableServiceAuthCodes: true,
    );
  });

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

  test(
    'DDS returns local paths with a converter',
    () async {
      Uri serviceUri = remoteVmServiceUri;
      dds = await DartDevelopmentService.startDartDevelopmentService(
        remoteVmServiceUri,
        uriConverter: (uri) => uri == 'package:test/has_local.dart'
            ? '/home/has_local.dart'
            : null,
      );
      serviceUri = dds!.wsUri!;
      expect(dds!.isRunning, true);
      final service = await vmServiceConnectUri(serviceUri.toString());

      IsolateRef isolate;
      while (true) {
        final vm = await service.getVM();
        if (vm.isolates!.isNotEmpty) {
          isolate = vm.isolates!.first;
          try {
            isolate = await service.getIsolate(isolate.id!);
            if ((isolate as Isolate).runnable!) {
              break;
            }
          } on SentinelException {
            // ignore
          }
        }
        await Future.delayed(const Duration(seconds: 1));
      }
      expect(isolate, isNotNull);

      final unresolvedUris = <String>[
        'dart:io', // dart:io -> org-dartlang-sdk:///sdk/lib/io/io.dart
        'package:test/has_local.dart', // package:test/test.dart -> file:///has_local.dart
        'package:does_not_exist/does_not_exist.dart', // invalid URI -> null
      ];
      var result = await service
          .lookupResolvedPackageUris(isolate.id!, unresolvedUris, local: true);

      expect(result.uris?[0], 'org-dartlang-sdk:///sdk/lib/io/io.dart');
      expect(result.uris?[1], 'file:///home/has_local.dart');
      expect(result.uris?[2], null);
    },
    timeout: Timeout.none,
  );
}
