117 lines
2.3 KiB
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")
|
|
}
|
|
}
|
|
}
|