| // Copyright 2016 The Chromium 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:async'; |
| |
| import 'package:process/process.dart'; |
| import 'package:process/record_replay.dart'; |
| |
| import 'common.dart'; |
| import 'context.dart'; |
| import 'file_system.dart'; |
| import 'process.dart'; |
| |
| const String _kRecordingType = 'process'; |
| const ProcessManager _kLocalProcessManager = LocalProcessManager(); |
| |
| /// The active process manager. |
| ProcessManager get processManager => context[ProcessManager] ?? _kLocalProcessManager; |
| |
| /// Gets a [ProcessManager] that will record process invocation activity to the |
| /// specified base recording [location]. |
| /// |
| /// Activity will be recorded in a subdirectory of [location] named `"process"`. |
| /// It is permissible for [location] to represent an existing non-empty |
| /// directory as long as there is no collision with the `"process"` |
| /// subdirectory. |
| RecordingProcessManager getRecordingProcessManager(String location) { |
| final Directory dir = getRecordingSink(location, _kRecordingType); |
| const ProcessManager delegate = LocalProcessManager(); |
| final RecordingProcessManager manager = new RecordingProcessManager(delegate, dir); |
| addShutdownHook(() async { |
| await manager.flush(finishRunningProcesses: true); |
| }, ShutdownStage.SERIALIZE_RECORDING); |
| return manager; |
| } |
| |
| /// Gets a [ProcessManager] that replays process activity from a previously |
| /// recorded set of invocations. |
| /// |
| /// [location] must represent a directory to which process activity has been |
| /// recorded (i.e. the result of having been previously passed to |
| /// [getRecordingProcessManager]), or a [ToolExit] will be thrown. |
| Future<ReplayProcessManager> getReplayProcessManager(String location) async { |
| final Directory dir = getReplaySource(location, _kRecordingType); |
| |
| ProcessManager manager; |
| try { |
| manager = await ReplayProcessManager.create(dir); |
| } on ArgumentError catch (error) { |
| throwToolExit('Invalid replay-from: $error'); |
| } |
| |
| return manager; |
| } |