package v1 import ( "fmt" "reflect" "strings" "testing" "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime/serializer" configapi "github.com/openshift/origin/pkg/cmd/server/api" ) func TestStringSourceUnmarshaling(t *testing.T) { codec := serializer.NewCodecFactory(configapi.Scheme).LegacyCodec(SchemeGroupVersion) testcases := map[string]struct { JSON string ExpectedObject configapi.StringSource ExpectedError string }{ "bool": { JSON: `true`, ExpectedObject: configapi.StringSource{}, ExpectedError: "cannot unmarshal", }, "number": { JSON: `1`, ExpectedObject: configapi.StringSource{}, ExpectedError: "cannot unmarshal", }, "empty string": { JSON: `""`, ExpectedObject: configapi.StringSource{}, ExpectedError: "", }, "string": { JSON: `"foo"`, ExpectedObject: configapi.StringSource{StringSourceSpec: configapi.StringSourceSpec{Value: "foo"}}, ExpectedError: "", }, "empty struct": { JSON: `{}`, ExpectedObject: configapi.StringSource{}, ExpectedError: "", }, "struct value": { JSON: `{"value":"foo"}`, ExpectedObject: configapi.StringSource{StringSourceSpec: configapi.StringSourceSpec{Value: "foo"}}, ExpectedError: "", }, "struct env": { JSON: `{"env":"foo"}`, ExpectedObject: configapi.StringSource{StringSourceSpec: configapi.StringSourceSpec{Env: "foo"}}, ExpectedError: "", }, "struct file": { JSON: `{"file":"foo"}`, ExpectedObject: configapi.StringSource{StringSourceSpec: configapi.StringSourceSpec{File: "foo"}}, ExpectedError: "", }, "struct file+keyFile": { JSON: `{"file":"foo","keyFile":"bar"}`, ExpectedObject: configapi.StringSource{StringSourceSpec: configapi.StringSourceSpec{File: "foo", KeyFile: "bar"}}, ExpectedError: "", }, } for k, tc := range testcases { // Wrap in a dummy object we can deserialize input := fmt.Sprintf(`{"kind":"GitHubIdentityProvider","apiVersion":"v1","clientSecret":%s}`, tc.JSON) obj, err := runtime.Decode(codec, []byte(input)) if len(tc.ExpectedError) > 0 && (err == nil || !strings.Contains(err.Error(), tc.ExpectedError)) { t.Errorf("%s: expected error containing %q, got %q", k, tc.ExpectedError, err.Error()) } if len(tc.ExpectedError) == 0 && err != nil { t.Errorf("%s: got unexpected error: %v", k, err) } if err != nil { continue } githubProvider, ok := obj.(*configapi.GitHubIdentityProvider) if !ok { t.Errorf("%s: wrapper object was not a GitHubIdentityProvider as expected: %#v", k, obj) continue } if !reflect.DeepEqual(tc.ExpectedObject, githubProvider.ClientSecret) { t.Errorf("%s: expected\n%#v\ngot\n%#v", k, tc.ExpectedObject, githubProvider.ClientSecret) } } } func TestStringSourceMarshaling(t *testing.T) { codec := serializer.NewCodecFactory(configapi.Scheme).LegacyCodec(SchemeGroupVersion) testcases := map[string]struct { Object configapi.StringSource ExpectedJSON string }{ "empty string": { Object: configapi.StringSource{}, ExpectedJSON: `""`, }, "string": { Object: configapi.StringSource{StringSourceSpec: configapi.StringSourceSpec{Value: "foo"}}, ExpectedJSON: `"foo"`, }, "struct value+keyFile": { Object: configapi.StringSource{StringSourceSpec: configapi.StringSourceSpec{Value: "foo", KeyFile: "bar"}}, ExpectedJSON: `{"value":"foo","env":"","file":"","keyFile":"bar"}`, }, "struct env": { Object: configapi.StringSource{StringSourceSpec: configapi.StringSourceSpec{Env: "foo"}}, ExpectedJSON: `{"value":"","env":"foo","file":"","keyFile":""}`, }, "struct file": { Object: configapi.StringSource{StringSourceSpec: configapi.StringSourceSpec{File: "foo"}}, ExpectedJSON: `{"value":"","env":"","file":"foo","keyFile":""}`, }, "struct file+keyFile": { Object: configapi.StringSource{StringSourceSpec: configapi.StringSourceSpec{File: "foo", KeyFile: "bar"}}, ExpectedJSON: `{"value":"","env":"","file":"foo","keyFile":"bar"}`, }, } for k, tc := range testcases { provider := &configapi.GitHubIdentityProvider{ClientSecret: tc.Object} json, err := runtime.Encode(codec, provider) if err != nil { t.Errorf("%s: unexpected error: %v", k, err) } // Wrap in a dummy JSON from the surrounding object input := fmt.Sprintf(`{"kind":"GitHubIdentityProvider","apiVersion":"v1","clientID":"","clientSecret":%s,"organizations":null,"teams":null}`, tc.ExpectedJSON) if strings.TrimSpace(string(json)) != input { t.Log(len(input), len(json)) t.Errorf("%s: expected\n%s\ngot\n%s", k, input, string(json)) } } }