feat: 实现 test/harness 集成测试启动器
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
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")
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user