Skip to content

Commit 6902494

Browse files
chore(deps): bump com.google.firebase:firebase-bom from 34.7.0 to 34.17.0 (#2445)
* chore(deps): bump com.google.firebase:firebase-bom Bumps com.google.firebase:firebase-bom from 34.7.0 to 34.17.0. --- updated-dependencies: - dependency-name: com.google.firebase:firebase-bom dependency-version: 34.17.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * fix(auth): avoid FirebaseApp test-isolation race in FirebaseAuthActivityTest * fix(e2e): fix FirebaseApp test-isolation race in e2eTest module --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: demolaf <demolafadumo@gmail.com>
1 parent 11639f3 commit 6902494

12 files changed

Lines changed: 108 additions & 192 deletions

File tree

auth/src/test/java/com/firebase/ui/auth/FirebaseAuthActivityTest.kt

Lines changed: 33 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -65,35 +65,44 @@ class FirebaseAuthActivityTest {
6565

6666
applicationContext = ApplicationProvider.getApplicationContext()
6767

68-
// Clear any existing Firebase apps
69-
FirebaseApp.getApps(applicationContext).forEach { app ->
70-
app.delete()
71-
}
68+
// Reuse FirebaseApps across tests in this class rather than deleting and
69+
// re-initializing them for every test, to reduce churn on the "[DEFAULT]"
70+
// app name (Robolectric shares statics across test methods in this class).
71+
val secondaryApp = if (FirebaseApp.getApps(applicationContext).isEmpty()) {
72+
FirebaseApp.initializeApp(
73+
applicationContext,
74+
FirebaseOptions.Builder()
75+
.setApiKey("fake-api-key")
76+
.setApplicationId("fake-app-id")
77+
.setProjectId("fake-project-id")
78+
.build()
79+
)
7280

73-
// Initialize default FirebaseApp
74-
FirebaseApp.initializeApp(
75-
applicationContext,
76-
FirebaseOptions.Builder()
77-
.setApiKey("fake-api-key")
78-
.setApplicationId("fake-app-id")
79-
.setProjectId("fake-project-id")
80-
.build()
81-
)
81+
val app = FirebaseApp.initializeApp(
82+
applicationContext,
83+
FirebaseOptions.Builder()
84+
.setApiKey("fake-api-key-2")
85+
.setApplicationId("fake-app-id-2")
86+
.setProjectId("fake-project-id-2")
87+
.build(),
88+
"secondary"
89+
)
8290

83-
val secondaryApp = FirebaseApp.initializeApp(
84-
applicationContext,
85-
FirebaseOptions.Builder()
86-
.setApiKey("fake-api-key-2")
87-
.setApplicationId("fake-app-id-2")
88-
.setProjectId("fake-project-id-2")
89-
.build(),
90-
"secondary"
91-
)
91+
// Other test classes in this module independently delete and recreate
92+
// the "[DEFAULT]" FirebaseApp. Newer firebase-auth releases sometimes
93+
// surface that unrelated churn here as "FirebaseApp was deleted" from
94+
// useEmulator(), even though the app we just initialized is live. This
95+
// call is a defensive safety net (these tests drive UI state through
96+
// mocks, never real network calls), so it's safe to ignore.
97+
runCatching { FirebaseAuthUI.getInstance().auth.useEmulator("127.0.0.1", 9099) }
98+
runCatching { FirebaseAuthUI.getInstance(app).auth.useEmulator("127.0.0.1", 9099) }
99+
app
100+
} else {
101+
FirebaseApp.getInstance("secondary")
102+
}
92103

93104
authUI = FirebaseAuthUI.getInstance()
94-
authUI.auth.useEmulator("127.0.0.1", 9099)
95105
secondaryAuthUI = FirebaseAuthUI.getInstance(secondaryApp)
96-
secondaryAuthUI.auth.useEmulator("127.0.0.1", 9099)
97106

98107
configuration = AuthUIConfiguration(
99108
context = applicationContext,
@@ -113,13 +122,6 @@ class FirebaseAuthActivityTest {
113122
fun tearDown() {
114123
FirebaseAuthActivity.clearLaunchStateCache()
115124
FirebaseAuthUI.clearInstanceCache()
116-
FirebaseApp.getApps(applicationContext).forEach { app ->
117-
try {
118-
app.delete()
119-
} catch (_: Exception) {
120-
// Ignore if already deleted
121-
}
122-
}
123125
}
124126

125127
// =============================================================================================
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.firebase.ui.auth.testutil
2+
3+
import android.content.Context
4+
import com.firebase.ui.auth.FirebaseAuthUI
5+
import com.google.firebase.FirebaseApp
6+
import com.google.firebase.FirebaseOptions
7+
8+
/**
9+
* Returns the "[DEFAULT]" FirebaseApp used by e2e tests, pointed at the local Auth
10+
* emulator, initializing it once per JVM instead of per test.
11+
*
12+
* Every test class used to delete and re-initialize this app in its own `@Before`.
13+
* Robolectric shares statics across test classes within a run, so that churn raced
14+
* with other classes doing the same thing; newer firebase-auth releases surface the
15+
* loser of that race as "FirebaseApp was deleted" from useEmulator(). Per-test
16+
* isolation is already handled by [EmulatorAuthApi.clearEmulatorData], so the app
17+
* itself doesn't need to be recreated for every test.
18+
*/
19+
fun ensureTestFirebaseApp(context: Context): FirebaseApp {
20+
FirebaseApp.getApps(context).firstOrNull { it.name == FirebaseApp.DEFAULT_APP_NAME }?.let {
21+
return it
22+
}
23+
24+
val app = FirebaseApp.initializeApp(
25+
context,
26+
FirebaseOptions.Builder()
27+
.setApiKey("fake-api-key")
28+
.setApplicationId("fake-app-id")
29+
.setProjectId("fake-project-id")
30+
.build()
31+
)
32+
FirebaseAuthUI.getInstance().auth.useEmulator("127.0.0.1", 9099)
33+
return app
34+
}

e2eTest/src/test/java/com/firebase/ui/auth/ui/screens/AnonymousAuthScreenTest.kt

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,8 @@ import com.firebase.ui.auth.configuration.string_provider.DefaultAuthUIStringPro
3434
import com.firebase.ui.auth.testutil.AUTH_STATE_WAIT_TIMEOUT_MS
3535
import com.firebase.ui.auth.testutil.EmulatorAuthApi
3636
import com.firebase.ui.auth.testutil.ensureFreshUser
37+
import com.firebase.ui.auth.testutil.ensureTestFirebaseApp
3738
import com.google.common.truth.Truth.assertThat
38-
import com.google.firebase.FirebaseApp
39-
import com.google.firebase.FirebaseOptions
4039
import org.junit.After
4140
import org.junit.Before
4241
import org.junit.Rule
@@ -68,23 +67,8 @@ class AnonymousAuthScreenTest {
6867

6968
stringProvider = DefaultAuthUIStringProvider(applicationContext)
7069

71-
// Clear any existing Firebase apps
72-
FirebaseApp.getApps(applicationContext).forEach { app ->
73-
app.delete()
74-
}
75-
76-
// Initialize default FirebaseApp
77-
val firebaseApp = FirebaseApp.initializeApp(
78-
applicationContext,
79-
FirebaseOptions.Builder()
80-
.setApiKey("fake-api-key")
81-
.setApplicationId("fake-app-id")
82-
.setProjectId("fake-project-id")
83-
.build()
84-
)
85-
70+
val firebaseApp = ensureTestFirebaseApp(applicationContext)
8671
authUI = FirebaseAuthUI.getInstance()
87-
authUI.auth.useEmulator("127.0.0.1", 9099)
8872

8973
emulatorApi = EmulatorAuthApi(
9074
projectId = firebaseApp.options.projectId
@@ -99,7 +83,10 @@ class AnonymousAuthScreenTest {
9983

10084
@After
10185
fun tearDown() {
102-
// Clean up after each test to prevent test pollution
86+
// Clean up after each test to prevent test pollution. The FirebaseApp itself is
87+
// shared across test classes (see ensureTestFirebaseApp), so the client-side
88+
// session must be reset explicitly here rather than relying on app re-creation.
89+
authUI.auth.signOut()
10390
FirebaseAuthUI.clearInstanceCache()
10491

10592
// Clear emulator data

e2eTest/src/test/java/com/firebase/ui/auth/ui/screens/CredentialLinkingScreenTest.kt

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,11 @@ import com.firebase.ui.auth.testutil.EmulatorAuthApi
4242
import com.firebase.ui.auth.testutil.awaitWithLooper
4343
import com.firebase.ui.auth.testutil.ensureFreshUser
4444
import com.firebase.ui.auth.testutil.generateMockGoogleIdToken
45+
import com.firebase.ui.auth.testutil.ensureTestFirebaseApp
4546
import com.firebase.ui.auth.testutil.verifyEmailInEmulator
4647
import com.firebase.ui.auth.util.CountryUtils
4748
import com.google.android.libraries.identity.googleid.GoogleIdTokenCredential
4849
import com.google.common.truth.Truth.assertThat
49-
import com.google.firebase.FirebaseApp
50-
import com.google.firebase.FirebaseOptions
5150
import kotlinx.coroutines.test.runTest
5251
import org.junit.After
5352
import org.junit.Assume
@@ -89,21 +88,8 @@ class CredentialLinkingScreenTest {
8988
applicationContext = ApplicationProvider.getApplicationContext()
9089
stringProvider = DefaultAuthUIStringProvider(applicationContext)
9190

92-
FirebaseApp.getApps(applicationContext).forEach { app ->
93-
app.delete()
94-
}
95-
96-
val firebaseApp = FirebaseApp.initializeApp(
97-
applicationContext,
98-
FirebaseOptions.Builder()
99-
.setApiKey("fake-api-key")
100-
.setApplicationId("fake-app-id")
101-
.setProjectId("fake-project-id")
102-
.build()
103-
)
104-
91+
val firebaseApp = ensureTestFirebaseApp(applicationContext)
10592
authUI = FirebaseAuthUI.getInstance()
106-
authUI.auth.useEmulator("127.0.0.1", 9099)
10793

10894
authUI.testCredentialManagerProvider = object : AuthProvider.Google.CredentialManagerProvider {
10995
override suspend fun getGoogleCredential(
@@ -137,6 +123,7 @@ class CredentialLinkingScreenTest {
137123

138124
@After
139125
fun tearDown() {
126+
authUI.auth.signOut()
140127
FirebaseAuthUI.clearInstanceCache()
141128
emulatorApi.clearEmulatorData()
142129
}

e2eTest/src/test/java/com/firebase/ui/auth/ui/screens/EmailAuthScreenTest.kt

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,9 @@ import com.firebase.ui.auth.testutil.AUTH_STATE_WAIT_TIMEOUT_MS
4545
import com.firebase.ui.auth.testutil.EmailLinkTestActivity
4646
import com.firebase.ui.auth.testutil.EmulatorAuthApi
4747
import com.firebase.ui.auth.testutil.ensureFreshUser
48+
import com.firebase.ui.auth.testutil.ensureTestFirebaseApp
4849
import com.firebase.ui.auth.testutil.verifyEmailInEmulator
4950
import com.google.common.truth.Truth.assertThat
50-
import com.google.firebase.FirebaseApp
51-
import com.google.firebase.FirebaseOptions
5251
import com.google.firebase.auth.actionCodeSettings
5352
import kotlinx.coroutines.runBlocking
5453
import org.junit.After
@@ -97,23 +96,8 @@ class EmailAuthScreenTest {
9796

9897
stringProvider = DefaultAuthUIStringProvider(applicationContext)
9998

100-
// Clear any existing Firebase apps
101-
FirebaseApp.getApps(applicationContext).forEach { app ->
102-
app.delete()
103-
}
104-
105-
// Initialize default FirebaseApp
106-
val firebaseApp = FirebaseApp.initializeApp(
107-
applicationContext,
108-
FirebaseOptions.Builder()
109-
.setApiKey("fake-api-key")
110-
.setApplicationId("fake-app-id")
111-
.setProjectId("fake-project-id")
112-
.build()
113-
)
114-
99+
val firebaseApp = ensureTestFirebaseApp(applicationContext)
115100
authUI = FirebaseAuthUI.getInstance()
116-
authUI.auth.useEmulator("127.0.0.1", 9099)
117101

118102
emulatorApi = EmulatorAuthApi(
119103
projectId = firebaseApp.options.projectId
@@ -138,7 +122,10 @@ class EmailAuthScreenTest {
138122
fun tearDown() {
139123
closeable.close()
140124

141-
// Clean up after each test to prevent test pollution
125+
// Clean up after each test to prevent test pollution. The FirebaseApp itself is
126+
// shared across test classes (see ensureTestFirebaseApp), so the client-side
127+
// session must be reset explicitly here rather than relying on app re-creation.
128+
authUI.auth.signOut()
142129
FirebaseAuthUI.clearInstanceCache()
143130

144131
// Clear emulator data

e2eTest/src/test/java/com/firebase/ui/auth/ui/screens/GoogleAuthScreenTest.kt

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,10 @@ import com.firebase.ui.auth.configuration.string_provider.AuthUIStringProvider
3939
import com.firebase.ui.auth.configuration.string_provider.DefaultAuthUIStringProvider
4040
import com.firebase.ui.auth.testutil.AUTH_STATE_WAIT_TIMEOUT_MS
4141
import com.firebase.ui.auth.testutil.EmulatorAuthApi
42+
import com.firebase.ui.auth.testutil.ensureTestFirebaseApp
4243
import com.firebase.ui.auth.testutil.generateMockGoogleIdToken
4344
import com.google.android.libraries.identity.googleid.GoogleIdTokenCredential
4445
import com.google.common.truth.Truth.assertThat
45-
import com.google.firebase.FirebaseApp
46-
import com.google.firebase.FirebaseOptions
4746
import kotlinx.coroutines.test.runTest
4847
import org.junit.After
4948
import org.junit.Before
@@ -85,23 +84,8 @@ class GoogleAuthScreenTest {
8584

8685
stringProvider = DefaultAuthUIStringProvider(applicationContext)
8786

88-
// Clear any existing Firebase apps
89-
FirebaseApp.getApps(applicationContext).forEach { app ->
90-
app.delete()
91-
}
92-
93-
// Initialize default FirebaseApp
94-
val firebaseApp = FirebaseApp.initializeApp(
95-
applicationContext,
96-
FirebaseOptions.Builder()
97-
.setApiKey("fake-api-key")
98-
.setApplicationId("fake-app-id")
99-
.setProjectId("fake-project-id")
100-
.build()
101-
)
102-
87+
val firebaseApp = ensureTestFirebaseApp(applicationContext)
10388
authUI = FirebaseAuthUI.getInstance()
104-
authUI.auth.useEmulator("127.0.0.1", 9099)
10589

10690
val testCredentialManagerProvider = object : AuthProvider.Google.CredentialManagerProvider {
10791
override suspend fun getGoogleCredential(
@@ -140,7 +124,10 @@ class GoogleAuthScreenTest {
140124

141125
@After
142126
fun tearDown() {
143-
// Clean up after each test to prevent test pollution
127+
// Clean up after each test to prevent test pollution. The FirebaseApp itself is
128+
// shared across test classes (see ensureTestFirebaseApp), so the client-side
129+
// session must be reset explicitly here rather than relying on app re-creation.
130+
authUI.auth.signOut()
144131
FirebaseAuthUI.clearInstanceCache()
145132

146133
// Clear emulator data

e2eTest/src/test/java/com/firebase/ui/auth/ui/screens/MfaChallengeScreenTest.kt

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,8 @@ import com.firebase.ui.auth.configuration.string_provider.AuthUIStringProvider
3535
import com.firebase.ui.auth.configuration.string_provider.DefaultAuthUIStringProvider
3636
import com.firebase.ui.auth.configuration.string_provider.LocalAuthUIStringProvider
3737
import com.firebase.ui.auth.mfa.MfaChallengeContentState
38+
import com.firebase.ui.auth.testutil.ensureTestFirebaseApp
3839
import com.google.common.truth.Truth.assertThat
39-
import com.google.firebase.FirebaseApp
40-
import com.google.firebase.FirebaseOptions
4140
import com.google.firebase.auth.MultiFactorInfo
4241
import com.google.firebase.auth.MultiFactorResolver
4342
import com.google.firebase.auth.MultiFactorSession
@@ -91,23 +90,8 @@ class MfaChallengeScreenTest {
9190
applicationContext = ApplicationProvider.getApplicationContext()
9291
stringProvider = DefaultAuthUIStringProvider(applicationContext)
9392

94-
// Clear any existing Firebase apps
95-
FirebaseApp.getApps(applicationContext).forEach { app ->
96-
app.delete()
97-
}
98-
99-
// Initialize default FirebaseApp
100-
FirebaseApp.initializeApp(
101-
applicationContext,
102-
FirebaseOptions.Builder()
103-
.setApiKey("fake-api-key")
104-
.setApplicationId("fake-app-id")
105-
.setProjectId("fake-project-id")
106-
.build()
107-
)
108-
93+
ensureTestFirebaseApp(applicationContext)
10994
authUI = FirebaseAuthUI.getInstance()
110-
authUI.auth.useEmulator("127.0.0.1", 9099)
11195

11296
// Setup mock resolver
11397
`when`(mockResolver.session).thenReturn(mockSession)

e2eTest/src/test/java/com/firebase/ui/auth/ui/screens/MfaDisabledTest.kt

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,8 @@ import com.firebase.ui.auth.configuration.string_provider.AuthUIStringProvider
2020
import com.firebase.ui.auth.configuration.string_provider.DefaultAuthUIStringProvider
2121
import com.firebase.ui.auth.testutil.AUTH_STATE_WAIT_TIMEOUT_MS
2222
import com.firebase.ui.auth.testutil.EmulatorAuthApi
23+
import com.firebase.ui.auth.testutil.ensureTestFirebaseApp
2324
import com.google.common.truth.Truth.assertThat
24-
import com.google.firebase.FirebaseApp
25-
import com.google.firebase.FirebaseOptions
2625
import org.junit.After
2726
import org.junit.Before
2827
import org.junit.Ignore
@@ -58,23 +57,8 @@ class MfaDisabledTest {
5857
applicationContext = ApplicationProvider.getApplicationContext()
5958
stringProvider = DefaultAuthUIStringProvider(applicationContext)
6059

61-
// Clear any existing Firebase apps
62-
FirebaseApp.getApps(applicationContext).forEach { app ->
63-
app.delete()
64-
}
65-
66-
// Initialize default FirebaseApp
67-
val firebaseApp = FirebaseApp.initializeApp(
68-
applicationContext,
69-
FirebaseOptions.Builder()
70-
.setApiKey("fake-api-key")
71-
.setApplicationId("fake-app-id")
72-
.setProjectId("fake-project-id")
73-
.build()
74-
)
75-
60+
val firebaseApp = ensureTestFirebaseApp(applicationContext)
7661
authUI = FirebaseAuthUI.getInstance()
77-
authUI.auth.useEmulator("127.0.0.1", 9099)
7862

7963
emulatorApi = EmulatorAuthApi(
8064
projectId = firebaseApp.options.projectId
@@ -89,7 +73,10 @@ class MfaDisabledTest {
8973

9074
@After
9175
fun tearDown() {
92-
// Clean up after each test to prevent test pollution
76+
// Clean up after each test to prevent test pollution. The FirebaseApp itself is
77+
// shared across test classes (see ensureTestFirebaseApp), so the client-side
78+
// session must be reset explicitly here rather than relying on app re-creation.
79+
authUI.auth.signOut()
9380
FirebaseAuthUI.clearInstanceCache()
9481

9582
// Clear emulator data

0 commit comments

Comments
 (0)