142 lines
4.2 KiB
Go
142 lines
4.2 KiB
Go
package server
|
|
|
|
import (
|
|
"net/http"
|
|
"net/url"
|
|
"testing"
|
|
|
|
"github.com/containous/mux"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestParseOneRule(t *testing.T) {
|
|
router := mux.NewRouter()
|
|
route := router.NewRoute()
|
|
serverRoute := &serverRoute{route: route}
|
|
rules := &Rules{route: serverRoute}
|
|
|
|
expression := "Host:foo.bar"
|
|
routeResult, err := rules.Parse(expression)
|
|
require.NoError(t, err, "Error while building route for %s", expression)
|
|
|
|
request, err := http.NewRequest("GET", "http://foo.bar", nil)
|
|
routeMatch := routeResult.Match(request, &mux.RouteMatch{Route: routeResult})
|
|
|
|
assert.True(t, routeMatch, "Rule %s don't match.", expression)
|
|
}
|
|
|
|
func TestParseTwoRules(t *testing.T) {
|
|
router := mux.NewRouter()
|
|
route := router.NewRoute()
|
|
serverRoute := &serverRoute{route: route}
|
|
rules := &Rules{route: serverRoute}
|
|
|
|
expression := "Host: Foo.Bar ; Path:/FOObar"
|
|
routeResult, err := rules.Parse(expression)
|
|
|
|
require.NoError(t, err, "Error while building route for %s.", expression)
|
|
|
|
request, _ := http.NewRequest("GET", "http://foo.bar/foobar", nil)
|
|
routeMatch := routeResult.Match(request, &mux.RouteMatch{Route: routeResult})
|
|
|
|
assert.False(t, routeMatch, "Rule %s don't match.", expression)
|
|
|
|
request, _ = http.NewRequest("GET", "http://foo.bar/FOObar", nil)
|
|
routeMatch = routeResult.Match(request, &mux.RouteMatch{Route: routeResult})
|
|
|
|
assert.True(t, routeMatch, "Rule %s don't match.", expression)
|
|
}
|
|
|
|
func TestParseDomains(t *testing.T) {
|
|
rules := &Rules{}
|
|
|
|
tests := []struct {
|
|
expression string
|
|
domain []string
|
|
}{
|
|
{
|
|
expression: "Host:foo.bar,test.bar",
|
|
domain: []string{"foo.bar", "test.bar"},
|
|
},
|
|
{
|
|
expression: "Path:/test",
|
|
domain: []string{},
|
|
},
|
|
{
|
|
expression: "Host:foo.bar;Path:/test",
|
|
domain: []string{"foo.bar"},
|
|
},
|
|
{
|
|
expression: "Host: Foo.Bar ;Path:/test",
|
|
domain: []string{"foo.bar"},
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
test := test
|
|
t.Run(test.expression, func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
domains, err := rules.ParseDomains(test.expression)
|
|
require.NoError(t, err, "%s: Error while parsing domain.", test.expression)
|
|
|
|
assert.EqualValues(t, test.domain, domains, "%s: Error parsing domains from expression.", test.expression)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestPriorites(t *testing.T) {
|
|
router := mux.NewRouter()
|
|
router.StrictSlash(true)
|
|
rules := &Rules{route: &serverRoute{route: router.NewRoute()}}
|
|
expression01 := "PathPrefix:/foo"
|
|
|
|
routeFoo, err := rules.Parse(expression01)
|
|
require.NoError(t, err, "Error while building route for %s", expression01)
|
|
|
|
fooHandler := &fakeHandler{name: "fooHandler"}
|
|
routeFoo.Handler(fooHandler)
|
|
|
|
routeMatch := router.Match(&http.Request{URL: &url.URL{Path: "/foo"}}, &mux.RouteMatch{})
|
|
assert.True(t, routeMatch, "Error matching route")
|
|
|
|
routeMatch = router.Match(&http.Request{URL: &url.URL{Path: "/fo"}}, &mux.RouteMatch{})
|
|
assert.False(t, routeMatch, "Error matching route")
|
|
|
|
multipleRules := &Rules{route: &serverRoute{route: router.NewRoute()}}
|
|
expression02 := "PathPrefix:/foobar"
|
|
|
|
routeFoobar, err := multipleRules.Parse(expression02)
|
|
require.NoError(t, err, "Error while building route for %s", expression02)
|
|
|
|
foobarHandler := &fakeHandler{name: "foobarHandler"}
|
|
routeFoobar.Handler(foobarHandler)
|
|
routeMatch = router.Match(&http.Request{URL: &url.URL{Path: "/foo"}}, &mux.RouteMatch{})
|
|
|
|
assert.True(t, routeMatch, "Error matching route")
|
|
|
|
fooMatcher := &mux.RouteMatch{}
|
|
routeMatch = router.Match(&http.Request{URL: &url.URL{Path: "/foobar"}}, fooMatcher)
|
|
|
|
assert.True(t, routeMatch, "Error matching route")
|
|
assert.NotEqual(t, fooMatcher.Handler, foobarHandler, "Error matching priority")
|
|
assert.Equal(t, fooMatcher.Handler, fooHandler, "Error matching priority")
|
|
|
|
routeFoo.Priority(1)
|
|
routeFoobar.Priority(10)
|
|
router.SortRoutes()
|
|
|
|
foobarMatcher := &mux.RouteMatch{}
|
|
routeMatch = router.Match(&http.Request{URL: &url.URL{Path: "/foobar"}}, foobarMatcher)
|
|
|
|
assert.True(t, routeMatch, "Error matching route")
|
|
assert.Equal(t, foobarMatcher.Handler, foobarHandler, "Error matching priority")
|
|
assert.NotEqual(t, foobarMatcher.Handler, fooHandler, "Error matching priority")
|
|
}
|
|
|
|
type fakeHandler struct {
|
|
name string
|
|
}
|
|
|
|
func (h *fakeHandler) ServeHTTP(http.ResponseWriter, *http.Request) {}
|