From e70e758161083a2f2ab6682f9f1fdc66793ec428 Mon Sep 17 00:00:00 2001 From: Trim21 Date: Sat, 6 Aug 2022 13:29:25 +0800 Subject: [PATCH] diff --- app.go | 11 ++++++++++- app_test.go | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/app.go b/app.go index d3523c1445..ce39cd923e 100644 --- a/app.go +++ b/app.go @@ -845,7 +845,16 @@ func (app *App) Test(req *http.Request, msTimeout ...int) (resp *http.Response, // Serve conn to server channel := make(chan error) go func() { - channel <- app.server.ServeConn(conn) + var returned bool + defer func() { + if !returned { + channel <- fmt.Errorf("runtime.Goexit() called in handler") + } + }() + + r := app.server.ServeConn(conn) + returned = true + channel <- r }() // Wait for callback diff --git a/app_test.go b/app_test.go index c7ce9dccde..b5e96467b3 100644 --- a/app_test.go +++ b/app_test.go @@ -16,6 +16,7 @@ import ( "net/http/httptest" "reflect" "regexp" + "runtime" "strings" "testing" "time" @@ -1527,3 +1528,35 @@ func Test_App_UseMountedErrorHandlerForBestPrefixMatch(t *testing.T) { utils.AssertEqual(t, nil, err, "iotuil.ReadAll()") utils.AssertEqual(t, "hi, i'm a custom sub sub fiber error", string(b), "Third fiber Response body") } + +func Test_App_Test_no_timeout_infinitely(t *testing.T) { + start := time.Now() + var err error + c := make(chan bool) + go func() { + time.Sleep(5 * time.Second) + c <- true + }() + go func() { + defer close(c) + app := New() + app.Get("/", func(c *Ctx) error { + runtime.Goexit() + return nil + }) + + req := httptest.NewRequest(http.MethodGet, "/", http.NoBody) + _, err = app.Test(req, -1) + }() + + <-c + + if time.Since(start) >= time.Second { + t.Error("hanging test") + t.FailNow() + } + if err == nil { + t.Error("unexpected success request") + t.FailNow() + } +}