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"
|
"net/http"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
|
"github.com/BBVA/kapow/internal/server/model"
|
||||||
"github.com/gorilla/mux"
|
"github.com/gorilla/mux"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -12,6 +13,12 @@ type swappableMux struct {
|
|||||||
root *mux.Router
|
root *mux.Router
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func New() *swappableMux {
|
||||||
|
return &swappableMux{
|
||||||
|
root: mux.NewRouter(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (sm *swappableMux) get() *mux.Router {
|
func (sm *swappableMux) get() *mux.Router {
|
||||||
sm.m.RLock()
|
sm.m.RLock()
|
||||||
defer sm.m.RUnlock()
|
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) {
|
func (sm *swappableMux) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||||
sm.get().ServeHTTP(w, r)
|
sm.get().ServeHTTP(w, r)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (sm *swappableMux) Update(rs []model.Route) {
|
||||||
|
sm.set(gorillize(rs, handlerBuilder))
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,13 +5,30 @@ package mux
|
|||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
|
"os"
|
||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/BBVA/kapow/internal/server/model"
|
||||||
"github.com/gorilla/mux"
|
"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) {
|
func TestSwappableMuxGetReturnsTheCurrentMux(t *testing.T) {
|
||||||
sm := swappableMux{}
|
sm := swappableMux{}
|
||||||
mux := sm.get()
|
mux := sm.get()
|
||||||
@@ -192,3 +209,30 @@ func TestServeHTTPCallsInnerMuxAfterAcquiringLock(t *testing.T) {
|
|||||||
t.Error("Inner mux wasn't called after mutex released")
|
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