191 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			191 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Go
		
	
	
	
package validation
 | 
						|
 | 
						|
import (
 | 
						|
	"time"
 | 
						|
 | 
						|
	"github.com/oauth2-proxy/oauth2-proxy/v7/pkg/apis/options"
 | 
						|
	. "github.com/onsi/ginkgo"
 | 
						|
	. "github.com/onsi/ginkgo/extensions/table"
 | 
						|
	. "github.com/onsi/gomega"
 | 
						|
)
 | 
						|
 | 
						|
var _ = Describe("Upstreams", func() {
 | 
						|
	type validateUpstreamTableInput struct {
 | 
						|
		upstreams  options.Upstreams
 | 
						|
		errStrings []string
 | 
						|
	}
 | 
						|
 | 
						|
	flushInterval := 5 * time.Second
 | 
						|
	staticCode200 := 200
 | 
						|
	truth := true
 | 
						|
 | 
						|
	validHTTPUpstream := options.Upstream{
 | 
						|
		ID:   "validHTTPUpstream",
 | 
						|
		Path: "/validHTTPUpstream",
 | 
						|
		URI:  "http://localhost:8080",
 | 
						|
	}
 | 
						|
	validStaticUpstream := options.Upstream{
 | 
						|
		ID:     "validStaticUpstream",
 | 
						|
		Path:   "/validStaticUpstream",
 | 
						|
		Static: true,
 | 
						|
	}
 | 
						|
	validFileUpstream := options.Upstream{
 | 
						|
		ID:   "validFileUpstream",
 | 
						|
		Path: "/validFileUpstream",
 | 
						|
		URI:  "file://var/lib/foo",
 | 
						|
	}
 | 
						|
 | 
						|
	emptyIDMsg := "upstream has empty id: ids are required for all upstreams"
 | 
						|
	emptyPathMsg := "upstream \"foo\" has empty path: paths are required for all upstreams"
 | 
						|
	emptyURIMsg := "upstream \"foo\" has empty uri: uris are required for all non-static upstreams"
 | 
						|
	invalidURIMsg := "upstream \"foo\" has invalid uri: parse \":\": missing protocol scheme"
 | 
						|
	invalidURISchemeMsg := "upstream \"foo\" has invalid scheme: \"ftp\""
 | 
						|
	staticWithURIMsg := "upstream \"foo\" has uri, but is a static upstream, this will have no effect."
 | 
						|
	staticWithInsecureMsg := "upstream \"foo\" has insecureSkipTLSVerify, but is a static upstream, this will have no effect."
 | 
						|
	staticWithFlushIntervalMsg := "upstream \"foo\" has flushInterval, but is a static upstream, this will have no effect."
 | 
						|
	staticWithPassHostHeaderMsg := "upstream \"foo\" has passHostHeader, but is a static upstream, this will have no effect."
 | 
						|
	staticWithProxyWebSocketsMsg := "upstream \"foo\" has proxyWebSockets, but is a static upstream, this will have no effect."
 | 
						|
	multipleIDsMsg := "multiple upstreams found with id \"foo\": upstream ids must be unique"
 | 
						|
	multiplePathsMsg := "multiple upstreams found with path \"/foo\": upstream paths must be unique"
 | 
						|
	staticCodeMsg := "upstream \"foo\" has staticCode (200), but is not a static upstream, set 'static' for a static response"
 | 
						|
 | 
						|
	DescribeTable("validateUpstreams",
 | 
						|
		func(o *validateUpstreamTableInput) {
 | 
						|
			Expect(validateUpstreams(o.upstreams)).To(ConsistOf(o.errStrings))
 | 
						|
		},
 | 
						|
		Entry("with no upstreams", &validateUpstreamTableInput{
 | 
						|
			upstreams:  options.Upstreams{},
 | 
						|
			errStrings: []string{},
 | 
						|
		}),
 | 
						|
		Entry("with valid upstreams", &validateUpstreamTableInput{
 | 
						|
			upstreams: options.Upstreams{
 | 
						|
				validHTTPUpstream,
 | 
						|
				validStaticUpstream,
 | 
						|
				validFileUpstream,
 | 
						|
			},
 | 
						|
			errStrings: []string{},
 | 
						|
		}),
 | 
						|
		Entry("with an empty ID", &validateUpstreamTableInput{
 | 
						|
			upstreams: options.Upstreams{
 | 
						|
				{
 | 
						|
					ID:   "",
 | 
						|
					Path: "/foo",
 | 
						|
					URI:  "http://localhost:8080",
 | 
						|
				},
 | 
						|
			},
 | 
						|
			errStrings: []string{emptyIDMsg},
 | 
						|
		}),
 | 
						|
		Entry("with an empty Path", &validateUpstreamTableInput{
 | 
						|
			upstreams: options.Upstreams{
 | 
						|
				{
 | 
						|
					ID:   "foo",
 | 
						|
					Path: "",
 | 
						|
					URI:  "http://localhost:8080",
 | 
						|
				},
 | 
						|
			},
 | 
						|
			errStrings: []string{emptyPathMsg},
 | 
						|
		}),
 | 
						|
		Entry("with an empty Path", &validateUpstreamTableInput{
 | 
						|
			upstreams: options.Upstreams{
 | 
						|
				{
 | 
						|
					ID:   "foo",
 | 
						|
					Path: "",
 | 
						|
					URI:  "http://localhost:8080",
 | 
						|
				},
 | 
						|
			},
 | 
						|
			errStrings: []string{emptyPathMsg},
 | 
						|
		}),
 | 
						|
		Entry("with an empty URI", &validateUpstreamTableInput{
 | 
						|
			upstreams: options.Upstreams{
 | 
						|
				{
 | 
						|
					ID:   "foo",
 | 
						|
					Path: "/foo",
 | 
						|
					URI:  "",
 | 
						|
				},
 | 
						|
			},
 | 
						|
			errStrings: []string{emptyURIMsg},
 | 
						|
		}),
 | 
						|
		Entry("with an invalid URI", &validateUpstreamTableInput{
 | 
						|
			upstreams: options.Upstreams{
 | 
						|
				{
 | 
						|
					ID:   "foo",
 | 
						|
					Path: "/foo",
 | 
						|
					URI:  ":",
 | 
						|
				},
 | 
						|
			},
 | 
						|
			errStrings: []string{invalidURIMsg},
 | 
						|
		}),
 | 
						|
		Entry("with an invalid URI scheme", &validateUpstreamTableInput{
 | 
						|
			upstreams: options.Upstreams{
 | 
						|
				{
 | 
						|
					ID:   "foo",
 | 
						|
					Path: "/foo",
 | 
						|
					URI:  "ftp://foo",
 | 
						|
				},
 | 
						|
			},
 | 
						|
			errStrings: []string{invalidURISchemeMsg},
 | 
						|
		}),
 | 
						|
		Entry("with a static upstream and invalid optons", &validateUpstreamTableInput{
 | 
						|
			upstreams: options.Upstreams{
 | 
						|
				{
 | 
						|
					ID:                    "foo",
 | 
						|
					Path:                  "/foo",
 | 
						|
					URI:                   "ftp://foo",
 | 
						|
					Static:                true,
 | 
						|
					FlushInterval:         &flushInterval,
 | 
						|
					PassHostHeader:        &truth,
 | 
						|
					ProxyWebSockets:       &truth,
 | 
						|
					InsecureSkipTLSVerify: true,
 | 
						|
				},
 | 
						|
			},
 | 
						|
			errStrings: []string{
 | 
						|
				staticWithURIMsg,
 | 
						|
				staticWithInsecureMsg,
 | 
						|
				staticWithFlushIntervalMsg,
 | 
						|
				staticWithPassHostHeaderMsg,
 | 
						|
				staticWithProxyWebSocketsMsg,
 | 
						|
			},
 | 
						|
		}),
 | 
						|
		Entry("with duplicate IDs", &validateUpstreamTableInput{
 | 
						|
			upstreams: options.Upstreams{
 | 
						|
				{
 | 
						|
					ID:   "foo",
 | 
						|
					Path: "/foo1",
 | 
						|
					URI:  "http://foo",
 | 
						|
				},
 | 
						|
				{
 | 
						|
					ID:   "foo",
 | 
						|
					Path: "/foo2",
 | 
						|
					URI:  "http://foo",
 | 
						|
				},
 | 
						|
			},
 | 
						|
			errStrings: []string{multipleIDsMsg},
 | 
						|
		}),
 | 
						|
		Entry("with duplicate Paths", &validateUpstreamTableInput{
 | 
						|
			upstreams: options.Upstreams{
 | 
						|
				{
 | 
						|
					ID:   "foo1",
 | 
						|
					Path: "/foo",
 | 
						|
					URI:  "http://foo",
 | 
						|
				},
 | 
						|
				{
 | 
						|
					ID:   "foo2",
 | 
						|
					Path: "/foo",
 | 
						|
					URI:  "http://foo",
 | 
						|
				},
 | 
						|
			},
 | 
						|
			errStrings: []string{multiplePathsMsg},
 | 
						|
		}),
 | 
						|
		Entry("when a static code is supplied without static", &validateUpstreamTableInput{
 | 
						|
			upstreams: options.Upstreams{
 | 
						|
				{
 | 
						|
					ID:         "foo",
 | 
						|
					Path:       "/foo",
 | 
						|
					StaticCode: &staticCode200,
 | 
						|
				},
 | 
						|
			},
 | 
						|
			errStrings: []string{emptyURIMsg, staticCodeMsg},
 | 
						|
		}),
 | 
						|
	)
 | 
						|
})
 |