Skip to content

Commit 12ff025

Browse files
Add test for getHighestListenSequenceNumber() recovery
1 parent d656e03 commit 12ff025

File tree

3 files changed

+33
-7
lines changed

3 files changed

+33
-7
lines changed

packages/firestore/src/local/indexeddb_persistence.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ import {
4545
DbPrimaryClient,
4646
DbPrimaryClientKey,
4747
DbTargetDocument,
48-
DbTargetGlobal,
4948
SCHEMA_VERSION,
5049
SchemaConverter
5150
} from './indexeddb_schema';
@@ -306,10 +305,13 @@ export class IndexedDbPersistence implements Persistence {
306305

307306
this.scheduleClientMetadataAndPrimaryLeaseRefreshes();
308307

309-
return this.simpleDb.runTransaction(
308+
return this.runTransaction(
309+
'getHighestListenSequenceNumber',
310310
'readonly',
311-
[DbTargetGlobal.store],
312-
txn => getHighestListenSequenceNumber(txn)
311+
txn =>
312+
getHighestListenSequenceNumber(
313+
(txn as IndexedDbTransaction).simpleDbTransaction
314+
)
313315
);
314316
})
315317
.then(highestListenSequenceNumber => {

packages/firestore/test/unit/local/indexeddb_persistence.test.ts

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
* limitations under the License.
1616
*/
1717

18-
import { expect } from 'chai';
18+
import * as chaiAsPromised from 'chai-as-promised';
19+
20+
import { expect, use } from 'chai';
1921
import { Query } from '../../../src/core/query';
2022
import { SnapshotVersion } from '../../../src/core/snapshot_version';
2123
import {
@@ -74,6 +76,8 @@ import {
7476
TEST_SERIALIZER
7577
} from './persistence_test_helpers';
7678

79+
use(chaiAsPromised);
80+
7781
/* eslint-disable no-restricted-globals */
7882

7983
function withDb(
@@ -1158,13 +1162,32 @@ describe('IndexedDb: allowTabSynchronization', () => {
11581162
'clientA',
11591163
/* multiClient= */ true,
11601164
async db => {
1161-
db.injectFailures = { updateClientMetadataAndTryBecomePrimary: true };
1165+
db.injectFailures = {
1166+
updateClientMetadataAndTryBecomePrimary: true,
1167+
getHighestListenSequenceNumber: false
1168+
};
11621169
await db.start();
11631170
await db.shutdown();
11641171
}
11651172
);
11661173
});
11671174

1175+
it('blocks start() when getHighestListenSequenceNumber() fails', async () => {
1176+
await withUnstartedCustomPersistence(
1177+
'clientA',
1178+
/* multiClient= */ false,
1179+
async db1 => {
1180+
db1.injectFailures = {
1181+
updateClientMetadataAndTryBecomePrimary: false,
1182+
getHighestListenSequenceNumber: true
1183+
};
1184+
await expect(db1.start()).to.eventually.be.rejectedWith(
1185+
'IndexedDB transaction failed'
1186+
);
1187+
}
1188+
);
1189+
});
1190+
11681191
it('ignores intermittent IndexedDbTransactionError during lease refresh', async () => {
11691192
await withPersistence('clientA', async (db, _, queue) => {
11701193
db.injectFailures = { updateClientMetadataAndTryBecomePrimary: true };

packages/firestore/test/unit/specs/spec_test_runner.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1215,7 +1215,8 @@ export type PersistenceAction =
12151215
| 'Get target data'
12161216
| 'Get new document changes'
12171217
| 'Synchronize last document change read time'
1218-
| 'updateClientMetadataAndTryBecomePrimary';
1218+
| 'updateClientMetadataAndTryBecomePrimary'
1219+
| 'getHighestListenSequenceNumber';
12191220

12201221
/** Specifies failure or success for a list of database actions. */
12211222
export type SpecDatabaseFailures = Partial<

0 commit comments

Comments
 (0)