package app import ( "os" "path/filepath" "testing" ) func TestDomainCacheLegacyMigrationToDirectBucket(t *testing.T) { dir := t.TempDir() path := filepath.Join(dir, "domain-cache.json") legacy := `{ "example.com": {"ips": ["1.1.1.1", "10.0.0.1"], "last_resolved": 100}, "bad.com": {"ips": [], "last_resolved": 100} }` if err := os.WriteFile(path, []byte(legacy), 0o644); err != nil { t.Fatalf("write legacy cache: %v", err) } st := loadDomainCacheState(path, nil) if _, ok := st.get("example.com", domainCacheSourceDirect, 150, 100); !ok { t.Fatalf("expected direct cache hit after migration") } if _, ok := st.get("example.com", domainCacheSourceWildcard, 150, 100); ok { t.Fatalf("did not expect wildcard cache hit for migrated legacy entry") } if ips, ok := st.get("example.com", domainCacheSourceDirect, 150, 100); !ok || len(ips) != 1 || ips[0] != "1.1.1.1" { t.Fatalf("unexpected migrated ips: ok=%v ips=%v", ok, ips) } } func TestDomainCacheSplitBucketsAreIndependent(t *testing.T) { dir := t.TempDir() path := filepath.Join(dir, "domain-cache.json") v2 := `{ "version": 2, "domains": { "example.com": { "direct": {"ips": ["1.1.1.1"], "last_resolved": 100}, "wildcard": {"ips": ["2.2.2.2"], "last_resolved": 100} } } }` if err := os.WriteFile(path, []byte(v2), 0o644); err != nil { t.Fatalf("write v2 cache: %v", err) } st := loadDomainCacheState(path, nil) direct, ok := st.get("example.com", domainCacheSourceDirect, 150, 100) if !ok || len(direct) != 1 || direct[0] != "1.1.1.1" { t.Fatalf("unexpected direct lookup: ok=%v ips=%v", ok, direct) } wild, ok := st.get("example.com", domainCacheSourceWildcard, 150, 100) if !ok || len(wild) != 1 || wild[0] != "2.2.2.2" { t.Fatalf("unexpected wildcard lookup: ok=%v ips=%v", ok, wild) } } func TestDomainCacheSetAndTTL(t *testing.T) { st := newDomainCacheState() st.set("example.com", domainCacheSourceDirect, []string{"1.1.1.1", "1.1.1.1", "10.0.0.1"}, 100) if _, ok := st.get("example.com", domainCacheSourceDirect, 201, 100); ok { t.Fatalf("expected cache miss due ttl expiry") } ips, ok := st.get("example.com", domainCacheSourceDirect, 200, 100) if !ok || len(ips) != 1 || ips[0] != "1.1.1.1" { t.Fatalf("unexpected ttl hit result: ok=%v ips=%v", ok, ips) } }