summaryrefslogtreecommitdiffstats
path: root/pkg/authn/authn_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/authn/authn_test.go')
-rw-r--r--pkg/authn/authn_test.go148
1 files changed, 148 insertions, 0 deletions
diff --git a/pkg/authn/authn_test.go b/pkg/authn/authn_test.go
new file mode 100644
index 0000000..f191acd
--- /dev/null
+++ b/pkg/authn/authn_test.go
@@ -0,0 +1,148 @@
+// Copyright 2022 Google LLC All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package authn
+
+import (
+ "encoding/json"
+ "strings"
+ "testing"
+
+ "github.com/google/go-cmp/cmp"
+)
+
+func TestAuthConfigMarshalJSON(t *testing.T) {
+ cases := []struct {
+ name string
+ config AuthConfig
+ json string
+ }{{
+ name: "auth field is calculated",
+ config: AuthConfig{
+ Username: "user",
+ Password: "pass",
+ IdentityToken: "id",
+ RegistryToken: "reg",
+ },
+ json: `{"username":"user","password":"pass","auth":"dXNlcjpwYXNz","identitytoken":"id","registrytoken":"reg"}`,
+ }, {
+ name: "auth field replaced",
+ config: AuthConfig{
+ Username: "user",
+ Password: "pass",
+ Auth: "blah",
+ IdentityToken: "id",
+ RegistryToken: "reg",
+ },
+ json: `{"username":"user","password":"pass","auth":"dXNlcjpwYXNz","identitytoken":"id","registrytoken":"reg"}`,
+ }}
+
+ for _, tc := range cases {
+ t.Run(tc.name, func(t *testing.T) {
+ bytes, err := json.Marshal(&tc.config)
+
+ if err != nil {
+ t.Fatal("Marshal() =", err)
+ }
+
+ if diff := cmp.Diff(tc.json, string(bytes)); diff != "" {
+ t.Error("json output diff (-want, +got): ", diff)
+ }
+ })
+ }
+}
+
+func TestAuthConfigUnmarshalJSON(t *testing.T) {
+ cases := []struct {
+ name string
+ json string
+ err string
+ want AuthConfig
+ }{{
+ name: "valid config no auth",
+ json: `{
+ "username": "user",
+ "password": "pass",
+ "identitytoken": "id",
+ "registrytoken": "reg"
+ }`,
+ want: AuthConfig{
+ // Auth value is set based on username and password
+ Auth: "dXNlcjpwYXNz",
+ Username: "user",
+ Password: "pass",
+ IdentityToken: "id",
+ RegistryToken: "reg",
+ },
+ }, {
+ name: "bad json input",
+ json: `{"username":true}`,
+ err: "json: cannot unmarshal",
+ }, {
+ name: "auth is base64",
+ json: `{ "auth": "dXNlcjpwYXNz" }`, // user:pass
+ want: AuthConfig{
+ Username: "user",
+ Password: "pass",
+ Auth: "dXNlcjpwYXNz",
+ },
+ }, {
+ name: "auth field overrides others",
+ json: `{ "auth": "dXNlcjpwYXNz", "username":"foo", "password":"bar" }`, // user:pass
+ want: AuthConfig{
+ Username: "user",
+ Password: "pass",
+ Auth: "dXNlcjpwYXNz",
+ },
+ }, {
+ name: "auth is base64 padded",
+ json: `{ "auth": "dXNlcjpwYXNzd29yZA==" }`, // user:password
+ want: AuthConfig{
+ Username: "user",
+ Password: "password",
+ Auth: "dXNlcjpwYXNzd29yZA==",
+ },
+ }, {
+ name: "auth is not base64",
+ json: `{ "auth": "bad-auth-bad" }`,
+ err: "unable to decode auth field",
+ }, {
+ name: "decoded auth is not valid",
+ json: `{ "auth": "Zm9vYmFy" }`,
+ err: "unable to decode auth field: must be formatted as base64(username:password)",
+ }}
+
+ for _, tc := range cases {
+ t.Run(tc.name, func(t *testing.T) {
+ var got AuthConfig
+ err := json.Unmarshal([]byte(tc.json), &got)
+ if tc.err != "" && err == nil {
+ t.Fatal("no error occurred expected:", tc.err)
+ } else if tc.err != "" && err != nil {
+ if !strings.HasPrefix(err.Error(), tc.err) {
+ t.Fatalf("expected err %q to have prefix %q", err, tc.err)
+ }
+ return
+ }
+
+ if err != nil {
+ t.Fatal("Unmarshal()=", err)
+ }
+
+ if diff := cmp.Diff(tc.want, got); diff != "" {
+ t.Fatal("unexpected diff (-want, +got)\n", diff)
+ }
+ })
+ }
+}