@powersync/service-core-tests 0.14.0 → 0.15.1
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 +40 -0
- package/dist/test-utils/general-utils.d.ts +22 -3
- package/dist/test-utils/general-utils.js +56 -3
- package/dist/test-utils/general-utils.js.map +1 -1
- package/dist/test-utils/stream_utils.js +2 -2
- package/dist/test-utils/stream_utils.js.map +1 -1
- package/dist/tests/register-compacting-tests.d.ts +1 -1
- package/dist/tests/register-compacting-tests.js +360 -297
- package/dist/tests/register-compacting-tests.js.map +1 -1
- package/dist/tests/register-data-storage-checkpoint-tests.d.ts +1 -1
- package/dist/tests/register-data-storage-checkpoint-tests.js +59 -48
- package/dist/tests/register-data-storage-checkpoint-tests.js.map +1 -1
- package/dist/tests/register-data-storage-data-tests.d.ts +2 -2
- package/dist/tests/register-data-storage-data-tests.js +1112 -612
- package/dist/tests/register-data-storage-data-tests.js.map +1 -1
- package/dist/tests/register-data-storage-parameter-tests.d.ts +1 -1
- package/dist/tests/register-data-storage-parameter-tests.js +273 -254
- package/dist/tests/register-data-storage-parameter-tests.js.map +1 -1
- package/dist/tests/register-parameter-compacting-tests.d.ts +1 -1
- package/dist/tests/register-parameter-compacting-tests.js +83 -87
- package/dist/tests/register-parameter-compacting-tests.js.map +1 -1
- package/dist/tests/register-sync-tests.d.ts +2 -1
- package/dist/tests/register-sync-tests.js +479 -451
- package/dist/tests/register-sync-tests.js.map +1 -1
- package/dist/tests/util.d.ts +5 -4
- package/dist/tests/util.js +27 -12
- package/dist/tests/util.js.map +1 -1
- package/package.json +3 -3
- package/src/test-utils/general-utils.ts +81 -4
- package/src/test-utils/stream_utils.ts +2 -2
- package/src/tests/register-compacting-tests.ts +376 -322
- package/src/tests/register-data-storage-checkpoint-tests.ts +85 -53
- package/src/tests/register-data-storage-data-tests.ts +1050 -559
- package/src/tests/register-data-storage-parameter-tests.ts +330 -288
- package/src/tests/register-parameter-compacting-tests.ts +87 -90
- package/src/tests/register-sync-tests.ts +390 -380
- package/src/tests/util.ts +46 -17
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -12,15 +12,24 @@ import * as test_utils from '../test-utils/test-utils-index.js';
|
|
|
12
12
|
*
|
|
13
13
|
* ```
|
|
14
14
|
*/
|
|
15
|
-
export function registerDataStorageCheckpointTests(
|
|
15
|
+
export function registerDataStorageCheckpointTests(config: storage.TestStorageConfig) {
|
|
16
|
+
const generateStorageFactory = config.factory;
|
|
17
|
+
const storageVersion = config.storageVersion;
|
|
18
|
+
|
|
16
19
|
test('managed write checkpoints - checkpoint after write', async (context) => {
|
|
17
20
|
await using factory = await generateStorageFactory();
|
|
18
21
|
const r = await factory.configureSyncRules(
|
|
19
|
-
updateSyncRulesFromYaml(
|
|
22
|
+
updateSyncRulesFromYaml(
|
|
23
|
+
`
|
|
20
24
|
bucket_definitions:
|
|
21
25
|
mybucket:
|
|
22
26
|
data: []
|
|
23
|
-
|
|
27
|
+
`,
|
|
28
|
+
{
|
|
29
|
+
validate: false,
|
|
30
|
+
storageVersion
|
|
31
|
+
}
|
|
32
|
+
)
|
|
24
33
|
);
|
|
25
34
|
const bucketStorage = factory.getInstance(r.persisted_sync_rules!);
|
|
26
35
|
|
|
@@ -30,14 +39,15 @@ bucket_definitions:
|
|
|
30
39
|
.watchCheckpointChanges({ user_id: 'user1', signal: abortController.signal })
|
|
31
40
|
[Symbol.asyncIterator]();
|
|
32
41
|
|
|
42
|
+
await using writer = await bucketStorage.createWriter(test_utils.BATCH_OPTIONS);
|
|
43
|
+
await writer.markAllSnapshotDone('1/1');
|
|
44
|
+
|
|
33
45
|
const writeCheckpoint = await bucketStorage.createManagedWriteCheckpoint({
|
|
34
46
|
heads: { '1': '5/0' },
|
|
35
47
|
user_id: 'user1'
|
|
36
48
|
});
|
|
37
49
|
|
|
38
|
-
await
|
|
39
|
-
await batch.keepalive('5/0');
|
|
40
|
-
});
|
|
50
|
+
await writer.keepalive('5/0');
|
|
41
51
|
|
|
42
52
|
const result = await iter.next();
|
|
43
53
|
expect(result).toMatchObject({
|
|
@@ -55,23 +65,30 @@ bucket_definitions:
|
|
|
55
65
|
test('managed write checkpoints - write after checkpoint', async (context) => {
|
|
56
66
|
await using factory = await generateStorageFactory();
|
|
57
67
|
const r = await factory.configureSyncRules(
|
|
58
|
-
updateSyncRulesFromYaml(
|
|
68
|
+
updateSyncRulesFromYaml(
|
|
69
|
+
`
|
|
59
70
|
bucket_definitions:
|
|
60
71
|
mybucket:
|
|
61
72
|
data: []
|
|
62
|
-
|
|
73
|
+
`,
|
|
74
|
+
{
|
|
75
|
+
validate: false,
|
|
76
|
+
storageVersion
|
|
77
|
+
}
|
|
78
|
+
)
|
|
63
79
|
);
|
|
64
80
|
const bucketStorage = factory.getInstance(r.persisted_sync_rules!);
|
|
65
81
|
|
|
82
|
+
await using writer = await bucketStorage.createWriter(test_utils.BATCH_OPTIONS);
|
|
83
|
+
await writer.markAllSnapshotDone('1/1');
|
|
84
|
+
|
|
66
85
|
const abortController = new AbortController();
|
|
67
86
|
context.onTestFinished(() => abortController.abort());
|
|
68
87
|
const iter = bucketStorage
|
|
69
88
|
.watchCheckpointChanges({ user_id: 'user1', signal: abortController.signal })
|
|
70
89
|
[Symbol.asyncIterator]();
|
|
71
90
|
|
|
72
|
-
await
|
|
73
|
-
await batch.keepalive('5/0');
|
|
74
|
-
});
|
|
91
|
+
await writer.keepalive('5/0');
|
|
75
92
|
|
|
76
93
|
const result = await iter.next();
|
|
77
94
|
expect(result).toMatchObject({
|
|
@@ -92,9 +109,7 @@ bucket_definitions:
|
|
|
92
109
|
// We have to trigger a new keepalive after the checkpoint, at least to cover postgres storage.
|
|
93
110
|
// This is what is effetively triggered with RouteAPI.createReplicationHead().
|
|
94
111
|
// MongoDB storage doesn't explicitly need this anymore.
|
|
95
|
-
await
|
|
96
|
-
await batch.keepalive('6/0');
|
|
97
|
-
});
|
|
112
|
+
await writer.keepalive('6/0');
|
|
98
113
|
|
|
99
114
|
let result2 = await iter.next();
|
|
100
115
|
if (result2.value?.base?.lsn == '5/0') {
|
|
@@ -116,29 +131,36 @@ bucket_definitions:
|
|
|
116
131
|
test('custom write checkpoints - checkpoint after write', async (context) => {
|
|
117
132
|
await using factory = await generateStorageFactory();
|
|
118
133
|
const r = await factory.configureSyncRules(
|
|
119
|
-
updateSyncRulesFromYaml(
|
|
134
|
+
updateSyncRulesFromYaml(
|
|
135
|
+
`
|
|
120
136
|
bucket_definitions:
|
|
121
137
|
mybucket:
|
|
122
138
|
data: []
|
|
123
|
-
|
|
139
|
+
`,
|
|
140
|
+
{
|
|
141
|
+
validate: false,
|
|
142
|
+
storageVersion
|
|
143
|
+
}
|
|
144
|
+
)
|
|
124
145
|
);
|
|
125
146
|
const bucketStorage = factory.getInstance(r.persisted_sync_rules!);
|
|
126
147
|
bucketStorage.setWriteCheckpointMode(storage.WriteCheckpointMode.CUSTOM);
|
|
127
148
|
|
|
149
|
+
await using writer = await bucketStorage.createWriter(test_utils.BATCH_OPTIONS);
|
|
150
|
+
await writer.markAllSnapshotDone('1/1');
|
|
151
|
+
|
|
128
152
|
const abortController = new AbortController();
|
|
129
153
|
context.onTestFinished(() => abortController.abort());
|
|
130
154
|
const iter = bucketStorage
|
|
131
155
|
.watchCheckpointChanges({ user_id: 'user1', signal: abortController.signal })
|
|
132
156
|
[Symbol.asyncIterator]();
|
|
133
157
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
user_id: 'user1'
|
|
138
|
-
});
|
|
139
|
-
await batch.flush();
|
|
140
|
-
await batch.keepalive('5/0');
|
|
158
|
+
writer.addCustomWriteCheckpoint({
|
|
159
|
+
checkpoint: 5n,
|
|
160
|
+
user_id: 'user1'
|
|
141
161
|
});
|
|
162
|
+
await writer.flush();
|
|
163
|
+
await writer.keepalive('5/0');
|
|
142
164
|
|
|
143
165
|
const result = await iter.next();
|
|
144
166
|
expect(result).toMatchObject({
|
|
@@ -155,32 +177,39 @@ bucket_definitions:
|
|
|
155
177
|
test('custom write checkpoints - standalone checkpoint', async (context) => {
|
|
156
178
|
await using factory = await generateStorageFactory();
|
|
157
179
|
const r = await factory.configureSyncRules(
|
|
158
|
-
updateSyncRulesFromYaml(
|
|
180
|
+
updateSyncRulesFromYaml(
|
|
181
|
+
`
|
|
159
182
|
bucket_definitions:
|
|
160
183
|
mybucket:
|
|
161
184
|
data: []
|
|
162
|
-
|
|
185
|
+
`,
|
|
186
|
+
{
|
|
187
|
+
validate: false,
|
|
188
|
+
storageVersion
|
|
189
|
+
}
|
|
190
|
+
)
|
|
163
191
|
);
|
|
164
192
|
const bucketStorage = factory.getInstance(r.persisted_sync_rules!);
|
|
165
193
|
bucketStorage.setWriteCheckpointMode(storage.WriteCheckpointMode.CUSTOM);
|
|
166
194
|
|
|
195
|
+
await using writer = await bucketStorage.createWriter(test_utils.BATCH_OPTIONS);
|
|
196
|
+
await writer.markAllSnapshotDone('1/1');
|
|
197
|
+
|
|
167
198
|
const abortController = new AbortController();
|
|
168
199
|
context.onTestFinished(() => abortController.abort());
|
|
169
200
|
const iter = bucketStorage
|
|
170
201
|
.watchCheckpointChanges({ user_id: 'user1', signal: abortController.signal })
|
|
171
202
|
[Symbol.asyncIterator]();
|
|
172
203
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
await batch.flush();
|
|
204
|
+
// Flush to clear state
|
|
205
|
+
await writer.flush();
|
|
176
206
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
});
|
|
181
|
-
await batch.flush();
|
|
182
|
-
await batch.keepalive('5/0');
|
|
207
|
+
writer.addCustomWriteCheckpoint({
|
|
208
|
+
checkpoint: 5n,
|
|
209
|
+
user_id: 'user1'
|
|
183
210
|
});
|
|
211
|
+
await writer.flush();
|
|
212
|
+
await writer.keepalive('5/0');
|
|
184
213
|
|
|
185
214
|
const result = await iter.next();
|
|
186
215
|
expect(result).toMatchObject({
|
|
@@ -197,24 +226,31 @@ bucket_definitions:
|
|
|
197
226
|
test('custom write checkpoints - write after checkpoint', async (context) => {
|
|
198
227
|
await using factory = await generateStorageFactory();
|
|
199
228
|
const r = await factory.configureSyncRules(
|
|
200
|
-
updateSyncRulesFromYaml(
|
|
229
|
+
updateSyncRulesFromYaml(
|
|
230
|
+
`
|
|
201
231
|
bucket_definitions:
|
|
202
232
|
mybucket:
|
|
203
233
|
data: []
|
|
204
|
-
|
|
234
|
+
`,
|
|
235
|
+
{
|
|
236
|
+
validate: false,
|
|
237
|
+
storageVersion
|
|
238
|
+
}
|
|
239
|
+
)
|
|
205
240
|
);
|
|
206
241
|
const bucketStorage = factory.getInstance(r.persisted_sync_rules!);
|
|
207
242
|
bucketStorage.setWriteCheckpointMode(storage.WriteCheckpointMode.CUSTOM);
|
|
208
243
|
|
|
244
|
+
await using writer = await bucketStorage.createWriter(test_utils.BATCH_OPTIONS);
|
|
245
|
+
await writer.markAllSnapshotDone('1/1');
|
|
246
|
+
|
|
209
247
|
const abortController = new AbortController();
|
|
210
248
|
context.onTestFinished(() => abortController.abort());
|
|
211
249
|
const iter = bucketStorage
|
|
212
250
|
.watchCheckpointChanges({ user_id: 'user1', signal: abortController.signal })
|
|
213
251
|
[Symbol.asyncIterator]();
|
|
214
252
|
|
|
215
|
-
await
|
|
216
|
-
await batch.keepalive('5/0');
|
|
217
|
-
});
|
|
253
|
+
await writer.keepalive('5/0');
|
|
218
254
|
|
|
219
255
|
const result = await iter.next();
|
|
220
256
|
expect(result).toMatchObject({
|
|
@@ -227,14 +263,12 @@ bucket_definitions:
|
|
|
227
263
|
}
|
|
228
264
|
});
|
|
229
265
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
user_id: 'user1'
|
|
234
|
-
});
|
|
235
|
-
await batch.flush();
|
|
236
|
-
await batch.keepalive('6/0');
|
|
266
|
+
writer.addCustomWriteCheckpoint({
|
|
267
|
+
checkpoint: 6n,
|
|
268
|
+
user_id: 'user1'
|
|
237
269
|
});
|
|
270
|
+
await writer.flush();
|
|
271
|
+
await writer.keepalive('6/0');
|
|
238
272
|
|
|
239
273
|
let result2 = await iter.next();
|
|
240
274
|
expect(result2).toMatchObject({
|
|
@@ -248,14 +282,12 @@ bucket_definitions:
|
|
|
248
282
|
}
|
|
249
283
|
});
|
|
250
284
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
user_id: 'user1'
|
|
255
|
-
});
|
|
256
|
-
await batch.flush();
|
|
257
|
-
await batch.keepalive('7/0');
|
|
285
|
+
writer.addCustomWriteCheckpoint({
|
|
286
|
+
checkpoint: 7n,
|
|
287
|
+
user_id: 'user1'
|
|
258
288
|
});
|
|
289
|
+
await writer.flush();
|
|
290
|
+
await writer.keepalive('7/0');
|
|
259
291
|
|
|
260
292
|
let result3 = await iter.next();
|
|
261
293
|
expect(result3).toMatchObject({
|