package fingerprint import ( "strings" "testing" ) func TestAllocateSelfConsistent(t *testing.T) { p := Allocate("node-a|0") if p.ChromeMajor != ChromeMajor || p.Impersonate != DefaultImpersonate { t.Fatalf("版本漂移: %+v", p) } if !strings.Contains(p.UserAgent, "Chrome/136") { t.Fatalf("UA 必须是 Chrome/136: %s", p.UserAgent) } if strings.Contains(p.UserAgent, "Chrome/151") { t.Fatal("禁止 Chrome/151") } if !strings.Contains(p.SecCHUA, `"136"`) { t.Fatalf("CH 必须对齐 136: %s", p.SecCHUA) } if p.OS == "Windows" && !strings.Contains(p.SecCHUAPlatform, "Windows") { t.Fatalf("platform 与 OS 不一致: %+v", p) } if p.OS == "macOS" && !strings.Contains(p.SecCHUAPlatform, "macOS") { t.Fatalf("platform 与 OS 不一致: %+v", p) } } func TestAllocateStable(t *testing.T) { a := Allocate("same-seed") b := Allocate("same-seed") if a != b { t.Fatalf("同 seed 应同脸: %+v vs %+v", a, b) } c := Allocate("other-seed") if c.ID == a.ID && c.UserAgent == a.UserAgent { t.Fatal("不同 seed 不应撞脸") } } func TestAllocateSetUnique(t *testing.T) { set := AllocateSet("mgr1", TemplateCount) if len(set) != TemplateCount { t.Fatalf("套数=%d", len(set)) } seen := map[string]bool{} for _, p := range set { if seen[p.ID] { t.Fatalf("模版 id 重复: %s", p.ID) } seen[p.ID] = true } act := PickActive("mgr1", set) if act.ID == "" { t.Fatal("active 空") } act2 := PickActive("mgr1", set) if act.ID != act2.ID { t.Fatal("active 重启应稳定") } } func TestHeadersAligned(t *testing.T) { p := Allocate("h") h := Headers(p) if h["User-Agent"] != p.UserAgent { t.Fatal("UA 头不一致") } if h["sec-ch-ua"] != p.SecCHUA { t.Fatal("CH 头不一致") } }