Fix bug thattimeDilation
is not reset, causing subsequent test errors, and add verifications to ensure such problem does not exist in the future (#113830)
This commit is contained in:
parent
c23b5ca7db
commit
61deaef5df
@ -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() {
|
|||||||
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 {
|
|||||||
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() {
|
|||||||
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() {
|
|||||||
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() {
|
|||||||
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() {
|
|||||||
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
|
|||||||
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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user