package integration import ( "fmt" "net" "testing" "time" "github.com/noahlann/nnet/pkg/nnet" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) // TestHandlerTimeout 测试处理器超时 func TestHandlerTimeout(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), HandlerTimeout: 500 * time.Millisecond, // 设置较短的超时时间 } ts := StartTestServerWithRoutes(t, cfg, func(srv nnet.Server) { // 注册一个会阻塞的路由 srv.Router().RegisterString("slow", func(ctx nnet.Context) error { // 阻塞超过超时时间 time.Sleep(1 * time.Second) return ctx.Response().WriteBytes([]byte("ok\n")) }) // 注册一个快速的路由 srv.Router().RegisterString("fast", func(ctx nnet.Context) error { return ctx.Response().WriteBytes([]byte("ok\n")) }) }) defer CleanupTestServer(t, ts) client := NewTestClient(t, ts.Addr, nil) defer CleanupTestClient(t, client) ConnectTestClient(t, client) time.Sleep(100 * time.Millisecond) // 快速路由应该正常响应 resp := RequestWithTimeout(t, client, []byte("fast"), 3*time.Second) assert.Contains(t, string(resp), "ok", "Fast route should respond normally") // 慢路由可能会超时(取决于实现) // 注意:超时行为取决于服务器的实现 slowResp, slowErr := client.Request([]byte("slow"), 2*time.Second) if slowErr != nil { // 如果请求超时,这是预期的行为 t.Logf("Slow route timed out as expected: %v", slowErr) assert.Error(t, slowErr, "Slow route should timeout") } else { // 如果收到响应,可能是错误响应 t.Logf("Slow route response: %q", string(slowResp)) } } // TestReadTimeout 测试读取超时 func TestReadTimeout(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), ReadTimeout: 500 * time.Millisecond, // 设置较短的读取超时时间 } ts := StartTestServerWithRoutes(t, cfg, func(srv nnet.Server) { srv.Router().RegisterString("test", func(ctx nnet.Context) error { return ctx.Response().WriteBytes([]byte("ok\n")) }) }) defer CleanupTestServer(t, ts) // 创建客户端,使用较短的超时时间 client := NewTestClient(t, ts.Addr, &nnet.ClientConfig{ ReadTimeout: 1 * time.Second, }) defer CleanupTestClient(t, client) ConnectTestClient(t, client) time.Sleep(100 * time.Millisecond) // 正常请求应该能够成功 resp := RequestWithTimeout(t, client, []byte("test"), 3*time.Second) assert.Contains(t, string(resp), "ok", "Request should succeed") }