package config import ( "os" "path/filepath" "testing" ) func TestLoadAgentEndpointsValidatesStrictInventory(t *testing.T) { path := filepath.Join(t.TempDir(), "agents.json") valid := `[{"agent_id":"agent-a","cell_id":"cell-a","address":"127.0.0.1:19090","server_name":"agent.test"}]` if err := os.WriteFile(path, []byte(valid), 0o600); err != nil { t.Fatal(err) } endpoints, err := LoadAgentEndpoints(path) if err != nil { t.Fatal(err) } if len(endpoints) != 1 || endpoints[0].AgentID != "agent-a" { t.Fatalf("unexpected endpoints: %+v", endpoints) } if err := os.WriteFile(path, []byte(`[{"agent_id":"agent-a","cell_id":"cell-a","address":"127.0.0.1:19090","server_name":"agent.test","role":"dispatcher"}]`), 0o600); err != nil { t.Fatal(err) } if _, err := LoadAgentEndpoints(path); err == nil { t.Fatal("expected unknown endpoint field to be rejected") } if err := os.WriteFile(path, []byte(`[{ "agent_id":"agent-a","cell_id":"cell-a","address":"127.0.0.1:19090","server_name":"agent.test" },{ "agent_id":"agent-a","cell_id":"cell-b","address":"127.0.0.1:19091","server_name":"agent.test" }]`), 0o600); err != nil { t.Fatal(err) } if _, err := LoadAgentEndpoints(path); err == nil { t.Fatal("expected duplicate Agent ID to be rejected") } } func TestParseCertificateFingerprints(t *testing.T) { fingerprint := "aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa" parsed, err := ParseCertificateFingerprints(fingerprint + "," + fingerprint) if err != nil { t.Fatal(err) } if len(parsed) != 1 { t.Fatalf("unexpected fingerprint count: %d", len(parsed)) } if _, err := ParseCertificateFingerprints("not-a-fingerprint"); err == nil { t.Fatal("expected invalid fingerprint to be rejected") } } func TestConfigRequiresDispatcherMTLSForEndpointInventory(t *testing.T) { cfg := Config{Mode: "mock", DBPath: ":memory:", AgentEndpointsFile: "agents.json"} if err := cfg.Validate("dispatcher"); err == nil { t.Fatal("expected Dispatcher mTLS requirement") } cfg.MTLSCAFile, cfg.MTLSCertFile, cfg.MTLSKeyFile = "ca.pem", "dispatcher.pem", "dispatcher.key" if err := cfg.Validate("dispatcher"); err != nil { t.Fatal(err) } }