Skip to content

Commit bb37ff1

Browse files
committed
Merge branch 'master' of github.com:firebase/firebase-android-sdk into enableRequestLimiter
2 parents 6d6b7c3 + 12ae453 commit bb37ff1

File tree

3 files changed

+78
-17
lines changed

3 files changed

+78
-17
lines changed

firebase-firestore/src/androidTest/java/com/google/firebase/firestore/remote/FirebaseClientGrpcMetadataProviderTest.java

Lines changed: 46 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import static org.mockito.Mockito.when;
2121

2222
import androidx.test.ext.junit.runners.AndroidJUnit4;
23+
import com.google.firebase.FirebaseOptions;
2324
import com.google.firebase.heartbeatinfo.HeartBeatInfo;
2425
import com.google.firebase.inject.Provider;
2526
import com.google.firebase.platforminfo.UserAgentPublisher;
@@ -33,19 +34,30 @@ public class FirebaseClientGrpcMetadataProviderTest {
3334
private Provider<HeartBeatInfo> mockHeartBeatProvider = mock(Provider.class);
3435
private UserAgentPublisher mockUserAgent = mock(UserAgentPublisher.class);
3536
private HeartBeatInfo mockHeartBeat = mock(HeartBeatInfo.class);
37+
private FirebaseOptions options =
38+
new FirebaseOptions.Builder()
39+
.setApplicationId("app_id")
40+
.setApiKey("apikey")
41+
.setProjectId("projectid")
42+
.build();
43+
3644
private static final Metadata.Key<String> HEART_BEAT_HEADER =
3745
Metadata.Key.of("x-firebase-client-log-type", Metadata.ASCII_STRING_MARSHALLER);
3846

3947
private static final Metadata.Key<String> USER_AGENT_HEADER =
4048
Metadata.Key.of("x-firebase-client", Metadata.ASCII_STRING_MARSHALLER);
4149

50+
private static final Metadata.Key<String> GMP_APP_ID_HEADER =
51+
Metadata.Key.of("x-firebase-gmpid", Metadata.ASCII_STRING_MARSHALLER);
52+
4253
@Test
4354
public void noUpdateWhenBothNullProvider() {
4455
Metadata metadata = new Metadata();
4556
when(mockUserAgentProvider.get()).thenReturn(null);
4657
when(mockHeartBeatProvider.get()).thenReturn(null);
4758
GrpcMetadataProvider metadataProvider =
48-
new FirebaseClientGrpcMetadataProvider(mockUserAgentProvider, mockHeartBeatProvider);
59+
new FirebaseClientGrpcMetadataProvider(
60+
mockUserAgentProvider, mockHeartBeatProvider, options);
4961
metadataProvider.updateMetadata(metadata);
5062
assertThat(metadata.keys().size()).isEqualTo(0);
5163
}
@@ -56,7 +68,8 @@ public void noUpdateWhenHeartbeatNullProvider() {
5668
when(mockUserAgentProvider.get()).thenReturn(mockUserAgent);
5769
when(mockHeartBeatProvider.get()).thenReturn(null);
5870
GrpcMetadataProvider metadataProvider =
59-
new FirebaseClientGrpcMetadataProvider(mockUserAgentProvider, mockHeartBeatProvider);
71+
new FirebaseClientGrpcMetadataProvider(
72+
mockUserAgentProvider, mockHeartBeatProvider, options);
6073
metadataProvider.updateMetadata(metadata);
6174
assertThat(metadata.keys().size()).isEqualTo(0);
6275
}
@@ -67,7 +80,8 @@ public void noUpdateWhenUserAgentNullProvider() {
6780
when(mockUserAgentProvider.get()).thenReturn(null);
6881
when(mockHeartBeatProvider.get()).thenReturn(mockHeartBeat);
6982
GrpcMetadataProvider metadataProvider =
70-
new FirebaseClientGrpcMetadataProvider(mockUserAgentProvider, mockHeartBeatProvider);
83+
new FirebaseClientGrpcMetadataProvider(
84+
mockUserAgentProvider, mockHeartBeatProvider, options);
7185
metadataProvider.updateMetadata(metadata);
7286
assertThat(metadata.keys().size()).isEqualTo(0);
7387
}
@@ -80,11 +94,13 @@ public void updateHeaderWhenHBCodeisGlobalHeartBeat() {
8094
when(mockHeartBeat.getHeartBeatCode(any())).thenReturn(HeartBeatInfo.HeartBeat.GLOBAL);
8195
when(mockUserAgent.getUserAgent()).thenReturn("foo:1.2.1");
8296
GrpcMetadataProvider metadataProvider =
83-
new FirebaseClientGrpcMetadataProvider(mockUserAgentProvider, mockHeartBeatProvider);
97+
new FirebaseClientGrpcMetadataProvider(
98+
mockUserAgentProvider, mockHeartBeatProvider, options);
8499
metadataProvider.updateMetadata(metadata);
85-
assertThat(metadata.keys().size()).isEqualTo(2);
100+
assertThat(metadata.keys().size()).isEqualTo(3);
86101
assertThat(metadata.get(HEART_BEAT_HEADER)).isEqualTo("2");
87102
assertThat(metadata.get(USER_AGENT_HEADER)).isEqualTo("foo:1.2.1");
103+
assertThat(metadata.get(GMP_APP_ID_HEADER)).isEqualTo("app_id");
88104
}
89105

90106
@Test
@@ -95,11 +111,13 @@ public void updateHeaderWhenHBCodeisSDKHeartBeat() {
95111
when(mockHeartBeat.getHeartBeatCode(any())).thenReturn(HeartBeatInfo.HeartBeat.SDK);
96112
when(mockUserAgent.getUserAgent()).thenReturn("foo:1.2.1");
97113
GrpcMetadataProvider metadataProvider =
98-
new FirebaseClientGrpcMetadataProvider(mockUserAgentProvider, mockHeartBeatProvider);
114+
new FirebaseClientGrpcMetadataProvider(
115+
mockUserAgentProvider, mockHeartBeatProvider, options);
99116
metadataProvider.updateMetadata(metadata);
100-
assertThat(metadata.keys().size()).isEqualTo(2);
117+
assertThat(metadata.keys().size()).isEqualTo(3);
101118
assertThat(metadata.get(HEART_BEAT_HEADER)).isEqualTo("1");
102119
assertThat(metadata.get(USER_AGENT_HEADER)).isEqualTo("foo:1.2.1");
120+
assertThat(metadata.get(GMP_APP_ID_HEADER)).isEqualTo("app_id");
103121
}
104122

105123
@Test
@@ -110,11 +128,13 @@ public void updateHeaderWhenHBCodeisCombinedHeartBeat() {
110128
when(mockHeartBeat.getHeartBeatCode(any())).thenReturn(HeartBeatInfo.HeartBeat.COMBINED);
111129
when(mockUserAgent.getUserAgent()).thenReturn("foo:1.2.1");
112130
GrpcMetadataProvider metadataProvider =
113-
new FirebaseClientGrpcMetadataProvider(mockUserAgentProvider, mockHeartBeatProvider);
131+
new FirebaseClientGrpcMetadataProvider(
132+
mockUserAgentProvider, mockHeartBeatProvider, options);
114133
metadataProvider.updateMetadata(metadata);
115-
assertThat(metadata.keys().size()).isEqualTo(2);
134+
assertThat(metadata.keys().size()).isEqualTo(3);
116135
assertThat(metadata.get(HEART_BEAT_HEADER)).isEqualTo("3");
117136
assertThat(metadata.get(USER_AGENT_HEADER)).isEqualTo("foo:1.2.1");
137+
assertThat(metadata.get(GMP_APP_ID_HEADER)).isEqualTo("app_id");
118138
}
119139

120140
@Test
@@ -125,8 +145,24 @@ public void noUpdateHeaderWhenHBCodeisZero() {
125145
when(mockHeartBeat.getHeartBeatCode(any())).thenReturn(HeartBeatInfo.HeartBeat.NONE);
126146
when(mockUserAgent.getUserAgent()).thenReturn("foo:1.2.1");
127147
GrpcMetadataProvider metadataProvider =
128-
new FirebaseClientGrpcMetadataProvider(mockUserAgentProvider, mockHeartBeatProvider);
148+
new FirebaseClientGrpcMetadataProvider(
149+
mockUserAgentProvider, mockHeartBeatProvider, options);
129150
metadataProvider.updateMetadata(metadata);
130151
assertThat(metadata.keys().size()).isEqualTo(0);
131152
}
153+
154+
@Test
155+
public void noGmpAppIdWhenOptionsAreNull() {
156+
Metadata metadata = new Metadata();
157+
when(mockUserAgentProvider.get()).thenReturn(mockUserAgent);
158+
when(mockHeartBeatProvider.get()).thenReturn(mockHeartBeat);
159+
when(mockHeartBeat.getHeartBeatCode(any())).thenReturn(HeartBeatInfo.HeartBeat.SDK);
160+
when(mockUserAgent.getUserAgent()).thenReturn("foo:1.2.1");
161+
GrpcMetadataProvider metadataProvider =
162+
new FirebaseClientGrpcMetadataProvider(mockUserAgentProvider, mockHeartBeatProvider, null);
163+
metadataProvider.updateMetadata(metadata);
164+
assertThat(metadata.keys().size()).isEqualTo(2);
165+
assertThat(metadata.get(HEART_BEAT_HEADER)).isEqualTo("1");
166+
assertThat(metadata.get(USER_AGENT_HEADER)).isEqualTo("foo:1.2.1");
167+
}
132168
}

firebase-firestore/src/main/java/com/google/firebase/firestore/FirestoreRegistrar.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import androidx.annotation.Keep;
1919
import androidx.annotation.RestrictTo;
2020
import com.google.firebase.FirebaseApp;
21+
import com.google.firebase.FirebaseOptions;
2122
import com.google.firebase.auth.internal.InternalAuthProvider;
2223
import com.google.firebase.components.Component;
2324
import com.google.firebase.components.ComponentRegistrar;
@@ -47,6 +48,7 @@ public List<Component<?>> getComponents() {
4748
.add(Dependency.optionalProvider(HeartBeatInfo.class))
4849
.add(Dependency.optionalProvider(UserAgentPublisher.class))
4950
.add(Dependency.optional(InternalAuthProvider.class))
51+
.add(Dependency.optional(FirebaseOptions.class))
5052
.factory(
5153
c ->
5254
new FirestoreMultiDbComponent(
@@ -55,7 +57,8 @@ public List<Component<?>> getComponents() {
5557
c.get(InternalAuthProvider.class),
5658
new FirebaseClientGrpcMetadataProvider(
5759
c.getProvider(UserAgentPublisher.class),
58-
c.getProvider(HeartBeatInfo.class))))
60+
c.getProvider(HeartBeatInfo.class),
61+
c.get(FirebaseOptions.class))))
5962
.build(),
6063
LibraryVersionComponent.create("fire-fst", BuildConfig.VERSION_NAME));
6164
}

firebase-firestore/src/main/java/com/google/firebase/firestore/remote/FirebaseClientGrpcMetadataProvider.java

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
package com.google.firebase.firestore.remote;
1616

1717
import androidx.annotation.NonNull;
18+
import androidx.annotation.Nullable;
19+
import com.google.firebase.FirebaseOptions;
1820
import com.google.firebase.heartbeatinfo.HeartBeatInfo;
1921
import com.google.firebase.inject.Provider;
2022
import com.google.firebase.platforminfo.UserAgentPublisher;
@@ -29,32 +31,52 @@ public class FirebaseClientGrpcMetadataProvider implements GrpcMetadataProvider
2931

3032
private final Provider<HeartBeatInfo> heartBeatInfoProvider;
3133
private final Provider<UserAgentPublisher> userAgentPublisherProvider;
32-
private final String firebaseFirestoreHeartBeatTag = "fire-fst";
34+
private final FirebaseOptions firebaseOptions;
35+
36+
private static final String HEART_BEAT_TAG = "fire-fst";
3337

3438
private static final Metadata.Key<String> HEART_BEAT_HEADER =
3539
Metadata.Key.of("x-firebase-client-log-type", Metadata.ASCII_STRING_MARSHALLER);
3640

3741
private static final Metadata.Key<String> USER_AGENT_HEADER =
3842
Metadata.Key.of("x-firebase-client", Metadata.ASCII_STRING_MARSHALLER);
3943

44+
private static final Metadata.Key<String> GMP_APP_ID_HEADER =
45+
Metadata.Key.of("x-firebase-gmpid", Metadata.ASCII_STRING_MARSHALLER);
46+
4047
public FirebaseClientGrpcMetadataProvider(
4148
@NonNull Provider<UserAgentPublisher> userAgentPublisherProvider,
42-
@NonNull Provider<HeartBeatInfo> heartBeatInfoProvider) {
49+
@NonNull Provider<HeartBeatInfo> heartBeatInfoProvider,
50+
@Nullable FirebaseOptions firebaseOptions) {
4351
this.userAgentPublisherProvider = userAgentPublisherProvider;
4452
this.heartBeatInfoProvider = heartBeatInfoProvider;
53+
this.firebaseOptions = firebaseOptions;
4554
}
4655

4756
@Override
4857
public void updateMetadata(@NonNull Metadata metadata) {
4958
if (heartBeatInfoProvider.get() == null || userAgentPublisherProvider.get() == null) {
5059
return;
5160
}
52-
int heartBeatCode =
53-
heartBeatInfoProvider.get().getHeartBeatCode(firebaseFirestoreHeartBeatTag).getCode();
54-
// Non-zero values indicate some kind of heartbeat should be sent
61+
62+
int heartBeatCode = heartBeatInfoProvider.get().getHeartBeatCode(HEART_BEAT_TAG).getCode();
63+
// Non-zero values indicate some kind of heartbeat should be sent.
5564
if (heartBeatCode != 0) {
5665
metadata.put(HEART_BEAT_HEADER, Integer.toString(heartBeatCode));
57-
metadata.put(USER_AGENT_HEADER, userAgentPublisherProvider.get().getUserAgent());
66+
}
67+
68+
metadata.put(USER_AGENT_HEADER, userAgentPublisherProvider.get().getUserAgent());
69+
maybeAddGmpAppId(metadata);
70+
}
71+
72+
private void maybeAddGmpAppId(@NonNull Metadata metadata) {
73+
if (firebaseOptions == null) {
74+
return;
75+
}
76+
77+
String gmpAppId = firebaseOptions.getApplicationId();
78+
if (gmpAppId.length() != 0) {
79+
metadata.put(GMP_APP_ID_HEADER, gmpAppId);
5880
}
5981
}
6082
}

0 commit comments

Comments
 (0)