2022-08-30 02:30:36 +00:00
|
|
|
package server
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net/http"
|
2022-09-05 08:26:21 +00:00
|
|
|
"sync/atomic"
|
2022-08-30 02:30:36 +00:00
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
)
|
|
|
|
|
|
|
|
func testServer(t *testing.T, r http.Handler) *Server {
|
2022-10-07 02:54:09 +00:00
|
|
|
svr := NewServer(WithHost("127.0.0.1"), WithPort("19245"))
|
2022-08-30 02:30:36 +00:00
|
|
|
|
2022-10-30 02:15:35 +00:00
|
|
|
if r != nil {
|
|
|
|
svr.mux.Mount("/", r)
|
|
|
|
}
|
2022-08-30 02:30:36 +00:00
|
|
|
go func() {
|
2022-10-30 02:15:35 +00:00
|
|
|
err := svr.Start()
|
2022-09-03 09:52:05 +00:00
|
|
|
assert.NoError(t, err)
|
2022-08-30 02:30:36 +00:00
|
|
|
}()
|
|
|
|
|
|
|
|
ping := func() error {
|
|
|
|
_, err := http.Get("http://127.0.0.1:19245")
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
for {
|
|
|
|
if err := ping(); err == nil {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
time.Sleep(time.Millisecond * 100)
|
|
|
|
}
|
|
|
|
|
|
|
|
return svr
|
|
|
|
}
|
|
|
|
|
|
|
|
func Test_ServerShutdown_Error(t *testing.T) {
|
2022-10-07 02:54:09 +00:00
|
|
|
svr := NewServer(WithHost("127.0.0.1"), WithPort("19245"))
|
2022-08-30 02:30:36 +00:00
|
|
|
|
|
|
|
err := svr.Shutdown("test")
|
|
|
|
assert.ErrorIs(t, err, ErrServerNotStarted)
|
|
|
|
}
|
|
|
|
|
|
|
|
func Test_ServerStarts_Error(t *testing.T) {
|
|
|
|
svr := testServer(t, nil)
|
|
|
|
|
2022-10-30 02:15:35 +00:00
|
|
|
err := svr.Start()
|
2022-08-30 02:30:36 +00:00
|
|
|
assert.ErrorIs(t, err, ErrServerAlreadyStarted)
|
|
|
|
|
|
|
|
err = svr.Shutdown("test")
|
|
|
|
assert.NoError(t, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
func Test_ServerStarts(t *testing.T) {
|
|
|
|
svr := testServer(t, nil)
|
|
|
|
err := svr.Shutdown("test")
|
|
|
|
assert.NoError(t, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
func Test_GracefulServerShutdownWithWorkers(t *testing.T) {
|
|
|
|
isFinished := false
|
|
|
|
|
|
|
|
svr := testServer(t, nil)
|
|
|
|
|
|
|
|
svr.Background(func() {
|
|
|
|
time.Sleep(time.Second * 4)
|
|
|
|
isFinished = true
|
|
|
|
})
|
|
|
|
|
|
|
|
err := svr.Shutdown("test")
|
|
|
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.True(t, isFinished)
|
|
|
|
}
|
|
|
|
|
|
|
|
func Test_GracefulServerShutdownWithRequests(t *testing.T) {
|
2022-09-05 08:26:21 +00:00
|
|
|
var isFinished atomic.Bool
|
2022-08-30 02:30:36 +00:00
|
|
|
|
|
|
|
router := http.NewServeMux()
|
|
|
|
|
|
|
|
// add long running handler func
|
|
|
|
router.HandleFunc("/test", func(rw http.ResponseWriter, r *http.Request) {
|
|
|
|
time.Sleep(time.Second * 3)
|
2022-09-05 08:26:21 +00:00
|
|
|
isFinished.Store(true)
|
2022-08-30 02:30:36 +00:00
|
|
|
})
|
|
|
|
|
|
|
|
svr := testServer(t, router)
|
|
|
|
|
|
|
|
// Make request to "/test"
|
|
|
|
go func() {
|
2022-09-03 09:52:05 +00:00
|
|
|
_, _ = http.Get("http://127.0.0.1:19245/test") // This is probably bad?
|
2022-08-30 02:30:36 +00:00
|
|
|
}()
|
|
|
|
|
|
|
|
time.Sleep(time.Second) // Hack to wait for the request to be made
|
|
|
|
|
|
|
|
err := svr.Shutdown("test")
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
2022-09-05 08:26:21 +00:00
|
|
|
assert.True(t, isFinished.Load())
|
2022-08-30 02:30:36 +00:00
|
|
|
}
|