blob: ad99d3700c78d19a50de050eb52f6f8d53a2f424 [file] [log] [blame]
// Copyright 2013 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 'dart:ffi' as ffi show Abi;
import 'dart:io' as io;
import 'package:engine_repo_tools/engine_repo_tools.dart';
import 'package:engine_tool/src/environment.dart';
import 'package:engine_tool/src/logger.dart';
import 'package:engine_tool/src/worker_pool.dart';
import 'package:litetest/litetest.dart';
import 'package:platform/platform.dart';
import 'package:process_fakes/process_fakes.dart';
import 'package:process_runner/process_runner.dart';
class TestWorkerPoolProgressReporter implements WorkerPoolProgressReporter {
int _successCount = 0;
int _errorCount = 0;
final List<Object> _errors = <Object>[];
@override
void onRun(Set<WorkerTask> tasks) {}
@override
void onFinish() {}
@override
void onTaskStart(WorkerPool pool, WorkerTask task) {}
@override
void onTaskDone(WorkerPool pool, WorkerTask task, [Object? err]) {
if (err == null) {
_successCount++;
return;
}
_errorCount++;
_errors.add(err);
}
}
class SuccessfulTask extends WorkerTask {
SuccessfulTask() : super('s');
@override
Future<bool> run() async {
return true;
}
}
class FailureTask extends WorkerTask {
FailureTask() : super('f');
@override
Future<bool> run() async {
throw ArgumentError('test');
}
}
void main() {
final Engine engine;
try {
engine = Engine.findWithin();
} catch (e) {
io.stderr.writeln(e);
io.exitCode = 1;
return;
}
(Environment, List<List<String>>) macEnv(Logger logger) {
final List<List<String>> runHistory = <List<String>>[];
return (
Environment(
abi: ffi.Abi.macosArm64,
engine: engine,
platform: FakePlatform(operatingSystem: Platform.macOS),
processRunner: ProcessRunner(
processManager: FakeProcessManager(onStart: (List<String> command) {
runHistory.add(command);
switch (command) {
case ['success']:
return FakeProcess(stdout: 'stdout success');
case ['failure']:
return FakeProcess(exitCode: 1, stdout: 'stdout failure');
default:
return FakeProcess();
}
}, onRun: (List<String> command) {
// Should not be executed.
assert(false);
return io.ProcessResult(81, 1, '', '');
})),
logger: logger,
),
runHistory
);
}
test('worker pool success', () async {
final Logger logger = Logger.test();
final (Environment env, _) = macEnv(logger);
final TestWorkerPoolProgressReporter reporter =
TestWorkerPoolProgressReporter();
final WorkerPool wp = WorkerPool(env, reporter);
final WorkerTask task = SuccessfulTask();
final bool r = await wp.run(<WorkerTask>{task});
expect(r, equals(true));
expect(reporter._successCount, equals(1));
expect(reporter._errorCount, equals(0));
expect(reporter._errors.length, equals(0));
});
test('worker pool failure', () async {
final Logger logger = Logger.test();
final (Environment env, _) = macEnv(logger);
final TestWorkerPoolProgressReporter reporter =
TestWorkerPoolProgressReporter();
final WorkerPool wp = WorkerPool(env, reporter);
final WorkerTask task = FailureTask();
final bool r = await wp.run(<WorkerTask>{task});
expect(r, equals(false));
expect(reporter._successCount, equals(0));
expect(reporter._errorCount, equals(1));
expect(reporter._errors.length, equals(1));
});
}