package harness_test import ( "io" "net/http" "os" "path/filepath" "sync" "testing" "time" "git.asio.asia/nixevol/NixMsg/test/harness" ) func TestHealthzAndCleanup(t *testing.T) { srv, err := harness.Start(harness.Options{}) if err != nil { t.Fatal(err) } dataDir := srv.DataDir httpBase := srv.HTTPBase resp, err := http.Get(httpBase + "/healthz") if err != nil { _ = srv.Stop() t.Fatalf("healthz: %v", err) } body, _ := io.ReadAll(resp.Body) _ = resp.Body.Close() if resp.StatusCode != http.StatusOK { _ = srv.Stop() t.Fatalf("status=%d body=%s", resp.StatusCode, body) } if string(body) != "ok" { _ = srv.Stop() t.Fatalf("body=%q", body) } if err = srv.Stop(); err != nil { t.Fatalf("stop: %v", err) } deadline := time.Now().Add(5 * time.Second) for time.Now().Before(deadline) { if _, statErr := os.Stat(dataDir); os.IsNotExist(statErr) { break } time.Sleep(20 * time.Millisecond) } if _, statErr := os.Stat(dataDir); !os.IsNotExist(statErr) { t.Fatalf("data dir still exists: %s", dataDir) } _, err = http.Get(httpBase + "/healthz") if err == nil { t.Fatal("healthz still reachable after stop") } } func TestParallelIsolation(t *testing.T) { var ( wg sync.WaitGroup mu sync.Mutex addrs []string dataDirs []string ) runOne := func(i int) { defer wg.Done() srv, err := harness.Start(harness.Options{}) if err != nil { t.Errorf("start %d: %v", i, err) return } defer func() { _ = srv.Stop() }() resp, err := http.Get(srv.HTTPBase + "/healthz") if err != nil { t.Errorf("healthz %d: %v", i, err) return } _ = resp.Body.Close() if resp.StatusCode != http.StatusOK { t.Errorf("healthz %d status=%d", i, resp.StatusCode) return } mu.Lock() addrs = append(addrs, srv.Addr) dataDirs = append(dataDirs, srv.DataDir) mu.Unlock() } const n = 2 wg.Add(n) for i := 0; i < n; i++ { go runOne(i) } wg.Wait() if t.Failed() { return } if len(addrs) != n || len(dataDirs) != n { t.Fatalf("got %d addrs %d dirs", len(addrs), len(dataDirs)) } if addrs[0] == addrs[1] { t.Fatalf("same listen addr: %s", addrs[0]) } if dataDirs[0] == dataDirs[1] { t.Fatalf("same data dir: %s", dataDirs[0]) } for _, d := range dataDirs { if filepath.Clean(d) == "" { t.Fatal("empty data dir") } } }