| // Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file |
| // for details. 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:io'; |
| |
| /// Returns a skip reason if the [condition] is met and we are running locally. |
| /// |
| /// Returns `null` (forcing the test or expectation to run) if running on CI |
| /// (detected by the `GITHUB_ACTIONS` environment variable). |
| Object? skipLocal( |
| // ignore: avoid_positional_boolean_parameters |
| bool condition, |
| String reason, { |
| bool skipDartSdkCI = false, |
| }) { |
| // Disallow skips when running in CI environments, where all toolchains and |
| // dependencies must be present. |
| final isGithubActions = Platform.environment.containsKey('GITHUB_ACTIONS'); |
| |
| // Note: The Dart SDK's internal CI infrastructure (Buildbot / Swarming) |
| // does not always have all tools (e.g. `dumpbin` is missing on Windows). |
| // We allow skipping there only when `allowSkipDartSdk` is true. |
| final isDartSdkCI = |
| Platform.environment.containsKey('BUILDBOT_BUILDERNAME') || |
| Platform.environment.containsKey('SWARMING_TASK_ID'); |
| |
| if (isGithubActions) return null; |
| if (isDartSdkCI && !skipDartSdkCI) return null; |
| |
| return condition ? reason : null; |
| } |