#!/usr/bin/env -S dart run -r
// Copyright (c) 2012, 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.

/// Test wrapper script.
/// Many of the integration tests runs the `pub` command, this is slow if every
/// invocation requires the dart compiler to load all the sources. This script
/// will create a `pub.XXX.dart.snapshot.dart2` which the tests can utilize.
/// After creating the snapshot this script will forward arguments to
/// `pub run test`, and ensure that the snapshot is deleted after tests have
/// been run.
library;

import 'dart:io';
import 'package:path/path.dart' as p;

import 'package:pub/src/dart.dart';
import 'package:pub/src/exceptions.dart';

Future<void> main(List<String> args) async {
  if (Platform.environment['FLUTTER_ROOT'] != null) {
    stderr.writeln(
      'WARNING: The tests will not run correctly with dart from a flutter checkout!',
    );
  }
  Process? testProcess;
  final sub = ProcessSignal.sigint.watch().listen((signal) {
    testProcess?.kill(signal);
  });
  final pubSnapshotFilename =
      p.absolute(p.join('.dart_tool', '_pub', 'pub.dart.snapshot.dart2'));
  try {
    final stopwatch = Stopwatch()..start();
    stderr.write('Building snapshot...');
    await precompile(
      executablePath: p.join('bin', 'pub.dart'),
      outputPath: pubSnapshotFilename,
      name: 'bin/pub.dart',
      packageConfigPath: p.join('.dart_tool', 'package_config.json'),
    );
    stderr.writeln(' (${stopwatch.elapsed.inMilliseconds}ms)');
    testProcess = await Process.start(
      Platform.resolvedExecutable,
      ['run', 'test', ...args],
      environment: {'_PUB_TEST_SNAPSHOT': pubSnapshotFilename},
      mode: ProcessStartMode.inheritStdio,
    );
    exitCode = await testProcess.exitCode;
  } on ApplicationException catch (e) {
    stderr.writeln('Failed building snapshot: $e');
    exitCode = 1;
  } finally {
    await sub.cancel();
  }
}
