410 lines
13 KiB
Go
410 lines
13 KiB
Go
package SimpleRouter
|
|
|
|
import (
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"sync"
|
|
"syscall"
|
|
"testing"
|
|
"time"
|
|
|
|
Testing "github.com/lbatuska/goutils/testing"
|
|
)
|
|
|
|
func setupServer(wg *sync.WaitGroup) {
|
|
defer wg.Done()
|
|
|
|
simpleRouter := SimpleRouter()
|
|
simpleRouter.GET("test", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
time.Sleep(time.Second * 5)
|
|
w.WriteHeader(200)
|
|
}))
|
|
simpleRouter.GET("test2", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
w.WriteHeader(200)
|
|
}))
|
|
|
|
simpleRouter.StartWithGracefulShutdown("0.0.0.0:8080")
|
|
}
|
|
|
|
func sendKillSignal(wg *sync.WaitGroup) {
|
|
defer wg.Done()
|
|
|
|
time.Sleep(time.Second * 4)
|
|
syscall.Kill(syscall.Getpid(), syscall.SIGINT)
|
|
}
|
|
|
|
func Test_gracefulShutdown(t *testing.T) {
|
|
var wg sync.WaitGroup
|
|
wg.Add(2)
|
|
|
|
go setupServer(&wg)
|
|
go sendKillSignal(&wg)
|
|
|
|
time.Sleep(time.Second * 2)
|
|
res, err := http.Get("http://localhost:8080/test")
|
|
Testing.AssertNotError(t, err)
|
|
Testing.AssertEqual(t, http.StatusOK, res.StatusCode)
|
|
|
|
wg.Wait()
|
|
}
|
|
|
|
func Test_middlewares(t *testing.T) {
|
|
counter := 0
|
|
mw1 := func(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
counter += 1
|
|
next.ServeHTTP(w, r)
|
|
})
|
|
}
|
|
mw2 := func(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
counter = counter * 2
|
|
next.ServeHTTP(w, r)
|
|
})
|
|
}
|
|
simpleRouter := SimpleRouter()
|
|
simpleRouter.PushMiddleware(mw1)
|
|
simpleRouter.PushMiddleware(mw2)
|
|
simpleRouter.GET("test", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
|
|
|
ts := httptest.NewServer(simpleRouter)
|
|
req, _ := http.NewRequest("GET", ts.URL+"/test", nil)
|
|
_, err := http.DefaultClient.Do(req)
|
|
|
|
Testing.AssertNotError(t, err)
|
|
Testing.AssertEqual(t, 2, counter)
|
|
ts.Close()
|
|
counter = 0
|
|
|
|
simpleRouter.PopMiddleware()
|
|
simpleRouter.PopMiddleware()
|
|
simpleRouter.PushMiddleware(mw2)
|
|
simpleRouter.PushMiddleware(mw1)
|
|
simpleRouter.GET("test2", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
|
|
|
ts = httptest.NewServer(simpleRouter)
|
|
req, _ = http.NewRequest("GET", ts.URL+"/test2", nil)
|
|
_, err = http.DefaultClient.Do(req)
|
|
|
|
Testing.AssertNotError(t, err)
|
|
Testing.AssertEqual(t, 1, counter)
|
|
ts.Close()
|
|
counter = 0
|
|
|
|
simpleRouter.PopMiddleware()
|
|
simpleRouter.PopMiddleware()
|
|
simpleRouter.PushMiddleware(mw1)
|
|
simpleRouter.PushMiddleware(mw2)
|
|
simpleRouter.PushMiddleware(mw1)
|
|
simpleRouter.PushMiddleware(mw2)
|
|
simpleRouter.GET("test3", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
|
|
|
ts = httptest.NewServer(simpleRouter)
|
|
defer ts.Close()
|
|
req, _ = http.NewRequest("GET", ts.URL+"/test3", nil)
|
|
_, err = http.DefaultClient.Do(req)
|
|
|
|
Testing.AssertNotError(t, err)
|
|
Testing.AssertEqual(t, 6, counter)
|
|
ts.Close()
|
|
}
|
|
|
|
func Test_middlewares2(t *testing.T) {
|
|
counter := 0
|
|
mw1 := func(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
counter += 1
|
|
next.ServeHTTP(w, r)
|
|
})
|
|
}
|
|
mw2 := func(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
counter = counter * 2
|
|
next.ServeHTTP(w, r)
|
|
})
|
|
}
|
|
simpleRouter := SimpleRouter()
|
|
simpleRouter.PushMiddleware(mw1, mw2)
|
|
simpleRouter.GET("test", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
|
|
|
ts := httptest.NewServer(simpleRouter)
|
|
req, _ := http.NewRequest("GET", ts.URL+"/test", nil)
|
|
_, err := http.DefaultClient.Do(req)
|
|
|
|
Testing.AssertNotError(t, err)
|
|
Testing.AssertEqual(t, 2, counter)
|
|
ts.Close()
|
|
counter = 0
|
|
|
|
simpleRouter.PopMiddleware()
|
|
simpleRouter.PopMiddleware()
|
|
simpleRouter.PushMiddleware(mw2, mw1)
|
|
simpleRouter.GET("test2", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
|
|
|
ts = httptest.NewServer(simpleRouter)
|
|
req, _ = http.NewRequest("GET", ts.URL+"/test2", nil)
|
|
_, err = http.DefaultClient.Do(req)
|
|
|
|
Testing.AssertNotError(t, err)
|
|
Testing.AssertEqual(t, 1, counter)
|
|
ts.Close()
|
|
counter = 0
|
|
|
|
simpleRouter.PopMiddleware()
|
|
simpleRouter.PopMiddleware()
|
|
simpleRouter.PushMiddleware(mw1, mw2, mw1, mw2)
|
|
simpleRouter.GET("test3", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
|
|
|
ts = httptest.NewServer(simpleRouter)
|
|
defer ts.Close()
|
|
req, _ = http.NewRequest("GET", ts.URL+"/test3", nil)
|
|
_, err = http.DefaultClient.Do(req)
|
|
|
|
Testing.AssertNotError(t, err)
|
|
Testing.AssertEqual(t, 6, counter)
|
|
ts.Close()
|
|
}
|
|
|
|
func Test_globalMiddlewares(t *testing.T) {
|
|
counter := 0
|
|
mw1 := func(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
counter += 1
|
|
next.ServeHTTP(w, r)
|
|
})
|
|
}
|
|
mw2 := func(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
counter = counter * 2
|
|
next.ServeHTTP(w, r)
|
|
})
|
|
}
|
|
gmw1 := func(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
counter += 3
|
|
next.ServeHTTP(w, r)
|
|
})
|
|
}
|
|
gmw2 := func(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
counter = counter * 4
|
|
next.ServeHTTP(w, r)
|
|
})
|
|
}
|
|
simpleRouter := SimpleRouter()
|
|
simpleRouter.PushGlobalMiddleware(gmw1)
|
|
simpleRouter.PushGlobalMiddleware(gmw2)
|
|
simpleRouter.PushMiddleware(mw1, mw2)
|
|
simpleRouter.GET("test", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
|
simpleRouter.GET("test2", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
|
|
|
ts := httptest.NewServer(simpleRouter)
|
|
req, _ := http.NewRequest("GET", ts.URL+"/test", nil)
|
|
_, err := http.DefaultClient.Do(req)
|
|
Testing.AssertNotError(t, err)
|
|
Testing.AssertEqual(t, 26, counter)
|
|
counter = 0
|
|
|
|
req2, _ := http.NewRequest("GET", ts.URL+"/test2", nil)
|
|
_, err2 := http.DefaultClient.Do(req2)
|
|
Testing.AssertNotError(t, err2)
|
|
Testing.AssertEqual(t, 26, counter)
|
|
ts.Close()
|
|
counter = 0
|
|
|
|
simpleRouter.PopGlobalMiddleware()
|
|
simpleRouter.PopGlobalMiddleware()
|
|
simpleRouter.PushGlobalMiddleware(gmw2)
|
|
simpleRouter.PushGlobalMiddleware(gmw1)
|
|
|
|
ts = httptest.NewServer(simpleRouter)
|
|
req, _ = http.NewRequest("GET", ts.URL+"/test", nil)
|
|
_, err = http.DefaultClient.Do(req)
|
|
Testing.AssertNotError(t, err)
|
|
Testing.AssertEqual(t, 8, counter)
|
|
counter = 0
|
|
|
|
req2, _ = http.NewRequest("GET", ts.URL+"/test2", nil)
|
|
_, err2 = http.DefaultClient.Do(req2)
|
|
Testing.AssertNotError(t, err2)
|
|
Testing.AssertEqual(t, 8, counter)
|
|
ts.Close()
|
|
counter = 0
|
|
}
|
|
|
|
func Test_globalMiddlewares2(t *testing.T) {
|
|
counter := 0
|
|
mw1 := func(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
counter += 1
|
|
next.ServeHTTP(w, r)
|
|
})
|
|
}
|
|
mw2 := func(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
counter = counter * 2
|
|
next.ServeHTTP(w, r)
|
|
})
|
|
}
|
|
gmw1 := func(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
counter += 3
|
|
next.ServeHTTP(w, r)
|
|
})
|
|
}
|
|
gmw2 := func(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
counter = counter * 4
|
|
next.ServeHTTP(w, r)
|
|
})
|
|
}
|
|
simpleRouter := SimpleRouter()
|
|
simpleRouter.PushGlobalMiddleware(gmw1, gmw2)
|
|
simpleRouter.PushMiddleware(mw1, mw2)
|
|
simpleRouter.GET("test", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
|
simpleRouter.GET("test2", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
|
|
|
ts := httptest.NewServer(simpleRouter)
|
|
req, _ := http.NewRequest("GET", ts.URL+"/test", nil)
|
|
_, err := http.DefaultClient.Do(req)
|
|
Testing.AssertNotError(t, err)
|
|
Testing.AssertEqual(t, 26, counter)
|
|
counter = 0
|
|
|
|
req2, _ := http.NewRequest("GET", ts.URL+"/test2", nil)
|
|
_, err2 := http.DefaultClient.Do(req2)
|
|
Testing.AssertNotError(t, err2)
|
|
Testing.AssertEqual(t, 26, counter)
|
|
ts.Close()
|
|
counter = 0
|
|
|
|
simpleRouter.PopGlobalMiddleware()
|
|
simpleRouter.PopGlobalMiddleware()
|
|
simpleRouter.PushGlobalMiddleware(gmw2, gmw1)
|
|
|
|
ts = httptest.NewServer(simpleRouter)
|
|
req, _ = http.NewRequest("GET", ts.URL+"/test", nil)
|
|
_, err = http.DefaultClient.Do(req)
|
|
Testing.AssertNotError(t, err)
|
|
Testing.AssertEqual(t, 8, counter)
|
|
counter = 0
|
|
|
|
req2, _ = http.NewRequest("GET", ts.URL+"/test2", nil)
|
|
_, err2 = http.DefaultClient.Do(req2)
|
|
Testing.AssertNotError(t, err2)
|
|
Testing.AssertEqual(t, 8, counter)
|
|
ts.Close()
|
|
counter = 0
|
|
}
|
|
|
|
func Test_handle(t *testing.T) {
|
|
counter := 0
|
|
subpathHandler := func() http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
counter = 1
|
|
})
|
|
}
|
|
regularHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
counter = 2
|
|
})
|
|
simpleRouter := SimpleRouter()
|
|
simpleRouter.SubpathHandle("test/", subpathHandler())
|
|
simpleRouter.Handle("GET", "test2", regularHandler)
|
|
|
|
ts := httptest.NewServer(simpleRouter)
|
|
defer ts.Close()
|
|
req, _ := http.NewRequest("GET", ts.URL+"/test/1", nil)
|
|
res, err := http.DefaultClient.Do(req)
|
|
Testing.AssertNotError(t, err)
|
|
Testing.AssertEqual(t, http.StatusOK, res.StatusCode)
|
|
Testing.AssertEqual(t, 1, counter)
|
|
|
|
req, _ = http.NewRequest("GET", ts.URL+"/test/2", nil)
|
|
res, err = http.DefaultClient.Do(req)
|
|
Testing.AssertNotError(t, err)
|
|
Testing.AssertEqual(t, http.StatusOK, res.StatusCode)
|
|
Testing.AssertEqual(t, 1, counter)
|
|
|
|
req, _ = http.NewRequest("GET", ts.URL+"/test2", nil)
|
|
res, err = http.DefaultClient.Do(req)
|
|
Testing.AssertNotError(t, err)
|
|
Testing.AssertEqual(t, http.StatusOK, res.StatusCode)
|
|
Testing.AssertEqual(t, 2, counter)
|
|
}
|
|
|
|
func Test_methods(t *testing.T) {
|
|
simpleRouter := SimpleRouter()
|
|
simpleRouter.GET("test", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
|
simpleRouter.POST("test2", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
|
simpleRouter.PATCH("test3", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
|
simpleRouter.PUT("test4", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
|
simpleRouter.DELETE("test5", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
|
simpleRouter.OPTIONS("test6", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
|
simpleRouter.HEAD("test7", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
|
|
|
ts := httptest.NewServer(simpleRouter)
|
|
defer ts.Close()
|
|
req, _ := http.NewRequest("GET", ts.URL+"/test", nil)
|
|
req2, _ := http.NewRequest("POST", ts.URL+"/test", nil)
|
|
res, err := http.DefaultClient.Do(req)
|
|
Testing.AssertNotError(t, err)
|
|
Testing.AssertEqual(t, http.StatusOK, res.StatusCode)
|
|
res2, err := http.DefaultClient.Do(req2)
|
|
Testing.AssertNotError(t, err)
|
|
Testing.AssertEqual(t, http.StatusMethodNotAllowed, res2.StatusCode)
|
|
|
|
req, _ = http.NewRequest("POST", ts.URL+"/test2", nil)
|
|
req2, _ = http.NewRequest("PATCH", ts.URL+"/test2", nil)
|
|
res, err = http.DefaultClient.Do(req)
|
|
Testing.AssertNotError(t, err)
|
|
Testing.AssertEqual(t, http.StatusOK, res.StatusCode)
|
|
res2, err = http.DefaultClient.Do(req2)
|
|
Testing.AssertNotError(t, err)
|
|
Testing.AssertEqual(t, http.StatusMethodNotAllowed, res2.StatusCode)
|
|
|
|
req, _ = http.NewRequest("PATCH", ts.URL+"/test3", nil)
|
|
req2, _ = http.NewRequest("PUT", ts.URL+"/test3", nil)
|
|
res, err = http.DefaultClient.Do(req)
|
|
Testing.AssertNotError(t, err)
|
|
Testing.AssertEqual(t, http.StatusOK, res.StatusCode)
|
|
res2, err = http.DefaultClient.Do(req2)
|
|
Testing.AssertNotError(t, err)
|
|
Testing.AssertEqual(t, http.StatusMethodNotAllowed, res2.StatusCode)
|
|
|
|
req, _ = http.NewRequest("PUT", ts.URL+"/test4", nil)
|
|
req2, _ = http.NewRequest("DELETE", ts.URL+"/test4", nil)
|
|
res, err = http.DefaultClient.Do(req)
|
|
Testing.AssertNotError(t, err)
|
|
Testing.AssertEqual(t, http.StatusOK, res.StatusCode)
|
|
res2, err = http.DefaultClient.Do(req2)
|
|
Testing.AssertNotError(t, err)
|
|
Testing.AssertEqual(t, http.StatusMethodNotAllowed, res2.StatusCode)
|
|
|
|
req, _ = http.NewRequest("DELETE", ts.URL+"/test5", nil)
|
|
req2, _ = http.NewRequest("OPTIONS", ts.URL+"/test5", nil)
|
|
res, err = http.DefaultClient.Do(req)
|
|
Testing.AssertNotError(t, err)
|
|
Testing.AssertEqual(t, http.StatusOK, res.StatusCode)
|
|
res2, err = http.DefaultClient.Do(req2)
|
|
Testing.AssertNotError(t, err)
|
|
Testing.AssertEqual(t, http.StatusMethodNotAllowed, res2.StatusCode)
|
|
|
|
req, _ = http.NewRequest("OPTIONS", ts.URL+"/test6", nil)
|
|
req2, _ = http.NewRequest("HEAD", ts.URL+"/test6", nil)
|
|
res, err = http.DefaultClient.Do(req)
|
|
Testing.AssertNotError(t, err)
|
|
Testing.AssertEqual(t, http.StatusOK, res.StatusCode)
|
|
res2, err = http.DefaultClient.Do(req2)
|
|
Testing.AssertNotError(t, err)
|
|
Testing.AssertEqual(t, http.StatusMethodNotAllowed, res2.StatusCode)
|
|
|
|
req, _ = http.NewRequest("HEAD", ts.URL+"/test7", nil)
|
|
req2, _ = http.NewRequest("GET", ts.URL+"/test7", nil)
|
|
res, err = http.DefaultClient.Do(req)
|
|
Testing.AssertNotError(t, err)
|
|
Testing.AssertEqual(t, http.StatusOK, res.StatusCode)
|
|
res2, err = http.DefaultClient.Do(req2)
|
|
Testing.AssertNotError(t, err)
|
|
Testing.AssertEqual(t, http.StatusMethodNotAllowed, res2.StatusCode)
|
|
}
|