@@ -304,23 +304,10 @@ void main() {
304304 await bucketStorage.saveSyncData (SyncDataBatch ([
305305 SyncBucketData (
306306 bucket: 'bucket1' ,
307- data: [
308- OplogEntry (
309- opId: '1' ,
310- op: OpType .move,
311- checksum: 1 ,
312- data: '{"target": "3"}' )
313- ],
307+ data: [OplogEntry (opId: '1' , op: OpType .move, checksum: 1 )],
314308 ),
315309 ]));
316310
317- // At this point, we have target: 3, but don't have that op yet, so we cannot sync.
318- final result = await bucketStorage.syncLocalDatabase (Checkpoint (
319- lastOpId: '2' ,
320- checksums: [BucketChecksum (bucket: 'bucket1' , checksum: 1 )]));
321- // Checksum passes, but we don't have a complete checkpoint
322- expect (result, equals (SyncLocalDatabaseResult (ready: false )));
323-
324311 await bucketStorage.saveSyncData (SyncDataBatch ([
325312 SyncBucketData (
326313 bucket: 'bucket1' ,
@@ -480,6 +467,99 @@ void main() {
480467 ]));
481468 });
482469
470+ test ('should compact with checksum wrapping' , () async {
471+ await bucketStorage.saveSyncData (SyncDataBatch ([
472+ SyncBucketData (bucket: 'bucket1' , data: [
473+ OplogEntry (
474+ opId: '1' ,
475+ op: OpType .put,
476+ rowType: 'assets' ,
477+ rowId: 'O1' ,
478+ data: '{"description": "b1"}' ,
479+ checksum: 2147483647 ),
480+ OplogEntry (
481+ opId: '2' ,
482+ op: OpType .put,
483+ rowType: 'assets' ,
484+ rowId: 'O1' ,
485+ data: '{"description": "b2"}' ,
486+ checksum: 2147483646 ),
487+ OplogEntry (
488+ opId: '3' ,
489+ op: OpType .put,
490+ rowType: 'assets' ,
491+ rowId: 'O1' ,
492+ data: '{"description": "b3"}' ,
493+ checksum: 2147483645 )
494+ ])
495+ ]));
496+
497+ await syncLocalChecked (Checkpoint (
498+ lastOpId: '4' ,
499+ writeCheckpoint: '4' ,
500+ checksums: [
501+ BucketChecksum (bucket: 'bucket1' , checksum: 2147483642 )
502+ ]));
503+
504+ await bucketStorage.forceCompact ();
505+
506+ await syncLocalChecked (Checkpoint (
507+ lastOpId: '4' ,
508+ writeCheckpoint: '4' ,
509+ checksums: [
510+ BucketChecksum (bucket: 'bucket1' , checksum: 2147483642 )
511+ ]));
512+
513+ final stats = db.select (
514+ 'SELECT row_type as type, row_id as id, count(*) as count FROM ps_oplog GROUP BY row_type, row_id ORDER BY row_type, row_id' );
515+ expect (
516+ stats,
517+ equals ([
518+ {'type' : 'assets' , 'id' : 'O1' , 'count' : 1 }
519+ ]));
520+ });
521+
522+ test ('should compact with checksum wrapping (2)' , () async {
523+ await bucketStorage.saveSyncData (SyncDataBatch ([
524+ SyncBucketData (bucket: 'bucket1' , data: [
525+ OplogEntry (
526+ opId: '1' ,
527+ op: OpType .put,
528+ rowType: 'assets' ,
529+ rowId: 'O1' ,
530+ data: '{"description": "b1"}' ,
531+ checksum: 2147483647 ),
532+ OplogEntry (
533+ opId: '2' ,
534+ op: OpType .put,
535+ rowType: 'assets' ,
536+ rowId: 'O1' ,
537+ data: '{"description": "b2"}' ,
538+ checksum: 2147483646 ),
539+ ])
540+ ]));
541+
542+ await syncLocalChecked (Checkpoint (
543+ lastOpId: '4' ,
544+ writeCheckpoint: '4' ,
545+ checksums: [BucketChecksum (bucket: 'bucket1' , checksum: - 3 )]));
546+
547+ await bucketStorage.forceCompact ();
548+
549+ await syncLocalChecked (Checkpoint (
550+ lastOpId: '4' ,
551+ writeCheckpoint: '4' ,
552+ checksums: [BucketChecksum (bucket: 'bucket1' , checksum: - 3 )]));
553+
554+ final stats = db.select (
555+ 'SELECT row_type as type, row_id as id, count(*) as count FROM ps_oplog GROUP BY row_type, row_id ORDER BY row_type, row_id' );
556+ expect (
557+ stats,
558+ equals ([
559+ {'type' : 'assets' , 'id' : 'O1' , 'count' : 1 }
560+ ]));
561+ });
562+
483563 test ('should not sync local db with pending crud - server removed' ,
484564 () async {
485565 await bucketStorage.saveSyncData (SyncDataBatch ([
0 commit comments