Skip to content

Commit b7b90c5

Browse files
committed
Merge branch 'master' of github.com:firebase/firebase-android-sdk into ankita_fis
2 parents 370b862 + 8d104e5 commit b7b90c5

File tree

14 files changed

+215
-128
lines changed

14 files changed

+215
-128
lines changed

buildSrc/src/main/groovy/com/google/firebase/gradle/plugins/measurement/apksize/ApkSizeTableBuilder.groovy

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ class ApkSizeTableBuilder {
2929
throw new IllegalStateException("No sizes added")
3030
}
3131

32-
def table = "|------------------ APK Sizes ------------------|\n"
33-
table += "|-- project --|-- build type --|-- size in bytes --|\n"
32+
def table = "|-------------------- APK Sizes ------------------|\n"
33+
table += "|--- project ---|-- build type --|-- size in bytes --|\n"
3434

3535
table += sdkSizes.collect {
36-
sprintf("|%-19s|%-19s|%-21s|", it.get(0), it.get(1), it.get(2))
36+
sprintf("|%-21s|%-19s|%-21s|", it.get(0), it.get(1), it.get(2))
3737
}.join("\n")
3838

3939
return table

buildSrc/src/test/groovy/com/google/firebase/gradle/plugins/measurement/apksize/ApkSizeTableBuilderTest.groovy

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ import org.junit.runners.JUnit4
2525
public class ApkSizeTableBuilderTest {
2626

2727
private static final String HEADER =
28-
"|------------------ APK Sizes ------------------|\n" +
29-
"|-- project --|-- build type --|-- size in bytes --|\n"
28+
"|-------------------- APK Sizes ------------------|\n" +
29+
"|--- project ---|-- build type --|-- size in bytes --|\n"
3030

3131
@Test(expected = IllegalStateException.class)
3232
public void toTableString_throwsWhenZeroAdded() {
@@ -37,7 +37,7 @@ public class ApkSizeTableBuilderTest {
3737
@Test
3838
public void toTableString_withOneMeasurement() {
3939
def expected = HEADER +
40-
"|firebase foo |debug |255000 |"
40+
"|firebase foo |debug |255000 |"
4141

4242
def builder = new ApkSizeTableBuilder()
4343
builder.addApkSize("firebase foo", "debug", 255000)
@@ -48,9 +48,9 @@ public class ApkSizeTableBuilderTest {
4848
@Test
4949
public void toTableString_withThreeMeasurements() {
5050
def expected = HEADER +
51-
"|firebase foo |debug |255000 |\n" +
52-
"|google loo |release |4000 |\n" +
53-
"|Appy Snap App |Snappy |781000 |"
51+
"|firebase foo |debug |255000 |\n" +
52+
"|google loo |release |4000 |\n" +
53+
"|Appy Snap App |Snappy |781000 |"
5454

5555
def builder = new ApkSizeTableBuilder()
5656
builder.addApkSize("firebase foo", "debug", 255000)

firebase-firestore/CHANGELOG.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
that were previously incorrectly disallowed are now allowed. For example,
44
after reading a document that doesn't exist, you can now set it multiple
55
times successfully in a transaction.
6-
7-
# 20.2.0
86
- [fixed] Fixed an issue where query results were temporarily missing documents
97
that previously had not matched but had been updated to now match the
108
query (#155).
9+
10+
# 20.2.0
1111
- [feature] Added a `@DocumentId` annotation which can be used on a
1212
`DocumentReference` or `String` property in a POJO to indicate that the SDK
1313
should automatically populate it with the document's ID.

firebase-firestore/ktx/src/test/java/com/google/firebase/firestore/TestUtil.java

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,17 @@
1919
import static com.google.firebase.firestore.testutil.TestUtil.key;
2020
import static org.mockito.Mockito.mock;
2121

22-
import androidx.annotation.Nullable;
2322
import com.google.android.gms.tasks.Task;
2423
import com.google.firebase.database.collection.ImmutableSortedSet;
2524
import com.google.firebase.firestore.core.DocumentViewChange;
2625
import com.google.firebase.firestore.core.DocumentViewChange.Type;
2726
import com.google.firebase.firestore.core.ViewSnapshot;
28-
import com.google.firebase.firestore.local.QueryData;
2927
import com.google.firebase.firestore.model.Document;
3028
import com.google.firebase.firestore.model.DocumentKey;
3129
import com.google.firebase.firestore.model.DocumentSet;
3230
import com.google.firebase.firestore.model.ResourcePath;
3331
import com.google.firebase.firestore.model.value.ObjectValue;
34-
import com.google.firebase.firestore.remote.WatchChangeAggregator;
3532
import java.util.ArrayList;
36-
import java.util.HashMap;
3733
import java.util.List;
3834
import java.util.Map;
3935
import org.junit.Assert;
@@ -138,36 +134,6 @@ public static QuerySnapshot querySnapshot(
138134
return new QuerySnapshot(query(path), viewSnapshot, FIRESTORE);
139135
}
140136

141-
/**
142-
* An implementation of TargetMetadataProvider that provides controlled access to the
143-
* `TargetMetadataProvider` callbacks. Any target accessed via these callbacks must be registered
144-
* beforehand via `setSyncedKeys()`.
145-
*/
146-
public static class TestTargetMetadataProvider
147-
implements WatchChangeAggregator.TargetMetadataProvider {
148-
final Map<Integer, ImmutableSortedSet<DocumentKey>> syncedKeys = new HashMap<>();
149-
final Map<Integer, QueryData> queryData = new HashMap<>();
150-
151-
@Override
152-
public ImmutableSortedSet<DocumentKey> getRemoteKeysForTarget(int targetId) {
153-
return syncedKeys.get(targetId) != null
154-
? syncedKeys.get(targetId)
155-
: DocumentKey.emptyKeySet();
156-
}
157-
158-
@Nullable
159-
@Override
160-
public QueryData getQueryDataForTarget(int targetId) {
161-
return queryData.get(targetId);
162-
}
163-
164-
/** Sets or replaces the local state for the provided query data. */
165-
public void setSyncedKeys(QueryData queryData, ImmutableSortedSet<DocumentKey> keys) {
166-
this.queryData.put(queryData.getTargetId(), queryData);
167-
this.syncedKeys.put(queryData.getTargetId(), keys);
168-
}
169-
}
170-
171137
public static <T> T waitFor(Task<T> task) {
172138
if (!task.isComplete()) {
173139
Robolectric.flushBackgroundThreadScheduler();

firebase-firestore/src/roboUtil/java/com/google/firebase/firestore/TestUtil.java

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,17 @@
1919
import static com.google.firebase.firestore.testutil.TestUtil.key;
2020
import static org.mockito.Mockito.mock;
2121

22-
import androidx.annotation.Nullable;
2322
import com.google.android.gms.tasks.Task;
2423
import com.google.firebase.database.collection.ImmutableSortedSet;
2524
import com.google.firebase.firestore.core.DocumentViewChange;
2625
import com.google.firebase.firestore.core.DocumentViewChange.Type;
2726
import com.google.firebase.firestore.core.ViewSnapshot;
28-
import com.google.firebase.firestore.local.QueryData;
2927
import com.google.firebase.firestore.model.Document;
3028
import com.google.firebase.firestore.model.DocumentKey;
3129
import com.google.firebase.firestore.model.DocumentSet;
3230
import com.google.firebase.firestore.model.ResourcePath;
3331
import com.google.firebase.firestore.model.value.ObjectValue;
34-
import com.google.firebase.firestore.remote.WatchChangeAggregator;
3532
import java.util.ArrayList;
36-
import java.util.HashMap;
3733
import java.util.List;
3834
import java.util.Map;
3935
import org.junit.Assert;
@@ -138,36 +134,6 @@ public static QuerySnapshot querySnapshot(
138134
return new QuerySnapshot(query(path), viewSnapshot, FIRESTORE);
139135
}
140136

141-
/**
142-
* An implementation of TargetMetadataProvider that provides controlled access to the
143-
* `TargetMetadataProvider` callbacks. Any target accessed via these callbacks must be registered
144-
* beforehand via `setSyncedKeys()`.
145-
*/
146-
public static class TestTargetMetadataProvider
147-
implements WatchChangeAggregator.TargetMetadataProvider {
148-
final Map<Integer, ImmutableSortedSet<DocumentKey>> syncedKeys = new HashMap<>();
149-
final Map<Integer, QueryData> queryData = new HashMap<>();
150-
151-
@Override
152-
public ImmutableSortedSet<DocumentKey> getRemoteKeysForTarget(int targetId) {
153-
return syncedKeys.get(targetId) != null
154-
? syncedKeys.get(targetId)
155-
: DocumentKey.emptyKeySet();
156-
}
157-
158-
@Nullable
159-
@Override
160-
public QueryData getQueryDataForTarget(int targetId) {
161-
return queryData.get(targetId);
162-
}
163-
164-
/** Sets or replaces the local state for the provided query data. */
165-
public void setSyncedKeys(QueryData queryData, ImmutableSortedSet<DocumentKey> keys) {
166-
this.queryData.put(queryData.getTargetId(), queryData);
167-
this.syncedKeys.put(queryData.getTargetId(), keys);
168-
}
169-
}
170-
171137
public static <T> T waitFor(Task<T> task) {
172138
if (!task.isComplete()) {
173139
Robolectric.flushBackgroundThreadScheduler();

firebase-firestore/src/test/java/com/google/firebase/firestore/local/LocalStoreTestCase.java

Lines changed: 6 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import static com.google.firebase.firestore.testutil.TestUtil.doc;
2222
import static com.google.firebase.firestore.testutil.TestUtil.key;
2323
import static com.google.firebase.firestore.testutil.TestUtil.map;
24+
import static com.google.firebase.firestore.testutil.TestUtil.noChangeEvent;
2425
import static com.google.firebase.firestore.testutil.TestUtil.patchMutation;
2526
import static com.google.firebase.firestore.testutil.TestUtil.query;
2627
import static com.google.firebase.firestore.testutil.TestUtil.resumeToken;
@@ -46,7 +47,6 @@
4647
import com.google.firebase.database.collection.ImmutableSortedMap;
4748
import com.google.firebase.database.collection.ImmutableSortedSet;
4849
import com.google.firebase.firestore.FieldValue;
49-
import com.google.firebase.firestore.TestUtil.TestTargetMetadataProvider;
5050
import com.google.firebase.firestore.auth.User;
5151
import com.google.firebase.firestore.core.Query;
5252
import com.google.firebase.firestore.model.Document;
@@ -61,13 +61,9 @@
6161
import com.google.firebase.firestore.model.mutation.MutationResult;
6262
import com.google.firebase.firestore.model.mutation.SetMutation;
6363
import com.google.firebase.firestore.remote.RemoteEvent;
64-
import com.google.firebase.firestore.remote.WatchChange.WatchTargetChange;
65-
import com.google.firebase.firestore.remote.WatchChange.WatchTargetChangeType;
66-
import com.google.firebase.firestore.remote.WatchChangeAggregator;
6764
import com.google.firebase.firestore.remote.WatchStream;
6865
import com.google.firebase.firestore.remote.WriteStream;
6966
import com.google.firebase.firestore.testutil.TestUtil;
70-
import com.google.protobuf.ByteString;
7167
import java.util.ArrayList;
7268
import java.util.Arrays;
7369
import java.util.Collections;
@@ -912,26 +908,15 @@ public void testPersistsResumeTokens() {
912908

913909
Query query = query("foo/bar");
914910
int targetId = allocateQuery(query);
915-
ByteString resumeToken = resumeToken(1000);
916911

917-
QueryData queryData = TestUtil.queryData(targetId, QueryPurpose.LISTEN, "foo/bar");
918-
TestTargetMetadataProvider testTargetMetadataProvider = new TestTargetMetadataProvider();
919-
testTargetMetadataProvider.setSyncedKeys(queryData, DocumentKey.emptyKeySet());
920-
921-
WatchChangeAggregator aggregator = new WatchChangeAggregator(testTargetMetadataProvider);
922-
923-
WatchTargetChange watchChange =
924-
new WatchTargetChange(WatchTargetChangeType.Current, asList(targetId), resumeToken);
925-
aggregator.handleTargetChange(watchChange);
926-
RemoteEvent remoteEvent = aggregator.createRemoteEvent(version(1000));
927-
applyRemoteEvent(remoteEvent);
912+
applyRemoteEvent(noChangeEvent(targetId, 1000));
928913

929914
// Stop listening so that the query should become inactive (but persistent)
930915
localStore.releaseQuery(query);
931916

932917
// Should come back with the same resume token
933918
QueryData queryData2 = localStore.allocateQuery(query);
934-
assertEquals(resumeToken, queryData2.getResumeToken());
919+
assertEquals(resumeToken(1000), queryData2.getResumeToken());
935920
}
936921

937922
@Test
@@ -943,35 +928,18 @@ public void testDoesNotReplaceResumeTokenWithEmptyByteString() {
943928

944929
Query query = query("foo/bar");
945930
int targetId = allocateQuery(query);
946-
ByteString resumeToken = resumeToken(1000);
947-
948-
QueryData queryData = TestUtil.queryData(targetId, QueryPurpose.LISTEN, "foo/bar");
949-
TestTargetMetadataProvider testTargetMetadataProvider = new TestTargetMetadataProvider();
950-
testTargetMetadataProvider.setSyncedKeys(queryData, DocumentKey.emptyKeySet());
951-
952-
WatchChangeAggregator aggregator1 = new WatchChangeAggregator(testTargetMetadataProvider);
953931

954-
WatchTargetChange watchChange1 =
955-
new WatchTargetChange(WatchTargetChangeType.Current, asList(targetId), resumeToken);
956-
aggregator1.handleTargetChange(watchChange1);
957-
RemoteEvent remoteEvent1 = aggregator1.createRemoteEvent(version(1000));
958-
applyRemoteEvent(remoteEvent1);
932+
applyRemoteEvent(noChangeEvent(targetId, 1000));
959933

960934
// New message with empty resume token should not replace the old resume token
961-
WatchChangeAggregator aggregator2 = new WatchChangeAggregator(testTargetMetadataProvider);
962-
WatchTargetChange watchChange2 =
963-
new WatchTargetChange(
964-
WatchTargetChangeType.Current, asList(targetId), WatchStream.EMPTY_RESUME_TOKEN);
965-
aggregator2.handleTargetChange(watchChange2);
966-
RemoteEvent remoteEvent2 = aggregator2.createRemoteEvent(version(2000));
967-
applyRemoteEvent(remoteEvent2);
935+
applyRemoteEvent(TestUtil.noChangeEvent(targetId, 2000, WatchStream.EMPTY_RESUME_TOKEN));
968936

969937
// Stop listening so that the query should become inactive (but persistent)
970938
localStore.releaseQuery(query);
971939

972940
// Should come back with the same resume token
973941
QueryData queryData2 = localStore.allocateQuery(query);
974-
assertEquals(resumeToken, queryData2.getResumeToken());
942+
assertEquals(resumeToken(1000), queryData2.getResumeToken());
975943
}
976944

977945
@Test

firebase-firestore/src/test/java/com/google/firebase/firestore/remote/RemoteEventTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,14 @@
3232
import static org.junit.Assert.fail;
3333

3434
import com.google.firebase.database.collection.ImmutableSortedSet;
35-
import com.google.firebase.firestore.TestUtil.TestTargetMetadataProvider;
3635
import com.google.firebase.firestore.local.QueryData;
3736
import com.google.firebase.firestore.model.Document;
3837
import com.google.firebase.firestore.model.DocumentKey;
3938
import com.google.firebase.firestore.model.NoDocument;
4039
import com.google.firebase.firestore.remote.WatchChange.DocumentChange;
4140
import com.google.firebase.firestore.remote.WatchChange.WatchTargetChange;
4241
import com.google.firebase.firestore.remote.WatchChange.WatchTargetChangeType;
42+
import com.google.firebase.firestore.testutil.TestTargetMetadataProvider;
4343
import com.google.protobuf.ByteString;
4444
import java.util.ArrayList;
4545
import java.util.Collections;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// Copyright 2019 Google LLC
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package com.google.firebase.firestore.testutil;
16+
17+
import com.google.firebase.database.collection.ImmutableSortedSet;
18+
import com.google.firebase.firestore.local.QueryData;
19+
import com.google.firebase.firestore.model.DocumentKey;
20+
import com.google.firebase.firestore.remote.WatchChangeAggregator;
21+
import java.util.HashMap;
22+
import java.util.Map;
23+
24+
/**
25+
* An implementation of TargetMetadataProvider that provides controlled access to the
26+
* `TargetMetadataProvider` callbacks. Any target accessed via these callbacks must be registered
27+
* beforehand via `setSyncedKeys()`.
28+
*/
29+
public class TestTargetMetadataProvider implements WatchChangeAggregator.TargetMetadataProvider {
30+
final Map<Integer, ImmutableSortedSet<DocumentKey>> syncedKeys = new HashMap<>();
31+
final Map<Integer, QueryData> queryData = new HashMap<>();
32+
33+
@Override
34+
public ImmutableSortedSet<DocumentKey> getRemoteKeysForTarget(int targetId) {
35+
return syncedKeys.get(targetId) != null ? syncedKeys.get(targetId) : DocumentKey.emptyKeySet();
36+
}
37+
38+
@androidx.annotation.Nullable
39+
@Override
40+
public QueryData getQueryDataForTarget(int targetId) {
41+
return queryData.get(targetId);
42+
}
43+
44+
/** Sets or replaces the local state for the provided query data. */
45+
public void setSyncedKeys(QueryData queryData, ImmutableSortedSet<DocumentKey> keys) {
46+
this.queryData.put(queryData.getTargetId(), queryData);
47+
this.syncedKeys.put(queryData.getTargetId(), keys);
48+
}
49+
}

firebase-firestore/src/testUtil/java/com/google/firebase/firestore/testutil/TestUtil.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
import com.google.firebase.firestore.model.value.ObjectValue;
6666
import com.google.firebase.firestore.remote.RemoteEvent;
6767
import com.google.firebase.firestore.remote.TargetChange;
68+
import com.google.firebase.firestore.remote.WatchChange;
6869
import com.google.firebase.firestore.remote.WatchChange.DocumentChange;
6970
import com.google.firebase.firestore.remote.WatchChangeAggregator;
7071
import com.google.protobuf.ByteString;
@@ -374,6 +375,24 @@ public static Map<Integer, QueryData> activeLimboQueries(String docKey, Integer.
374375
return activeLimboQueries(docKey, asList(targets));
375376
}
376377

378+
public static RemoteEvent noChangeEvent(int targetId, int version) {
379+
return noChangeEvent(targetId, version, resumeToken(version));
380+
}
381+
382+
public static RemoteEvent noChangeEvent(int targetId, int version, ByteString resumeToken) {
383+
QueryData queryData = TestUtil.queryData(targetId, QueryPurpose.LISTEN, "foo/bar");
384+
TestTargetMetadataProvider testTargetMetadataProvider = new TestTargetMetadataProvider();
385+
testTargetMetadataProvider.setSyncedKeys(queryData, DocumentKey.emptyKeySet());
386+
387+
WatchChangeAggregator aggregator = new WatchChangeAggregator(testTargetMetadataProvider);
388+
389+
WatchChange.WatchTargetChange watchChange =
390+
new WatchChange.WatchTargetChange(
391+
WatchChange.WatchTargetChangeType.NoChange, asList(targetId), resumeToken);
392+
aggregator.handleTargetChange(watchChange);
393+
return aggregator.createRemoteEvent(version(version));
394+
}
395+
377396
public static RemoteEvent addedRemoteEvent(
378397
MaybeDocument doc, List<Integer> updatedInTargets, List<Integer> removedFromTargets) {
379398
DocumentChange change =

root-project.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import com.google.firebase.gradle.plugins.license.LicenseResolverPlugin
1616

1717
buildscript {
18-
ext.kotlinVersion = '1.3.20'
18+
ext.kotlinVersion = '1.3.41'
1919
repositories {
2020
google()
2121
jcenter()

smoke-tests/build.gradle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ android {
4949
}
5050
}
5151

52+
if (project.hasProperty("testBuildType")) {
53+
testBuildType project.getProperty("testBuildType")
54+
}
55+
5256
flavorDimensions "systemUnderTest"
5357

5458
// TODO(allisonbm92): Switch to the default flavor.

0 commit comments

Comments
 (0)