1/*
2Copyright 2018 The Kubernetes Authors.
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8    http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
15*/
16
17package strict
18
19import (
20	"io/ioutil"
21	"path/filepath"
22	"testing"
23
24	kubeadmapiv1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta3"
25	"k8s.io/kubernetes/cmd/kubeadm/app/constants"
26
27	"k8s.io/apimachinery/pkg/runtime/schema"
28	kubeproxyconfigv1alpha1 "k8s.io/kube-proxy/config/v1alpha1"
29	kubeletconfigv1beta1 "k8s.io/kubelet/config/v1beta1"
30)
31
32func TestVerifyUnmarshalStrict(t *testing.T) {
33	const (
34		pathTestData = "testdata/"
35	)
36
37	var testFiles = []struct {
38		fileName      string
39		kind          string
40		groupVersion  schema.GroupVersion
41		expectedError bool
42	}{
43		// tests with file errors
44		{
45			fileName:      "invalid_duplicate_field_clustercfg.yaml",
46			kind:          constants.InitConfigurationKind,
47			groupVersion:  kubeadmapiv1.SchemeGroupVersion,
48			expectedError: true,
49		},
50		{
51			fileName:      "invalid_duplicate_field_joincfg.yaml",
52			kind:          constants.JoinConfigurationKind,
53			groupVersion:  kubeadmapiv1.SchemeGroupVersion,
54			expectedError: true,
55		},
56		{
57			fileName:      "invalid_duplicate_field_kubeletcfg.yaml",
58			kind:          "KubeletConfiguration",
59			groupVersion:  kubeletconfigv1beta1.SchemeGroupVersion,
60			expectedError: true,
61		},
62		{
63			fileName:      "invalid_duplicate_field_kubeproxycfg.yaml",
64			kind:          "KubeProxyConfiguration",
65			groupVersion:  kubeproxyconfigv1alpha1.SchemeGroupVersion,
66			expectedError: true,
67		},
68		{
69			fileName:      "invalid_unknown_field_clustercfg.yaml",
70			kind:          constants.ClusterConfigurationKind,
71			groupVersion:  kubeadmapiv1.SchemeGroupVersion,
72			expectedError: true,
73		},
74		{
75			fileName:      "invalid_unknown_field_initcfg.yaml",
76			kind:          constants.InitConfigurationKind,
77			groupVersion:  kubeadmapiv1.SchemeGroupVersion,
78			expectedError: true,
79		},
80		{
81			fileName:      "invalid_unknown_field_joincfg.yaml",
82			kind:          constants.JoinConfigurationKind,
83			groupVersion:  kubeadmapiv1.SchemeGroupVersion,
84			expectedError: true,
85		},
86		{
87			fileName:      "invalid_unknown_field_kubeletcfg.yaml",
88			kind:          "KubeletConfiguration",
89			groupVersion:  kubeletconfigv1beta1.SchemeGroupVersion,
90			expectedError: true,
91		},
92		{
93			fileName:      "invalid_unknown_field_kubeproxycfg.yaml",
94			kind:          "KubeProxyConfiguration",
95			groupVersion:  kubeproxyconfigv1alpha1.SchemeGroupVersion,
96			expectedError: true,
97		},
98		// test unknown groupVersion and kind
99		{
100			fileName:      "valid_clustercfg.yaml",
101			kind:          constants.ClusterConfigurationKind,
102			groupVersion:  schema.GroupVersion{Group: "someGroup", Version: "v1"},
103			expectedError: true,
104		},
105		{
106			fileName:      "valid_clustercfg.yaml",
107			kind:          "SomeUnknownKind",
108			groupVersion:  kubeadmapiv1.SchemeGroupVersion,
109			expectedError: true,
110		},
111		// valid tests
112		{
113			fileName:      "valid_clustercfg.yaml",
114			kind:          constants.ClusterConfigurationKind,
115			groupVersion:  kubeadmapiv1.SchemeGroupVersion,
116			expectedError: false,
117		},
118		{
119			fileName:      "valid_initcfg.yaml",
120			kind:          constants.InitConfigurationKind,
121			groupVersion:  kubeadmapiv1.SchemeGroupVersion,
122			expectedError: false,
123		},
124		{
125			fileName:      "valid_joincfg.yaml",
126			kind:          constants.JoinConfigurationKind,
127			groupVersion:  kubeadmapiv1.SchemeGroupVersion,
128			expectedError: false,
129		},
130		{
131			fileName:      "valid_kubeletcfg.yaml",
132			kind:          "KubeletConfiguration",
133			groupVersion:  kubeletconfigv1beta1.SchemeGroupVersion,
134			expectedError: false,
135		},
136		{
137			fileName:      "valid_kubeproxycfg.yaml",
138			kind:          "KubeProxyConfiguration",
139			groupVersion:  kubeproxyconfigv1alpha1.SchemeGroupVersion,
140			expectedError: false,
141		},
142	}
143
144	for _, test := range testFiles {
145		t.Run(test.fileName, func(t *testing.T) {
146			bytes, err := ioutil.ReadFile(filepath.Join(pathTestData, test.fileName))
147			if err != nil {
148				t.Fatalf("couldn't read test data: %v", err)
149			}
150			gvk := schema.GroupVersionKind{
151				Group:   test.groupVersion.Group,
152				Version: test.groupVersion.Version,
153				Kind:    test.kind,
154			}
155			err = VerifyUnmarshalStrict(bytes, gvk)
156			if (err != nil) != test.expectedError {
157				t.Errorf("expected error %v, got %v, error: %v", err != nil, test.expectedError, err)
158			}
159		})
160	}
161}
162