diff --git a/contrib/gotests_templates/call.tmpl b/contrib/gotests_templates/call.tmpl new file mode 100644 index 0000000000..4164f489b1 --- /dev/null +++ b/contrib/gotests_templates/call.tmpl @@ -0,0 +1 @@ +{{define "call"}}{{with .Receiver}}{{if not .IsStruct}}tt.{{end}}{{Receiver .}}.{{end}}{{.Name}}({{range $i, $el := .Parameters}}{{if $i}}, {{end}}{{if not .IsWriter}}tt.args.{{end}}{{Param .}}{{if .Type.IsVariadic}}...{{end}}{{end}}){{end}} diff --git a/contrib/gotests_templates/function.tmpl b/contrib/gotests_templates/function.tmpl new file mode 100644 index 0000000000..f53d0eedf9 --- /dev/null +++ b/contrib/gotests_templates/function.tmpl @@ -0,0 +1,107 @@ +{{define "function"}} +{{- $f := .}} + +func Test_Unit{{.FullName}}(t *testing.T) { + {{- with .Receiver}} + {{- if .IsStruct}} + {{- if .Fields}} + type fields struct { + {{- range .Fields}} + {{Field .}} {{.Type}} + {{- end}} + } + {{- end}} + {{- end}} + {{- end}} + {{- if .TestParameters}} + type args struct { + {{- range .TestParameters}} + {{Param .}} {{.Type}} + {{- end}} + } + {{- end}} + tests := []struct { + name string + {{- with .Receiver}} + {{- if and .IsStruct .Fields}} + fields fields + {{- else}} + {{Receiver .}} {{.Type}} + {{- end}} + {{- end}} + {{- if .TestParameters}} + args args + {{- end}} + setup func() error // Optional, delete if unused + teardown func() error // Optional, delete if unused + {{- range .TestResults}} + {{Want .}} {{.Type}} + {{- end}} + {{- if .ReturnsError}} + wantErr bool + {{- end}} + }{ + // TODO: Add test cases. + // { + // name: "Example Test", + // args: args { + // }, + // {{- range .TestResults}} + // want: {{Want .}} {{.Type}} + // {{- end}} + // setup: func() error { return nil }, + // teardown: func() error { return nil }, + // }, + } + for {{if (or .Subtests (not .IsNaked))}} _, tt := {{end}} range tests { + {{- if .Subtests}} + {{- if .Parallel}}tt := tt{{end}} + t.Run(tt.name, func(t *testing.T) { + {{- if .Parallel}}t.Parallel(){{end}} + {{- end}} + {{- with .Receiver}} + {{- if .IsStruct}} + {{Receiver .}} := {{if .Type.IsStar}}&{{end}}{{.Type.Value}}{ + {{- range .Fields}} + {{.Name}}: tt.fields.{{Field .}}, + {{- end}} + } + {{- end}} + {{- end}} + {{- range .Parameters}} + {{- if .IsWriter}} + {{Param .}} := &bytes.Buffer{} + {{- end}} + {{- end}} + defer tt.teardown() + if err := tt.setup(); err != nil { + t.Errorf("Setup for {{template "message" $f}} failed = %v", err) + return + } + {{- if and (not .OnlyReturnsError) (not .OnlyReturnsOneValue) }} + {{template "results" $f}} {{template "call" $f}} + {{- end}} + {{- if .ReturnsError}} + if {{if .OnlyReturnsError}} err := {{template "call" $f}}; {{end}} (err != nil) != tt.wantErr { + t.Errorf("{{template "message" $f}} error = %v, wantErr %v", {{template "inputs" $f}} err, tt.wantErr) + {{- if .TestResults}} + {{if .Subtests }}return{{else}}continue{{end}} + {{- end}} + } + {{- end}} + {{- range .TestResults}} + {{- if .IsWriter}} + if {{Got .}} := {{Param .}}.String(); {{Got .}} != tt.{{Want .}} { + {{- else if .IsBasicType}} + if {{if $f.OnlyReturnsOneValue}}{{Got .}} := {{template "inline" $f}}; {{end}} {{Got .}} != tt.{{Want .}} { + {{- else}} + if {{if $f.OnlyReturnsOneValue}}{{Got .}} := {{template "inline" $f}}; {{end}} !reflect.DeepEqual({{Got .}}, tt.{{Want .}}) { + {{- end}} + t.Errorf("{{template "message" $f}} {{if $f.ReturnsMultiple}}{{Got .}} {{end}}= %+v\nWant = %+v", {{template "inputs" $f}} {{Got .}}, tt.{{Want .}}) + } + {{- end}} + {{- if .Subtests }} }) {{- end -}} + } +} + +{{end}} diff --git a/contrib/gotests_templates/header.tmpl b/contrib/gotests_templates/header.tmpl new file mode 100644 index 0000000000..245569df7e --- /dev/null +++ b/contrib/gotests_templates/header.tmpl @@ -0,0 +1,10 @@ +{{define "header"}} +{{range .Comments}}{{.}} +{{end -}} +package {{.Package}} + +import ( +{{range .Imports}}{{.Name}} {{.Path}} +{{end}} +) +{{end}} diff --git a/contrib/gotests_templates/inline.tmpl b/contrib/gotests_templates/inline.tmpl new file mode 100644 index 0000000000..5ffc2f5812 --- /dev/null +++ b/contrib/gotests_templates/inline.tmpl @@ -0,0 +1 @@ +{{define "inline"}} {{template "call" .}} {{end}} diff --git a/contrib/gotests_templates/inputs.tmpl b/contrib/gotests_templates/inputs.tmpl new file mode 100644 index 0000000000..fb655da595 --- /dev/null +++ b/contrib/gotests_templates/inputs.tmpl @@ -0,0 +1 @@ +{{define "inputs"}}{{$f := .}}{{if not .Subtests}}tt.name, {{end}}{{if $f.PrintInputs}}{{range $f.Parameters}}tt.args.{{Param .}}, {{end}}{{end}}{{end}} diff --git a/contrib/gotests_templates/message.tmpl b/contrib/gotests_templates/message.tmpl new file mode 100644 index 0000000000..06068dfda5 --- /dev/null +++ b/contrib/gotests_templates/message.tmpl @@ -0,0 +1,3 @@ +{{define "message" -}} +{{if not .Subtests}}%q. {{end}}{{with .Receiver}}{{.Type.Value}}.{{end}}{{.Name}}({{if .PrintInputs}}{{range $i, $el := .Parameters}}{{if $i}}, {{end}}%v{{end}}{{end}}) +{{- end}} diff --git a/contrib/gotests_templates/results.tmpl b/contrib/gotests_templates/results.tmpl new file mode 100644 index 0000000000..de313bee85 --- /dev/null +++ b/contrib/gotests_templates/results.tmpl @@ -0,0 +1 @@ +{{define "results"}} {{range $i, $el := .Results}}{{if $i}}, {{end}}{{Got .}}{{end}}{{if .ReturnsError}}, err{{end}} {{if or .Results .ReturnsError}} := {{end}} {{end}} diff --git a/pkg/images/images_test.go b/pkg/images/images_test.go new file mode 100644 index 0000000000..268cf1caf0 --- /dev/null +++ b/pkg/images/images_test.go @@ -0,0 +1,111 @@ +package images + +import ( + "io/ioutil" + "os" + "testing" + + "github.com/google/go-containerregistry/pkg/name" +) + +func Test_UnitPull(t *testing.T) { + type args struct { + dir string + name string + image name.Reference + } + tests := []struct { + name string + args args + setup func(a *args) error + teardown func(a *args) error + wantTxtFile bool + wantErr bool + }{ + { + name: "Pull with no directory", + args: args{ + name: KubeScheduler, + }, + setup: func(a *args) error { return nil }, + teardown: func(a *args) error { return nil }, + }, + { + name: "Pull with nonexistent directory", + args: args{ + dir: "/tmp/DEADBEEF", + name: KubeScheduler, + }, + setup: func(a *args) error { + var err error + a.image, err = getDefaultImage(KubeScheduler) + return err + }, + teardown: func(a *args) error { + return os.RemoveAll(a.dir) + }, + + wantTxtFile: true, + }, + { + name: "Pull with no image in directory", + args: args{ + name: KubeScheduler, + }, + setup: func(a *args) error { + var err error + a.image, err = getDefaultImage(KubeScheduler) + if err != nil { + return err + } + a.dir, err = os.MkdirTemp("", "*") + return err + }, + teardown: func(a *args) error { + return os.RemoveAll(a.dir) + }, + + wantTxtFile: true, + }, + { + name: "Pull with fake image in directory", + args: args{ + name: "kube-scheduler", + }, + setup: func(a *args) error { + var err error + a.image, err = getDefaultImage(KubeScheduler) + if err != nil { + return err + } + a.dir, err = os.MkdirTemp("", "*") + tempImage := a.dir + "/" + a.name + ".image" + ioutil.WriteFile(tempImage, []byte(a.image.Name()+"\n"), 0644) + return err + }, + teardown: func(a *args) error { + return os.RemoveAll(a.dir) + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + + if err := tt.setup(&tt.args); err != nil { + t.Errorf("Setup for Pull() failed = %v", err) + } + if err := Pull(tt.args.dir, tt.args.name, tt.args.image); (err != nil) != tt.wantErr { + t.Errorf("Pull() error = %v, wantErr %v", err, tt.wantErr) + } + if tt.wantTxtFile { + fileName := tt.args.name + ".txt" + if _, err := os.Stat(tt.args.dir + "/" + fileName); os.IsNotExist(err) { + t.Errorf("File generate by Pull() %s, does not exists, wantFile %v", fileName, tt.wantTxtFile) + } + } + if err := tt.teardown(&tt.args); err != nil { + t.Errorf("Teardown for Pull() failed = %v", err) + } + }) + } +} diff --git a/pkg/rke2/psp_test.go b/pkg/rke2/psp_test.go index d5adc88e03..5f6a7cfc66 100644 --- a/pkg/rke2/psp_test.go +++ b/pkg/rke2/psp_test.go @@ -140,7 +140,7 @@ func fakeWithRetriableError(ro interface{}) *fake.Clientset { return cs } -func Test_deployPodSecurityPolicyFromYaml(t *testing.T) { +func Test_UnitdeployPodSecurityPolicyFromYaml(t *testing.T) { pspYAML := fmt.Sprintf(globalRestrictedPSPTemplate, testPSPName) type args struct { ctx context.Context @@ -207,7 +207,7 @@ func Test_deployPodSecurityPolicyFromYaml(t *testing.T) { } } -func Test_deployClusterRoleBindingFromYaml(t *testing.T) { +func Test_UnitdeployClusterRoleBindingFromYaml(t *testing.T) { clusterRoleBindingYaml := fmt.Sprintf(kubeletAPIServerRoleBindingTemplate, testClusterRoleBindingName) type args struct { ctx context.Context @@ -274,7 +274,7 @@ func Test_deployClusterRoleBindingFromYaml(t *testing.T) { } } -func Test_deployClusterRoleFromYaml(t *testing.T) { +func Test_UnitdeployClusterRoleFromYaml(t *testing.T) { const testResourceName = "test-resource-name" clusterRoleYaml := fmt.Sprintf(roleTemplate, "test-cluster-role", testResourceName) type args struct { @@ -342,7 +342,7 @@ func Test_deployClusterRoleFromYaml(t *testing.T) { } } -func Test_deployRoleBindingFromYaml(t *testing.T) { +func Test_UnitdeployRoleBindingFromYaml(t *testing.T) { roleBindingYaml := fmt.Sprintf(tunnelControllerRoleTemplate, testRoleBindingName) type args struct { ctx context.Context diff --git a/pkg/rke2/serviceaccount_test.go b/pkg/rke2/serviceaccount_test.go index 56188794e8..98fc285764 100644 --- a/pkg/rke2/serviceaccount_test.go +++ b/pkg/rke2/serviceaccount_test.go @@ -69,7 +69,7 @@ func addClientReactors(cs *fake.Clientset, verb string, pass bool) *fake.Clients return cs } -func Test_restrictServiceAccount(t *testing.T) { +func Test_UnitrestrictServiceAccount(t *testing.T) { type args struct { ctx context.Context namespace string