From 4c372926560c97b6d9861d0df0f1ddc398347a75 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Thu, 30 Jul 2026 12:51:39 +0100 Subject: [PATCH 1/8] fix(tests, ios): correct testing app bundle id to io.invertase.testing com.invertase.testing is not registered on the team's Apple Developer Portal (io.invertase.testing is), so Xcode cannot provision the app. Updates the Xcode project's PRODUCT_BUNDLE_IDENTIFIER, keychain-access-groups entitlement, and the Google Sign-In URL scheme, and re-downloads GoogleService-Info.plist for the io.invertase.testing Firebase iOS app so Firebase/Google services keep working under the corrected bundle id. --- tests/e2e/firebase.test.js | 4 ++-- tests/ios/GoogleService-Info.plist | 20 +++++++++----------- tests/ios/testing.xcodeproj/project.pbxproj | 4 ++-- tests/ios/testing/Info.plist | 2 +- tests/ios/testing/testing.entitlements | 2 +- 5 files changed, 15 insertions(+), 17 deletions(-) diff --git a/tests/e2e/firebase.test.js b/tests/e2e/firebase.test.js index 68a584ec5c..b21ac61d87 100644 --- a/tests/e2e/firebase.test.js +++ b/tests/e2e/firebase.test.js @@ -210,7 +210,7 @@ function logLaunchInstallState(label) { try { const container = execSync( - `/usr/bin/xcrun simctl get_app_container ${udid} com.invertase.testing 2>&1`, + `/usr/bin/xcrun simctl get_app_container ${udid} io.invertase.testing 2>&1`, { encoding: 'utf8', timeout: 15000 }, ).trim(); console.log(`[rnfb-e2e] install-state label=${label} udid=${udid} container=${container}`); @@ -227,7 +227,7 @@ function logLaunchInstallState(label) { timeout: 30000, }); const invertaseLine = - apps.split('\n').find(line => line.includes('com.invertase.testing')) || '(not listed)'; + apps.split('\n').find(line => line.includes('io.invertase.testing')) || '(not listed)'; console.log(`[rnfb-e2e] install-state label=${label} listapps=${invertaseLine.trim()}`); } catch (err) { console.warn( diff --git a/tests/ios/GoogleService-Info.plist b/tests/ios/GoogleService-Info.plist index 05630f784b..47eab4a509 100644 --- a/tests/ios/GoogleService-Info.plist +++ b/tests/ios/GoogleService-Info.plist @@ -2,14 +2,12 @@ - AD_UNIT_ID_FOR_BANNER_TEST - ca-app-pub-3940256099942544/2934735716 - AD_UNIT_ID_FOR_INTERSTITIAL_TEST - ca-app-pub-3940256099942544/4411468910 CLIENT_ID - 448618578101-28tsenal97nceuij1msj7iuqinv48t02.apps.googleusercontent.com + 448618578101-4km55qmv55tguvnivgjdiegb3r0jquv5.apps.googleusercontent.com REVERSED_CLIENT_ID - com.googleusercontent.apps.448618578101-28tsenal97nceuij1msj7iuqinv48t02 + com.googleusercontent.apps.448618578101-4km55qmv55tguvnivgjdiegb3r0jquv5 + ANDROID_CLIENT_ID + 448618578101-a9p7bj5jlakabp22fo3cbkj7nsmag24e.apps.googleusercontent.com API_KEY AIzaSyAHAsf51D0A407EklG1bs-5wA7EbyfNFg0 GCM_SENDER_ID @@ -17,24 +15,24 @@ PLIST_VERSION 1 BUNDLE_ID - com.invertase.testing + io.invertase.testing PROJECT_ID react-native-firebase-testing STORAGE_BUCKET react-native-firebase-testing.appspot.com IS_ADS_ENABLED - + IS_ANALYTICS_ENABLED IS_APPINVITE_ENABLED - + IS_GCM_ENABLED IS_SIGNIN_ENABLED GOOGLE_APP_ID - 1:448618578101:ios:cc6c1dc7a65cc83c + 1:448618578101:ios:3e76955ab6d49ecaac3efc DATABASE_URL https://react-native-firebase-testing.firebaseio.com - \ No newline at end of file + diff --git a/tests/ios/testing.xcodeproj/project.pbxproj b/tests/ios/testing.xcodeproj/project.pbxproj index 2deb3aa9c0..6cfdc5cf5f 100644 --- a/tests/ios/testing.xcodeproj/project.pbxproj +++ b/tests/ios/testing.xcodeproj/project.pbxproj @@ -476,7 +476,7 @@ "-ObjC", ); OTHER_SWIFT_FLAGS = "$(inherited) -profile-generate -profile-coverage-mapping"; - PRODUCT_BUNDLE_IDENTIFIER = com.invertase.testing; + PRODUCT_BUNDLE_IDENTIFIER = io.invertase.testing; PRODUCT_NAME = testing; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_ENABLE_EXPLICIT_MODULES = NO; @@ -535,7 +535,7 @@ "-ObjC", ); OTHER_SWIFT_FLAGS = "$(inherited) -profile-generate -profile-coverage-mapping"; - PRODUCT_BUNDLE_IDENTIFIER = com.invertase.testing; + PRODUCT_BUNDLE_IDENTIFIER = io.invertase.testing; PRODUCT_NAME = testing; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_ENABLE_EXPLICIT_MODULES = NO; diff --git a/tests/ios/testing/Info.plist b/tests/ios/testing/Info.plist index b545f687c5..52f06ec3e1 100644 --- a/tests/ios/testing/Info.plist +++ b/tests/ios/testing/Info.plist @@ -26,7 +26,7 @@ CFBundleURLSchemes com.googleusercontent.apps.305229645282-9i07a33r4sj2fmrshnmh8jkh52dgpdve - com.googleusercontent.apps.448618578101-28tsenal97nceuij1msj7iuqinv48t02 + com.googleusercontent.apps.448618578101-4km55qmv55tguvnivgjdiegb3r0jquv5 diff --git a/tests/ios/testing/testing.entitlements b/tests/ios/testing/testing.entitlements index 246ff13574..ff99532a0a 100644 --- a/tests/ios/testing/testing.entitlements +++ b/tests/ios/testing/testing.entitlements @@ -14,7 +14,7 @@ keychain-access-groups - $(AppIdentifierPrefix)com.invertase.testing + $(AppIdentifierPrefix)io.invertase.testing From 1493d9a9d4445935d7c3805b7700dce08300f046 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Thu, 30 Jul 2026 15:40:51 +0100 Subject: [PATCH 2/8] fix(tests): sync globals.js iOS appId with updated GoogleService-Info.plist The iOS bundle id change in this PR regenerated GoogleService-Info.plist with a new GOOGLE_APP_ID, but tests/globals.js still had the old value hardcoded, causing app.e2e.js config assertions and App Check token tests to fail in CI. --- tests/globals.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/globals.js b/tests/globals.js index 6f43122b79..b005b64a57 100644 --- a/tests/globals.js +++ b/tests/globals.js @@ -166,7 +166,7 @@ global.FirebaseHelpers = { clientId: '448618578101-28tsenal97nceuij1msj7iuqinv48t02.apps.googleusercontent.com', androidClientId: '448618578101-pdjje2lkv3p941e03hkrhfa7459cr2v8.apps.googleusercontent.com', - appId: '1:448618578101:ios:cc6c1dc7a65cc83c', + appId: '1:448618578101:ios:3e76955ab6d49ecaac3efc', apiKey: 'AIzaSyAHAsf51D0A407EklG1bs-5wA7EbyfNFg0', authDomain: 'react-native-firebase-testing.firebaseapp.com', databaseURL: 'https://react-native-firebase-testing.firebaseio.com', From d89115a8e74a56b74ec509716b8faec53911af72 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Thu, 30 Jul 2026 15:42:35 +0100 Subject: [PATCH 3/8] fix(auth,tests): update useUserAccessGroup() keychain group for new testing bundle id testing.entitlements now grants keychain-access-groups for io.invertase.testing (not com.invertase.testing), so the e2e test must request the matching YYX2P3XVJ7.io.invertase.testing group or useUserAccessGroup() fails with auth/keychain-error. --- packages/auth/e2e/auth.e2e.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/auth/e2e/auth.e2e.js b/packages/auth/e2e/auth.e2e.js index 8ea1f966fa..43a0088a1a 100644 --- a/packages/auth/e2e/auth.e2e.js +++ b/packages/auth/e2e/auth.e2e.js @@ -1100,7 +1100,7 @@ describe('auth() modular', function () { const successfulKeychain = await useUserAccessGroup( defaultAuth, - 'YYX2P3XVJ7.com.invertase.testing', + 'YYX2P3XVJ7.io.invertase.testing', ); // iOS signing team is YYX2P3XVJ7 should.not.exist(successfulKeychain); From 089d7e3e4a27b4ba49ce1e59703bc54779d10381 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Fri, 31 Jul 2026 11:47:12 +0100 Subject: [PATCH 4/8] fix(app-check,tests): pass debugToken on apple valid reconfigure path The config-switch e2e case re-enabled the debug provider without a debugToken on iOS, so exchangeDebugToken could not use the shared CI token after App Attest failed. --- packages/app-check/e2e/appcheck.e2e.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/app-check/e2e/appcheck.e2e.js b/packages/app-check/e2e/appcheck.e2e.js index 7d886aed28..5cf4f3f64b 100644 --- a/packages/app-check/e2e/appcheck.e2e.js +++ b/packages/app-check/e2e/appcheck.e2e.js @@ -230,6 +230,7 @@ describe('appCheck()', function () { }, apple: { provider: 'debug', + debugToken: getRandomToken(), }, web: { provider: 'debug', From f8dd1d6288e45f75611655007015be23cdbc2338 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Fri, 31 Jul 2026 11:47:12 +0100 Subject: [PATCH 5/8] fix(tests,ios): terminate io.invertase.testing in boot-simulator scripts Keep CI/local simulator cleanup aligned with the testing app bundle id change from com.invertase.testing. --- .github/workflows/scripts/boot-simulator.sh | 2 +- scripts/tart/lib/boot-simulator.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/scripts/boot-simulator.sh b/.github/workflows/scripts/boot-simulator.sh index b41c3f603b..fd1747baff 100755 --- a/.github/workflows/scripts/boot-simulator.sh +++ b/.github/workflows/scripts/boot-simulator.sh @@ -82,7 +82,7 @@ kill_resolved_simulator() { log_boot_status "phase=kill_resolved udid=${udid} device=\"${device}\"" killall Simulator 2>/dev/null || true - xcrun simctl terminate "$udid" com.invertase.testing 2>/dev/null || true + xcrun simctl terminate "$udid" io.invertase.testing 2>/dev/null || true xcrun simctl shutdown "$udid" 2>/dev/null || true xcrun simctl shutdown "$device" 2>/dev/null || true } diff --git a/scripts/tart/lib/boot-simulator.sh b/scripts/tart/lib/boot-simulator.sh index a7fc8a4e4a..ceb1b78735 100755 --- a/scripts/tart/lib/boot-simulator.sh +++ b/scripts/tart/lib/boot-simulator.sh @@ -110,7 +110,7 @@ kill_resolved_simulator() { log_boot_status "phase=kill_resolved udid=${udid} device=\"${device}\"" killall Simulator 2>/dev/null || true - xcrun simctl terminate "$udid" com.invertase.testing 2>/dev/null || true + xcrun simctl terminate "$udid" io.invertase.testing 2>/dev/null || true xcrun simctl shutdown "$udid" 2>/dev/null || true xcrun simctl shutdown "$device" 2>/dev/null || true } From 76c39168bd25c84a9ae9f383eafabfaa332a45ee Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Fri, 31 Jul 2026 11:47:12 +0100 Subject: [PATCH 6/8] docs(okf): update iOS testing bundle id references to io.invertase.testing Match triage notes and benign Detox noise examples to the corrected testing app bundle identifier. --- okf-bundle/ci-workflows/ios.md | 4 ++-- okf-bundle/testing/running-e2e.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/okf-bundle/ci-workflows/ios.md b/okf-bundle/ci-workflows/ios.md index 307bc605bb..3a35416b15 100644 --- a/okf-bundle/ci-workflows/ios.md +++ b/okf-bundle/ci-workflows/ios.md @@ -144,7 +144,7 @@ rg 'No script URL provided|com\.facebook\.react\.log' sim-app.log rg -i 'invertase|FrontBoard|unknown' sim-app.log ``` -Long `datamigrator` activity with no `com.invertase.testing` means migration/pre-boot install not done. +Long `datamigrator` activity with no `io.invertase.testing` means migration/pre-boot install not done. ### Detox configuration @@ -448,7 +448,7 @@ Failed to transform failure: Bundle was not loaded from Metro. ``` FBSOpenApplicationServiceErrorDomain -Application "com.invertase.testing" is unknown to FrontBoard +Application "io.invertase.testing" is unknown to FrontBoard ``` Often preceded by `[rnfb-e2e] terminateApp ... elapsed=60000ms` (or similar) in `detox-step-*_log`. diff --git a/okf-bundle/testing/running-e2e.md b/okf-bundle/testing/running-e2e.md index caddc1f477..6034cd2811 100644 --- a/okf-bundle/testing/running-e2e.md +++ b/okf-bundle/testing/running-e2e.md @@ -625,7 +625,7 @@ Do **not** treat this redbox as a missing TurboModule registration until the ref - **iOS** — `xcrun simctl spawn booted log stream --level debug --style compact --predicate 'process == "testing"'`; silent hangs: `sample ` on `testing`. Metro redbox **`Requiring unknown module "undefined"`** → [TurboModule stale toolchain](#turbomodule-stale-toolchain-blocking), not registration checklist alone. - **Android** — `adb logcat` (filter your tags) -**Benign noise:** iOS Detox `EXEC_FAIL "xcrun simctl terminate … com.invertase.testing" … found nothing to terminate` — app wasn't running; ignore. +**Benign noise:** iOS Detox `EXEC_FAIL "xcrun simctl terminate … io.invertase.testing" … found nothing to terminate` — app wasn't running; ignore. **Cloud API pressure** — Installations / Remote Config failures with FIS 503 or “Too many server requests” are live-project quota on **any** platform, not emulator issues. See [Firebase testing project — CI triage](firebase-testing-project.md#ci-triage-cloud-api-quota-pressure). From 492777a8af7032ba02dd87c2fea79570f0e6562b Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Fri, 31 Jul 2026 15:21:01 +0100 Subject: [PATCH 7/8] fix(tests,ios): use io.invertase.testing for native coverage pull Post-suite simctl get_app_container still used the Android applicationId after the iOS testing bundle id change, so CI failed after Jet passed. --- tests/scripts/pull-native-coverage.js | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/tests/scripts/pull-native-coverage.js b/tests/scripts/pull-native-coverage.js index 8a4048d33e..a78e4c8058 100644 --- a/tests/scripts/pull-native-coverage.js +++ b/tests/scripts/pull-native-coverage.js @@ -2,7 +2,9 @@ const { execSync, spawnSync } = require('child_process'); const fs = require('fs'); const path = require('path'); -const TEST_APP_PACKAGE = 'com.invertase.testing'; +// Android applicationId stays com.invertase.testing; iOS PRODUCT_BUNDLE_IDENTIFIER is io.invertase.testing. +const ANDROID_TEST_APP_PACKAGE = 'com.invertase.testing'; +const IOS_TEST_APP_BUNDLE_ID = 'io.invertase.testing'; const ANDROID_COVERAGE_RELATIVE_PATH = 'files/coverage.ec'; function getAdbBinary() { @@ -41,7 +43,7 @@ function androidCoverageFileExists(deviceId) { try { execSync( - `${adb} ${serial} shell "run-as ${TEST_APP_PACKAGE} test -f ${ANDROID_COVERAGE_RELATIVE_PATH}"`, + `${adb} ${serial} shell "run-as ${ANDROID_TEST_APP_PACKAGE} test -f ${ANDROID_COVERAGE_RELATIVE_PATH}"`, { stdio: 'pipe' }, ); return true; @@ -60,7 +62,7 @@ function pullAndroidCoverage(deviceId, options = {}) { try { execSync( - `${adb} ${serial} shell "run-as ${TEST_APP_PACKAGE} cat ${ANDROID_COVERAGE_RELATIVE_PATH} > ${emuDest}"`, + `${adb} ${serial} shell "run-as ${ANDROID_TEST_APP_PACKAGE} cat ${ANDROID_COVERAGE_RELATIVE_PATH} > ${emuDest}"`, ); fs.mkdirSync(localDestDir, { recursive: true }); execSync(`${adb} ${serial} pull ${emuDest} ${localDestFile}`); @@ -112,9 +114,12 @@ async function pullAndroidCoverageWithRetry(deviceId, options = {}) { function pullIosCoverage(deviceId, options = {}) { const testsDir = options.testsDir || path.resolve(__dirname, '..'); const localDestDir = path.join(testsDir, 'ios/build/output/coverage'); - const container = execSync(`xcrun simctl get_app_container ${deviceId} ${TEST_APP_PACKAGE} data`, { - encoding: 'utf8', - }).trim(); + const container = execSync( + `xcrun simctl get_app_container ${deviceId} ${IOS_TEST_APP_BUNDLE_ID} data`, + { + encoding: 'utf8', + }, + ).trim(); fs.mkdirSync(localDestDir, { recursive: true }); const profrawList = execSync( From 3940ef7aa93ca75113204f3e86d59b9e63f03d63 Mon Sep 17 00:00:00 2001 From: Mike Hardy Date: Tue, 4 Aug 2026 06:43:20 -0500 Subject: [PATCH 8/8] fix(tests): sync iOS clientId and local-test docs with io.invertase.testing Match globals.js OAuth clientId to the regenerated GoogleService-Info.plist CLIENT_ID, and update the Apple Sign-In local-test README now that the bundle id correction lands. --- tests/globals.js | 2 +- tests/local-tests/auth/README-apple-full-name.md | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/tests/globals.js b/tests/globals.js index b005b64a57..5e961b01a4 100644 --- a/tests/globals.js +++ b/tests/globals.js @@ -163,7 +163,7 @@ global.FirebaseHelpers = { config() { if (global.Platform.ios) { return { - clientId: '448618578101-28tsenal97nceuij1msj7iuqinv48t02.apps.googleusercontent.com', + clientId: '448618578101-4km55qmv55tguvnivgjdiegb3r0jquv5.apps.googleusercontent.com', androidClientId: '448618578101-pdjje2lkv3p941e03hkrhfa7459cr2v8.apps.googleusercontent.com', appId: '1:448618578101:ios:3e76955ab6d49ecaac3efc', diff --git a/tests/local-tests/auth/README-apple-full-name.md b/tests/local-tests/auth/README-apple-full-name.md index 71474a6b49..04bf74e2b7 100644 --- a/tests/local-tests/auth/README-apple-full-name.md +++ b/tests/local-tests/auth/README-apple-full-name.md @@ -21,7 +21,7 @@ hand-typed fake one. ## One-time setup -1. **Apple Developer account**: ensure the app's App ID (`com.invertase.testing`, team `YYX2P3XVJ7` +1. **Apple Developer account**: ensure the app's App ID (`io.invertase.testing`, team `YYX2P3XVJ7` per the existing Xcode project) has the **Sign in with Apple** capability enabled at [developer.apple.com](https://developer.apple.com/account/resources/identifiers/list) → Identifiers → your App ID → capabilities. If you're using your own team/App ID for local @@ -33,11 +33,6 @@ hand-typed fake one. build you still need it enabled on the App ID above so a matching provisioning profile can be issued (automatic signing will regenerate the profile once the capability is enabled). Simulator builds do not require a real provisioning profile. - - Note: at the time of writing, `com.invertase.testing` is not the App ID actually registered - on the Apple Developer Portal for this team (`io.invertase.testing` is) — a separate PR - tracks correcting `PRODUCT_BUNDLE_IDENTIFIER` and `GoogleService-Info.plist` to match. Until - that lands, real-device testing needs a locally-modified bundle id/provisioning profile; - Simulator builds are unaffected. 2. **Firebase console**: enable the **Apple** sign-in provider for the test project (`react-native-firebase-testing`) under Authentication → Sign-in method.