From 3e1f3473f5840a06ffbb1b5df222d00584f4a0a7 Mon Sep 17 00:00:00 2001 From: Seungsoo Lee Date: Thu, 25 Jun 2026 17:17:03 +0900 Subject: [PATCH 1/4] [firebase_core] Add integration tests based on upstream v2.17.0 Port 6 integration test cases from upstream firebase_core (github.com/firebase/flutterfire) at tag firebase_core-v2.17.0, located at tests/integration_test/firebase_core/firebase_core_e2e_test.dart. The upstream package on pub.dev does not include integration tests, so the source was fetched directly from the GitHub repository. Adapted for Tizen: replaced 'package:tests/firebase_options.dart' with a manually created firebase_options.dart that maps TargetPlatform.linux (Tizen's reported platform) to public test credentials from main.dart. All other test logic is unchanged from upstream. Ported test cases: - Firebase.apps - Firebase.app() - Firebase.app() Exception - FirebaseApp.delete() - FirebaseApp.setAutomaticDataCollectionEnabled() - FirebaseApp.setAutomaticResourceManagementEnabled() Validated on RPI4 (armv7l) and TV emulator (x86_64): 6/6 passed. Co-Authored-By: Claude Sonnet 4.6 --- packages/firebase_core/CHANGELOG.md | 1 + .../integration_test/firebase_core_test.dart | 85 +++++++++++++++++++ .../example/lib/firebase_options.dart | 31 +++++++ packages/firebase_core/example/pubspec.yaml | 10 +++ .../example/test_driver/integration_test.dart | 7 ++ packages/firebase_core/pubspec.yaml | 1 + 6 files changed, 135 insertions(+) create mode 100644 packages/firebase_core/example/integration_test/firebase_core_test.dart create mode 100644 packages/firebase_core/example/lib/firebase_options.dart create mode 100644 packages/firebase_core/example/test_driver/integration_test.dart diff --git a/packages/firebase_core/CHANGELOG.md b/packages/firebase_core/CHANGELOG.md index 40a68551a..0fbe63cda 100644 --- a/packages/firebase_core/CHANGELOG.md +++ b/packages/firebase_core/CHANGELOG.md @@ -1,5 +1,6 @@ ## NEXT +* Add integration tests based on upstream firebase_core v2.17.0. * Update minimum Flutter and Dart version to 3.13 and 3.1. * Fix new lint warnings. * Update code format. diff --git a/packages/firebase_core/example/integration_test/firebase_core_test.dart b/packages/firebase_core/example/integration_test/firebase_core_test.dart new file mode 100644 index 000000000..1761b06b9 --- /dev/null +++ b/packages/firebase_core/example/integration_test/firebase_core_test.dart @@ -0,0 +1,85 @@ +// Copyright 2024 Samsung Electronics Co., Ltd. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Integration tests ported from upstream firebase_core +// (github.com/firebase/flutterfire), originally authored by the +// Chromium project authors under a BSD-style license. + +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_core_platform_interface/firebase_core_platform_interface.dart'; +import 'package:firebase_core_tizen_example/firebase_options.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; + +void main() { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + + group('firebase_core', () { + final String testAppName = '[DEFAULT]'; + + setUpAll(() async { + await Firebase.initializeApp( + options: DefaultFirebaseOptions.currentPlatform, + ); + }); + + test('Firebase.apps', () async { + final List apps = Firebase.apps; + expect(apps.length, 1); + expect(apps[0].name, testAppName); + expect(apps[0].options, DefaultFirebaseOptions.currentPlatform); + }); + + test('Firebase.app()', () async { + final FirebaseApp app = Firebase.app(testAppName); + expect(app.name, testAppName); + expect(app.options, DefaultFirebaseOptions.currentPlatform); + }); + + test('Firebase.app() Exception', () async { + expect( + () => Firebase.app('NoApp'), + throwsA(noAppExists('NoApp')), + ); + }); + + test( + 'FirebaseApp.delete()', + () async { + await Firebase.initializeApp( + name: 'SecondaryApp', + options: DefaultFirebaseOptions.currentPlatform, + ); + + expect(Firebase.apps.length, 2); + + final FirebaseApp app = Firebase.app('SecondaryApp'); + + await app.delete(); + + expect(Firebase.apps.length, 1); + // TODO(russellwheatley): test randomly causes an auth sign-in failure due to duplicate accounts. + }, + skip: TargetPlatform.android == defaultTargetPlatform, + ); + + test('FirebaseApp.setAutomaticDataCollectionEnabled()', () async { + final FirebaseApp app = Firebase.app(testAppName); + await app.setAutomaticDataCollectionEnabled(false); + + expect(app.isAutomaticDataCollectionEnabled, false); + + await app.setAutomaticDataCollectionEnabled(true); + + expect(app.isAutomaticDataCollectionEnabled, true); + }); + + test('FirebaseApp.setAutomaticResourceManagementEnabled()', () async { + final FirebaseApp app = Firebase.app(testAppName); + + await app.setAutomaticResourceManagementEnabled(true); + }); + }); +} diff --git a/packages/firebase_core/example/lib/firebase_options.dart b/packages/firebase_core/example/lib/firebase_options.dart new file mode 100644 index 000000000..b5a9771d9 --- /dev/null +++ b/packages/firebase_core/example/lib/firebase_options.dart @@ -0,0 +1,31 @@ +// Copyright 2024 Samsung Electronics Co., Ltd. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// ignore_for_file: lines_longer_than_80_chars, avoid_classes_with_only_static_members +import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; +import 'package:flutter/foundation.dart' + show defaultTargetPlatform, kIsWeb, TargetPlatform; + +class DefaultFirebaseOptions { + static FirebaseOptions get currentPlatform { + if (kIsWeb) { + throw UnsupportedError('Web is not supported.'); + } + switch (defaultTargetPlatform) { + case TargetPlatform.linux: // Tizen reports as TargetPlatform.linux + return linux; + default: + throw UnsupportedError( + 'DefaultFirebaseOptions are not supported for this platform.', + ); + } + } + + static const FirebaseOptions linux = FirebaseOptions( + apiKey: 'AIzaSyAgUhHU8wSJgO5MVNy95tMT07NEjzMOfz0', + appId: '1:448618578101:ios:0b650370bb29e29cac3efc', + messagingSenderId: '448618578101', + projectId: 'react-native-firebase-testing', + ); +} diff --git a/packages/firebase_core/example/pubspec.yaml b/packages/firebase_core/example/pubspec.yaml index 442cd2278..dfe7d697d 100644 --- a/packages/firebase_core/example/pubspec.yaml +++ b/packages/firebase_core/example/pubspec.yaml @@ -12,3 +12,13 @@ dependencies: path: ../ flutter: sdk: flutter + +dev_dependencies: + flutter_driver: + sdk: flutter + flutter_test: + sdk: flutter + integration_test: + sdk: flutter + integration_test_tizen: + path: ../../integration_test/ diff --git a/packages/firebase_core/example/test_driver/integration_test.dart b/packages/firebase_core/example/test_driver/integration_test.dart new file mode 100644 index 000000000..4f10f2a52 --- /dev/null +++ b/packages/firebase_core/example/test_driver/integration_test.dart @@ -0,0 +1,7 @@ +// Copyright 2013 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:integration_test/integration_test_driver.dart'; + +Future main() => integrationDriver(); diff --git a/packages/firebase_core/pubspec.yaml b/packages/firebase_core/pubspec.yaml index 6b5ca7f30..9b261331f 100644 --- a/packages/firebase_core/pubspec.yaml +++ b/packages/firebase_core/pubspec.yaml @@ -22,3 +22,4 @@ flutter: false_secrets: - /example/lib/main.dart + - /example/lib/firebase_options.dart From f5970690260655ab2c593c111535af54c2bbcca5 Mon Sep 17 00:00:00 2001 From: Seungsoo Lee Date: Thu, 25 Jun 2026 17:22:37 +0900 Subject: [PATCH 2/4] [firebase_core] Fix lint warnings in integration tests - Add firebase_core_platform_interface as explicit dev dependency (was only a transitive dependency, causing depend_on_referenced_packages) - Use const instead of final for testAppName constant - Remove redundant '[DEFAULT]' argument from Firebase.app() calls (matches the default parameter value) - Fix combinator ordering in firebase_options.dart import - Suppress public_member_api_docs and no_default_cases in firebase_options.dart (generated-style file with no public API contract to document) Co-Authored-By: Claude Sonnet 4.6 --- .../example/integration_test/firebase_core_test.dart | 8 ++++---- packages/firebase_core/example/lib/firebase_options.dart | 4 ++-- packages/firebase_core/example/pubspec.yaml | 1 + 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/firebase_core/example/integration_test/firebase_core_test.dart b/packages/firebase_core/example/integration_test/firebase_core_test.dart index 1761b06b9..40f1d7c97 100644 --- a/packages/firebase_core/example/integration_test/firebase_core_test.dart +++ b/packages/firebase_core/example/integration_test/firebase_core_test.dart @@ -17,7 +17,7 @@ void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); group('firebase_core', () { - final String testAppName = '[DEFAULT]'; + const String testAppName = '[DEFAULT]'; setUpAll(() async { await Firebase.initializeApp( @@ -33,7 +33,7 @@ void main() { }); test('Firebase.app()', () async { - final FirebaseApp app = Firebase.app(testAppName); + final FirebaseApp app = Firebase.app(); expect(app.name, testAppName); expect(app.options, DefaultFirebaseOptions.currentPlatform); }); @@ -66,7 +66,7 @@ void main() { ); test('FirebaseApp.setAutomaticDataCollectionEnabled()', () async { - final FirebaseApp app = Firebase.app(testAppName); + final FirebaseApp app = Firebase.app(); await app.setAutomaticDataCollectionEnabled(false); expect(app.isAutomaticDataCollectionEnabled, false); @@ -77,7 +77,7 @@ void main() { }); test('FirebaseApp.setAutomaticResourceManagementEnabled()', () async { - final FirebaseApp app = Firebase.app(testAppName); + final FirebaseApp app = Firebase.app(); await app.setAutomaticResourceManagementEnabled(true); }); diff --git a/packages/firebase_core/example/lib/firebase_options.dart b/packages/firebase_core/example/lib/firebase_options.dart index b5a9771d9..f49f5d3ae 100644 --- a/packages/firebase_core/example/lib/firebase_options.dart +++ b/packages/firebase_core/example/lib/firebase_options.dart @@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// ignore_for_file: lines_longer_than_80_chars, avoid_classes_with_only_static_members +// ignore_for_file: lines_longer_than_80_chars, avoid_classes_with_only_static_members, no_default_cases, public_member_api_docs import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; import 'package:flutter/foundation.dart' - show defaultTargetPlatform, kIsWeb, TargetPlatform; + show TargetPlatform, defaultTargetPlatform, kIsWeb; class DefaultFirebaseOptions { static FirebaseOptions get currentPlatform { diff --git a/packages/firebase_core/example/pubspec.yaml b/packages/firebase_core/example/pubspec.yaml index dfe7d697d..9ee31a230 100644 --- a/packages/firebase_core/example/pubspec.yaml +++ b/packages/firebase_core/example/pubspec.yaml @@ -14,6 +14,7 @@ dependencies: sdk: flutter dev_dependencies: + firebase_core_platform_interface: ^4.5.2 flutter_driver: sdk: flutter flutter_test: From 56b83316e4daf6b1095e8a28195aa10480ce4e71 Mon Sep 17 00:00:00 2001 From: Seungsoo Lee Date: Thu, 25 Jun 2026 17:28:47 +0900 Subject: [PATCH 3/4] [firebase_core] Fix copyright year in newly created files Co-Authored-By: Claude Sonnet 4.6 --- .../example/integration_test/firebase_core_test.dart | 2 +- packages/firebase_core/example/lib/firebase_options.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/firebase_core/example/integration_test/firebase_core_test.dart b/packages/firebase_core/example/integration_test/firebase_core_test.dart index 40f1d7c97..193a74472 100644 --- a/packages/firebase_core/example/integration_test/firebase_core_test.dart +++ b/packages/firebase_core/example/integration_test/firebase_core_test.dart @@ -1,4 +1,4 @@ -// Copyright 2024 Samsung Electronics Co., Ltd. All rights reserved. +// Copyright 2026 Samsung Electronics Co., Ltd. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/firebase_core/example/lib/firebase_options.dart b/packages/firebase_core/example/lib/firebase_options.dart index f49f5d3ae..ee2edfe85 100644 --- a/packages/firebase_core/example/lib/firebase_options.dart +++ b/packages/firebase_core/example/lib/firebase_options.dart @@ -1,4 +1,4 @@ -// Copyright 2024 Samsung Electronics Co., Ltd. All rights reserved. +// Copyright 2026 Samsung Electronics Co., Ltd. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. From ad75a995679a2da8d32d9422d15f6e30395cebb1 Mon Sep 17 00:00:00 2001 From: Seungsoo Lee Date: Fri, 10 Jul 2026 14:05:09 +0900 Subject: [PATCH 4/4] [firebase_core] Deduplicate Firebase options and pin upstream test source Per review: the example's main.dart hardcoded the same test credentials that firebase_options.dart defines, so make it use DefaultFirebaseOptions.currentPlatform as the single source of truth, matching the upstream tests app. Also replace the vague upstream reference in the test header with the exact source URL pinned to the ported version (firebase_core-v2.17.0). --- .../example/integration_test/firebase_core_test.dart | 7 ++++--- packages/firebase_core/example/lib/main.dart | 9 +++------ 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/packages/firebase_core/example/integration_test/firebase_core_test.dart b/packages/firebase_core/example/integration_test/firebase_core_test.dart index 193a74472..39bfa30df 100644 --- a/packages/firebase_core/example/integration_test/firebase_core_test.dart +++ b/packages/firebase_core/example/integration_test/firebase_core_test.dart @@ -2,9 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Integration tests ported from upstream firebase_core -// (github.com/firebase/flutterfire), originally authored by the -// Chromium project authors under a BSD-style license. +// Integration tests ported from upstream firebase_core v2.17.0: +// https://github.com/firebase/flutterfire/blob/firebase_core-v2.17.0/tests/integration_test/firebase_core/firebase_core_e2e_test.dart +// Originally authored by the Chromium project authors under a BSD-style +// license. import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_core_platform_interface/firebase_core_platform_interface.dart'; diff --git a/packages/firebase_core/example/lib/main.dart b/packages/firebase_core/example/lib/main.dart index dfe3701a8..07f03b9a5 100644 --- a/packages/firebase_core/example/lib/main.dart +++ b/packages/firebase_core/example/lib/main.dart @@ -9,6 +9,8 @@ import 'dart:developer'; import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; +import 'firebase_options.dart'; + void main() => runApp(const MyApp()); class MyApp extends StatelessWidget { @@ -16,12 +18,7 @@ class MyApp extends StatelessWidget { String get name => 'foo'; - FirebaseOptions get firebaseOptions => const FirebaseOptions( - appId: '1:448618578101:ios:0b650370bb29e29cac3efc', - apiKey: 'AIzaSyAgUhHU8wSJgO5MVNy95tMT07NEjzMOfz0', - projectId: 'react-native-firebase-testing', - messagingSenderId: '448618578101', - ); + FirebaseOptions get firebaseOptions => DefaultFirebaseOptions.currentPlatform; Future initializeDefault() async { final FirebaseApp app = await Firebase.initializeApp(