| // Copyright 2014 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:async'; | |
| import 'dart:io' as io show exit; | |
| import 'package:meta/meta.dart'; | |
| import 'process.dart'; | |
| /// Exits the process with the given [exitCode]. | |
| typedef ExitFunction = void Function(int exitCode); | |
| const ExitFunction _defaultExitFunction = io.exit; | |
| ExitFunction _exitFunction = _defaultExitFunction; | |
| /// Exits the process. | |
| /// | |
| /// Throws [AssertionError] if assertions are enabled and the dart:io exit | |
| /// is still active when called. This may indicate exit was called in | |
| /// a test without being configured correctly. | |
| /// | |
| /// This is analogous to the `exit` function in `dart:io`, except that this | |
| /// function may be set to a testing-friendly value by calling | |
| /// [setExitFunctionForTests] (and then restored to its default implementation | |
| /// with [restoreExitFunction]). The default implementation delegates to | |
| /// `dart:io`. | |
| ExitFunction get exit { | |
| assert( | |
| _exitFunction != io.exit || !_inUnitTest(), | |
| 'io.exit was called with assertions active in a unit test', | |
| ); | |
| return _exitFunction; | |
| } | |
| // Whether the tool is executing in a unit test. | |
| bool _inUnitTest() { | |
| return Zone.current[#test.declarer] != null; | |
| } | |
| /// Sets the [exit] function to a function that throws an exception rather | |
| /// than exiting the process; this is intended for testing purposes. | |
| @visibleForTesting | |
| void setExitFunctionForTests([ExitFunction? exitFunction]) { | |
| _exitFunction = | |
| exitFunction ?? | |
| (int exitCode) { | |
| throw ProcessExit(exitCode, immediate: true); | |
| }; | |
| } | |
| /// Restores the [exit] function to the `dart:io` implementation. | |
| @visibleForTesting | |
| void restoreExitFunction() { | |
| _exitFunction = _defaultExitFunction; | |
| } |