Unverified Commit 24207183 authored by Ian Hickson's avatar Ian Hickson Committed by GitHub

Remove our extra timeout logic. (#89952)

parent 5d9afaa0
// 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 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets('flutter_test timeout logic - addTime - negative', (WidgetTester tester) async {
await tester.runAsync(() async {
await Future<void>.delayed(const Duration(milliseconds: 3500)); // must be more than 1000ms more than the initial timeout
}, additionalTime: const Duration(milliseconds: 200));
}, initialTimeout: const Duration(milliseconds: 2000));
}
// 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 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets('flutter_test timeout logic - addTime - positive', (WidgetTester tester) async {
await tester.runAsync(() async {
await Future<void>.delayed(const Duration(milliseconds: 2500)); // must be longer than initial timeout below.
}, additionalTime: const Duration(milliseconds: 2000)); // initial timeout is 2s, so this makes it 4s.
}, initialTimeout: const Duration(milliseconds: 2000));
}
...@@ -568,9 +568,9 @@ Future<void> verifyIntegrationTestTimeouts(String workingDirectory) async { ...@@ -568,9 +568,9 @@ Future<void> verifyIntegrationTestTimeouts(String workingDirectory) async {
if (errors.isNotEmpty) { if (errors.isNotEmpty) {
exitWithError(<String>[ exitWithError(<String>[
if (errors.length == 1) if (errors.length == 1)
'${bold}An error was detected when looking at import dependencies within the flutter_tools package:$reset' '${bold}An error was detected when looking at integration test timeouts:$reset'
else else
'${bold}Multiple errors were detected when looking at import dependencies within the flutter_tools package:$reset', '${bold}Multiple errors were detected when looking at integration test timeouts:$reset',
...errors.map((String paragraph) => '$paragraph\n'), ...errors.map((String paragraph) => '$paragraph\n'),
]); ]);
} }
......
...@@ -190,83 +190,65 @@ Future<void> _runSmokeTests() async { ...@@ -190,83 +190,65 @@ Future<void> _runSmokeTests() async {
// Verify that the tests actually return failure on failure and success on // Verify that the tests actually return failure on failure and success on
// success. // success.
final String automatedTests = path.join(flutterRoot, 'dev', 'automated_tests'); final String automatedTests = path.join(flutterRoot, 'dev', 'automated_tests');
// We run the "pass" and "fail" smoke tests first, and alone, because those
// are particularly critical and sensitive. If one of these fails, there's no // We want to run the smoketests in parallel, because they each take some time
// point even trying the others. // to run (e.g. compiling), so we don't want to run them in series, especially
// on 20-core machines. However, we have a race condition, so for now...
// Race condition issue: https://github.com/flutter/flutter/issues/90026
final List<ShardRunner> tests = <ShardRunner>[ final List<ShardRunner> tests = <ShardRunner>[
() => _runFlutterTest( () => _runFlutterTest(
automatedTests, automatedTests,
script: path.join('test_smoke_test', 'pass_test.dart'), script: path.join('test_smoke_test', 'pass_test.dart'),
printOutput: false, printOutput: false,
), ),
() => _runFlutterTest(
automatedTests,
script: path.join('test_smoke_test', 'fail_test.dart'),
expectFailure: true,
printOutput: false,
),
() => _runFlutterTest(
automatedTests,
script: path.join('test_smoke_test', 'pending_timer_fail_test.dart'),
expectFailure: true,
printOutput: false,
outputChecker: (CommandResult result) {
return result.flattenedStdout!.contains('failingPendingTimerTest')
? null
: 'Failed to find the stack trace for the pending Timer.\n\n'
'stdout:\n${result.flattenedStdout}\n\n'
'stderr:\n${result.flattenedStderr}';
}),
() => _runFlutterTest(
automatedTests,
script: path.join('test_smoke_test', 'crash1_test.dart'),
expectFailure: true,
printOutput: false,
),
() => _runFlutterTest(
automatedTests,
script: path.join('test_smoke_test', 'crash2_test.dart'),
expectFailure: true,
printOutput: false,
),
() => _runFlutterTest( () => _runFlutterTest(
automatedTests, automatedTests,
script: path.join('test_smoke_test', 'fail_test.dart'), script: path.join('test_smoke_test', 'syntax_error_test.broken_dart'),
expectFailure: true, expectFailure: true,
printOutput: false, printOutput: false,
), ),
// We run the timeout tests individually because they are timing-sensitive.
() => _runFlutterTest( () => _runFlutterTest(
automatedTests, automatedTests,
script: path.join('test_smoke_test', 'timeout_pass_test.dart'), script: path.join('test_smoke_test', 'missing_import_test.broken_dart'),
expectFailure: false, expectFailure: true,
printOutput: false, printOutput: false,
), ),
() => _runFlutterTest( () => _runFlutterTest(
automatedTests, automatedTests,
script: path.join('test_smoke_test', 'timeout_fail_test.dart'), script: path.join('test_smoke_test', 'disallow_error_reporter_modification_test.dart'),
expectFailure: true, expectFailure: true,
printOutput: false, printOutput: false,
), ),
() => _runFlutterTest(automatedTests,
script:
path.join('test_smoke_test', 'pending_timer_fail_test.dart'),
expectFailure: true,
printOutput: false, outputChecker: (CommandResult result) {
return result.flattenedStdout!.contains('failingPendingTimerTest')
? null
: 'Failed to find the stack trace for the pending Timer.';
}),
// We run the remaining smoketests in parallel, because they each take some
// time to run (e.g. compiling), so we don't want to run them in series,
// especially on 20-core machines...
() => Future.wait<void>(
<Future<void>>[
_runFlutterTest(
automatedTests,
script: path.join('test_smoke_test', 'crash1_test.dart'),
expectFailure: true,
printOutput: false,
),
_runFlutterTest(
automatedTests,
script: path.join('test_smoke_test', 'crash2_test.dart'),
expectFailure: true,
printOutput: false,
),
_runFlutterTest(
automatedTests,
script:
path.join('test_smoke_test', 'syntax_error_test.broken_dart'),
expectFailure: true,
printOutput: false,
),
_runFlutterTest(
automatedTests,
script: path.join(
'test_smoke_test', 'missing_import_test.broken_dart'),
expectFailure: true,
printOutput: false,
),
_runFlutterTest(
automatedTests,
script: path.join('test_smoke_test',
'disallow_error_reporter_modification_test.dart'),
expectFailure: true,
printOutput: false,
),
],
),
]; ];
List<ShardRunner> testsToRun; List<ShardRunner> testsToRun;
...@@ -785,8 +767,9 @@ Future<void> _runFrameworkTests() async { ...@@ -785,8 +767,9 @@ Future<void> _runFrameworkTests() async {
outputChecker: (CommandResult result) { outputChecker: (CommandResult result) {
final Iterable<Match> matches = httpClientWarning.allMatches(result.flattenedStdout!); final Iterable<Match> matches = httpClientWarning.allMatches(result.flattenedStdout!);
if (matches == null || matches.isEmpty || matches.length > 1) { if (matches == null || matches.isEmpty || matches.length > 1) {
return 'Failed to print warning about HttpClientUsage, or printed it too many times.\n' return 'Failed to print warning about HttpClientUsage, or printed it too many times.\n\n'
'stdout:\n${result.flattenedStdout}'; 'stdout:\n${result.flattenedStdout}\n\n'
'stderr:\n${result.flattenedStderr}';
} }
return null; return null;
}, },
...@@ -1773,9 +1756,9 @@ List<T> _selectIndexOfTotalSubshard<T>(List<T> tests, {String subshardKey = kSub ...@@ -1773,9 +1756,9 @@ List<T> _selectIndexOfTotalSubshard<T>(List<T> tests, {String subshardKey = kSub
exit(1); exit(1);
} }
final int testsPerShard = tests.length ~/ total; final int testsPerShard = (tests.length / total).ceil();
final int start = (index - 1) * testsPerShard; final int start = (index - 1) * testsPerShard;
final int end = index * testsPerShard; final int end = math.min(index * testsPerShard, tests.length);
print('Selecting subshard $index of $total (range ${start + 1}-$end of ${tests.length})'); print('Selecting subshard $index of $total (range ${start + 1}-$end of ${tests.length})');
return tests.sublist(start, end); return tests.sublist(start, end);
......
...@@ -109,19 +109,19 @@ void main() { ...@@ -109,19 +109,19 @@ void main() {
} }
test('subshards tests correctly', () async { test('subshards tests correctly', () async {
// When updating this test, try to pick shard numbers that ensure we're checking
// that unequal test distributions don't miss tests.
ProcessResult result = await runScript( ProcessResult result = await runScript(
<String, String>{'SHARD': 'smoke_tests', 'SUBSHARD': '1_3'}, <String, String>{'SHARD': 'smoke_tests', 'SUBSHARD': '1_3'},
); );
expectExitCode(result, 0); expectExitCode(result, 0);
// There are currently 6 smoke tests. This shard should contain test 1 and 2. expect(result.stdout, contains('Selecting subshard 1 of 3 (range 1-3 of 8)'));
expect(result.stdout, contains('Selecting subshard 1 of 3 (range 1-2 of 6)'));
result = await runScript( result = await runScript(
<String, String>{'SHARD': 'smoke_tests', 'SUBSHARD': '5_6'}, <String, String>{'SHARD': 'smoke_tests', 'SUBSHARD': '3_3'},
); );
expectExitCode(result, 0); expectExitCode(result, 0);
// This shard should contain only test 5. expect(result.stdout, contains('Selecting subshard 3 of 3 (range 7-8 of 8)'));
expect(result.stdout, contains('Selecting subshard 5 of 6 (range 5-5 of 6)'));
}); });
test('exits with code 1 when SUBSHARD index greater than total', () async { test('exits with code 1 when SUBSHARD index greater than total', () async {
......
...@@ -6,9 +6,9 @@ ...@@ -6,9 +6,9 @@
#include "generated_plugin_registrant.h" #include "generated_plugin_registrant.h"
#include <url_launcher_windows/url_launcher_plugin.h> #include <url_launcher_windows/url_launcher_windows.h>
void RegisterPlugins(flutter::PluginRegistry* registry) { void RegisterPlugins(flutter::PluginRegistry* registry) {
UrlLauncherPluginRegisterWithRegistrar( UrlLauncherWindowsRegisterWithRegistrar(
registry->GetRegistrarForPlugin("UrlLauncherPlugin")); registry->GetRegistrarForPlugin("UrlLauncherWindows"));
} }
...@@ -13,7 +13,6 @@ import 'package:flutter_test/flutter_test.dart'; ...@@ -13,7 +13,6 @@ import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
testWidgets("BackdropFilter's cull rect does not shrink", (WidgetTester tester) async { testWidgets("BackdropFilter's cull rect does not shrink", (WidgetTester tester) async {
tester.binding.addTime(const Duration(seconds: 15));
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp( MaterialApp(
home: Scaffold( home: Scaffold(
...@@ -51,7 +50,6 @@ void main() { ...@@ -51,7 +50,6 @@ void main() {
}); });
testWidgets('BackdropFilter blendMode on saveLayer', (WidgetTester tester) async { testWidgets('BackdropFilter blendMode on saveLayer', (WidgetTester tester) async {
tester.binding.addTime(const Duration(seconds: 15));
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp( MaterialApp(
home: Scaffold( home: Scaffold(
......
...@@ -2522,7 +2522,7 @@ class _TestWidgetInspectorService extends TestWidgetInspectorService { ...@@ -2522,7 +2522,7 @@ class _TestWidgetInspectorService extends TestWidgetInspectorService {
final ui.Codec codec = await ui.instantiateImageCodec(base64.decode(base64Screenshot)); final ui.Codec codec = await ui.instantiateImageCodec(base64.decode(base64Screenshot));
final ui.FrameInfo frame = await codec.getNextFrame(); final ui.FrameInfo frame = await codec.getNextFrame();
return frame.image; return frame.image;
}, additionalTime: const Duration(seconds: 11)))!; }))!;
await expectLater( await expectLater(
screenshotImage, screenshotImage,
......
This diff is collapsed.
...@@ -82,23 +82,13 @@ E? _lastWhereOrNull<E>(Iterable<E> list, bool Function(E) test) { ...@@ -82,23 +82,13 @@ E? _lastWhereOrNull<E>(Iterable<E> list, bool Function(E) test) {
/// The callback can be asynchronous (using `async`/`await` or /// The callback can be asynchronous (using `async`/`await` or
/// using explicit [Future]s). /// using explicit [Future]s).
/// ///
/// There are two kinds of timeouts that can be specified. The `timeout` /// The `timeout` argument specifies the backstop timeout implemented by the
/// argument specifies the backstop timeout implemented by the `test` package. /// `test` package. If set, it should be relatively large (minutes). It defaults
/// If set, it should be relatively large (minutes). It defaults to ten minutes /// to ten minutes for tests run by `flutter test`, and is unlimited for tests
/// for tests run by `flutter test`, and is unlimited for tests run by `flutter /// run by `flutter run`; specifically, it defaults to
/// run`; specifically, it defaults to /// [TestWidgetsFlutterBinding.defaultTestTimeout]. (The `initialTimeout`
/// [TestWidgetsFlutterBinding.defaultTestTimeout]. /// parameter has no effect. It was previously used with
/// /// [TestWidgetsFlutterBinding.addTime] but that feature was removed.)
/// The `initialTimeout` argument specifies the timeout implemented by the
/// `flutter_test` package itself. If set, it may be relatively small (seconds),
/// as it is automatically increased for some expensive operations, and can also
/// be manually increased by calling
/// [AutomatedTestWidgetsFlutterBinding.addTime]. The effective maximum value of
/// this timeout (even after calling `addTime`) is the one specified by the
/// `timeout` argument.
///
/// In general, timeouts are race conditions and cause flakes, so best practice
/// is to avoid the use of timeouts in tests.
/// ///
/// If the `semanticsEnabled` parameter is set to `true`, /// If the `semanticsEnabled` parameter is set to `true`,
/// [WidgetTester.ensureSemantics] will have been called before the tester is /// [WidgetTester.ensureSemantics] will have been called before the tester is
...@@ -138,6 +128,10 @@ void testWidgets( ...@@ -138,6 +128,10 @@ void testWidgets(
WidgetTesterCallback callback, { WidgetTesterCallback callback, {
bool? skip, bool? skip,
test_package.Timeout? timeout, test_package.Timeout? timeout,
@Deprecated(
'This parameter has no effect. Use `timeout` instead. '
'This feature was deprecated after v2.6.0-1.0.pre.'
)
Duration? initialTimeout, Duration? initialTimeout,
bool semanticsEnabled = true, bool semanticsEnabled = true,
TestVariant<Object?> variant = const DefaultTestVariant(), TestVariant<Object?> variant = const DefaultTestVariant(),
......
...@@ -214,13 +214,16 @@ https://flutter.dev/docs/testing/integration-tests#testing-on-firebase-test-lab ...@@ -214,13 +214,16 @@ https://flutter.dev/docs/testing/integration-tests#testing-on-firebase-test-lab
Future<void> Function() testBody, Future<void> Function() testBody,
VoidCallback invariantTester, { VoidCallback invariantTester, {
String description = '', String description = '',
@Deprecated(
'This parameter has no effect. Use the `timeout` parameter on `testWidgets` instead. '
'This feature was deprecated after v2.6.0-1.0.pre.'
)
Duration? timeout, Duration? timeout,
}) async { }) async {
await super.runTest( await super.runTest(
testBody, testBody,
invariantTester, invariantTester,
description: description, description: description,
timeout: timeout,
); );
results[description] ??= _success; results[description] ??= _success;
} }
...@@ -411,13 +414,7 @@ https://flutter.dev/docs/testing/integration-tests#testing-on-firebase-test-lab ...@@ -411,13 +414,7 @@ https://flutter.dev/docs/testing/integration-tests#testing-on-firebase-test-lab
} }
@override @override
Timeout get defaultTestTimeout => _defaultTestTimeout ?? super.defaultTestTimeout; Timeout defaultTestTimeout = Timeout.none;
/// Configures the default timeout for [testWidgets].
///
/// See [TestWidgetsFlutterBinding.defaultTestTimeout] for more details.
set defaultTestTimeout(Timeout timeout) => _defaultTestTimeout = timeout;
Timeout? _defaultTestTimeout;
@override @override
void attachRootWidget(Widget rootWidget) { void attachRootWidget(Widget rootWidget) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment