| // 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); |