// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter_devicelab/framework/runner.dart';
import 'package:vm_service/vm_service.dart';

import 'common.dart';

void main() {
  final isolateParams = <String, String>{'runFlutterConfig': 'false', 'timeoutInMinutes': '1'};
  late List<String> printLog;
  void print(String s) => printLog.add(s);

  group('run.dart script', () {
    test('Reruns - Test passes the first time.', () async {
      printLog = <String>[];
      await runTasks(
        <String>['smoke_test_success'],
        isolateParams: isolateParams,
        print: print,
        logs: printLog,
      );
      expect(printLog.length, 2);
      expect(printLog[0], 'Test passed on first attempt.');
      expect(printLog[1], 'flaky: false');
    });

    test('Reruns - Test fails all reruns.', () async {
      printLog = <String>[];
      await runTasks(
        <String>['smoke_test_failure'],
        isolateParams: isolateParams,
        print: print,
        logs: printLog,
      );
      expect(printLog.length, 2);
      expect(printLog[0], 'Consistently failed across all 3 executions.');
      expect(printLog[1], 'flaky: false');
    });

    test('Ensures task results are received before task process shuts down.', () async {
      // Regression test for https://github.com/flutter/flutter/issues/155475
      //
      // Runs multiple concurrent instances of a short-lived task in an effort to
      // trigger the race between the VM service processing the response from
      // ext.cocoonRunTask and the VM shutting down, which will throw a RPCError
      // with a "Service connection disposed" message.
      //
      // Obviously this isn't foolproof, but this test becoming flaky or failing
      // consistently should signal that we're encountering a shutdown race
      // somewhere.
      const runs = 30;
      try {
        await Future.wait(<Future<void>>[
          for (int i = 0; i < runs; ++i)
            runTasks(<String>['smoke_test_success'], isolateParams: isolateParams),
        ], eagerError: true);
      } on RPCError catch (e) {
        fail('Unexpected RPCError: $e');
      }
    }, timeout: const Timeout.factor(2));
  });
}
