@@ -403,6 +403,55 @@ void main() {
403403 expect ((await repository.load ()).snapshot! .content, 'safe' );
404404 });
405405
406+ test (
407+ 'oversized otherwise-valid metadata is refused before hydration' ,
408+ () async {
409+ await repository.write (snapshot ('safe' ), expectedGeneration: 0 );
410+ await repository.close ();
411+ final sqlite.Database db = sqlite.sqlite3.open (file.path);
412+ final Map <String , dynamic > metadata =
413+ jsonDecode (
414+ db
415+ .select (
416+ "SELECT value FROM settings WHERE key = 'current_text_draft'" ,
417+ )
418+ .single['value' ]
419+ as String ,
420+ )
421+ as Map <String , dynamic >;
422+ metadata['unexpected_padding' ] = 'é' * 4096 ;
423+ db.execute (
424+ "UPDATE settings SET value = ? WHERE key = 'current_text_draft'" ,
425+ < Object > [jsonEncode (metadata)],
426+ );
427+ db.close ();
428+ final List <int > before = await file.readAsBytes ();
429+ await expectLater (
430+ DriftDraftRepository .open (file),
431+ failure (DraftStorageFailure .corrupt),
432+ );
433+ expect (await file.readAsBytes (), before);
434+ },
435+ );
436+
437+ test (
438+ 'extra internal project rows are refused without losing storage' ,
439+ () async {
440+ await repository.close ();
441+ final sqlite.Database db = sqlite.sqlite3.open (file.path);
442+ db.execute (
443+ "INSERT INTO projects (id, name, created_at, updated_at) VALUES ('extra', 'extra', 0, 0)" ,
444+ );
445+ db.close ();
446+ final List <int > before = await file.readAsBytes ();
447+ await expectLater (
448+ DriftDraftRepository .open (file),
449+ failure (DraftStorageFailure .corrupt),
450+ );
451+ expect (await file.readAsBytes (), before);
452+ },
453+ );
454+
406455 test (
407456 'process kill before, during and after commit yields only whole checkpoints' ,
408457 () async {
0 commit comments