Add some tests to ensure proper configuration parsing
This commit is contained in:
parent
671958e123
commit
f4ca8e91f2
9 changed files with 181 additions and 10 deletions
|
@ -88,7 +88,7 @@ func startEndpoint(handler api.ProtocolHandler, config config.HandlerConfig, log
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
handler.Run(config)
|
handler.Start(config)
|
||||||
}
|
}
|
||||||
|
|
||||||
func shutdownEndpoint(handler api.ProtocolHandler, wg *sync.WaitGroup, logger *zap.Logger) {
|
func shutdownEndpoint(handler api.ProtocolHandler, wg *sync.WaitGroup, logger *zap.Logger) {
|
||||||
|
|
|
@ -11,6 +11,6 @@ type PluginInstanceFactory func() ProtocolHandler
|
||||||
type LoggingFactory func() (*zap.Logger, error)
|
type LoggingFactory func() (*zap.Logger, error)
|
||||||
|
|
||||||
type ProtocolHandler interface {
|
type ProtocolHandler interface {
|
||||||
Run(config config.HandlerConfig)
|
Start(config config.HandlerConfig)
|
||||||
Shutdown(wg *sync.WaitGroup)
|
Shutdown(wg *sync.WaitGroup)
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@ type dnsHandler struct {
|
||||||
dnsServer []*dns.Server
|
dnsServer []*dns.Server
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *dnsHandler) Run(config config.HandlerConfig) {
|
func (d *dnsHandler) Start(config config.HandlerConfig) {
|
||||||
options := loadFromConfig(config.Options())
|
options := loadFromConfig(config.Options())
|
||||||
addr := fmt.Sprintf("%s:%d", config.ListenAddress(), config.Port())
|
addr := fmt.Sprintf("%s:%d", config.ListenAddress(), config.Port())
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ type httpHandler struct {
|
||||||
server *http.Server
|
server *http.Server
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *httpHandler) Run(config config.HandlerConfig) {
|
func (p *httpHandler) Start(config config.HandlerConfig) {
|
||||||
options := loadFromConfig(config.Options())
|
options := loadFromConfig(config.Options())
|
||||||
addr := fmt.Sprintf("%s:%d", config.ListenAddress(), config.Port())
|
addr := fmt.Sprintf("%s:%d", config.ListenAddress(), config.Port())
|
||||||
p.server = &http.Server{Addr: addr, Handler: p.router}
|
p.server = &http.Server{Addr: addr, Handler: p.router}
|
||||||
|
|
|
@ -16,7 +16,7 @@ var (
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
fallbackStrategies = map[string]ProxyFallbackStrategy{
|
fallbackStrategies = map[string]ProxyFallbackStrategy{
|
||||||
passthroughStrategyName: &passthroughFallbackStrategy{},
|
passthroughStrategyName: &passThroughFallbackStrategy{},
|
||||||
notFoundStrategyName: ¬FoundFallbackStrategy{},
|
notFoundStrategyName: ¬FoundFallbackStrategy{},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,10 +32,10 @@ type ProxyFallbackStrategy interface {
|
||||||
Apply(request *http.Request) (*http.Response, error)
|
Apply(request *http.Request) (*http.Response, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type passthroughFallbackStrategy struct {
|
type passThroughFallbackStrategy struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p passthroughFallbackStrategy) Apply(request *http.Request) (*http.Response, error) {
|
func (p passThroughFallbackStrategy) Apply(request *http.Request) (*http.Response, error) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
46
plugins/http_proxy/fallback_test.go
Normal file
46
plugins/http_proxy/fallback_test.go
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestStrategyForName(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
name string
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
want reflect.Type
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "Test get notfound strategy",
|
||||||
|
want: reflect.TypeOf(¬FoundFallbackStrategy{}),
|
||||||
|
args: args{
|
||||||
|
name: "notfound",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Test get pass through strategy",
|
||||||
|
want: reflect.TypeOf(&passThroughFallbackStrategy{}),
|
||||||
|
args: args{
|
||||||
|
name: "passthrough",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Test get fallback strategy notfound because key is not known",
|
||||||
|
want: reflect.TypeOf(¬FoundFallbackStrategy{}),
|
||||||
|
args: args{
|
||||||
|
name: "asdf12234",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if got := StrategyForName(tt.args.name); reflect.TypeOf(got) != tt.want {
|
||||||
|
t.Errorf("StrategyForName() = %v, want %v", got, tt.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
|
@ -19,7 +19,7 @@ type httpProxy struct {
|
||||||
server *http.Server
|
server *http.Server
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *httpProxy) Run(config config.HandlerConfig) {
|
func (h *httpProxy) Start(config config.HandlerConfig) {
|
||||||
options := loadFromConfig(config.Options())
|
options := loadFromConfig(config.Options())
|
||||||
addr := fmt.Sprintf("%s:%d", config.ListenAddress(), config.Port())
|
addr := fmt.Sprintf("%s:%d", config.ListenAddress(), config.Port())
|
||||||
h.server = &http.Server{Addr: addr, Handler: h.proxy}
|
h.server = &http.Server{Addr: addr, Handler: h.proxy}
|
||||||
|
@ -32,7 +32,6 @@ func (h *httpProxy) Run(config config.HandlerConfig) {
|
||||||
logger: h.logger,
|
logger: h.logger,
|
||||||
}
|
}
|
||||||
h.proxy.OnRequest().Do(proxyHandler)
|
h.proxy.OnRequest().Do(proxyHandler)
|
||||||
h.proxy.OnRequest().HandleConnect()
|
|
||||||
go h.startProxy()
|
go h.startProxy()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
126
plugins/http_proxy/protocol_options_test.go
Normal file
126
plugins/http_proxy/protocol_options_test.go
Normal file
|
@ -0,0 +1,126 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"github.com/spf13/viper"
|
||||||
|
"reflect"
|
||||||
|
"regexp"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Test_loadFromConfig(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
config string
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
wantOptions httpProxyOptions
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "Parse proper configuration with notfound strategy",
|
||||||
|
args: args{
|
||||||
|
config: `
|
||||||
|
fallback: notfound,
|
||||||
|
rules:
|
||||||
|
- pattern: ".*"
|
||||||
|
response: ./assets/fakeFiles/default.html
|
||||||
|
`,
|
||||||
|
},
|
||||||
|
wantOptions: httpProxyOptions{
|
||||||
|
FallbackStrategy: StrategyForName(notFoundStrategyName),
|
||||||
|
Rules: []targetRule{
|
||||||
|
{
|
||||||
|
response: "./assets/fakeFiles/default.html",
|
||||||
|
pattern: regexp.MustCompile(".*"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Parse proper configuration with pass through strategy",
|
||||||
|
args: args{
|
||||||
|
config: `
|
||||||
|
fallback: passthrough
|
||||||
|
rules:
|
||||||
|
- pattern: ".*"
|
||||||
|
response: ./assets/fakeFiles/default.html
|
||||||
|
`,
|
||||||
|
},
|
||||||
|
wantOptions: httpProxyOptions{
|
||||||
|
FallbackStrategy: StrategyForName(passthroughStrategyName),
|
||||||
|
Rules: []targetRule{
|
||||||
|
{
|
||||||
|
response: "./assets/fakeFiles/default.html",
|
||||||
|
pattern: regexp.MustCompile(".*"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Parse proper configuration and preserve order of rules",
|
||||||
|
args: args{
|
||||||
|
config: `
|
||||||
|
fallback: notfound
|
||||||
|
rules:
|
||||||
|
- pattern: ".*\\.(?i)txt"
|
||||||
|
response: ./assets/fakeFiles/default.txt
|
||||||
|
- pattern: ".*"
|
||||||
|
response: ./assets/fakeFiles/default.html
|
||||||
|
`,
|
||||||
|
},
|
||||||
|
wantOptions: httpProxyOptions{
|
||||||
|
FallbackStrategy: StrategyForName(notFoundStrategyName),
|
||||||
|
Rules: []targetRule{
|
||||||
|
{
|
||||||
|
response: "./assets/fakeFiles/default.txt",
|
||||||
|
pattern: regexp.MustCompile(".*\\.(?i)txt"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
response: "./assets/fakeFiles/default.html",
|
||||||
|
pattern: regexp.MustCompile(".*"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Parse configuration with non existing fallback strategy key - falling back to 'notfound'",
|
||||||
|
args: args{
|
||||||
|
config: `
|
||||||
|
fallback: doesNotExist
|
||||||
|
rules: []
|
||||||
|
`,
|
||||||
|
},
|
||||||
|
wantOptions: httpProxyOptions{
|
||||||
|
FallbackStrategy: StrategyForName(notFoundStrategyName),
|
||||||
|
Rules: nil,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Parse configuration without any fallback key",
|
||||||
|
args: args{
|
||||||
|
config: `
|
||||||
|
f4llb4ck: doesNotExist
|
||||||
|
rules: []
|
||||||
|
`,
|
||||||
|
},
|
||||||
|
wantOptions: httpProxyOptions{
|
||||||
|
FallbackStrategy: StrategyForName(notFoundStrategyName),
|
||||||
|
Rules: nil,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
config := viper.New()
|
||||||
|
config.SetConfigType("yaml")
|
||||||
|
if err := config.ReadConfig(bytes.NewBufferString(tt.args.config)); err != nil {
|
||||||
|
t.Errorf("failed to read config %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if gotOptions := loadFromConfig(config); !reflect.DeepEqual(gotOptions, tt.wantOptions) {
|
||||||
|
t.Errorf("loadFromConfig() = %v, want %v", gotOptions, tt.wantOptions)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
|
@ -25,7 +25,7 @@ type tlsInterceptor struct {
|
||||||
currentConnections []*proxyConn
|
currentConnections []*proxyConn
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *tlsInterceptor) Run(config config.HandlerConfig) {
|
func (t *tlsInterceptor) Start(config config.HandlerConfig) {
|
||||||
var err error
|
var err error
|
||||||
t.options = loadFromConfig(config.Options())
|
t.options = loadFromConfig(config.Options())
|
||||||
addr := fmt.Sprintf("%s:%d", config.ListenAddress(), config.Port())
|
addr := fmt.Sprintf("%s:%d", config.ListenAddress(), config.Port())
|
||||||
|
|
Loading…
Reference in a new issue