From 530b358c9494aecd7bca893d7bebd92fcef005a1 Mon Sep 17 00:00:00 2001 From: suwanliang Date: Mon, 16 May 2022 18:27:06 +0800 Subject: [PATCH 1/2] test functions in package resources/v1alpha3 by building restful's res and res --- pkg/kapis/resources/v1alpha3/handler_test.go | 122 ++++++++++++++++++- 1 file changed, 117 insertions(+), 5 deletions(-) diff --git a/pkg/kapis/resources/v1alpha3/handler_test.go b/pkg/kapis/resources/v1alpha3/handler_test.go index a3a9e6d85..6aadae610 100644 --- a/pkg/kapis/resources/v1alpha3/handler_test.go +++ b/pkg/kapis/resources/v1alpha3/handler_test.go @@ -17,7 +17,15 @@ limitations under the License. package v1alpha3 import ( + "fmt" + "github.com/emicklei/go-restful" + "io" + "k8s.io/klog" + "net/http" + "net/http/httptest" + "reflect" "testing" + "unsafe" "github.com/google/go-cmp/cmp" fakesnapshot "github.com/kubernetes-csi/external-snapshotter/client/v4/clientset/versioned/fake" @@ -87,13 +95,11 @@ func TestResourceV1alpha2Fallback(t *testing.T) { }, } - factory, err := prepare() + handler, err := prepare() if err != nil { t.Fatal(err) } - handler := New(resourcev1alpha3.NewResourceGetter(factory, nil), resourcev1alpha2.NewResourceGetter(factory), components.NewComponentsGetter(factory.KubernetesSharedInformerFactory())) - for _, test := range tests { got, err := listResources(test.namespace, test.resource, test.query, handler) @@ -175,12 +181,32 @@ var ( ReadyReplicas: 0, }, } + apiServerService = &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "ks-apiserver", + Namespace: "istio-system", + }, + Spec: corev1.ServiceSpec{ + Selector: map[string]string{"app": "ks-apiserver-app"}, + }, + } + ksControllerService = &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "ks-controller", + Namespace: "kubesphere-system", + }, + Spec: corev1.ServiceSpec{ + Selector: map[string]string{"app": "ks-controller-app"}, + }, + } deployments = []interface{}{redisDeployment, nginxDeployment} namespaces = []interface{}{defaultNamespace, kubesphereNamespace} secrets = []interface{}{secretFoo1, secretFoo2} + services = []interface{}{apiServerService, ksControllerService} + ) -func prepare() (informers.InformerFactory, error) { +func prepare() (*Handler, error) { ksClient := fakeks.NewSimpleClientset() k8sClient := fakek8s.NewSimpleClientset() @@ -210,6 +236,92 @@ func prepare() (informers.InformerFactory, error) { return nil, err } } + for _, service := range services { + err := k8sInformerFactory.Core().V1().Services().Informer().GetIndexer().Add(service) + if err != nil { + return nil, err + } + } - return fakeInformerFactory, nil + handler := New(resourcev1alpha3.NewResourceGetter(fakeInformerFactory, nil), resourcev1alpha2.NewResourceGetter(fakeInformerFactory), components.NewComponentsGetter(fakeInformerFactory.KubernetesSharedInformerFactory())) + + + return handler, nil } + +func TestHandleGetComponentStatus(t *testing.T) { + param := map[string]string{ + "component": "ks-controller", + } + request, response, err := buildReqAndRes("GET", "/kapis/resources.kubesphere.io/v1alpha3/components/{component}", param, nil) + if err != nil { + t.Fatal("build res or req failed ") + } + handler, err := prepare() + if err != nil { + t.Fatal("init handler failed") + } + + handler.handleGetComponentStatus(request, response) + + if status := response.StatusCode(); status != http.StatusOK { + t.Errorf("handler returned wrong status code: got %v want %v", + status, http.StatusOK) + } +} + +func TestHandleGetComponents(t *testing.T) { + request, response, err := buildReqAndRes("GET", "/kapis/resources.kubesphere.io/v1alpha3/components", nil, nil) + if err != nil { + t.Fatal("build res or req failed ") + } + handler, err := prepare() + if err != nil { + t.Fatal("init handler failed") + } + + handler.handleGetComponents(request, response) + + if status := response.StatusCode(); status != http.StatusOK { + t.Errorf("handler returned wrong status code: got %v want %v", + status, http.StatusOK) + } +} + +//build req and res in *restful +func buildReqAndRes(method, target string, param map[string]string, body io.Reader) (*restful.Request, *restful.Response, error) { + //build req + request := httptest.NewRequest(method, target, body) + newRequest := restful.NewRequest(request) + if param != nil { + err := setUnExportedFields(newRequest, "pathParameters", param) + if err != nil { + klog.Error("set pathParameters failed ") + return nil, nil, err + } + } + //build res + response := httptest.NewRecorder() + newResponse := restful.NewResponse(response) + + // assign Key:routeProduces a value of "application/json" + err := setUnExportedFields(newResponse, "routeProduces", []string{"application/json"}) + if err != nil { + klog.Error("set routeProduces failed ") + return nil, nil, err + } + return newRequest, newResponse, nil +} + +//Setting unexported fields by using reflect +func setUnExportedFields(ptr interface{}, filedName string, newFiledValue interface{}) (err error) { + v := reflect.ValueOf(ptr).Elem().FieldByName(filedName) + v = reflect.NewAt(v.Type(), unsafe.Pointer(v.UnsafeAddr())).Elem() + nv := reflect.ValueOf(newFiledValue) + + if v.Kind() != nv.Kind() { + return fmt.Errorf("kind error") + } + v.Set(nv) + return nil +} \ No newline at end of file From b2be6536394d2c4392ab15c24bd3e45e0018ad86 Mon Sep 17 00:00:00 2001 From: suwanliang Date: Tue, 24 May 2022 18:37:16 +0800 Subject: [PATCH 2/2] run make fmt and make goimports --- pkg/kapis/resources/v1alpha3/handler_test.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/pkg/kapis/resources/v1alpha3/handler_test.go b/pkg/kapis/resources/v1alpha3/handler_test.go index 6aadae610..d37bd6c11 100644 --- a/pkg/kapis/resources/v1alpha3/handler_test.go +++ b/pkg/kapis/resources/v1alpha3/handler_test.go @@ -18,15 +18,16 @@ package v1alpha3 import ( "fmt" - "github.com/emicklei/go-restful" "io" - "k8s.io/klog" "net/http" "net/http/httptest" "reflect" "testing" "unsafe" + "github.com/emicklei/go-restful" + "k8s.io/klog" + "github.com/google/go-cmp/cmp" fakesnapshot "github.com/kubernetes-csi/external-snapshotter/client/v4/clientset/versioned/fake" fakeistio "istio.io/client-go/pkg/clientset/versioned/fake" @@ -203,7 +204,6 @@ var ( namespaces = []interface{}{defaultNamespace, kubesphereNamespace} secrets = []interface{}{secretFoo1, secretFoo2} services = []interface{}{apiServerService, ksControllerService} - ) func prepare() (*Handler, error) { @@ -245,7 +245,6 @@ func prepare() (*Handler, error) { handler := New(resourcev1alpha3.NewResourceGetter(fakeInformerFactory, nil), resourcev1alpha2.NewResourceGetter(fakeInformerFactory), components.NewComponentsGetter(fakeInformerFactory.KubernetesSharedInformerFactory())) - return handler, nil } @@ -324,4 +323,4 @@ func setUnExportedFields(ptr interface{}, filedName string, newFiledValue interf } v.Set(nv) return nil -} \ No newline at end of file +}