Files
NixMsg/test/harness/harness_test.go

117 lines
2.3 KiB
Go

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")
}
}
}