diff --git a/internal/server/user/mux/mux.go b/internal/server/user/mux/mux.go index 425f59b..ec814d1 100644 --- a/internal/server/user/mux/mux.go +++ b/internal/server/user/mux/mux.go @@ -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)) +} diff --git a/internal/server/user/mux/mux_test.go b/internal/server/user/mux/mux_test.go index 178e012..7d770cb 100644 --- a/internal/server/user/mux/mux_test.go +++ b/internal/server/user/mux/mux_test.go @@ -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) + } +}