// 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 Map isolateParams = { 'runFlutterConfig': 'false', 'timeoutInMinutes': '1', }; late List printLog; void print(String s) => printLog.add(s); group('run.dart script', () { test('Reruns - Test passes the first time.', () async { printLog = []; await runTasks( ['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 = []; await runTasks( ['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 int runs = 30; try { await Future.wait( >[ for (int i = 0; i < runs; ++i) runTasks( ['smoke_test_success'], isolateParams: isolateParams, ), ], eagerError: true, ); } on RPCError catch (e) { fail('Unexpected RPCError: $e'); } }, timeout: const Timeout.factor(2)); }); }