| // Copyright 2020 The Fuchsia 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:convert'; | |
| import 'dart:io'; | |
| import 'package:fxutils/fxutils.dart'; | |
| /// A mock process. By default, the process exits immediately and immediately | |
| /// completes its stdout and stderr streams. | |
| class MockProcess implements Process { | |
| @override | |
| final Stream<List<int>> stdout; | |
| @override | |
| final Stream<List<int>> stderr; | |
| @override | |
| final Future<int> exitCode; | |
| MockProcess({ | |
| Stream<List<int>> stdout, | |
| Stream<List<int>> stderr, | |
| Future<int> exitCode, | |
| }) : stdout = stdout ?? Stream.empty(), | |
| stderr = stderr ?? Stream.empty(), | |
| exitCode = exitCode ?? Future<int>.value(0); | |
| /// Convenience constructor that deals in raw literals instead of streams | |
| /// of bytes. | |
| /// | |
| /// Because this class mocks processes, and processes deal with streams of | |
| /// bytes, that is the direct constructor's language. However, since most | |
| /// process output is ultimately strings, this allows quicker creation of what | |
| /// developers will often want. And so, while nothing could be more "raw" than | |
| /// a series of bytes, *streams* of a series of bytes are themselves an | |
| /// abstraction. Since this constructor accepts raw literals, we name it | |
| /// thusly. | |
| factory MockProcess.raw({ | |
| String stdout, | |
| String stderr, | |
| int exitCode = 0, | |
| }) => | |
| MockProcess( | |
| exitCode: Future<int>.value(exitCode), | |
| stdout: | |
| stdout != null ? Stream.fromIterable([utf8.encode(stdout)]) : null, | |
| stderr: | |
| stderr != null ? Stream.fromIterable([utf8.encode(stderr)]) : null, | |
| ); | |
| @override | |
| bool kill([ProcessSignal signal = ProcessSignal.sigterm]) { | |
| throw UnimplementedError(); | |
| } | |
| @override | |
| int get pid => 1000; // Arbitrary valid pid. | |
| @override | |
| IOSink get stdin => throw UnimplementedError(); | |
| } | |
| /// Creates a [StartProcess] that always returns the provided [process]. | |
| StartProcess mockStartProcess(Process process) => | |
| (String executable, List<String> arguments, | |
| {String workingDirectory, | |
| Map<String, String> environment, | |
| bool includeParentEnvironment, | |
| bool runInShell, | |
| ProcessStartMode mode}) => | |
| Future.value(process); |