// 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:path/path.dart' as path;
import 'package:expect/expect.dart';

import '../snapshot_test_helper.dart';
import '../../../concurrency/generate_stress_test.dart'
    show testFiles, generateStressTest;

// The only purpose of the test is to ensure we can generate a isolate stress
// test out of many normal dart tests (that are expected to be short-lived and
// passing).
//
// The actual isolate stress test is run on it's own builder (similar to our
// fuzzing test).
main() async {
  if (!Platform.isLinux) return;
  if (!Platform.executable.contains("ReleaseX64/dart")) return;

  final dartExecutable = Platform.executable;
  await withTempDir((String tempDir) async {
    final stressTest = path.join(tempDir, 'stress_test.dart');
    final stressTestDill = path.join(tempDir, 'stress_test.dill');

    // Generate stress test.
    File(stressTest).writeAsStringSync(await generateStressTest(testFiles));

    final packageConfig =
        path.join(path.absolute('.'), '.dart_tool/package_config.json');

    // Compile stress test to kernel.
    final args = [
      '--packages=$packageConfig',
      '--snapshot-kind=kernel',
      '--no-sound-null-safety',
      '--snapshot=$stressTestDill',
      stressTest
    ];
    print('Running $dartExecutable ${args.join(' ')}');
    final process = await Process.start(dartExecutable, args);
    process.stdout
        .transform(utf8.decoder)
        .transform(const LineSplitter())
        .listen((String line) {
      stdout.writeln(line);
    });
    process.stderr
        .transform(utf8.decoder)
        .transform(const LineSplitter())
        .listen((String line) {
      stderr.writeln(line);
    });
    final int exitCode = await process.exitCode;
    if (exitCode != 0) {
      final stressTestFile = 'runtime/tests/concurrency/stress_test_list.json';
      print('We fail to compile the isolate stress test.');
      print('=> It might be that $stressTestFile needs to be updated (possibly '
          'by removing a test there).');
      Expect.equals(0, exitCode);
    }
  });
}
