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") }