@powersync/service-core-tests 0.15.5 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +44 -0
- package/dist/test-utils/AbstractStreamTestContext.d.ts +52 -0
- package/dist/test-utils/AbstractStreamTestContext.js +147 -0
- package/dist/test-utils/AbstractStreamTestContext.js.map +1 -0
- package/dist/test-utils/StorageDataHelpers.d.ts +3 -3
- package/dist/test-utils/StorageDataHelpers.js.map +1 -1
- package/dist/test-utils/general-utils.d.ts +13 -8
- package/dist/test-utils/general-utils.js +39 -25
- package/dist/test-utils/general-utils.js.map +1 -1
- package/dist/test-utils/test-utils-index.d.ts +1 -0
- package/dist/test-utils/test-utils-index.js +1 -0
- package/dist/test-utils/test-utils-index.js.map +1 -1
- package/dist/tests/register-compacting-tests.js +15 -8
- package/dist/tests/register-compacting-tests.js.map +1 -1
- package/dist/tests/register-data-storage-data-tests.js +104 -75
- package/dist/tests/register-data-storage-data-tests.js.map +1 -1
- package/dist/tests/register-data-storage-parameter-tests.js +48 -47
- package/dist/tests/register-data-storage-parameter-tests.js.map +1 -1
- package/dist/tests/register-sync-tests.js +6 -3
- package/dist/tests/register-sync-tests.js.map +1 -1
- package/dist/tests/util.d.ts +3 -4
- package/dist/tests/util.js +8 -5
- package/dist/tests/util.js.map +1 -1
- package/package.json +5 -5
- package/src/test-utils/AbstractStreamTestContext.ts +183 -0
- package/src/test-utils/StorageDataHelpers.ts +4 -4
- package/src/test-utils/general-utils.ts +52 -34
- package/src/test-utils/test-utils-index.ts +1 -0
- package/src/tests/register-compacting-tests.ts +15 -8
- package/src/tests/register-data-storage-data-tests.ts +130 -77
- package/src/tests/register-data-storage-parameter-tests.ts +62 -47
- package/src/tests/register-sync-tests.ts +6 -3
- package/src/tests/util.ts +14 -11
- package/tsconfig.json +4 -4
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,49 @@
|
|
|
1
1
|
# @powersync/service-core-tests
|
|
2
2
|
|
|
3
|
+
## 0.17.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- a91a08f: [Experimental] Enable incremental reprocessing for MongoDB source + MongoDB storage. This includes significant changes to the v3 storage format.
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies [a91a08f]
|
|
12
|
+
- Updated dependencies [184c39f]
|
|
13
|
+
- Updated dependencies [c3f75df]
|
|
14
|
+
- Updated dependencies [4bd35ea]
|
|
15
|
+
- @powersync/service-core@1.23.0
|
|
16
|
+
- @powersync/service-sync-rules@0.38.0
|
|
17
|
+
- @powersync/lib-services-framework@0.9.6
|
|
18
|
+
|
|
19
|
+
## 0.16.0
|
|
20
|
+
|
|
21
|
+
### Minor Changes
|
|
22
|
+
|
|
23
|
+
- e2bf1ad: [Internal] rework resolveTables to handle multiple SourceTables.
|
|
24
|
+
|
|
25
|
+
### Patch Changes
|
|
26
|
+
|
|
27
|
+
- Updated dependencies [17fd96b]
|
|
28
|
+
- Updated dependencies [6e2a57e]
|
|
29
|
+
- Updated dependencies [ec6df9f]
|
|
30
|
+
- Updated dependencies [99d33d5]
|
|
31
|
+
- Updated dependencies [cae92ce]
|
|
32
|
+
- Updated dependencies [5ac5345]
|
|
33
|
+
- Updated dependencies [15cb880]
|
|
34
|
+
- Updated dependencies [f2f5086]
|
|
35
|
+
- Updated dependencies [5b1b215]
|
|
36
|
+
- Updated dependencies [e2bf1ad]
|
|
37
|
+
- Updated dependencies [92cc83b]
|
|
38
|
+
- Updated dependencies [0aab0f9]
|
|
39
|
+
- Updated dependencies [15e2466]
|
|
40
|
+
- Updated dependencies [ebeaa3b]
|
|
41
|
+
- Updated dependencies [b116857]
|
|
42
|
+
- Updated dependencies [a94b6c3]
|
|
43
|
+
- @powersync/service-core@1.22.0
|
|
44
|
+
- @powersync/service-sync-rules@0.37.0
|
|
45
|
+
- @powersync/lib-services-framework@0.9.5
|
|
46
|
+
|
|
3
47
|
## 0.15.5
|
|
4
48
|
|
|
5
49
|
### Patch Changes
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { BucketStorageFactory, InternalOpId, storage, SyncRulesBucketStorage } from '@powersync/service-core';
|
|
2
|
+
export declare abstract class AbstractStreamTestContext implements AsyncDisposable {
|
|
3
|
+
protected abortController: AbortController;
|
|
4
|
+
protected syncRulesContent?: storage.PersistedSyncConfigContent;
|
|
5
|
+
protected replicationStream?: storage.PersistedReplicationStream;
|
|
6
|
+
storage?: SyncRulesBucketStorage;
|
|
7
|
+
protected settledReplicationPromise?: Promise<PromiseSettledResult<void>>;
|
|
8
|
+
abstract get factory(): BucketStorageFactory;
|
|
9
|
+
protected abstract get storageVersion(): number;
|
|
10
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
11
|
+
protected abstract _dispose(): Promise<void>;
|
|
12
|
+
dispose(): Promise<void>;
|
|
13
|
+
updateSyncRules(content: string): Promise<storage.SyncRulesBucketStorage>;
|
|
14
|
+
loadNextSyncRules(): Promise<storage.SyncRulesBucketStorage>;
|
|
15
|
+
loadActiveSyncRules(): Promise<storage.SyncRulesBucketStorage>;
|
|
16
|
+
private getSyncConfigContent;
|
|
17
|
+
/**
|
|
18
|
+
* Replicate a snapshot, start streaming, and wait for a consistent checkpoint.
|
|
19
|
+
*/
|
|
20
|
+
initializeReplication(): Promise<void>;
|
|
21
|
+
protected abstract triggerReplication(): Promise<void>;
|
|
22
|
+
protected abstract waitForInitialSnapshot(): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Replicate the initial snapshot, and start streaming.
|
|
25
|
+
*/
|
|
26
|
+
replicateSnapshot(): Promise<void>;
|
|
27
|
+
abstract getClientCheckpoint(options?: {
|
|
28
|
+
timeout?: number;
|
|
29
|
+
}): Promise<bigint>;
|
|
30
|
+
getCheckpoint(options?: {
|
|
31
|
+
timeout?: number;
|
|
32
|
+
}): Promise<bigint>;
|
|
33
|
+
getBucketsDataBatch(buckets: Record<string, InternalOpId>, options?: {
|
|
34
|
+
timeout?: number;
|
|
35
|
+
}): Promise<storage.SyncBucketDataChunk[]>;
|
|
36
|
+
/**
|
|
37
|
+
* This waits for a client checkpoint.
|
|
38
|
+
*/
|
|
39
|
+
getBucketData(bucket: string, start?: InternalOpId | string | undefined, options?: {
|
|
40
|
+
timeout?: number;
|
|
41
|
+
}): Promise<import("@powersync/service-core").OplogEntry<import("@powersync/service-core").StoredOplogData>[]>;
|
|
42
|
+
getChecksums(buckets: string[], options?: {
|
|
43
|
+
timeout?: number;
|
|
44
|
+
}): Promise<Map<any, any>>;
|
|
45
|
+
getChecksum(bucket: string, options?: {
|
|
46
|
+
timeout?: number;
|
|
47
|
+
}): Promise<any>;
|
|
48
|
+
/**
|
|
49
|
+
* This does not wait for a client checkpoint.
|
|
50
|
+
*/
|
|
51
|
+
getCurrentBucketData(bucket: string, start?: InternalOpId | string | undefined): Promise<import("@powersync/service-core").OplogEntry<import("@powersync/service-core").StoredOplogData>[]>;
|
|
52
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { ReplicationAbortedError } from '@powersync/lib-services-framework';
|
|
2
|
+
import { settledPromise, unsettledPromise, updateSyncRulesFromYaml } from '@powersync/service-core';
|
|
3
|
+
import { StorageDataHelpers } from './StorageDataHelpers.js';
|
|
4
|
+
import { bucketRequest } from './general-utils.js';
|
|
5
|
+
import { fromAsync } from './stream_utils.js';
|
|
6
|
+
export class AbstractStreamTestContext {
|
|
7
|
+
abortController = new AbortController();
|
|
8
|
+
syncRulesContent;
|
|
9
|
+
replicationStream;
|
|
10
|
+
storage;
|
|
11
|
+
settledReplicationPromise;
|
|
12
|
+
async [Symbol.asyncDispose]() {
|
|
13
|
+
await this.dispose();
|
|
14
|
+
}
|
|
15
|
+
async dispose() {
|
|
16
|
+
this.abortController.abort();
|
|
17
|
+
try {
|
|
18
|
+
await this.settledReplicationPromise;
|
|
19
|
+
await this._dispose();
|
|
20
|
+
await this.factory?.[Symbol.asyncDispose]();
|
|
21
|
+
}
|
|
22
|
+
catch (e) {
|
|
23
|
+
// Throwing here may result in SuppressedError. The underlying errors often don't show up
|
|
24
|
+
// in the test output, so we log it here.
|
|
25
|
+
// If we could get vitest to log SuppressedError.error and SuppressedError.suppressed, we
|
|
26
|
+
// could remove this.
|
|
27
|
+
console.error('Error during ConvexStreamTestContext dispose', e);
|
|
28
|
+
throw e;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async updateSyncRules(content) {
|
|
32
|
+
const stream = await this.factory.updateSyncRules(updateSyncRulesFromYaml(content, { validate: true, storageVersion: this.storageVersion }));
|
|
33
|
+
this.replicationStream = stream;
|
|
34
|
+
this.syncRulesContent = stream.syncConfigContent[0];
|
|
35
|
+
this.storage = this.factory.getInstance(stream);
|
|
36
|
+
return this.storage;
|
|
37
|
+
}
|
|
38
|
+
async loadNextSyncRules() {
|
|
39
|
+
const syncConfig = await this.factory.getDeployingSyncConfig();
|
|
40
|
+
if (syncConfig == null) {
|
|
41
|
+
throw new Error(`Next sync config not available`);
|
|
42
|
+
}
|
|
43
|
+
this.syncRulesContent = syncConfig.content;
|
|
44
|
+
this.replicationStream = syncConfig.replicationStream;
|
|
45
|
+
this.storage = syncConfig.storage;
|
|
46
|
+
return this.storage;
|
|
47
|
+
}
|
|
48
|
+
async loadActiveSyncRules() {
|
|
49
|
+
const syncConfig = await this.factory.getActiveSyncConfig();
|
|
50
|
+
if (syncConfig == null) {
|
|
51
|
+
throw new Error(`Active sync config not available`);
|
|
52
|
+
}
|
|
53
|
+
this.syncRulesContent = syncConfig.content;
|
|
54
|
+
this.replicationStream = syncConfig.replicationStream;
|
|
55
|
+
this.storage = syncConfig.storage;
|
|
56
|
+
return this.storage;
|
|
57
|
+
}
|
|
58
|
+
getSyncConfigContent() {
|
|
59
|
+
if (this.syncRulesContent == null) {
|
|
60
|
+
throw new Error('Sync config not configured - call updateSyncRules() first');
|
|
61
|
+
}
|
|
62
|
+
return this.syncRulesContent;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Replicate a snapshot, start streaming, and wait for a consistent checkpoint.
|
|
66
|
+
*/
|
|
67
|
+
async initializeReplication() {
|
|
68
|
+
await this.replicateSnapshot();
|
|
69
|
+
// Make sure we're up to date
|
|
70
|
+
await this.getCheckpoint();
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Replicate the initial snapshot, and start streaming.
|
|
74
|
+
*/
|
|
75
|
+
async replicateSnapshot() {
|
|
76
|
+
// Use a settledPromise to avoid unhandled rejections
|
|
77
|
+
this.settledReplicationPromise = settledPromise(this.triggerReplication());
|
|
78
|
+
try {
|
|
79
|
+
await Promise.race([unsettledPromise(this.settledReplicationPromise), this.waitForInitialSnapshot()]);
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
if (e instanceof ReplicationAbortedError && e.cause != null) {
|
|
83
|
+
// Edge case for tests: replicate() can throw an error, but we'd receive the ReplicationAbortedError from
|
|
84
|
+
// waitForInitialSnapshot() first. In that case, prioritize the cause, e.g. MissingReplicationSlotError.
|
|
85
|
+
// This is not a concern for production use, since we only use waitForInitialSnapshot() in tests.
|
|
86
|
+
throw e.cause;
|
|
87
|
+
}
|
|
88
|
+
throw e;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async getCheckpoint(options) {
|
|
92
|
+
let checkpoint = await Promise.race([
|
|
93
|
+
this.getClientCheckpoint(options),
|
|
94
|
+
unsettledPromise(this.settledReplicationPromise)
|
|
95
|
+
]);
|
|
96
|
+
if (checkpoint == null) {
|
|
97
|
+
// This indicates an issue with the test setup - replicationPromise completed instead
|
|
98
|
+
// of getClientCheckpoint()
|
|
99
|
+
throw new Error('Test failure - replicationPromise completed');
|
|
100
|
+
}
|
|
101
|
+
return checkpoint;
|
|
102
|
+
}
|
|
103
|
+
async getBucketsDataBatch(buckets, options) {
|
|
104
|
+
const helpers = new StorageDataHelpers(this.storage, this.getSyncConfigContent());
|
|
105
|
+
const checkpoint = await this.getCheckpoint(options);
|
|
106
|
+
return helpers.getBucketsDataBatch(buckets, checkpoint);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* This waits for a client checkpoint.
|
|
110
|
+
*/
|
|
111
|
+
async getBucketData(bucket, start, options) {
|
|
112
|
+
const helpers = new StorageDataHelpers(this.storage, this.getSyncConfigContent());
|
|
113
|
+
const checkpoint = await this.getCheckpoint(options);
|
|
114
|
+
return helpers.getBucketData(bucket, checkpoint, start);
|
|
115
|
+
}
|
|
116
|
+
async getChecksums(buckets, options) {
|
|
117
|
+
const checkpoint = await this.getCheckpoint(options);
|
|
118
|
+
const syncConfigContent = this.getSyncConfigContent();
|
|
119
|
+
const versionedBuckets = buckets.map((bucket) => bucketRequest(syncConfigContent, bucket, 0n));
|
|
120
|
+
const checksums = await this.storage.getChecksums(checkpoint, versionedBuckets);
|
|
121
|
+
const unversioned = new Map();
|
|
122
|
+
for (let i = 0; i < buckets.length; i++) {
|
|
123
|
+
unversioned.set(buckets[i], checksums.get(versionedBuckets[i].bucket));
|
|
124
|
+
}
|
|
125
|
+
return unversioned;
|
|
126
|
+
}
|
|
127
|
+
async getChecksum(bucket, options) {
|
|
128
|
+
const checksums = await this.getChecksums([bucket], options);
|
|
129
|
+
return checksums.get(bucket);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* This does not wait for a client checkpoint.
|
|
133
|
+
*/
|
|
134
|
+
async getCurrentBucketData(bucket, start) {
|
|
135
|
+
start ??= 0n;
|
|
136
|
+
if (typeof start == 'string') {
|
|
137
|
+
start = BigInt(start);
|
|
138
|
+
}
|
|
139
|
+
const syncConfigContent = this.getSyncConfigContent();
|
|
140
|
+
const { checkpoint } = await this.storage.getCheckpoint();
|
|
141
|
+
const map = [bucketRequest(syncConfigContent, bucket, start)];
|
|
142
|
+
const batch = this.storage.getBucketDataBatch(checkpoint, map);
|
|
143
|
+
const batches = await fromAsync(batch);
|
|
144
|
+
return batches[0]?.chunkData.data ?? [];
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=AbstractStreamTestContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AbstractStreamTestContext.js","sourceRoot":"","sources":["../../src/test-utils/AbstractStreamTestContext.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { InternalOpId, OplogEntry,
|
|
1
|
+
import { InternalOpId, OplogEntry, ParsedSyncConfigSet, PersistedSyncConfigContent, SyncRulesBucketStorage } from '@powersync/service-core';
|
|
2
2
|
export declare class StorageDataHelpers {
|
|
3
3
|
storage: SyncRulesBucketStorage;
|
|
4
|
-
syncRules:
|
|
5
|
-
constructor(storage: SyncRulesBucketStorage, syncRules:
|
|
4
|
+
syncRules: PersistedSyncConfigContent | ParsedSyncConfigSet;
|
|
5
|
+
constructor(storage: SyncRulesBucketStorage, syncRules: PersistedSyncConfigContent | ParsedSyncConfigSet);
|
|
6
6
|
getBucketData(bucket: string, checkpoint: InternalOpId, start?: InternalOpId | string | undefined): Promise<OplogEntry<import("@powersync/service-core").StoredOplogData>[]>;
|
|
7
7
|
getBucketsDataBatch(buckets: Record<string, InternalOpId>, checkpoint: InternalOpId): Promise<import("@powersync/service-core").SyncBucketDataChunk[]>;
|
|
8
8
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StorageDataHelpers.js","sourceRoot":"","sources":["../../src/test-utils/StorageDataHelpers.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,OAAO,kBAAkB;IAC7B,OAAO,CAAyB;IAChC,SAAS,
|
|
1
|
+
{"version":3,"file":"StorageDataHelpers.js","sourceRoot":"","sources":["../../src/test-utils/StorageDataHelpers.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,OAAO,kBAAkB;IAC7B,OAAO,CAAyB;IAChC,SAAS,CAAmD;IAE5D,YAAY,OAA+B,EAAE,SAA2D;QACtG,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAAc,EAAE,UAAwB,EAAE,KAAyC;QACrG,KAAK,KAAK,EAAE,CAAC;QACb,IAAI,OAAO,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,GAAG,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QACzD,IAAI,IAAI,GAAiB,EAAE,CAAC;QAC5B,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,IAAI,CAAC,OAAQ,CAAC,kBAAkB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;YAEhE,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;YACvC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YACrD,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;gBAC3D,MAAM;YACR,CAAC;YACD,GAAG,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,OAAqC,EAAE,UAAwB;QACvF,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QAC3G,OAAO,SAAS,CAAC,IAAI,CAAC,OAAQ,CAAC,kBAAkB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;IACtE,CAAC;CACF"}
|
|
@@ -2,17 +2,22 @@ import { BucketDataRequest, InternalOpId, storage, utils } from '@powersync/serv
|
|
|
2
2
|
import { GetQuerierOptions, RequestParameters } from '@powersync/service-sync-rules';
|
|
3
3
|
import * as bson from 'bson';
|
|
4
4
|
export declare const ZERO_LSN = "0/0";
|
|
5
|
-
export declare const PARSE_OPTIONS: storage.
|
|
5
|
+
export declare const PARSE_OPTIONS: storage.ParseSyncConfigOptions;
|
|
6
6
|
export declare const BATCH_OPTIONS: storage.CreateWriterOptions;
|
|
7
|
-
export declare function makeTestTable(name: string, replicaIdColumns?: string[] | undefined, options?: {
|
|
8
|
-
tableIdStrings: boolean;
|
|
9
|
-
}): storage.SourceTable;
|
|
10
7
|
/**
|
|
11
|
-
*
|
|
8
|
+
* Deploy a sync config and return both the replication stream (for {@link storage.BucketStorageFactory.getInstance})
|
|
9
|
+
* and the deployed config content (for parsing / bucket requests).
|
|
12
10
|
*
|
|
13
|
-
*
|
|
11
|
+
* Replication streams and sync config content are separate concerns since one stream can hold multiple configs.
|
|
12
|
+
*/
|
|
13
|
+
export declare function deploySyncRules(factory: storage.BucketStorageFactory, options: storage.UpdateSyncRulesOptions): Promise<{
|
|
14
|
+
stream: storage.PersistedReplicationStream;
|
|
15
|
+
content: storage.PersistedSyncConfigContent;
|
|
16
|
+
}>;
|
|
17
|
+
/**
|
|
18
|
+
* With newer storage versions, we need actual test tables, resolved via the writer.
|
|
14
19
|
*/
|
|
15
|
-
export declare function resolveTestTable(
|
|
20
|
+
export declare function resolveTestTable(writer: storage.BucketStorageBatch, name: string, replicaIdColumns: string[] | undefined, options: {
|
|
16
21
|
tableIdStrings: boolean;
|
|
17
22
|
}, idIndex?: number): Promise<storage.SourceTable>;
|
|
18
23
|
export declare function getBatchData(batch: utils.SyncBucketData[] | storage.SyncBucketDataChunk[] | storage.SyncBucketDataChunk): {
|
|
@@ -25,7 +30,7 @@ export declare function getBatchData(batch: utils.SyncBucketData[] | storage.Syn
|
|
|
25
30
|
* Bucket names no longer purely depend on the sync config.
|
|
26
31
|
* This converts a bucket name like "global[]" into the actual bucket name, for use in tests.
|
|
27
32
|
*/
|
|
28
|
-
export declare function bucketRequest(syncRules: storage.
|
|
33
|
+
export declare function bucketRequest(syncRules: storage.PersistedSyncConfigContent | storage.ParsedSyncConfigSet, bucket: string, start?: InternalOpId | string | number): BucketDataRequest;
|
|
29
34
|
export declare function getBatchMeta(batch: utils.SyncBucketData[] | storage.SyncBucketDataChunk[] | storage.SyncBucketDataChunk): {
|
|
30
35
|
has_more: boolean;
|
|
31
36
|
after: string;
|
|
@@ -10,39 +10,52 @@ export const BATCH_OPTIONS = {
|
|
|
10
10
|
zeroLSN: ZERO_LSN,
|
|
11
11
|
storeCurrentData: true
|
|
12
12
|
};
|
|
13
|
-
export function makeTestTable(name, replicaIdColumns, options) {
|
|
14
|
-
const relId = utils.hashData('table', name, (replicaIdColumns ?? ['id']).join(','));
|
|
15
|
-
const id = options?.tableIdStrings == false ? new bson.ObjectId('6544e3899293153fa7b38331') : '6544e3899293153fa7b38331';
|
|
16
|
-
return new storage.SourceTable({
|
|
17
|
-
id: id,
|
|
18
|
-
connectionTag: storage.SourceTable.DEFAULT_TAG,
|
|
19
|
-
objectId: relId,
|
|
20
|
-
schema: 'public',
|
|
21
|
-
name: name,
|
|
22
|
-
replicaIdColumns: (replicaIdColumns ?? ['id']).map((column) => ({ name: column, type: 'VARCHAR', typeId: 25 })),
|
|
23
|
-
snapshotComplete: true
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
13
|
/**
|
|
27
|
-
*
|
|
14
|
+
* Deploy a sync config and return both the replication stream (for {@link storage.BucketStorageFactory.getInstance})
|
|
15
|
+
* and the deployed config content (for parsing / bucket requests).
|
|
28
16
|
*
|
|
29
|
-
*
|
|
17
|
+
* Replication streams and sync config content are separate concerns since one stream can hold multiple configs.
|
|
18
|
+
*/
|
|
19
|
+
export async function deploySyncRules(factory, options) {
|
|
20
|
+
const stream = await factory.updateSyncRules(options);
|
|
21
|
+
const content = stream.syncConfigContent[0];
|
|
22
|
+
return { stream, content };
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* With newer storage versions, we need actual test tables, resolved via the writer.
|
|
30
26
|
*/
|
|
31
|
-
export async function resolveTestTable(
|
|
27
|
+
export async function resolveTestTable(writer, name, replicaIdColumns, options, idIndex = 1) {
|
|
28
|
+
void idIndex;
|
|
29
|
+
void options;
|
|
32
30
|
const relId = utils.hashData('table', name, (replicaIdColumns ?? ['id']).join(','));
|
|
33
|
-
//
|
|
34
|
-
//
|
|
31
|
+
// Semi-hardcoded id for tests, to get consistent output.
|
|
32
|
+
// If the same test uses multiple tables, pass idIndex to get different ids.
|
|
35
33
|
const idString = '6544e3899293153fa7b383' + (30 + idIndex).toString().padStart(2, '0');
|
|
36
34
|
const id = options.tableIdStrings == false ? new bson.ObjectId(idString) : idString;
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
let didGenerateId = false;
|
|
36
|
+
const source = {
|
|
39
37
|
connectionTag: storage.SourceTable.DEFAULT_TAG,
|
|
40
38
|
objectId: relId,
|
|
41
39
|
schema: 'public',
|
|
42
40
|
name: name,
|
|
43
|
-
replicaIdColumns: (replicaIdColumns ?? ['id']).map((column) => ({ name: column, type: 'VARCHAR', typeId: 25 }))
|
|
44
|
-
|
|
41
|
+
replicaIdColumns: (replicaIdColumns ?? ['id']).map((column) => ({ name: column, type: 'VARCHAR', typeId: 25 }))
|
|
42
|
+
};
|
|
43
|
+
const resolved = await writer.resolveTables({
|
|
44
|
+
connection_id: 1,
|
|
45
|
+
source,
|
|
46
|
+
idGenerator: () => {
|
|
47
|
+
if (didGenerateId) {
|
|
48
|
+
throw new Error('idGenerator called multiple times - not supported in tests');
|
|
49
|
+
}
|
|
50
|
+
didGenerateId = true;
|
|
51
|
+
return id;
|
|
52
|
+
}
|
|
45
53
|
});
|
|
54
|
+
const table = resolved.tables[0];
|
|
55
|
+
if (table == null) {
|
|
56
|
+
throw new Error(`Failed to resolve test table ${source.schema}.${source.name}`);
|
|
57
|
+
}
|
|
58
|
+
return table;
|
|
46
59
|
}
|
|
47
60
|
export function getBatchData(batch) {
|
|
48
61
|
const first = getFirst(batch);
|
|
@@ -59,7 +72,7 @@ export function getBatchData(batch) {
|
|
|
59
72
|
});
|
|
60
73
|
}
|
|
61
74
|
function isParsedSyncRules(syncRules) {
|
|
62
|
-
return syncRules.
|
|
75
|
+
return syncRules.syncConfigs !== undefined;
|
|
63
76
|
}
|
|
64
77
|
/**
|
|
65
78
|
* Bucket names no longer purely depend on the sync config.
|
|
@@ -71,9 +84,10 @@ export function bucketRequest(syncRules, bucket, start) {
|
|
|
71
84
|
const parameterStart = bucket.indexOf('[');
|
|
72
85
|
const definitionName = bucket.substring(0, parameterStart);
|
|
73
86
|
const parameters = bucket.substring(parameterStart);
|
|
74
|
-
const
|
|
87
|
+
const availableSources = parsed.syncConfigs.flatMap((config) => config.config.bucketDataSources);
|
|
88
|
+
const source = availableSources.find((b) => b.uniqueName === definitionName);
|
|
75
89
|
if (source == null) {
|
|
76
|
-
throw new Error(`Failed to find global bucket ${bucket}`);
|
|
90
|
+
throw new Error(`Failed to find global bucket ${bucket}. Available: ${availableSources.map((s) => s.uniqueName).join(',')}`);
|
|
77
91
|
}
|
|
78
92
|
const bucketName = hydrationState.getBucketSourceScope(source).bucketPrefix + parameters;
|
|
79
93
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"general-utils.js","sourceRoot":"","sources":["../../src/test-utils/general-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmC,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACtG,OAAO,EAAqB,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACrF,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,CAAC;AAE9B,MAAM,CAAC,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"general-utils.js","sourceRoot":"","sources":["../../src/test-utils/general-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-utils-index.js","sourceRoot":"","sources":["../../src/test-utils/test-utils-index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"test-utils-index.js","sourceRoot":"","sources":["../../src/test-utils/test-utils-index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC"}
|
|
@@ -13,6 +13,7 @@ bucket_definitions:
|
|
|
13
13
|
data: [select * from test]
|
|
14
14
|
`));
|
|
15
15
|
const bucketStorage = factory.getInstance(syncRules);
|
|
16
|
+
const syncRulesContent = syncRules.syncConfigContent[0];
|
|
16
17
|
await using writer = await bucketStorage.createWriter(test_utils.BATCH_OPTIONS);
|
|
17
18
|
const testTable = await test_utils.resolveTestTable(writer, 'test', ['id'], config);
|
|
18
19
|
await writer.markAllSnapshotDone('1/1');
|
|
@@ -43,7 +44,7 @@ bucket_definitions:
|
|
|
43
44
|
await writer.commit('1/1');
|
|
44
45
|
await writer.flush();
|
|
45
46
|
const checkpoint = writer.last_flushed_op;
|
|
46
|
-
const request = bucketRequest(
|
|
47
|
+
const request = bucketRequest(syncRulesContent, 'global[]');
|
|
47
48
|
const batchBefore = await test_utils.oneFromAsync(bucketStorage.getBucketDataBatch(checkpoint, [request]));
|
|
48
49
|
const dataBefore = batchBefore.chunkData.data;
|
|
49
50
|
const checksumBefore = await bucketStorage.getChecksums(checkpoint, [request]);
|
|
@@ -104,6 +105,7 @@ bucket_definitions:
|
|
|
104
105
|
data: [select * from test]
|
|
105
106
|
`));
|
|
106
107
|
const bucketStorage = factory.getInstance(syncRules);
|
|
108
|
+
const syncRulesContent = syncRules.syncConfigContent[0];
|
|
107
109
|
await using writer = await bucketStorage.createWriter(test_utils.BATCH_OPTIONS);
|
|
108
110
|
const testTable = await test_utils.resolveTestTable(writer, 'test', ['id'], config);
|
|
109
111
|
await writer.markAllSnapshotDone('1/1');
|
|
@@ -142,7 +144,7 @@ bucket_definitions:
|
|
|
142
144
|
await writer.commit('1/1');
|
|
143
145
|
await writer.flush();
|
|
144
146
|
const checkpoint = writer.last_flushed_op;
|
|
145
|
-
const request = bucketRequest(
|
|
147
|
+
const request = bucketRequest(syncRulesContent, 'global[]');
|
|
146
148
|
const batchBefore = await test_utils.oneFromAsync(bucketStorage.getBucketDataBatch(checkpoint, [request]));
|
|
147
149
|
const dataBefore = batchBefore.chunkData.data;
|
|
148
150
|
const checksumBefore = await bucketStorage.getChecksums(checkpoint, [request]);
|
|
@@ -202,6 +204,7 @@ bucket_definitions:
|
|
|
202
204
|
data: [select * from test]
|
|
203
205
|
`));
|
|
204
206
|
const bucketStorage = factory.getInstance(syncRules);
|
|
207
|
+
const syncRulesContent = syncRules.syncConfigContent[0];
|
|
205
208
|
await using writer = await bucketStorage.createWriter(test_utils.BATCH_OPTIONS);
|
|
206
209
|
const testTable = await test_utils.resolveTestTable(writer, 'test', ['id'], config);
|
|
207
210
|
await writer.markAllSnapshotDone('1/1');
|
|
@@ -232,7 +235,7 @@ bucket_definitions:
|
|
|
232
235
|
await writer.commit('1/1');
|
|
233
236
|
await writer.flush();
|
|
234
237
|
const checkpoint1 = writer.last_flushed_op;
|
|
235
|
-
const request = bucketRequest(
|
|
238
|
+
const request = bucketRequest(syncRulesContent, 'global[]');
|
|
236
239
|
await using writer2 = await bucketStorage.createWriter(test_utils.BATCH_OPTIONS);
|
|
237
240
|
const testTable2 = await test_utils.resolveTestTable(writer2, 'test', ['id'], config);
|
|
238
241
|
await writer2.save({
|
|
@@ -279,6 +282,7 @@ bucket_definitions:
|
|
|
279
282
|
data:
|
|
280
283
|
- select * from test where b = bucket.b`));
|
|
281
284
|
const bucketStorage = factory.getInstance(syncRules);
|
|
285
|
+
const syncRulesContent = syncRules.syncConfigContent[0];
|
|
282
286
|
await using writer = await bucketStorage.createWriter(test_utils.BATCH_OPTIONS);
|
|
283
287
|
const testTable = await test_utils.resolveTestTable(writer, 'test', ['id'], config);
|
|
284
288
|
await writer.markAllSnapshotDone('1/1');
|
|
@@ -351,7 +355,7 @@ bucket_definitions:
|
|
|
351
355
|
minBucketChanges: 1,
|
|
352
356
|
minChangeRatio: 0
|
|
353
357
|
});
|
|
354
|
-
const batchAfter = await test_utils.fromAsync(bucketStorage.getBucketDataBatch(checkpoint, bucketRequestMap(
|
|
358
|
+
const batchAfter = await test_utils.fromAsync(bucketStorage.getBucketDataBatch(checkpoint, bucketRequestMap(syncRulesContent, [
|
|
355
359
|
['grouped["b1"]', 0n],
|
|
356
360
|
['grouped["b2"]', 0n]
|
|
357
361
|
])));
|
|
@@ -388,6 +392,7 @@ bucket_definitions:
|
|
|
388
392
|
data: [select * from test]
|
|
389
393
|
`));
|
|
390
394
|
const bucketStorage = factory.getInstance(syncRules);
|
|
395
|
+
const syncRulesContent = syncRules.syncConfigContent[0];
|
|
391
396
|
await using writer = await bucketStorage.createWriter(test_utils.BATCH_OPTIONS);
|
|
392
397
|
const testTable = await test_utils.resolveTestTable(writer, 'test', ['id'], config);
|
|
393
398
|
await writer.markAllSnapshotDone('1/1');
|
|
@@ -437,7 +442,7 @@ bucket_definitions:
|
|
|
437
442
|
await writer2.commit('2/1');
|
|
438
443
|
await writer2.flush();
|
|
439
444
|
const checkpoint2 = writer2.last_flushed_op;
|
|
440
|
-
const request = bucketRequest(
|
|
445
|
+
const request = bucketRequest(syncRulesContent, 'global[]');
|
|
441
446
|
await bucketStorage.clearChecksumCache();
|
|
442
447
|
const checksumAfter = await bucketStorage.getChecksums(checkpoint2, [request]);
|
|
443
448
|
const globalChecksum = checksumAfter.get(request.bucket);
|
|
@@ -456,6 +461,7 @@ bucket_definitions:
|
|
|
456
461
|
data: [select * from test]
|
|
457
462
|
`));
|
|
458
463
|
const bucketStorage = factory.getInstance(syncRules);
|
|
464
|
+
const syncRulesContent = syncRules.syncConfigContent[0];
|
|
459
465
|
await using writer = await bucketStorage.createWriter(test_utils.BATCH_OPTIONS);
|
|
460
466
|
const testTable = await test_utils.resolveTestTable(writer, 'test', ['id'], config);
|
|
461
467
|
await writer.markAllSnapshotDone('1/1');
|
|
@@ -478,7 +484,7 @@ bucket_definitions:
|
|
|
478
484
|
await writer.commit('1/1');
|
|
479
485
|
await writer.flush();
|
|
480
486
|
// Get checksums here just to populate the cache
|
|
481
|
-
await bucketStorage.getChecksums(writer.last_flushed_op, bucketRequests(
|
|
487
|
+
await bucketStorage.getChecksums(writer.last_flushed_op, bucketRequests(syncRulesContent, ['global[]']));
|
|
482
488
|
await using writer2 = await bucketStorage.createWriter(test_utils.BATCH_OPTIONS);
|
|
483
489
|
const testTable2 = await test_utils.resolveTestTable(writer2, 'test', ['id'], config);
|
|
484
490
|
await writer2.save({
|
|
@@ -499,7 +505,7 @@ bucket_definitions:
|
|
|
499
505
|
minChangeRatio: 0
|
|
500
506
|
});
|
|
501
507
|
const checkpoint2 = writer2.last_flushed_op;
|
|
502
|
-
const request = bucketRequest(
|
|
508
|
+
const request = bucketRequest(syncRulesContent, 'global[]');
|
|
503
509
|
// Check that the checksum was correctly updated with the clear operation after having a cached checksum
|
|
504
510
|
const checksumAfter = await bucketStorage.getChecksums(checkpoint2, [request]);
|
|
505
511
|
const globalChecksum = checksumAfter.get(request.bucket);
|
|
@@ -518,6 +524,7 @@ bucket_definitions:
|
|
|
518
524
|
data: [select * from test]
|
|
519
525
|
`));
|
|
520
526
|
const bucketStorage = factory.getInstance(syncRules);
|
|
527
|
+
const syncRulesContent = syncRules.syncConfigContent[0];
|
|
521
528
|
await using writer = await bucketStorage.createWriter(test_utils.BATCH_OPTIONS);
|
|
522
529
|
const testTable = await test_utils.resolveTestTable(writer, 'test', ['id'], config);
|
|
523
530
|
await writer.markAllSnapshotDone('1/1');
|
|
@@ -550,7 +557,7 @@ bucket_definitions:
|
|
|
550
557
|
minBucketChanges: 1,
|
|
551
558
|
minChangeRatio: 0
|
|
552
559
|
});
|
|
553
|
-
const batchAfterDefaultCompact = await test_utils.oneFromAsync(bucketStorage.getBucketDataBatch(checkpoint2, bucketRequestMap(
|
|
560
|
+
const batchAfterDefaultCompact = await test_utils.oneFromAsync(bucketStorage.getBucketDataBatch(checkpoint2, bucketRequestMap(syncRulesContent, [['global[]', 0n]])));
|
|
554
561
|
// Operation 1 should remain a PUT because op_id=2 is above the default maxOpId checkpoint.
|
|
555
562
|
expect(batchAfterDefaultCompact.chunkData.data).toMatchObject([
|
|
556
563
|
{ op_id: '1', op: 'PUT', object_id: 't1' },
|