// Copyright (c) 2014, 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.=> defineTests();

/// This tests the benchmarks in benchmark/benchmark.test, and ensures that our
/// benchmarks can run.
library;

import 'dart:convert';
import 'dart:io';

import 'package:analyzer_utilities/package_root.dart';
import 'package:path/path.dart' as path;
import 'package:test/test.dart';

void main() => defineTests();

String get _serverSourcePath {
  return path.join(packageRoot, 'analysis_server');
}

void defineTests() {
  group('benchmarks', () {
    var benchmarks = _listBenchmarks();

    test('can list', () {
      expect(benchmarks, isNotEmpty);
    });

    const benchmarkIdsToSkip = {
      'analysis-flutter-analyze',
      'das-flutter',
      'lsp-flutter',
    };

    // Since these benchmarks can take a while, allow skipping with an env
    // variable.
    var runBenchmarks =
        Platform.environment['TEST_SERVER_BENCHMARKS'] != 'false';
    var skipReason =
        runBenchmarks
            ? null
            : 'Skipped by TEST_SERVER_BENCHMARKS environment variable';

    for (var benchmarkId in benchmarks) {
      if (benchmarkIdsToSkip.contains(benchmarkId)) {
        continue;
      }

      test(benchmarkId, () {
        var r = Process.runSync(Platform.resolvedExecutable, [
          path.join('benchmark', 'benchmarks.dart'),
          'run',
          '--repeat=1',
          '--quick',
          benchmarkId,
        ], workingDirectory: _serverSourcePath);
        expect(
          r.exitCode,
          0,
          reason: 'exit: ${r.exitCode}\n${r.stdout}\n${r.stderr}',
        );
      }, skip: skipReason);
    }
  });
}

List<String> _listBenchmarks() {
  var result = Process.runSync(Platform.resolvedExecutable, [
    path.join('benchmark', 'benchmarks.dart'),
    'list',
    '--machine',
  ], workingDirectory: _serverSourcePath);
  var output = json.decode(result.stdout as String) as Map<Object?, Object?>;
  var benchmarks = (output['benchmarks'] as List).cast<Map<Object?, Object?>>();
  return benchmarks.map((b) => b['id']).cast<String>().toList();
}
