diff --git a/firebase-firestore/src/test/resources/json/bundle_spec_test.json b/firebase-firestore/src/test/resources/json/bundle_spec_test.json index 1e21bbea06a..e45f01e937a 100644 --- a/firebase-firestore/src/test/resources/json/bundle_spec_test.json +++ b/firebase-firestore/src/test/resources/json/bundle_spec_test.json @@ -1386,7 +1386,7 @@ "value": { "value": "patched" }, - "version": 250 + "version": 0 } ], "query": { @@ -1670,7 +1670,7 @@ "value": { "value": "patched" }, - "version": 250 + "version": 0 } ], "query": { diff --git a/firebase-firestore/src/test/resources/json/existence_filter_spec_test.json b/firebase-firestore/src/test/resources/json/existence_filter_spec_test.json index 5798b877996..3083b762224 100644 --- a/firebase-firestore/src/test/resources/json/existence_filter_spec_test.json +++ b/firebase-firestore/src/test/resources/json/existence_filter_spec_test.json @@ -1,4 +1,240 @@ { + "Existence filter clears resume token": { + "describeName": "Existence Filters:", + "itName": "Existence filter clears resume token", + "tags": [ + "durable-persistence" + ], + "config": { + "numClients": 1, + "useGarbageCollection": true + }, + "steps": [ + { + "userListen": { + "query": { + "filters": [ + ], + "orderBys": [ + ], + "path": "collection" + }, + "targetId": 2 + }, + "expectedState": { + "activeTargets": { + "2": { + "queries": [ + { + "filters": [ + ], + "orderBys": [ + ], + "path": "collection" + } + ], + "resumeToken": "" + } + } + } + }, + { + "watchAck": [ + 2 + ] + }, + { + "watchEntity": { + "docs": [ + { + "key": "collection/1", + "options": { + "hasCommittedMutations": false, + "hasLocalMutations": false + }, + "value": { + "v": 1 + }, + "version": 1000 + }, + { + "key": "collection/2", + "options": { + "hasCommittedMutations": false, + "hasLocalMutations": false + }, + "value": { + "v": 2 + }, + "version": 1000 + } + ], + "targets": [ + 2 + ] + } + }, + { + "watchCurrent": [ + [ + 2 + ], + "resume-token-1000" + ] + }, + { + "watchSnapshot": { + "targetIds": [ + ], + "version": 1000 + }, + "expectedSnapshotEvents": [ + { + "added": [ + { + "key": "collection/1", + "options": { + "hasCommittedMutations": false, + "hasLocalMutations": false + }, + "value": { + "v": 1 + }, + "version": 1000 + }, + { + "key": "collection/2", + "options": { + "hasCommittedMutations": false, + "hasLocalMutations": false + }, + "value": { + "v": 2 + }, + "version": 1000 + } + ], + "errorCode": 0, + "fromCache": false, + "hasPendingWrites": false, + "query": { + "filters": [ + ], + "orderBys": [ + ], + "path": "collection" + } + } + ] + }, + { + "watchFilter": [ + [ + 2 + ], + "collection/1" + ] + }, + { + "watchSnapshot": { + "targetIds": [ + ], + "version": 2000 + }, + "expectedSnapshotEvents": [ + { + "errorCode": 0, + "fromCache": true, + "hasPendingWrites": false, + "query": { + "filters": [ + ], + "orderBys": [ + ], + "path": "collection" + } + } + ] + }, + { + "restart": true, + "expectedState": { + "activeLimboDocs": [ + ], + "activeTargets": { + }, + "enqueuedLimboDocs": [ + ] + } + }, + { + "userListen": { + "query": { + "filters": [ + ], + "orderBys": [ + ], + "path": "collection" + }, + "targetId": 2 + }, + "expectedSnapshotEvents": [ + { + "added": [ + { + "key": "collection/1", + "options": { + "hasCommittedMutations": false, + "hasLocalMutations": false + }, + "value": { + "v": 1 + }, + "version": 1000 + }, + { + "key": "collection/2", + "options": { + "hasCommittedMutations": false, + "hasLocalMutations": false + }, + "value": { + "v": 2 + }, + "version": 1000 + } + ], + "errorCode": 0, + "fromCache": true, + "hasPendingWrites": false, + "query": { + "filters": [ + ], + "orderBys": [ + ], + "path": "collection" + } + } + ], + "expectedState": { + "activeTargets": { + "2": { + "queries": [ + { + "filters": [ + ], + "orderBys": [ + ], + "path": "collection" + } + ], + "resumeToken": "" + } + } + } + } + ] + }, "Existence filter handled at global snapshot": { "describeName": "Existence Filters:", "itName": "Existence filter handled at global snapshot", @@ -1072,242 +1308,6 @@ } ] }, - "Existence filter mismatch invalidates index-free query": { - "describeName": "Existence Filters:", - "itName": "Existence filter clears resume token", - "tags": [ - "durable-persistence" - ], - "config": { - "numClients": 1, - "useGarbageCollection": true - }, - "steps": [ - { - "userListen": { - "query": { - "filters": [ - ], - "orderBys": [ - ], - "path": "collection" - }, - "targetId": 2 - }, - "expectedState": { - "activeTargets": { - "2": { - "queries": [ - { - "filters": [ - ], - "orderBys": [ - ], - "path": "collection" - } - ], - "resumeToken": "" - } - } - } - }, - { - "watchAck": [ - 2 - ] - }, - { - "watchEntity": { - "docs": [ - { - "key": "collection/1", - "options": { - "hasCommittedMutations": false, - "hasLocalMutations": false - }, - "value": { - "v": 1 - }, - "version": 1000 - }, - { - "key": "collection/2", - "options": { - "hasCommittedMutations": false, - "hasLocalMutations": false - }, - "value": { - "v": 2 - }, - "version": 1000 - } - ], - "targets": [ - 2 - ] - } - }, - { - "watchCurrent": [ - [ - 2 - ], - "resume-token-1000" - ] - }, - { - "watchSnapshot": { - "targetIds": [ - ], - "version": 1000 - }, - "expectedSnapshotEvents": [ - { - "added": [ - { - "key": "collection/1", - "options": { - "hasCommittedMutations": false, - "hasLocalMutations": false - }, - "value": { - "v": 1 - }, - "version": 1000 - }, - { - "key": "collection/2", - "options": { - "hasCommittedMutations": false, - "hasLocalMutations": false - }, - "value": { - "v": 2 - }, - "version": 1000 - } - ], - "errorCode": 0, - "fromCache": false, - "hasPendingWrites": false, - "query": { - "filters": [ - ], - "orderBys": [ - ], - "path": "collection" - } - } - ] - }, - { - "watchFilter": [ - [ - 2 - ], - "collection/1" - ] - }, - { - "watchSnapshot": { - "targetIds": [ - ], - "version": 2000 - }, - "expectedSnapshotEvents": [ - { - "errorCode": 0, - "fromCache": true, - "hasPendingWrites": false, - "query": { - "filters": [ - ], - "orderBys": [ - ], - "path": "collection" - } - } - ] - }, - { - "restart": true, - "expectedState": { - "activeLimboDocs": [ - ], - "activeTargets": { - }, - "enqueuedLimboDocs": [ - ] - } - }, - { - "userListen": { - "query": { - "filters": [ - ], - "orderBys": [ - ], - "path": "collection" - }, - "targetId": 2 - }, - "expectedSnapshotEvents": [ - { - "added": [ - { - "key": "collection/1", - "options": { - "hasCommittedMutations": false, - "hasLocalMutations": false - }, - "value": { - "v": 1 - }, - "version": 1000 - }, - { - "key": "collection/2", - "options": { - "hasCommittedMutations": false, - "hasLocalMutations": false - }, - "value": { - "v": 2 - }, - "version": 1000 - } - ], - "errorCode": 0, - "fromCache": true, - "hasPendingWrites": false, - "query": { - "filters": [ - ], - "orderBys": [ - ], - "path": "collection" - } - } - ], - "expectedState": { - "activeTargets": { - "2": { - "queries": [ - { - "filters": [ - ], - "orderBys": [ - ], - "path": "collection" - } - ], - "resumeToken": "" - } - } - } - } - ] - }, "Existence filter mismatch triggers re-run of query": { "describeName": "Existence Filters:", "itName": "Existence filter mismatch triggers re-run of query", diff --git a/firebase-firestore/src/test/resources/json/index_spec_test.json b/firebase-firestore/src/test/resources/json/index_spec_test.json new file mode 100644 index 00000000000..885b3357fed --- /dev/null +++ b/firebase-firestore/src/test/resources/json/index_spec_test.json @@ -0,0 +1,252 @@ +{ + "Index Creation succeeds even if not primary": { + "describeName": "Client Side Index", + "itName": "Index Creation succeeds even if not primary", + "tags": [ + "multi-client" + ], + "config": { + "numClients": 2, + "useGarbageCollection": false + }, + "steps": [ + { + "clientIndex": 0, + "drainQueue": true, + "expectedState": { + "isPrimary": true + } + }, + { + "clientIndex": 1, + "drainQueue": true, + "expectedState": { + "isPrimary": false + } + }, + { + "clientIndex": 1, + "setIndexConfiguration": { + "indexes": [ + { + "collectionGroup": "restaurants", + "fields": [ + { + "fieldPath": "price", + "order": "ASCENDING" + } + ], + "queryScope": "COLLECTION" + } + ] + }, + "expectedState": { + "indexes": [ + { + "collectionGroup": "restaurants", + "fields": [ + { + "fieldPath": { + "len": 1, + "offset": 0, + "segments": [ + "price" + ] + }, + "kind": 0 + } + ], + "indexId": -1, + "indexState": { + "offset": { + "documentKey": { + "path": { + "len": 0, + "offset": 0, + "segments": [ + ] + } + }, + "largestBatchId": -1, + "readTime": { + "timestamp": { + "nanoseconds": 0, + "seconds": 0 + } + } + }, + "sequenceNumber": 0 + } + } + ] + } + }, + { + "clientIndex": 0, + "drainQueue": true, + "expectedState": { + "indexes": [ + { + "collectionGroup": "restaurants", + "fields": [ + { + "fieldPath": { + "len": 1, + "offset": 0, + "segments": [ + "price" + ] + }, + "kind": 0 + } + ], + "indexId": -1, + "indexState": { + "offset": { + "documentKey": { + "path": { + "len": 0, + "offset": 0, + "segments": [ + ] + } + }, + "largestBatchId": -1, + "readTime": { + "timestamp": { + "nanoseconds": 0, + "seconds": 0 + } + } + }, + "sequenceNumber": 0 + } + } + ] + } + } + ] + }, + "Index Creation visible on all clients": { + "describeName": "Client Side Index", + "itName": "Index Creation visible on all clients", + "tags": [ + "multi-client" + ], + "config": { + "numClients": 2, + "useGarbageCollection": false + }, + "steps": [ + { + "clientIndex": 0, + "drainQueue": true, + "expectedState": { + "isPrimary": true + } + }, + { + "clientIndex": 0, + "setIndexConfiguration": { + "indexes": [ + { + "collectionGroup": "restaurants", + "fields": [ + { + "fieldPath": "price", + "order": "ASCENDING" + } + ], + "queryScope": "COLLECTION" + } + ] + }, + "expectedState": { + "indexes": [ + { + "collectionGroup": "restaurants", + "fields": [ + { + "fieldPath": { + "len": 1, + "offset": 0, + "segments": [ + "price" + ] + }, + "kind": 0 + } + ], + "indexId": -1, + "indexState": { + "offset": { + "documentKey": { + "path": { + "len": 0, + "offset": 0, + "segments": [ + ] + } + }, + "largestBatchId": -1, + "readTime": { + "timestamp": { + "nanoseconds": 0, + "seconds": 0 + } + } + }, + "sequenceNumber": 0 + } + } + ] + } + }, + { + "clientIndex": 1, + "drainQueue": true, + "expectedState": { + "indexes": [ + { + "collectionGroup": "restaurants", + "fields": [ + { + "fieldPath": { + "len": 1, + "offset": 0, + "segments": [ + "price" + ] + }, + "kind": 0 + } + ], + "indexId": -1, + "indexState": { + "offset": { + "documentKey": { + "path": { + "len": 0, + "offset": 0, + "segments": [ + ] + } + }, + "largestBatchId": -1, + "readTime": { + "timestamp": { + "nanoseconds": 0, + "seconds": 0 + } + } + }, + "sequenceNumber": 0 + } + } + ], + "isPrimary": false + } + } + ] + } +} diff --git a/firebase-firestore/src/test/resources/json/limbo_spec_test.json b/firebase-firestore/src/test/resources/json/limbo_spec_test.json index 57f57e909e5..0b6abe08a2b 100644 --- a/firebase-firestore/src/test/resources/json/limbo_spec_test.json +++ b/firebase-firestore/src/test/resources/json/limbo_spec_test.json @@ -2627,7 +2627,7 @@ "matches": true, "modified": true }, - "version": 1000 + "version": 0 } ], "query": { @@ -2690,7 +2690,7 @@ "matches": true, "modified": true }, - "version": 1000 + "version": 0 } ], "errorCode": 0, diff --git a/firebase-firestore/src/test/resources/json/orderby_spec_test.json b/firebase-firestore/src/test/resources/json/orderby_spec_test.json index 858919c3721..6c395803606 100644 --- a/firebase-firestore/src/test/resources/json/orderby_spec_test.json +++ b/firebase-firestore/src/test/resources/json/orderby_spec_test.json @@ -154,7 +154,7 @@ "key": "b", "sort": 2 }, - "version": 1001 + "version": 0 } ], "errorCode": 0, diff --git a/firebase-firestore/src/test/resources/json/perf_spec_test.json b/firebase-firestore/src/test/resources/json/perf_spec_test.json index 5276fb92fb9..8dc52457023 100644 --- a/firebase-firestore/src/test/resources/json/perf_spec_test.json +++ b/firebase-firestore/src/test/resources/json/perf_spec_test.json @@ -224390,7 +224390,7 @@ "value": { "v": 1 }, - "version": 2 + "version": 0 } ], "query": { @@ -224493,7 +224493,7 @@ "value": { "v": 2 }, - "version": 4 + "version": 0 } ], "query": { @@ -224596,7 +224596,7 @@ "value": { "v": 3 }, - "version": 6 + "version": 0 } ], "query": { @@ -224699,7 +224699,7 @@ "value": { "v": 4 }, - "version": 8 + "version": 0 } ], "query": { @@ -224802,7 +224802,7 @@ "value": { "v": 5 }, - "version": 10 + "version": 0 } ], "query": { @@ -224905,7 +224905,7 @@ "value": { "v": 6 }, - "version": 12 + "version": 0 } ], "query": { @@ -225008,7 +225008,7 @@ "value": { "v": 7 }, - "version": 14 + "version": 0 } ], "query": { @@ -225111,7 +225111,7 @@ "value": { "v": 8 }, - "version": 16 + "version": 0 } ], "query": { @@ -225214,7 +225214,7 @@ "value": { "v": 9 }, - "version": 18 + "version": 0 } ], "query": { @@ -225317,7 +225317,7 @@ "value": { "v": 10 }, - "version": 20 + "version": 0 } ], "query": { diff --git a/firebase-firestore/src/test/resources/json/query_spec_test.json b/firebase-firestore/src/test/resources/json/query_spec_test.json index f2c1ce51e6c..18ade7a1e2c 100644 --- a/firebase-firestore/src/test/resources/json/query_spec_test.json +++ b/firebase-firestore/src/test/resources/json/query_spec_test.json @@ -1493,7 +1493,7 @@ "value": { "match": true }, - "version": 1000 + "version": 0 } ], "query": { @@ -1534,7 +1534,7 @@ "value": { "match": true }, - "version": 1000 + "version": 0 } ], "errorCode": 0, diff --git a/firebase-firestore/src/test/resources/json/recovery_spec_test.json b/firebase-firestore/src/test/resources/json/recovery_spec_test.json index c42d58c9d41..9ae9f2349ff 100644 --- a/firebase-firestore/src/test/resources/json/recovery_spec_test.json +++ b/firebase-firestore/src/test/resources/json/recovery_spec_test.json @@ -1012,6 +1012,20 @@ }, "targetId": 2 }, + "expectedSnapshotEvents": [ + { + "errorCode": 0, + "fromCache": true, + "hasPendingWrites": false, + "query": { + "filters": [ + ], + "orderBys": [ + ], + "path": "collection" + } + } + ], "expectedState": { "activeTargets": { "2": { diff --git a/firebase-firestore/src/test/resources/json/write_spec_test.json b/firebase-firestore/src/test/resources/json/write_spec_test.json index 4ad3f39f4be..dc5c135b72f 100644 --- a/firebase-firestore/src/test/resources/json/write_spec_test.json +++ b/firebase-firestore/src/test/resources/json/write_spec_test.json @@ -126,7 +126,7 @@ "value": { "v": 2 }, - "version": 1000 + "version": 0 } ], "query": { @@ -336,7 +336,7 @@ "value": { "v": 3 }, - "version": 1000 + "version": 0 } ], "query": { @@ -597,7 +597,7 @@ "value": { "v": 2 }, - "version": 1000 + "version": 0 } ], "query": { @@ -1092,7 +1092,7 @@ }, "v": 2 }, - "version": 1000 + "version": 0 } ], "query": { @@ -1308,7 +1308,7 @@ "value": { "v": 2 }, - "version": 1000 + "version": 0 } ], "query": { @@ -1567,7 +1567,7 @@ "value": { "v": 2 }, - "version": 1000 + "version": 0 } ], "query": { @@ -1858,7 +1858,7 @@ "local": 5, "remote": 2 }, - "version": 2000 + "version": 0 } ], "query": { @@ -5547,7 +5547,7 @@ "value": { "v": 2 }, - "version": 1000 + "version": 0 } ], "query": { @@ -5650,7 +5650,7 @@ "value": { "v": 2 }, - "version": 500 + "version": 0 } ], "query": {