Skip to content

Commit 571bd2f

Browse files
Add LocalStoreTestCase
1 parent 3197faf commit 571bd2f

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

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

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import static com.google.firebase.firestore.testutil.TestUtil.deletedDoc;
2222
import static com.google.firebase.firestore.testutil.TestUtil.doc;
2323
import static com.google.firebase.firestore.testutil.TestUtil.docMap;
24+
import static com.google.firebase.firestore.testutil.TestUtil.existenceFilterEvent;
2425
import static com.google.firebase.firestore.testutil.TestUtil.filter;
2526
import static com.google.firebase.firestore.testutil.TestUtil.key;
2627
import static com.google.firebase.firestore.testutil.TestUtil.keySet;
@@ -75,6 +76,7 @@
7576
import com.google.firebase.firestore.remote.WriteStream;
7677
import com.google.firebase.firestore.testutil.TestUtil;
7778
import com.google.firebase.firestore.util.AsyncQueue;
79+
import com.google.protobuf.ByteString;
7880
import java.util.ArrayList;
7981
import java.util.Arrays;
8082
import java.util.Collection;
@@ -1123,6 +1125,38 @@ public void testUsesTargetMappingToExecuteQueries() {
11231125
assertQueryReturned("foo/a", "foo/b");
11241126
}
11251127

1128+
@Test
1129+
public void testIgnoresTargetMappingAfterExistenceFilterMismatch() {
1130+
assumeFalse(garbageCollectorIsEager());
1131+
1132+
Query query = query("foo").filter(filter("matches", "==", true));
1133+
int targetId = allocateQuery(query);
1134+
1135+
executeQuery(query);
1136+
1137+
// Persist a mapping with a single document
1138+
applyRemoteEvent(
1139+
addedRemoteEvent(
1140+
asList(doc("foo/a", 10, map("matches", true))), asList(targetId), emptyList()));
1141+
applyRemoteEvent(noChangeEvent(targetId, 10));
1142+
updateViews(targetId, /* fromCache= */ false);
1143+
1144+
TargetData cachedTargetData = localStore.getTargetData(query.toTarget());
1145+
Assert.assertEquals(version(10), cachedTargetData.getLastLimboFreeSnapshotVersion());
1146+
1147+
// Create an existence filter mismatch and verify that the last limbo free snapshot version
1148+
// is deleted
1149+
applyRemoteEvent(existenceFilterEvent(targetId, 2, 20));
1150+
cachedTargetData = localStore.getTargetData(query.toTarget());
1151+
Assert.assertEquals(version(0), cachedTargetData.getLastLimboFreeSnapshotVersion());
1152+
Assert.assertEquals(ByteString.EMPTY, cachedTargetData.getResumeToken());
1153+
1154+
// Re-run the query as a collection scan
1155+
executeQuery(query);
1156+
assertRemoteDocumentsRead(/* byKey= */ 0, /* byCollection= */ 1);
1157+
assertQueryReturned("foo/a");
1158+
}
1159+
11261160
@Test
11271161
public void testLastLimboFreeSnapshotIsAdvancedDuringViewProcessing() {
11281162
// This test verifies that the `lastLimboFreeSnapshot` version for TargetData is advanced when

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
import com.google.firebase.firestore.model.mutation.Precondition;
7272
import com.google.firebase.firestore.model.mutation.SetMutation;
7373
import com.google.firebase.firestore.model.mutation.VerifyMutation;
74+
import com.google.firebase.firestore.remote.ExistenceFilter;
7475
import com.google.firebase.firestore.remote.RemoteEvent;
7576
import com.google.firebase.firestore.remote.TargetChange;
7677
import com.google.firebase.firestore.remote.WatchChange;
@@ -426,6 +427,20 @@ public static RemoteEvent addedRemoteEvent(
426427
return addedRemoteEvent(singletonList(doc), updatedInTargets, removedFromTargets);
427428
}
428429

430+
public static RemoteEvent existenceFilterEvent(int targetId, int count, int version) {
431+
TargetData targetData = TestUtil.targetData(targetId, QueryPurpose.LISTEN, "foo");
432+
TestTargetMetadataProvider testTargetMetadataProvider = new TestTargetMetadataProvider();
433+
testTargetMetadataProvider.setSyncedKeys(targetData, DocumentKey.emptyKeySet());
434+
435+
ExistenceFilter existenceFilter = new ExistenceFilter(count);
436+
WatchChangeAggregator aggregator = new WatchChangeAggregator(testTargetMetadataProvider);
437+
438+
WatchChange.ExistenceFilterWatchChange existenceFilterWatchChange =
439+
new WatchChange.ExistenceFilterWatchChange(targetId, existenceFilter);
440+
aggregator.handleExistenceFilter(existenceFilterWatchChange);
441+
return aggregator.createRemoteEvent(version(version));
442+
}
443+
429444
public static RemoteEvent addedRemoteEvent(
430445
List<MutableDocument> docs,
431446
List<Integer> updatedInTargets,

0 commit comments

Comments
 (0)