// 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 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:flutter_test/flutter_test.dart'; class TestBinding extends BindingBase { } void main() { test('BindingBase.debugCheckZone', () async { final BindingBase binding = TestBinding(); binding.debugCheckZone('test1'); BindingBase.debugZoneErrorsAreFatal = true; Zone.current.fork().run(() { try { binding.debugCheckZone('test2'); fail('expected an exception'); } catch (error) { expect(error, isA<FlutterError>()); expect(error.toString(), 'Zone mismatch.\n' 'The Flutter bindings were initialized in a different zone than is now being used. ' 'This will likely cause confusion and bugs as any zone-specific configuration will ' 'inconsistently use the configuration of the original binding initialization zone ' 'or this zone based on hard-to-predict factors such as which zone was active when ' 'a particular callback was set.\n' 'It is important to use the same zone when calling `ensureInitialized` on the ' 'binding as when calling `test2` later.\n' 'To make this error non-fatal, set BindingBase.debugZoneErrorsAreFatal to false ' 'before the bindings are initialized (i.e. as the first statement in `void main() { }`).', ); } }); BindingBase.debugZoneErrorsAreFatal = false; Zone.current.fork().run(() { bool sawError = false; final FlutterExceptionHandler? lastHandler = FlutterError.onError; FlutterError.onError = (FlutterErrorDetails details) { final Object error = details.exception; expect(error, isA<FlutterError>()); expect(error.toString(), 'Zone mismatch.\n' 'The Flutter bindings were initialized in a different zone than is now being used. ' 'This will likely cause confusion and bugs as any zone-specific configuration will ' 'inconsistently use the configuration of the original binding initialization zone ' 'or this zone based on hard-to-predict factors such as which zone was active when ' 'a particular callback was set.\n' 'It is important to use the same zone when calling `ensureInitialized` on the ' 'binding as when calling `test3` later.\n' 'To make this warning fatal, set BindingBase.debugZoneErrorsAreFatal to true ' 'before the bindings are initialized (i.e. as the first statement in `void main() { }`).', ); sawError = true; }; binding.debugCheckZone('test3'); expect(sawError, isTrue); FlutterError.onError = lastHandler; }); }); }