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)
| 739 | // values don't match the current WAL header. |
| 740 | // Companion test to TestDB_Verify_WALOffsetAtHeader for full branch coverage. |
| 741 | func 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 |
nothing calls this directly
no test coverage detected