You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ngs/client/client_test.go

103 lines
1.8 KiB
Go

package client
import (
"git.noahlan.cn/northlan/ngs"
"git.noahlan.cn/northlan/ngs/benchmark/testdata"
"git.noahlan.cn/northlan/ngs/component"
"git.noahlan.cn/northlan/ngs/serialize/protobuf"
"git.noahlan.cn/northlan/ngs/session"
"log"
"os"
"os/signal"
"sync/atomic"
"syscall"
"testing"
"time"
)
const (
addr = "127.0.0.1:13250" // local address
conc = 1000 // concurrent client count
)
//
type TestHandler struct {
component.Base
metrics int32
group *ngs.Group
}
func (h *TestHandler) AfterInit() {
ticker := time.NewTicker(time.Second)
// metrics output ticker
go func() {
for range ticker.C {
println("QPS", atomic.LoadInt32(&h.metrics))
atomic.StoreInt32(&h.metrics, 0)
}
}()
}
func NewTestHandler() *TestHandler {
return &TestHandler{
group: ngs.NewGroup("handler"),
}
}
func (h *TestHandler) Ping(s *session.Session, data *testdata.Ping) error {
atomic.AddInt32(&h.metrics, 1)
return s.Push("pong", &testdata.Pong{Content: data.Content})
}
func server() {
components := &component.Components{}
components.Register(NewTestHandler())
ngs.Listen(addr,
ngs.WithDebugMode(),
ngs.WithSerializer(protobuf.NewSerializer()),
ngs.WithComponents(components),
)
}
func client() {
c := NewClient()
chReady := make(chan struct{})
c.OnConnected(func() {
chReady <- struct{}{}
})
if err := c.Start(addr); err != nil {
panic(err)
}
c.On("pong", func(data interface{}) {})
<-chReady
for /*i := 0; i < 1; i++*/ {
c.Notify("TestHandler.Ping", &testdata.Ping{})
time.Sleep(1 * time.Second)
}
}
func TestIO(t *testing.T) {
go server()
// wait server startup
time.Sleep(1 * time.Second)
for i := 0; i < conc; i++ {
go client()
}
log.SetFlags(log.LstdFlags | log.Llongfile)
sg := make(chan os.Signal)
signal.Notify(sg, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGKILL)
<-sg
t.Log("exit")
}