Files
goutils/unstable/simplerouter/router_test.go

422 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()
simpleRouter2 := simpleRouter.SubPath("2")
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) {}))
// Subpath
simpleRouter2.GET("test", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
_ts := httptest.NewServer(simpleRouter2)
_req, _ := http.NewRequest("GET", _ts.URL+"/2/test", nil)
_, _err := http.DefaultClient.Do(_req)
Testing.AssertNotError(t, _err)
Testing.AssertEqual(t, 12, counter)
counter = 0
// Subpath
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)
}