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.

110 lines
2.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 (
"fmt"
"net"
"testing"
"time"
"github.com/noahlann/nnet/pkg/nnet"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
// TestSimpleEcho 最简单的测试服务器echo客户端发送的数据
func TestSimpleEcho(t *testing.T) {
// 获取随机端口
listener, err := net.Listen("tcp", "127.0.0.1:0")
require.NoError(t, err)
port := listener.Addr().(*net.TCPAddr).Port
listener.Close()
cfg := &nnet.Config{
Addr: fmt.Sprintf("tcp://127.0.0.1:%d", port),
Codec: &nnet.CodecConfig{
DefaultCodec: "json",
EnableProtocolEncode: false, // 明确禁用协议编码
},
Logger: &nnet.LoggerConfig{
Level: "debug", // 使用debug级别查看详细日志
Format: "text",
Output: "stdout",
},
}
// 创建服务器
server, err := nnet.NewServer(cfg)
require.NoError(t, err)
// 注册一个简单的echo路由
server.Router().RegisterString("echo", func(ctx nnet.Context) error {
data := ctx.Request().Raw()
t.Logf("Server received: %q", string(data))
// 直接写入原始数据
return ctx.Response().WriteBytes(data)
})
// 启动服务器
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")
// 等待服务器准备好
require.Eventually(t, func() bool {
testConn, err := net.DialTimeout("tcp", fmt.Sprintf("127.0.0.1:%d", port), 500*time.Millisecond)
if err != nil {
return false
}
testConn.Close()
return true
}, 5*time.Second, 100*time.Millisecond, "Server should be ready")
defer CleanupTestServer(t, ts)
// 创建客户端
client := NewTestClient(t, ts.Addr, nil)
defer CleanupTestClient(t, client)
// 连接客户端
ConnectTestClient(t, client)
// 等待一下
time.Sleep(500 * time.Millisecond)
// 发送请求
testData := "echo\n"
t.Logf("Client sending: %q", testData)
// 使用Send和Receive分开测试
err = client.Send([]byte(testData))
require.NoError(t, err, "Send should succeed")
// 接收响应
resp, err := client.Receive()
if err != nil {
t.Logf("Receive error: %v", err)
// 如果Receive失败尝试Request
resp, err = client.Request([]byte(testData), 3*time.Second)
}
require.NoError(t, err, "Should receive response")
t.Logf("Client received: %q", string(resp))
assert.NotEmpty(t, resp, "Response should not be empty")
}