Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions pkgs/test/test/utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ SuiteConfiguration suiteConfiguration(
Map<BooleanSelector, SuiteConfiguration>? tags,
Map<PlatformSelector, SuiteConfiguration>? onPlatform,
bool? ignoreTimeouts,
Timeout? suiteLoadTimeout,

// Test-level configuration
Timeout? timeout,
Expand All @@ -179,6 +180,7 @@ SuiteConfiguration suiteConfiguration(
tags: tags,
onPlatform: onPlatform,
ignoreTimeouts: ignoreTimeouts,
suiteLoadTimeout: suiteLoadTimeout,
timeout: timeout,
verboseTrace: verboseTrace,
chainStackTraces: chainStackTraces,
Expand Down Expand Up @@ -212,6 +214,7 @@ Configuration configuration(
Map<String, CustomRuntime>? defineRuntimes,
bool? noRetry,
bool? ignoreTimeouts,
Timeout? suiteLoadTimeout,

// Suite-level configuration
bool? allowDuplicateTestNames,
Expand Down Expand Up @@ -262,6 +265,7 @@ Configuration configuration(
defineRuntimes: defineRuntimes,
noRetry: noRetry,
ignoreTimeouts: ignoreTimeouts,
suiteLoadTimeout: suiteLoadTimeout,
allowDuplicateTestNames: allowDuplicateTestNames,
allowTestRandomization: allowTestRandomization,
jsTrace: jsTrace,
Expand Down
10 changes: 10 additions & 0 deletions pkgs/test_core/lib/src/runner/configuration.dart
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,7 @@ class Configuration {
required Map<BooleanSelector, SuiteConfiguration>? tags,
required Map<PlatformSelector, SuiteConfiguration>? onPlatform,
required bool? ignoreTimeouts,
required Timeout? suiteLoadTimeout,

// Test-level configuration
required Timeout? timeout,
Expand Down Expand Up @@ -338,6 +339,7 @@ class Configuration {
tags: tags,
onPlatform: onPlatform,
ignoreTimeouts: ignoreTimeouts,
suiteLoadTimeout: suiteLoadTimeout,

// Test-level configuration
timeout: timeout,
Expand Down Expand Up @@ -396,6 +398,7 @@ class Configuration {
Map<BooleanSelector, SuiteConfiguration>? tags,
Map<PlatformSelector, SuiteConfiguration>? onPlatform,
bool? ignoreTimeouts,
Timeout? suiteLoadTimeout,

// Test-level configuration
Timeout? timeout,
Expand Down Expand Up @@ -445,6 +448,7 @@ class Configuration {
tags: tags,
onPlatform: onPlatform,
ignoreTimeouts: ignoreTimeouts,
suiteLoadTimeout: suiteLoadTimeout,
timeout: timeout,
verboseTrace: verboseTrace,
chainStackTraces: chainStackTraces,
Expand Down Expand Up @@ -498,6 +502,7 @@ class Configuration {
testRandomizeOrderingSeed: null,
stopOnFirstFailure: null,
ignoreTimeouts: null,
suiteLoadTimeout: null,
allowDuplicateTestNames: null,
allowTestRandomization: null,
runSkipped: null,
Expand Down Expand Up @@ -576,6 +581,7 @@ class Configuration {
tags: null,
onPlatform: null,
ignoreTimeouts: null,
suiteLoadTimeout: null,
timeout: null,
verboseTrace: null,
chainStackTraces: null,
Expand Down Expand Up @@ -639,6 +645,7 @@ class Configuration {
tags: null,
onPlatform: null,
ignoreTimeouts: null,
suiteLoadTimeout: null,
timeout: null,
verboseTrace: null,
chainStackTraces: null,
Expand Down Expand Up @@ -700,6 +707,7 @@ class Configuration {
tags: null,
onPlatform: null,
ignoreTimeouts: null,
suiteLoadTimeout: null,
timeout: null,
verboseTrace: null,
chainStackTraces: null,
Expand Down Expand Up @@ -983,6 +991,7 @@ class Configuration {
bool? noRetry,
int? testRandomizeOrderingSeed,
bool? ignoreTimeouts,
Timeout? suiteLoadTimeout,

// Suite-level configuration
bool? allowDuplicateTestNames,
Expand Down Expand Up @@ -1051,6 +1060,7 @@ class Configuration {
testOn: testOn,
addTags: addTags,
ignoreTimeouts: ignoreTimeouts,
suiteLoadTimeout: suiteLoadTimeout,
));
return config._resolvePresets();
}
Expand Down
5 changes: 5 additions & 0 deletions pkgs/test_core/lib/src/runner/configuration/args.dart
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,10 @@ final ArgParser _parser = (() {
parser.addOption('timeout',
help: 'The default test timeout. For example: 15s, 2x, none',
defaultsTo: '30s');
parser.addOption('suite-load-timeout',
help: 'The timeout for loading a test suite. Loading the test suite '
'includes compiling the test suite. For example: 15s, 2x, none',
defaultsTo: '12m');
parser.addFlag('ignore-timeouts',
help: 'Ignore all timeouts (useful if debugging)', negatable: false);
parser.addFlag('pause-after-load',
Expand Down Expand Up @@ -333,6 +337,7 @@ class _Parser {
shardIndex: shardIndex,
totalShards: totalShards,
timeout: _parseOption('timeout', Timeout.parse),
suiteLoadTimeout: _parseOption('suite-load-timeout', Timeout.parse),
globalPatterns: patterns,
compilerSelections: compilerSelections,
runtimes: runtimes,
Expand Down
14 changes: 3 additions & 11 deletions pkgs/test_core/lib/src/runner/load_suite.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import 'dart:async';

import 'package:stack_trace/stack_trace.dart';
import 'package:test_api/scaffolding.dart' show Timeout;
import 'package:test_api/src/backend/group.dart'; // ignore: implementation_imports
import 'package:test_api/src/backend/invoker.dart'; // ignore: implementation_imports
import 'package:test_api/src/backend/metadata.dart'; // ignore: implementation_imports
Expand All @@ -20,14 +19,6 @@ import 'plugin/environment.dart';
import 'runner_suite.dart';
import 'suite.dart';

/// The timeout for loading a test suite.
///
/// We want this to be long enough that even a very large application being
/// compiled with dart2js doesn't trigger it, but short enough that it fires
/// before the host kills it. For example, Google's Forge service has a
/// 15-minute timeout.
final _timeout = const Duration(minutes: 12);

/// A [Suite] emitted by a [Loader] that provides a test-like interface for
/// loading a test file.
///
Expand Down Expand Up @@ -150,8 +141,9 @@ class LoadSuite extends Suite implements RunnerSuite {
void Function() body, this._suiteAndZone,
{required bool ignoreTimeouts, String? path})
: super(
Group.root(
[LocalTest(name, Metadata(timeout: Timeout(_timeout)), body)]),
Group.root([
LocalTest(name, Metadata(timeout: config.suiteLoadTimeout), body)
]),
platform,
path: path,
ignoreTimeouts: ignoreTimeouts);
Expand Down
22 changes: 19 additions & 3 deletions pkgs/test_core/lib/src/runner/suite.dart
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ final class SuiteConfiguration {
tags: null,
onPlatform: null,
metadata: null,
ignoreTimeouts: null);
ignoreTimeouts: null,
suiteLoadTimeout: null);

/// Whether or not duplicate test (or group) names are allowed within the same
/// test suite.
Expand Down Expand Up @@ -149,6 +150,11 @@ final class SuiteConfiguration {
final bool? _ignoreTimeouts;
bool get ignoreTimeouts => _ignoreTimeouts ?? false;

/// The timeout for loading a test suite.
final Timeout? _suiteLoadTimeout;
Timeout get suiteLoadTimeout =>
_suiteLoadTimeout ?? const Timeout(Duration(minutes: 12));
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I implemented --suite-load-timeout the same way as --ignore-timeouts was implemented. However, it's not optimal that we have two locations for the default value. Here and in pkgs/test_core/lib/src/runner/configuration/args.dart. Should we improve this? Or not? Or just writing a comment to update the default value also in the other file?


factory SuiteConfiguration(
{required bool? allowDuplicateTestNames,
required bool? allowTestRandomization,
Expand All @@ -161,7 +167,7 @@ final class SuiteConfiguration {
required Map<BooleanSelector, SuiteConfiguration>? tags,
required Map<PlatformSelector, SuiteConfiguration>? onPlatform,
required bool? ignoreTimeouts,

required Timeout? suiteLoadTimeout,
// Test-level configuration
required Timeout? timeout,
required bool? verboseTrace,
Expand All @@ -184,6 +190,7 @@ final class SuiteConfiguration {
tags: tags,
onPlatform: onPlatform,
ignoreTimeouts: ignoreTimeouts,
suiteLoadTimeout: suiteLoadTimeout,
metadata: Metadata(
timeout: timeout,
verboseTrace: verboseTrace,
Expand Down Expand Up @@ -212,6 +219,7 @@ final class SuiteConfiguration {
Map<BooleanSelector, SuiteConfiguration>? tags,
Map<PlatformSelector, SuiteConfiguration>? onPlatform,
bool? ignoreTimeouts,
Timeout? suiteLoadTimeout,

// Test-level configuration
Timeout? timeout,
Expand All @@ -234,6 +242,7 @@ final class SuiteConfiguration {
tags: tags,
onPlatform: onPlatform,
ignoreTimeouts: ignoreTimeouts,
suiteLoadTimeout: suiteLoadTimeout,
timeout: timeout,
verboseTrace: verboseTrace,
chainStackTraces: chainStackTraces,
Expand Down Expand Up @@ -273,6 +282,7 @@ final class SuiteConfiguration {
required Map<PlatformSelector, SuiteConfiguration>? onPlatform,
required Metadata? metadata,
required bool? ignoreTimeouts,
required Timeout? suiteLoadTimeout,
}) : _allowDuplicateTestNames = allowDuplicateTestNames,
_allowTestRandomization = allowTestRandomization,
_jsTrace = jsTrace,
Expand All @@ -283,6 +293,7 @@ final class SuiteConfiguration {
tags = _map(tags),
onPlatform = _map(onPlatform),
_ignoreTimeouts = ignoreTimeouts,
_suiteLoadTimeout = suiteLoadTimeout,
_metadata = metadata ?? Metadata.empty;

/// Creates a new [SuiteConfiguration] that takes its configuration from
Expand All @@ -304,6 +315,7 @@ final class SuiteConfiguration {
runtimes: null,
compilerSelections: null,
ignoreTimeouts: null,
suiteLoadTimeout: null,
);

/// Returns an unmodifiable copy of [input].
Expand Down Expand Up @@ -348,7 +360,8 @@ final class SuiteConfiguration {
tags: _mergeConfigMaps(tags, other.tags),
onPlatform: _mergeConfigMaps(onPlatform, other.onPlatform),
ignoreTimeouts: other._ignoreTimeouts ?? _ignoreTimeouts,
metadata: metadata.merge(other.metadata));
metadata: metadata.merge(other.metadata),
suiteLoadTimeout: other._suiteLoadTimeout ?? _suiteLoadTimeout);
return config._resolveTags();
}

Expand All @@ -368,6 +381,7 @@ final class SuiteConfiguration {
Map<BooleanSelector, SuiteConfiguration>? tags,
Map<PlatformSelector, SuiteConfiguration>? onPlatform,
bool? ignoreTimeouts,
Timeout? suiteLoadTimeout,

// Test-level configuration
Timeout? timeout,
Expand All @@ -393,6 +407,7 @@ final class SuiteConfiguration {
tags: tags ?? this.tags,
onPlatform: onPlatform ?? this.onPlatform,
ignoreTimeouts: ignoreTimeouts ?? _ignoreTimeouts,
suiteLoadTimeout: suiteLoadTimeout ?? _suiteLoadTimeout,
metadata: _metadata.change(
timeout: timeout,
verboseTrace: verboseTrace,
Expand Down Expand Up @@ -428,6 +443,7 @@ final class SuiteConfiguration {
tags: tags,
onPlatform: onPlatform,
ignoreTimeouts: _ignoreTimeouts,
suiteLoadTimeout: suiteLoadTimeout,
metadata: _metadata);
}

Expand Down