| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- 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)
- }
- }
- }
|