Add New() func & Update() method to internal/server/user/mux/swappableMux
Co-authored-by: Roberto Abdelkader Martínez Pérez <robertomartinezp@gmail.com>
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
||||
"net/http"
|
||||
"sync"
|
||||
|
||||
"github.com/BBVA/kapow/internal/server/model"
|
||||
"github.com/gorilla/mux"
|
||||
)
|
||||
|
||||
@@ -12,6 +13,12 @@ type swappableMux struct {
|
||||
root *mux.Router
|
||||
}
|
||||
|
||||
func New() *swappableMux {
|
||||
return &swappableMux{
|
||||
root: mux.NewRouter(),
|
||||
}
|
||||
}
|
||||
|
||||
func (sm *swappableMux) get() *mux.Router {
|
||||
sm.m.RLock()
|
||||
defer sm.m.RUnlock()
|
||||
@@ -28,3 +35,7 @@ func (sm *swappableMux) set(mux *mux.Router) {
|
||||
func (sm *swappableMux) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
sm.get().ServeHTTP(w, r)
|
||||
}
|
||||
|
||||
func (sm *swappableMux) Update(rs []model.Route) {
|
||||
sm.set(gorillize(rs, handlerBuilder))
|
||||
}
|
||||
|
||||
@@ -5,13 +5,30 @@ package mux
|
||||
import (
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"os"
|
||||
"reflect"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/BBVA/kapow/internal/server/model"
|
||||
"github.com/gorilla/mux"
|
||||
)
|
||||
|
||||
func TestNewReturnsAProperlyInitializedMux(t *testing.T) {
|
||||
sm := New()
|
||||
sm.root.HandleFunc("/foo", func(w http.ResponseWriter, r *http.Request) {
|
||||
w.WriteHeader(http.StatusTeapot)
|
||||
})
|
||||
req := httptest.NewRequest("GET", "/foo", nil)
|
||||
w := httptest.NewRecorder()
|
||||
|
||||
sm.root.ServeHTTP(w, req)
|
||||
|
||||
if w.Result().StatusCode != http.StatusTeapot {
|
||||
t.Error("mux not properly initialized")
|
||||
}
|
||||
}
|
||||
|
||||
func TestSwappableMuxGetReturnsTheCurrentMux(t *testing.T) {
|
||||
sm := swappableMux{}
|
||||
mux := sm.get()
|
||||
@@ -192,3 +209,30 @@ func TestServeHTTPCallsInnerMuxAfterAcquiringLock(t *testing.T) {
|
||||
t.Error("Inner mux wasn't called after mutex released")
|
||||
}
|
||||
}
|
||||
|
||||
func TestUpdateUpdatesMuxWithProvideRouteList(t *testing.T) {
|
||||
sm := New()
|
||||
rs := []model.Route{
|
||||
model.Route{
|
||||
Method: "GET",
|
||||
Pattern: "/",
|
||||
Entrypoint: "/bin/sh -c",
|
||||
Command: "jaillover > /tmp/kapow-test-update-mux",
|
||||
},
|
||||
}
|
||||
os.Remove("/tmp/kapow-test-update-mux")
|
||||
defer os.Remove("/tmp/kapow-test-update-mux")
|
||||
|
||||
sm.Update(rs)
|
||||
|
||||
req := httptest.NewRequest("GET", "/", nil)
|
||||
w := httptest.NewRecorder()
|
||||
|
||||
sm.ServeHTTP(w, req)
|
||||
|
||||
if _, err := os.Stat("/tmp/kapow-test-update-mux"); os.IsNotExist(err) {
|
||||
t.Error("Routes not updated")
|
||||
} else if err != nil {
|
||||
t.Fatalf("Unexpected error: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user