package corebin import ( "os" "path/filepath" "testing" ) func TestResolveCacheAndStale(t *testing.T) { Invalidate() dir := t.TempDir() path := filepath.Join(dir, "core") if err := os.WriteFile(path, []byte("x"), 0o755); err != nil { t.Fatal(err) } key := CacheKey(dir, "naive") calls := 0 fn := func() (string, error) { calls++ return path, nil } if p, err := Resolve(key, fn); err != nil || p != path || calls != 1 { t.Fatalf("first: path=%q calls=%d err=%v", p, calls, err) } if p, err := Resolve(key, fn); err != nil || p != path || calls != 1 { t.Fatalf("cached: path=%q calls=%d err=%v", p, calls, err) } _ = os.Remove(path) if _, err := Resolve(key, fn); err != nil { // fn returns removed path; Resolve still succeeds but next Stat misses t.Fatalf("unexpected err after delete before recreate: %v", err) } if calls != 2 { t.Fatalf("expected refresh call, got %d", calls) } if err := os.WriteFile(path, []byte("y"), 0o755); err != nil { t.Fatal(err) } if p, err := Resolve(key, fn); err != nil || p != path { t.Fatalf("after recreate: %q %v", p, err) } if ProtoKey("vless") != "xray" || ProtoKey("naive") != "naive" { t.Fatal("ProtoKey") } }