// 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 = 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; }