test functions in package resources/v1alpha3 by building restful's res and res

This commit is contained in:
suwanliang
2022-05-16 18:27:06 +08:00
parent 1c96f99072
commit 530b358c94

View File

@@ -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
}