MCPcopy
hub / github.com/benbjohnson/litestream / TestDB_Verify_WALOffsetAtHeader_SaltMismatch

Function TestDB_Verify_WALOffsetAtHeader_SaltMismatch

db_internal_test.go:741–859  ·  view source on GitHub ↗

TestDB_Verify_WALOffsetAtHeader_SaltMismatch tests that verify() correctly triggers a snapshot when WALOffset=WALHeaderSize, WALSize=0, and the salt values don't match the current WAL header. Companion test to TestDB_Verify_WALOffsetAtHeader for full branch coverage.

(t *testing.T)

Source from the content-addressed store, hash-verified

739// values don't match the current WAL header.
740// Companion test to TestDB_Verify_WALOffsetAtHeader for full branch coverage.
741func TestDB_Verify_WALOffsetAtHeader_SaltMismatch(t *testing.T) {
742 dir := t.TempDir()
743 dbPath := filepath.Join(dir, "db")
744
745 db := NewDB(dbPath)
746 db.MonitorInterval = 0
747 db.Replica = NewReplica(db)
748 db.Replica.Client = &testReplicaClient{dir: t.TempDir()}
749 db.Replica.MonitorEnabled = false
750 if err := db.Open(); err != nil {
751 t.Fatal(err)
752 }
753 defer func() {
754 if err := db.Close(context.Background()); err != nil {
755 t.Fatal(err)
756 }
757 }()
758
759 sqldb, err := sql.Open("sqlite", dbPath)
760 if err != nil {
761 t.Fatal(err)
762 }
763 defer sqldb.Close()
764
765 if _, err := sqldb.Exec(`PRAGMA journal_mode = wal;`); err != nil {
766 t.Fatal(err)
767 }
768
769 if _, err := sqldb.Exec(`CREATE TABLE t (id INT)`); err != nil {
770 t.Fatal(err)
771 }
772
773 // Perform initial sync to set up page size and initial state
774 if err := db.Sync(context.Background()); err != nil {
775 t.Fatal(err)
776 }
777
778 // Read the WAL header to get current salt values
779 walHdr, err := readWALHeader(db.WALPath())
780 if err != nil {
781 t.Fatal(err)
782 }
783 salt1 := binary.BigEndian.Uint32(walHdr[16:])
784 salt2 := binary.BigEndian.Uint32(walHdr[20:])
785
786 // Create an LTX file with WALOffset=WALHeaderSize (32) and WALSize=0
787 // but with DIFFERENT salt values to simulate a salt reset
788 ltxDir := db.LTXLevelDir(0)
789 if err := os.MkdirAll(ltxDir, 0o755); err != nil {
790 t.Fatal(err)
791 }
792
793 // Get current position to determine next TXID
794 pos, err := db.Pos()
795 if err != nil {
796 t.Fatal(err)
797 }
798 nextTXID := pos.TXID + 1

Callers

nothing calls this directly

Calls 13

OpenMethod · 0.95
CloseMethod · 0.95
SyncMethod · 0.95
WALPathMethod · 0.95
LTXLevelDirMethod · 0.95
PosMethod · 0.95
LTXPathMethod · 0.95
invalidatePosCacheMethod · 0.95
verifyMethod · 0.95
NewReplicaFunction · 0.85
readWALHeaderFunction · 0.85
CreateMethod · 0.80

Tested by

no test coverage detected