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.

143 lines
3.6 KiB
Go

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package integration
import (
"encoding/json"
"fmt"
"net"
"testing"
"time"
"github.com/noahlann/nnet/pkg/nnet"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
// TestUDPServerClient 测试UDP服务器-客户端通信
// 注意UDP测试可能需要特殊处理暂时跳过
func TestUDPServerClient(t *testing.T) {
t.Skip("UDP test needs further investigation - gnet UDP handling")
// 获取随机端口
listener, err := net.ListenPacket("udp", "127.0.0.1:0")
require.NoError(t, err)
addr := listener.LocalAddr().(*net.UDPAddr)
port := addr.Port
listener.Close()
cfg := &nnet.Config{
Addr: fmt.Sprintf("udp://127.0.0.1:%d", port),
Codec: &nnet.CodecConfig{
DefaultCodec: "json",
EnableProtocolEncode: false,
},
}
// 创建UDP服务器
server, err := nnet.NewUDPServer(cfg)
require.NoError(t, err)
// 注册路由
server.Router().RegisterString("hello", func(ctx nnet.Context) error {
return ctx.Response().Write(map[string]any{
"message": "hello from udp server",
})
})
// 启动服务器
ts := &TestServer{
Server: server,
Addr: cfg.Addr,
stopCh: make(chan struct{}),
}
ts.wg.Add(1)
go func() {
defer ts.wg.Done()
if err := server.Start(); err != nil {
t.Logf("Server error: %v", err)
}
}()
require.Eventually(t, func() bool {
return server.Started()
}, 3*time.Second, 50*time.Millisecond, "Server should start within 3 seconds")
time.Sleep(200 * time.Millisecond)
defer CleanupTestServer(t, ts)
// 创建UDP客户端
client := NewTestClient(t, ts.Addr, &nnet.ClientConfig{
TransportProtocol: "udp",
})
defer CleanupTestClient(t, client)
ConnectTestClient(t, client)
// 等待服务器准备好
time.Sleep(100 * time.Millisecond)
// 发送请求
resp := RequestWithTimeout(t, client, []byte("hello"), 3*time.Second)
t.Logf("Response: %q", string(resp))
var result map[string]any
err = json.Unmarshal(resp, &result)
assert.NoError(t, err, "Response should be valid JSON")
assert.Equal(t, "hello from udp server", result["message"], "Message should match")
}
// TestUDPMultipleClients 测试UDP多个客户端
// 注意UDP测试可能需要特殊处理暂时跳过
func TestUDPMultipleClients(t *testing.T) {
t.Skip("UDP test needs further investigation - gnet UDP handling")
listener, err := net.ListenPacket("udp", "127.0.0.1:0")
require.NoError(t, err)
addr := listener.LocalAddr().(*net.UDPAddr)
port := addr.Port
listener.Close()
cfg := &nnet.Config{
Addr: fmt.Sprintf("udp://127.0.0.1:%d", port),
Codec: &nnet.CodecConfig{
DefaultCodec: "json",
},
}
ts := StartTestServerWithRoutes(t, cfg, func(srv nnet.Server) {
srv.Router().RegisterString("test", func(ctx nnet.Context) error {
return ctx.Response().Write(map[string]any{
"status": "ok",
})
})
})
defer CleanupTestServer(t, ts)
// 创建多个UDP客户端
clients := make([]nnet.Client, 3)
for i := 0; i < 3; i++ {
client := NewTestClient(t, ts.Addr, &nnet.ClientConfig{
TransportProtocol: "udp",
})
ConnectTestClient(t, client)
clients[i] = client
}
time.Sleep(100 * time.Millisecond)
// 所有客户端都应该能够发送请求
for i, client := range clients {
resp := RequestWithTimeout(t, client, []byte("test"), 3*time.Second)
t.Logf("Response for client %d: %q", i, string(resp))
var result map[string]any
err := json.Unmarshal(resp, &result)
assert.NoError(t, err, "Response should be valid JSON")
assert.Equal(t, "ok", result["status"], "Status should be ok")
}
// 清理所有客户端
for _, client := range clients {
CleanupTestClient(t, client)
}
}