package console import ( "go/ast" "go/parser" "go/token" "os" "path/filepath" "slices" "strings" "testing" ) func claimInventoryKeys(entries []claimEntry) []string { keys := make([]string, 0, len(entries)) for _, e := range entries { keys = append(keys, e.Kind+" "+e.Pattern) } slices.Sort(keys) return keys } func compareClaimInventory(entries []claimEntry, want []string) bool { return slices.Equal(claimInventoryKeys(entries), want) } func TestClaimConsoleRouteCensus(t *testing.T) { // The enabled console: two routes (host-loss resolve and inspect) exist only // with HostClaim on, and the census is of what an enabled console serves. s := newClaimCase(t).srv b, err := os.ReadFile("testdata/claim-routes.txt") if err != nil { t.Fatal(err) } want := strings.Split(strings.TrimSpace(string(b)), "\n") slices.Sort(want) if !compareClaimInventory(s.claimEntries.snapshot(), want) { got := claimInventoryKeys(s.claimEntries.snapshot()) for _, k := range got { if !slices.Contains(want, k) { t.Errorf("new: %s", k) } } for _, k := range want { if !slices.Contains(got, k) { t.Errorf("missing: %s", k) } } t.FailNow() } s.registerRoute("POST /claim-unreviewed-door", s.handleHome) if compareClaimInventory(s.claimEntries.snapshot(), want) { t.Fatal("new route escaped census") } } func TestClaimConsoleMuxHasOneRegistrar(t *testing.T) { fs := token.NewFileSet() entries, err := os.ReadDir(".") if err != nil { t.Fatal(err) } for _, entry := range entries { if !strings.HasSuffix(entry.Name(), ".go") || strings.HasSuffix(entry.Name(), "_test.go") { continue } f, err := parser.ParseFile(fs, entry.Name(), nil, 0) if err != nil { t.Fatal(err) } for _, d := range f.Decls { fd, ok := d.(*ast.FuncDecl) if !ok || fd.Body == nil { continue } ast.Inspect(fd.Body, func(n ast.Node) bool { call, ok := n.(*ast.CallExpr) if !ok { return true } sel, ok := call.Fun.(*ast.SelectorExpr) if !ok { return true } if sel.Sel.Name != "Handle" && sel.Sel.Name != "HandleFunc" { return true } if filepath.Base(entry.Name()) != "claim_routes.go" || fd.Name.Name != "registerRoute" { t.Errorf("mux registration outside registerRoute: %s", fs.Position(n.Pos())) } return true }) } } }