Skip to content

Commit 67da22e

Browse files
committed
Address comments
1 parent 6cea252 commit 67da22e

File tree

6 files changed

+57
-105
lines changed

6 files changed

+57
-105
lines changed

firebase-sessions/api.txt

Lines changed: 0 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -16,52 +16,3 @@ package com.google.firebase.sessions {
1616
}
1717

1818
}
19-
20-
package com.google.firebase.sessions.api {
21-
22-
public final class FirebaseSessionsDependencies {
23-
method public void addDependency(@NonNull com.google.firebase.sessions.api.SessionSubscriber.Name subscriberName);
24-
field @NonNull public static final com.google.firebase.sessions.api.FirebaseSessionsDependencies INSTANCE;
25-
}
26-
27-
public interface SessionSubscriber {
28-
method @NonNull public com.google.firebase.sessions.api.SessionSubscriber.Name getSessionSubscriberName();
29-
method public boolean isDataCollectionEnabled();
30-
method public void onSessionChanged(@NonNull com.google.firebase.sessions.api.SessionSubscriber.SessionDetails sessionDetails);
31-
property public abstract boolean isDataCollectionEnabled;
32-
property @NonNull public abstract com.google.firebase.sessions.api.SessionSubscriber.Name sessionSubscriberName;
33-
}
34-
35-
public enum SessionSubscriber.Name {
36-
method @NonNull public static com.google.firebase.sessions.api.SessionSubscriber.Name valueOf(@NonNull String name) throws java.lang.IllegalArgumentException;
37-
method @NonNull public static com.google.firebase.sessions.api.SessionSubscriber.Name[] values();
38-
enum_constant public static final com.google.firebase.sessions.api.SessionSubscriber.Name CRASHLYTICS;
39-
enum_constant @Discouraged(message="This is for testing purposes only.") public static final com.google.firebase.sessions.api.SessionSubscriber.Name MATT_SAYS_HI;
40-
enum_constant public static final com.google.firebase.sessions.api.SessionSubscriber.Name PERFORMANCE;
41-
}
42-
43-
public static final class SessionSubscriber.SessionDetails {
44-
ctor public SessionSubscriber.SessionDetails(@NonNull String sessionId);
45-
method @NonNull public String component1();
46-
method @NonNull public com.google.firebase.sessions.api.SessionSubscriber.SessionDetails copy(@NonNull String sessionId);
47-
method @NonNull public String getSessionId();
48-
property @NonNull public final String sessionId;
49-
}
50-
51-
}
52-
53-
package com.google.firebase.sessions.settings {
54-
55-
public interface SettingsProvider {
56-
method @Nullable public Double getSamplingRate();
57-
method @Nullable public Boolean getSessionEnabled();
58-
method @Nullable public kotlin.time.Duration getSessionRestartTimeout();
59-
method public boolean isSettingsStale();
60-
method public void updateSettings();
61-
property @Nullable public abstract Double samplingRate;
62-
property @Nullable public abstract Boolean sessionEnabled;
63-
property @Nullable public abstract kotlin.time.Duration sessionRestartTimeout;
64-
}
65-
66-
}
67-

firebase-sessions/src/main/kotlin/com/google/firebase/sessions/FirebaseSessions.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,16 +83,11 @@ internal constructor(
8383
private fun initiateSessionStart() {
8484
val sessionDetails = sessionGenerator.generateNewSession()
8585

86-
if (!sessionGenerator.collectEvents) {
87-
Log.d(TAG, "Sessions SDK has sampled this session")
88-
return
89-
}
90-
9186
sessionStartScope.launch {
9287
val subscribers = FirebaseSessionsDependencies.getSubscribers()
9388

9489
if (subscribers.isEmpty()) {
95-
Log.e(
90+
Log.d(
9691
TAG,
9792
"Sessions SDK did not have any dependent SDKs register as dependencies. Events will not be sent."
9893
)
@@ -112,6 +107,11 @@ internal constructor(
112107
}
113108
}
114109

110+
if (!sessionGenerator.collectEvents) {
111+
Log.d(TAG, "Sessions SDK has sampled this session")
112+
return@launch
113+
}
114+
115115
sessionCoordinator.attemptLoggingSessionEvent(
116116
SessionEvents.startSession(firebaseApp, sessionDetails, sessionSettings, timeProvider)
117117
)

firebase-sessions/src/main/kotlin/com/google/firebase/sessions/api/FirebaseSessionsDependencies.kt

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.google.firebase.sessions.api
1818

19+
import android.util.Log
1920
import androidx.annotation.VisibleForTesting
2021
import java.util.Collections.synchronizedMap
2122
import kotlinx.coroutines.sync.Mutex
@@ -29,6 +30,8 @@ import kotlinx.coroutines.sync.withLock
2930
* This is important because the Sessions SDK starts up before dependent SDKs.
3031
*/
3132
object FirebaseSessionsDependencies {
33+
private const val TAG = "SessionsDependencies"
34+
3235
private val dependencies = synchronizedMap(mutableMapOf<SessionSubscriber.Name, Dependency>())
3336

3437
/**
@@ -37,7 +40,8 @@ object FirebaseSessionsDependencies {
3740
*/
3841
fun addDependency(subscriberName: SessionSubscriber.Name) {
3942
if (dependencies.containsKey(subscriberName)) {
40-
throw IllegalArgumentException("Dependency $subscriberName already added.")
43+
Log.d(TAG, "Dependency $subscriberName already added.")
44+
return
4145
}
4246

4347
// The dependency is locked until the subscriber registers itself.
@@ -50,7 +54,8 @@ object FirebaseSessionsDependencies {
5054
val dependency = getDependency(subscriberName)
5155

5256
dependency.subscriber?.run {
53-
throw IllegalArgumentException("Subscriber $subscriberName already registered.")
57+
Log.d(TAG, "Subscriber $subscriberName already registered.")
58+
return
5459
}
5560
dependency.subscriber = subscriber
5661

@@ -60,24 +65,21 @@ object FirebaseSessionsDependencies {
6065

6166
/** Gets the subscribers safely, blocks until all the subscribers are registered. */
6267
internal suspend fun getSubscribers(): Map<SessionSubscriber.Name, SessionSubscriber> {
63-
// The call to get will never throw because the mutex guarantees it's been registered.
68+
// The call to getSubscriber will never throw because the mutex guarantees it's been registered.
6469
return dependencies.mapValues { (subscriberName, dependency) ->
65-
dependency.mutex.withLock { get(subscriberName) }
70+
dependency.mutex.withLock { getSubscriber(subscriberName) }
6671
}
6772
}
6873

69-
/** Gets the subscriber regardless of being registered. This is exposed for testing. */
74+
/** Gets the subscriber, regardless of being registered. This is exposed for testing. */
7075
@VisibleForTesting
71-
internal operator fun get(subscriberName: SessionSubscriber.Name): SessionSubscriber {
76+
internal fun getSubscriber(subscriberName: SessionSubscriber.Name): SessionSubscriber {
7277
return getDependency(subscriberName).subscriber
7378
?: throw IllegalStateException("Subscriber $subscriberName has not been registered.")
7479
}
7580

76-
/** Resets the registered subscribers for testing purposes. */
77-
@VisibleForTesting
78-
internal fun reset() {
79-
dependencies.keys.forEach { dependencies[it] = Dependency(Mutex(locked = true)) }
80-
}
81+
/** Resets all the dependencies for testing purposes. */
82+
@VisibleForTesting internal fun reset() = dependencies.clear()
8183

8284
private fun getDependency(subscriberName: SessionSubscriber.Name): Dependency {
8385
return dependencies.getOrElse(subscriberName) {

firebase-sessions/src/main/kotlin/com/google/firebase/sessions/api/SessionSubscriber.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,5 @@ interface SessionSubscriber {
3434

3535
val isDataCollectionEnabled: Boolean
3636

37-
val sessionSubscriberName: Name
37+
val sessionSubscriberName: SessionSubscriber.Name
3838
}

firebase-sessions/src/test/kotlin/com/google/firebase/sessions/SessionCoordinatorTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class SessionCoordinatorTest {
4343
val firebaseInstallations = FakeFirebaseInstallations("FaKeFiD")
4444
val sessionCoordinator =
4545
SessionCoordinator(
46-
firebaseInstallations = FakeFirebaseInstallations("FaKeFiD"),
46+
firebaseInstallations,
4747
eventGDTLogger = fakeEventGDTLogger,
4848
)
4949

firebase-sessions/src/test/kotlin/com/google/firebase/sessions/api/FirebaseSessionsDependenciesTest.kt

Lines changed: 36 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -39,89 +39,88 @@ import org.junit.runner.RunWith
3939
class FirebaseSessionsDependenciesTest {
4040
@After
4141
fun cleanUp() {
42-
// Reset any registered subscribers after each test.
42+
// Reset all dependencies after each test.
4343
FirebaseSessionsDependencies.reset()
4444
}
4545

4646
@Test
4747
fun register_dependencyAdded_canGet() {
48+
val crashlyticsSubscriber = FakeSessionSubscriber(sessionSubscriberName = CRASHLYTICS)
49+
FirebaseSessionsDependencies.addDependency(CRASHLYTICS)
4850
FirebaseSessionsDependencies.register(crashlyticsSubscriber)
4951

50-
assertThat(FirebaseSessionsDependencies[CRASHLYTICS]).isEqualTo(crashlyticsSubscriber)
52+
assertThat(FirebaseSessionsDependencies.getSubscriber(CRASHLYTICS))
53+
.isEqualTo(crashlyticsSubscriber)
5154
}
5255

5356
@Test
54-
fun register_alreadyRegistered_throws() {
57+
fun register_alreadyRegisteredSameName_ignoresSecondSubscriber() {
58+
val firstSubscriber = FakeSessionSubscriber(sessionSubscriberName = CRASHLYTICS)
59+
val secondSubscriber = FakeSessionSubscriber(sessionSubscriberName = CRASHLYTICS)
60+
61+
FirebaseSessionsDependencies.addDependency(CRASHLYTICS)
62+
5563
// Register the first time, no problem.
56-
FirebaseSessionsDependencies.register(crashlyticsSubscriber)
64+
FirebaseSessionsDependencies.register(firstSubscriber)
5765

58-
val thrown =
59-
assertThrows(IllegalArgumentException::class.java) {
60-
// Attempt to register the same subscriber a second time.
61-
FirebaseSessionsDependencies.register(crashlyticsSubscriber)
62-
}
66+
// Attempt to register a second subscriber with the same name.
67+
FirebaseSessionsDependencies.register(secondSubscriber)
6368

64-
assertThat(thrown).hasMessageThat().contains("Subscriber CRASHLYTICS already registered")
69+
assertThat(FirebaseSessionsDependencies.getSubscriber(CRASHLYTICS)).isEqualTo(firstSubscriber)
6570
}
6671

6772
@Test
6873
fun getSubscriber_dependencyAdded_notRegistered_throws() {
69-
val thrown =
70-
assertThrows(IllegalStateException::class.java) { FirebaseSessionsDependencies[CRASHLYTICS] }
74+
FirebaseSessionsDependencies.addDependency(PERFORMANCE)
7175

72-
assertThat(thrown).hasMessageThat().contains("Subscriber CRASHLYTICS has not been registered")
73-
}
74-
75-
@Test
76-
fun getSubscriber_notDepended_throws() {
7776
val thrown =
7877
assertThrows(IllegalStateException::class.java) {
79-
// Performance was never added as a dependency.
80-
FirebaseSessionsDependencies[PERFORMANCE]
78+
FirebaseSessionsDependencies.getSubscriber(PERFORMANCE)
8179
}
8280

83-
assertThat(thrown).hasMessageThat().contains("Cannot get dependency PERFORMANCE")
81+
assertThat(thrown).hasMessageThat().contains("Subscriber PERFORMANCE has not been registered")
8482
}
8583

8684
@Test
87-
fun addDependencyTwice_throws() {
85+
fun getSubscriber_notDepended_throws() {
8886
val thrown =
89-
assertThrows(IllegalArgumentException::class.java) {
90-
// CRASHLYTICS has already been added. Attempt to add it again.
91-
FirebaseSessionsDependencies.addDependency(CRASHLYTICS)
87+
assertThrows(IllegalStateException::class.java) {
88+
// Crashlytics was never added as a dependency.
89+
FirebaseSessionsDependencies.getSubscriber(CRASHLYTICS)
9290
}
9391

94-
assertThat(thrown).hasMessageThat().contains("Dependency CRASHLYTICS already added")
92+
assertThat(thrown).hasMessageThat().contains("Cannot get dependency CRASHLYTICS")
9593
}
9694

9795
@Test
9896
fun getSubscribers_waitsForRegister(): Unit = runBlocking {
97+
val crashlyticsSubscriber = FakeSessionSubscriber(sessionSubscriberName = CRASHLYTICS)
98+
FirebaseSessionsDependencies.addDependency(CRASHLYTICS)
99+
99100
// Wait a few seconds and then register.
100101
launch {
101102
delay(2.seconds)
102103
FirebaseSessionsDependencies.register(crashlyticsSubscriber)
103104
}
104105

105106
// Block until the register happens.
106-
val subscribers = runBlocking { FirebaseSessionsDependencies.getSubscribers() }
107+
val subscribers = FirebaseSessionsDependencies.getSubscribers()
107108

108109
assertThat(subscribers).containsExactly(CRASHLYTICS, crashlyticsSubscriber)
109110
}
110111

112+
@Test
113+
fun getSubscribers_noDependencies() = runTest {
114+
val subscribers = FirebaseSessionsDependencies.getSubscribers()
115+
116+
assertThat(subscribers).isEmpty()
117+
}
118+
111119
@Test(expected = TimeoutCancellationException::class)
112120
fun getSubscribers_neverRegister_waitsForever() = runTest {
121+
FirebaseSessionsDependencies.addDependency(CRASHLYTICS)
122+
113123
// The register never happens, wait until the timeout.
114124
withTimeout(2.seconds) { FirebaseSessionsDependencies.getSubscribers() }
115125
}
116-
117-
companion object {
118-
init {
119-
// Add only Crashlytics as a dependency, not Performance.
120-
// This is similar to how 1P SDKs will add themselves as dependencies. Note that this
121-
// dependency is added for all unit tests after this class is loaded into memory.
122-
FirebaseSessionsDependencies.addDependency(CRASHLYTICS)
123-
}
124-
}
125-
126-
private val crashlyticsSubscriber = FakeSessionSubscriber(sessionSubscriberName = CRASHLYTICS)
127126
}

0 commit comments

Comments
 (0)