From 9abe948d1d6cda2e936c1fceb7a0cfa67cb06c39 Mon Sep 17 00:00:00 2001 From: yusing Date: Fri, 6 Feb 2026 15:38:22 +0800 Subject: [PATCH] refactor(entrypoint): streamline benchmark tests and enhance error handling - Introduced `NewTestRoute` function to simplify route creation in benchmark tests. - Replaced direct route validation and starting with error handling using `require.NoError`. - Updated server retrieval to use `common.ProxyHTTPAddr` for consistency. - Improved logging for HTTP route addition errors in `AddRoute` method. --- internal/entrypoint/entrypoint.go | 4 -- .../entrypoint/entrypoint_benchmark_test.go | 54 +++++++------------ internal/entrypoint/routes.go | 15 ++++-- internal/route/test_route.go | 22 ++++++++ 4 files changed, 52 insertions(+), 43 deletions(-) create mode 100644 internal/route/test_route.go diff --git a/internal/entrypoint/entrypoint.go b/internal/entrypoint/entrypoint.go index ae7d3d29..3b0697f6 100644 --- a/internal/entrypoint/entrypoint.go +++ b/internal/entrypoint/entrypoint.go @@ -126,10 +126,6 @@ func (ep *Entrypoint) GetServer(addr string) (http.Handler, bool) { return ep.servers.Load(addr) } -func (ep *Entrypoint) PrintServers() { - log.Info().Msgf("servers: %v", xsync.ToPlainMap(ep.servers)) -} - func (ep *Entrypoint) SetFindRouteDomains(domains []string) { if len(domains) == 0 { ep.findRouteFunc = findRouteAnyDomain diff --git a/internal/entrypoint/entrypoint_benchmark_test.go b/internal/entrypoint/entrypoint_benchmark_test.go index adc1ad75..0e9cdcd9 100644 --- a/internal/entrypoint/entrypoint_benchmark_test.go +++ b/internal/entrypoint/entrypoint_benchmark_test.go @@ -10,6 +10,8 @@ import ( "strings" "testing" + "github.com/stretchr/testify/require" + "github.com/yusing/godoxy/internal/common" . "github.com/yusing/godoxy/internal/entrypoint" entrypoint "github.com/yusing/godoxy/internal/entrypoint/types" "github.com/yusing/godoxy/internal/route" @@ -79,27 +81,20 @@ func BenchmarkEntrypointReal(b *testing.B) { b.Fatal(err) } - r := &route.Route{ + r, err := route.NewTestRoute(b, task, &route.Route{ Alias: "test", Scheme: routeTypes.SchemeHTTP, Host: host, Port: route.Port{Proxy: portInt}, HealthCheck: types.HealthCheckConfig{Disable: true}, - } + }) - err = r.Validate() - if err != nil { - b.Fatal(err) - } - - err = r.Start(task) - if err != nil { - b.Fatal(err) - } + require.NoError(b, err) + require.False(b, r.ShouldExclude()) var w noopResponseWriter - server, ok := ep.GetServer(r.ListenURL().Host) + server, ok := ep.GetServer(common.ProxyHTTPAddr) if !ok { b.Fatal("server not found") } @@ -107,12 +102,12 @@ func BenchmarkEntrypointReal(b *testing.B) { b.ResetTimer() for b.Loop() { server.ServeHTTP(&w, &req) - // if w.statusCode != http.StatusOK { - // b.Fatalf("status code is not 200: %d", w.statusCode) - // } - // if string(w.written) != "1" { - // b.Fatalf("written is not 1: %s", string(w.written)) - // } + if w.statusCode != http.StatusOK { + b.Fatalf("status code is not 200: %d", w.statusCode) + } + if string(w.written) != "1" { + b.Fatalf("written is not 1: %s", string(w.written)) + } } } @@ -127,7 +122,7 @@ func BenchmarkEntrypoint(b *testing.B) { ep.SetFindRouteDomains([]string{}) entrypoint.SetCtx(task, ep) - r := &route.Route{ + r, err := route.NewTestRoute(b, task, &route.Route{ Alias: "test", Scheme: routeTypes.SchemeHTTP, Host: "localhost", @@ -137,27 +132,16 @@ func BenchmarkEntrypoint(b *testing.B) { HealthCheck: types.HealthCheckConfig{ Disable: true, }, - } + }) - err := r.Validate() - if err != nil { - b.Fatal(err) - } + require.NoError(b, err) + require.False(b, r.ShouldExclude()) - err = r.Start(task) - if err != nil { - b.Fatal(err) - } - - rev, ok := ep.HTTPRoutes().Get("test") - if !ok { - b.Fatal("route not found") - } - rev.(types.ReverseProxyRoute).ReverseProxy().Transport = noopTransport{} + r.(types.ReverseProxyRoute).ReverseProxy().Transport = noopTransport{} var w noopResponseWriter - server, ok := ep.GetServer(r.ListenURL().Host) + server, ok := ep.GetServer(common.ProxyHTTPAddr) if !ok { b.Fatal("server not found") } diff --git a/internal/entrypoint/routes.go b/internal/entrypoint/routes.go index 9fe709d8..475edc7c 100644 --- a/internal/entrypoint/routes.go +++ b/internal/entrypoint/routes.go @@ -5,6 +5,7 @@ import ( "net" "strconv" + "github.com/rs/zerolog/log" "github.com/yusing/godoxy/internal/common" "github.com/yusing/godoxy/internal/types" ) @@ -54,7 +55,13 @@ func (ep *Entrypoint) AddRoute(r types.Route) { } switch r := r.(type) { case types.HTTPRoute: - ep.AddHTTPRoute(r) + if err := ep.AddHTTPRoute(r); err != nil { + log.Error(). + Err(err). + Str("route", r.Key()). + Str("listen_url", r.ListenURL().String()). + Msg("failed to add HTTP route") + } ep.shortLinkMatcher.AddRoute(r.Key()) r.Task().OnCancel("remove_route", func() { ep.delHTTPRoute(r) @@ -90,9 +97,9 @@ func (ep *Entrypoint) AddHTTPRoute(route types.HTTPRoute) error { func (ep *Entrypoint) addHTTPRoute(route types.HTTPRoute, addr string, proto HTTPProto) error { var err error - srv, _ := ep.servers.LoadOrCompute(addr, func() (srv *httpServer, cancel bool) { - srv = newHTTPServer(ep) - err = srv.Listen(addr, proto) + srv, _ := ep.servers.LoadOrCompute(addr, func() (newSrv *httpServer, cancel bool) { + newSrv = newHTTPServer(ep) + err = newSrv.Listen(addr, proto) cancel = err != nil return }) diff --git a/internal/route/test_route.go b/internal/route/test_route.go new file mode 100644 index 00000000..40ec10dc --- /dev/null +++ b/internal/route/test_route.go @@ -0,0 +1,22 @@ +package route + +import ( + "github.com/yusing/godoxy/internal/types" + "github.com/yusing/goutils/task" +) + +func NewTestRoute[T interface{ Helper() }](t T, task task.Parent, base *Route) (types.Route, error) { + t.Helper() + + err := base.Validate() + if err != nil { + return nil, err + } + + err = base.Start(task) + if err != nil { + return nil, err + } + + return base.impl, nil +}