package main import ( "encoding/binary" "testing" "git.ycl.pub/yl32940/TsDB2/DB/core" ) // 构造一个 CRC 自洽的头页字节块 (Magic + Version + Comment + 正确 CRC)。 func buildHeaderPage(t *testing.T, version uint32, comment string) []byte { t.Helper() b := make([]byte, 4096) copy(b[0:4], "VRTX") binary.LittleEndian.PutUint32(b[4:8], version) copy(b[332:], comment) // 与 core.PrepareWrite 同法: 清零 CRC 字段后整页散列 for i := 84; i < 88; i++ { b[i] = 0 } binary.LittleEndian.PutUint32(b[84:88], core.XXH32(b)) return b } func TestCheckHeaderCrc(t *testing.T) { // 正常: CRC 自洽 → OK ok := buildHeaderPage(t, 11, "hello") if v, d := checkHeaderCrc(ok, 11); v != "OK" { t.Fatalf("自洽头页应 OK, 得到 %s (%s)", v, d) } // 损坏: 改 Comment 区一字节 → CRC 不符 bad := buildHeaderPage(t, 11, "hello") bad[400] ^= 0x01 if v, _ := checkHeaderCrc(bad, 11); v != "CRC 不符" { t.Fatalf("损坏头页应 CRC 不符, 得到 %s", v) } // 旧库: v11 且 CRC==0 → 跳过 legacy := buildHeaderPage(t, 11, "old") for i := 84; i < 88; i++ { legacy[i] = 0 } if v, _ := checkHeaderCrc(legacy, 11); v != "跳过" { t.Fatalf("旧 v11 库应跳过, 得到 %s", v) } // 未来版本 (v12): CRC==0 也要校验 → 不符 if v, _ := checkHeaderCrc(legacy, 12); v != "CRC 不符" { t.Fatalf("v12 零 CRC 应按失配处理, 得到 %s", v) } // checkHeaderCrc 不得改动调用方的字节 mine := buildHeaderPage(t, 11, "immutable") snapshot := make([]byte, len(mine)) copy(snapshot, mine) checkHeaderCrc(mine, 11) for i := range mine { if mine[i] != snapshot[i] { t.Fatalf("checkHeaderCrc 改动了输入字节 @ %d", i) } } }