2018-03-01 12:50:59 -05:00
|
|
|
package registry
|
|
|
|
|
|
|
|
import (
|
|
|
|
"strings"
|
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
|
|
|
type authServiceMock struct {
|
|
|
|
service string
|
|
|
|
realm string
|
|
|
|
scope []string
|
|
|
|
}
|
|
|
|
|
|
|
|
type challengeTestCase struct {
|
|
|
|
header string
|
|
|
|
errorString string
|
|
|
|
value authServiceMock
|
|
|
|
}
|
|
|
|
|
|
|
|
func (asm authServiceMock) equalTo(v *authService) bool {
|
|
|
|
if asm.service != v.Service {
|
|
|
|
return false
|
|
|
|
}
|
2018-06-06 12:04:28 -04:00
|
|
|
for i, v := range v.Scope {
|
|
|
|
if v != asm.scope[i] {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
2018-06-04 16:42:58 -04:00
|
|
|
|
2018-06-17 15:55:31 -04:00
|
|
|
return asm.realm == v.Realm.String()
|
2018-03-01 12:50:59 -05:00
|
|
|
}
|
|
|
|
|
2018-03-06 09:12:29 -05:00
|
|
|
func TestParseChallenge(t *testing.T) {
|
2018-03-01 12:50:59 -05:00
|
|
|
challengeHeaderCases := []challengeTestCase{
|
|
|
|
{
|
|
|
|
header: `Bearer realm="https://foobar.com/api/v1/token",service=foobar.com,scope=""`,
|
|
|
|
value: authServiceMock{
|
|
|
|
service: "foobar.com",
|
|
|
|
realm: "https://foobar.com/api/v1/token",
|
|
|
|
},
|
|
|
|
},
|
2018-06-06 15:43:12 -04:00
|
|
|
{
|
|
|
|
header: `Bearer realm="https://r.j3ss.co/auth",service="Docker registry",scope="repository:chrome:pull"`,
|
|
|
|
value: authServiceMock{
|
|
|
|
service: "Docker registry",
|
|
|
|
realm: "https://r.j3ss.co/auth",
|
|
|
|
scope: []string{"repository:chrome:pull"},
|
|
|
|
},
|
|
|
|
},
|
2018-07-26 17:13:58 -04:00
|
|
|
{
|
|
|
|
header: `Basic realm="https://r.j3ss.co/auth",service="Docker registry"`,
|
|
|
|
errorString: "basic auth required",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
header: `Basic realm="Registry Realm",service="Docker registry"`,
|
|
|
|
errorString: "basic auth required",
|
|
|
|
},
|
2018-03-01 12:50:59 -05:00
|
|
|
}
|
2018-03-06 09:12:29 -05:00
|
|
|
|
2018-03-01 12:50:59 -05:00
|
|
|
for _, tc := range challengeHeaderCases {
|
|
|
|
val, err := parseChallenge(tc.header)
|
|
|
|
if err != nil && !strings.Contains(err.Error(), tc.errorString) {
|
|
|
|
t.Fatalf("expected error to contain %v, got %s", tc.errorString, err)
|
|
|
|
}
|
2018-07-26 17:13:58 -04:00
|
|
|
if err == nil && !tc.value.equalTo(val) {
|
2018-03-01 12:50:59 -05:00
|
|
|
t.Fatalf("got %v, expected %v", val, tc.value)
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
2018-06-04 16:42:58 -04:00
|
|
|
|
|
|
|
func TestParseChallengePush(t *testing.T) {
|
|
|
|
challengeHeaderCases := []challengeTestCase{
|
|
|
|
{
|
|
|
|
header: `Bearer realm="https://foo.com/v2/token",service="foo.com",scope="repository:pdr/tls:pull,push"`,
|
|
|
|
value: authServiceMock{
|
2018-06-06 12:04:28 -04:00
|
|
|
realm: "https://foo.com/v2/token",
|
|
|
|
service: "foo.com",
|
|
|
|
scope: []string{"repository:pdr/tls:pull,push"},
|
2018-06-04 16:42:58 -04:00
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
for _, tc := range challengeHeaderCases {
|
|
|
|
val, err := parseChallenge(tc.header)
|
|
|
|
if err != nil && !strings.Contains(err.Error(), tc.errorString) {
|
|
|
|
t.Fatalf("expected error to contain %v, got %s", tc.errorString, err)
|
|
|
|
}
|
|
|
|
if !tc.value.equalTo(val) {
|
|
|
|
t.Fatalf("got %v, expected %v", val, tc.value)
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|