diff --git a/packages/firebase_core/firebase_core_platform_interface/CHANGELOG.md b/packages/firebase_core/firebase_core_platform_interface/CHANGELOG.md index c01d6dabd835..63e423b0d515 100644 --- a/packages/firebase_core/firebase_core_platform_interface/CHANGELOG.md +++ b/packages/firebase_core/firebase_core_platform_interface/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.4 + +* Migrate to package:plugin_platform_interface. + ## 1.0.3 * Make the pedantic dev_dependency explicit. diff --git a/packages/firebase_core/firebase_core_platform_interface/lib/firebase_core_platform_interface.dart b/packages/firebase_core/firebase_core_platform_interface/lib/firebase_core_platform_interface.dart index 4fd1281abac9..27a484894929 100644 --- a/packages/firebase_core/firebase_core_platform_interface/lib/firebase_core_platform_interface.dart +++ b/packages/firebase_core/firebase_core_platform_interface/lib/firebase_core_platform_interface.dart @@ -4,7 +4,7 @@ import 'dart:async'; -import 'package:meta/meta.dart' show visibleForTesting; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; import 'src/firebase_options.dart'; import 'src/method_channel_firebase_core.dart'; @@ -22,14 +22,10 @@ export 'src/platform_firebase_app.dart'; /// will get the default implementation, while platform implementations that /// `implements` this interface will be broken by newly added /// [FirebaseCorePlatform] methods. -abstract class FirebaseCorePlatform { - /// Only mock implementations should set this to `true`. - /// - /// Mockito mocks implement this class with `implements` which is forbidden - /// (see class docs). This property provides a backdoor for mocks to skip the - /// verification that the class isn't implemented with `implements`. - @visibleForTesting - bool get isMock => false; +abstract class FirebaseCorePlatform extends PlatformInterface { + FirebaseCorePlatform() : super(token: _token); + + static final Object _token = Object(); /// The default instance of [FirebaseCorePlatform] to use. /// @@ -44,26 +40,10 @@ abstract class FirebaseCorePlatform { // TODO(amirh): Extract common platform interface logic. // https://github.com/flutter/flutter/issues/43368 static set instance(FirebaseCorePlatform instance) { - if (!instance.isMock) { - try { - instance._verifyProvidesDefaultImplementations(); - } on NoSuchMethodError catch (_) { - throw AssertionError( - 'Platform interfaces must not be implemented with `implements`'); - } - } + PlatformInterface.verifyToken(instance, _token); _instance = instance; } - /// This method ensures that [FirebaseCorePlatform] isn't implemented with `implements`. - /// - /// See class docs for more details on why using `implements` to implement - /// [FirebaseCorePlatform] is forbidden. - /// - /// This private method is called by the [instance] setter, which should fail - /// if the provided instance is a class implemented with `implements`. - void _verifyProvidesDefaultImplementations() {} - /// Returns the data for the Firebase app with the given [name]. /// /// If there is no such app, returns null. diff --git a/packages/firebase_core/firebase_core_platform_interface/pubspec.yaml b/packages/firebase_core/firebase_core_platform_interface/pubspec.yaml index 67fc6ac343b5..8c2edaef7b0a 100644 --- a/packages/firebase_core/firebase_core_platform_interface/pubspec.yaml +++ b/packages/firebase_core/firebase_core_platform_interface/pubspec.yaml @@ -3,12 +3,13 @@ description: A common platform interface for the firebase_core plugin. homepage: https://github.com/FirebaseExtended/flutterfire/tree/master/packages/firebase_core/firebase_core_platform_interface # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 1.0.3 +version: 1.0.4 dependencies: flutter: sdk: flutter meta: ^1.0.5 + plugin_platform_interface: ^1.0.2 quiver: ">=2.0.0 <3.0.0" dev_dependencies: diff --git a/packages/firebase_core/firebase_core_platform_interface/test/firebase_core_platform_interface_test.dart b/packages/firebase_core/firebase_core_platform_interface/test/firebase_core_platform_interface_test.dart index 8feb5a50e95d..b1d06915f5f1 100644 --- a/packages/firebase_core/firebase_core_platform_interface/test/firebase_core_platform_interface_test.dart +++ b/packages/firebase_core/firebase_core_platform_interface/test/firebase_core_platform_interface_test.dart @@ -5,6 +5,7 @@ import 'package:firebase_core_platform_interface/firebase_core_platform_interface.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/mockito.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; void main() { group('$FirebaseCorePlatform', () { @@ -15,7 +16,7 @@ void main() { test('Cannot be implemented with `implements`', () { expect(() { FirebaseCorePlatform.instance = ImplementsFirebaseCorePlatform(); - }, throwsAssertionError); + }, throwsNoSuchMethodError); }); test('Can be extended', () { @@ -23,15 +24,25 @@ void main() { }); test('Can be mocked with `implements`', () { - final ImplementsFirebaseCorePlatform mock = - ImplementsFirebaseCorePlatform(); - when(mock.isMock).thenReturn(true); + final FirebaseCoreMockPlatform mock = FirebaseCoreMockPlatform(); FirebaseCorePlatform.instance = mock; }); }); } -class ImplementsFirebaseCorePlatform extends Mock - implements FirebaseCorePlatform {} +class ImplementsFirebaseCorePlatform implements FirebaseCorePlatform { + @override + Future> allApps() => null; + + @override + Future appNamed(String name) => null; + + @override + Future configure(String name, FirebaseOptions options) => null; +} class ExtendsFirebaseCorePlatform extends FirebaseCorePlatform {} + +class FirebaseCoreMockPlatform extends Mock + with MockPlatformInterfaceMixin + implements FirebaseCorePlatform {}