Files
NixMsg/test/load/q3_live_test.go
T

79 lines
2.1 KiB
Go

package load_test
import (
"fmt"
"testing"
"time"
"git.asio.asia/nixevol/NixMsg/test/accept"
"git.asio.asia/nixevol/NixMsg/test/harness"
)
const (
epPassword = "password1234"
// 本机短时压测目标:几十连接收发。不做 1000 / 10 分钟(见 DEVIATIONS)。
q3LivePairs = 16 // 32 个端、16 对收发
)
// TestQ3LiveShortBurst 短时几十连接登录并完成单聊收发。
func TestQ3LiveShortBurst(t *testing.T) {
srv, err := harness.Start(harness.Options{})
if err != nil {
t.Fatal(err)
}
defer func() { _ = srv.Stop() }()
ac := accept.AdminLogin(t, srv)
type pair struct {
a, b string
}
pairs := make([]pair, 0, q3LivePairs)
for i := 0; i < q3LivePairs; i++ {
a := fmt.Sprintf("q3la%04d", i)
b := fmt.Sprintf("q3lb%04d", i)
accept.CreateEndpoint(t, ac, a, epPassword)
accept.CreateEndpoint(t, ac, b, epPassword)
pairs = append(pairs, pair{a: a, b: b})
}
sessions := make([]*accept.MQTTSession, 0, q3LivePairs*2)
defer func() {
for _, s := range sessions {
s.Close()
}
}()
for _, p := range pairs {
sa := accept.MQTTLogin(t, srv.HTTPBase, p.a, epPassword)
sb := accept.MQTTLogin(t, srv.HTTPBase, p.b, epPassword)
sessions = append(sessions, sa, sb)
}
for i, p := range pairs {
sa := sessions[i*2]
sb := sessions[i*2+1]
msgID := fmt.Sprintf("q3-load-%d", i)
resp := sa.Request(t, map[string]any{
"v": 1, "type": "send", "rid": fmt.Sprintf("ls%d", i), "id": msgID,
"to": map[string]any{"kind": "endpoint", "id": p.b},
"body": map[string]any{"enc": "utf8", "data": "burst"},
"delay_ms": int64(0),
})
if !resp.OK {
t.Fatalf("pair %d send: %+v", i, resp)
}
msg := sb.WaitType(t, "msg", 15*time.Second)
if msg["id"] != msgID {
t.Fatalf("pair %d want %s got %v", i, msgID, msg)
}
ack := sb.Request(t, map[string]any{
"v": 1, "type": "ack", "rid": fmt.Sprintf("la%d", i),
"from": p.a, "id": msgID,
})
if !ack.OK {
t.Fatalf("pair %d ack: %+v", i, ack)
}
}
t.Logf("短时压测通过:%d 连接、%d 对单聊收发成功(未做 1000 连接 / 10 分钟)", q3LivePairs*2, q3LivePairs)
}