Unverified Commit 61deaef5 authored by fzyzcjy's avatar fzyzcjy Committed by GitHub

Fix bug that`timeDilation` is not reset, causing subsequent test errors, and...

Fix bug that`timeDilation` is not reset, causing subsequent test errors, and add verifications to ensure such problem does not exist in the future (#113830)
parent c23b5ca7
...@@ -119,6 +119,7 @@ Future<File> generateTest(Directory apiDir) async { ...@@ -119,6 +119,7 @@ Future<File> generateTest(Directory apiDir) async {
// Collect the examples, and import them all as separate symbols. // Collect the examples, and import them all as separate symbols.
final List<String> imports = <String>[]; final List<String> imports = <String>[];
imports.add('''import 'package:flutter/widgets.dart';'''); imports.add('''import 'package:flutter/widgets.dart';''');
imports.add('''import 'package:flutter/scheduler.dart';''');
imports.add('''import 'package:flutter_test/flutter_test.dart';'''); imports.add('''import 'package:flutter_test/flutter_test.dart';''');
imports.add('''import 'package:integration_test/integration_test.dart';'''); imports.add('''import 'package:integration_test/integration_test.dart';''');
final List<ExampleInfo> infoList = <ExampleInfo>[]; final List<ExampleInfo> infoList = <ExampleInfo>[];
...@@ -165,6 +166,7 @@ void main() { ...@@ -165,6 +166,7 @@ void main() {
expect(find.byType(WidgetsApp), findsOneWidget); expect(find.byType(WidgetsApp), findsOneWidget);
} finally { } finally {
ErrorWidget.builder = originalBuilder; ErrorWidget.builder = originalBuilder;
timeDilation = 1.0;
} }
}, },
); );
......
...@@ -652,6 +652,20 @@ mixin SchedulerBinding on BindingBase { ...@@ -652,6 +652,20 @@ mixin SchedulerBinding on BindingBase {
return true; return true;
} }
/// Asserts that there is no artificial time dilation in debug mode.
///
/// Throws a [FlutterError] if there are such dilation, as this will make
/// subsequent tests see dilation and thus flaky.
bool debugAssertNoTimeDilation(String reason) {
assert(() {
if (timeDilation != 1.0) {
throw FlutterError(reason);
}
return true;
}());
return true;
}
/// Prints the stack for where the current transient callback was registered. /// Prints the stack for where the current transient callback was registered.
/// ///
/// A transient frame callback is one that was registered with /// A transient frame callback is one that was registered with
......
...@@ -13,4 +13,19 @@ void main() { ...@@ -13,4 +13,19 @@ void main() {
SchedulerBinding.instance.scheduleForcedFrame(); SchedulerBinding.instance.scheduleForcedFrame();
expect(SchedulerBinding.instance.platformDispatcher.onBeginFrame, isNotNull); expect(SchedulerBinding.instance.platformDispatcher.onBeginFrame, isNotNull);
}); });
test('debugAssertNoTimeDilation does not throw if time dilate already reset', () async {
timeDilation = 2.0;
timeDilation = 1.0;
SchedulerBinding.instance.debugAssertNoTimeDilation('reason'); // no error
});
test('debugAssertNoTimeDilation throw if time dilate not reset', () async {
timeDilation = 3.0;
expect(
() => SchedulerBinding.instance.debugAssertNoTimeDilation('reason'),
throwsA(isA<FlutterError>().having((FlutterError e) => e.message, 'message', 'reason')),
);
timeDilation = 1.0;
});
} }
...@@ -215,6 +215,8 @@ void main() { ...@@ -215,6 +215,8 @@ void main() {
tick(const Duration(seconds: 8)); tick(const Duration(seconds: 8));
expect(lastTimeStamp, const Duration(seconds: 3)); // 2s + (8 - 6)s / 2 expect(lastTimeStamp, const Duration(seconds: 3)); // 2s + (8 - 6)s / 2
expect(lastSystemTimeStamp, const Duration(seconds: 8)); expect(lastSystemTimeStamp, const Duration(seconds: 8));
timeDilation = 1.0; // restore time dilation, or it will affect other tests
}); });
test('Animation frame scheduled in the middle of the warm-up frame', () { test('Animation frame scheduled in the middle of the warm-up frame', () {
......
...@@ -124,6 +124,8 @@ void main() { ...@@ -124,6 +124,8 @@ void main() {
expect(lastDuration, const Duration(milliseconds: 20)); expect(lastDuration, const Duration(milliseconds: 20));
ticker.dispose(); ticker.dispose();
timeDilation = 1.0; // restore time dilation, or it will affect other tests
}); });
testWidgets('Ticker can be slowed down with time dilation', (WidgetTester tester) async { testWidgets('Ticker can be slowed down with time dilation', (WidgetTester tester) async {
...@@ -140,6 +142,8 @@ void main() { ...@@ -140,6 +142,8 @@ void main() {
expect(lastDuration, const Duration(milliseconds: 5)); expect(lastDuration, const Duration(milliseconds: 5));
ticker.dispose(); ticker.dispose();
timeDilation = 1.0; // restore time dilation, or it will affect other tests
}); });
testWidgets('Ticker stops ticking when application is paused', (WidgetTester tester) async { testWidgets('Ticker stops ticking when application is paused', (WidgetTester tester) async {
......
...@@ -965,6 +965,9 @@ abstract class TestWidgetsFlutterBinding extends BindingBase ...@@ -965,6 +965,9 @@ abstract class TestWidgetsFlutterBinding extends BindingBase
assert(debugAssertNoPendingPerformanceModeRequests( assert(debugAssertNoPendingPerformanceModeRequests(
'A performance mode was requested and not disposed by a test.' 'A performance mode was requested and not disposed by a test.'
)); ));
assert(debugAssertNoTimeDilation(
'The timeDilation was changed and not reset by the test.'
));
assert(debugAssertAllFoundationVarsUnset( assert(debugAssertAllFoundationVarsUnset(
'The value of a foundation debug variable was changed by the test.', 'The value of a foundation debug variable was changed by the test.',
debugPrintOverride: debugPrintOverride, debugPrintOverride: debugPrintOverride,
......
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