58 lines
1.6 KiB
Go
58 lines
1.6 KiB
Go
package auth
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestParseBearerToken(t *testing.T) {
|
|
for _, tc := range []struct {
|
|
header, token string
|
|
want error
|
|
}{
|
|
{"Bearer abc.def-_/+~==", "abc.def-_/+~==", nil},
|
|
{"bEaReR token", "token", nil},
|
|
{"Bearer ", "", ErrAuthEmptyBearerToken},
|
|
{"Bearer ", "", ErrAuthEmptyBearerToken},
|
|
{"Bearer", "", ErrAuthInvalidBearerFormat},
|
|
{"Bearer x y", "", ErrAuthInvalidBearerFormat},
|
|
{"Bearer x ", "", ErrAuthInvalidBearerFormat},
|
|
{"Bearer x\r\n", "", ErrAuthInvalidBearerFormat},
|
|
{"Bearer x\ty", "", ErrAuthInvalidBearerFormat},
|
|
{"Bearer =", "", ErrAuthInvalidBearerFormat},
|
|
{"Bearer a=b", "", ErrAuthInvalidBearerFormat},
|
|
{"Other x", "", ErrAuthInvalidBearerFormat},
|
|
{"Bearer " + strings.Repeat("x", MaxTokenLen+1), "", ErrTokenTooLong},
|
|
} {
|
|
token, err := ParseBearerToken(tc.header)
|
|
if tc.want != nil {
|
|
errIs(t, err, tc.want, tc.header)
|
|
} else {
|
|
noErr(t, err, tc.header)
|
|
}
|
|
eq(t, token, tc.token, "token")
|
|
}
|
|
}
|
|
|
|
func FuzzParseBearerToken(f *testing.F) {
|
|
for _, seed := range []string{"Bearer token", "bearer abc+/==", "Bearer x\n", "Bearer a=b", ""} {
|
|
f.Add(seed)
|
|
}
|
|
f.Fuzz(func(t *testing.T, header string) {
|
|
token, err := ParseBearerToken(header)
|
|
if err != nil {
|
|
if token != "" {
|
|
t.Fatal("token with error")
|
|
}
|
|
return
|
|
}
|
|
if token == "" || len(token) > MaxTokenLen || strings.ContainsAny(token, " \t\r\n") {
|
|
t.Fatal("invalid token accepted")
|
|
}
|
|
again, err := ParseBearerToken("Bearer " + token)
|
|
if err != nil || again != token {
|
|
t.Fatal("noncanonical roundtrip")
|
|
}
|
|
})
|
|
}
|