add unit test for GetServiceTracing

This commit is contained in:
zhanghaiwen
2022-06-02 14:46:27 +08:00
parent 04d70b1db4
commit 02e99365c7
4 changed files with 188 additions and 25 deletions

View File

@@ -0,0 +1,142 @@
package v1alpha2
import (
"context"
"encoding/json"
"fmt"
"net/http"
"net/http/httptest"
"testing"
"github.com/emicklei/go-restful"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
fakek8s "k8s.io/client-go/kubernetes/fake"
"k8s.io/klog"
"kubesphere.io/kubesphere/pkg/simple/client/kiali"
"kubesphere.io/kubesphere/pkg/simple/client/servicemesh"
"kubesphere.io/kubesphere/pkg/utils/reflectutils"
)
func prepare() (*Handler, error) {
var namespaceName = "kubesphere-system"
var serviceAccountName = "kubesphere"
var secretName = "kiali"
clientset := fakek8s.NewSimpleClientset()
ctx := context.Background()
namespacesClient := clientset.CoreV1().Namespaces()
ns := &corev1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Name: namespaceName,
},
}
_, err := namespacesClient.Create(ctx, ns, metav1.CreateOptions{})
if err != nil {
klog.Errorf("create namespace failed ")
return nil, err
}
secret := &corev1.Secret{
ObjectMeta: metav1.ObjectMeta{
Name: secretName,
Namespace: namespaceName,
},
}
object := &corev1.ObjectReference{
Name: secretName,
}
sa := &corev1.ServiceAccount{
ObjectMeta: metav1.ObjectMeta{
Name: serviceAccountName,
Namespace: namespaceName,
},
Secrets: []corev1.ObjectReference{*object},
}
serviceAccountClient := clientset.CoreV1().ServiceAccounts(namespaceName)
_, err = serviceAccountClient.Create(ctx, sa, metav1.CreateOptions{})
if err != nil {
klog.Errorf("create serviceAccount failed ")
return nil, err
}
secretClient := clientset.CoreV1().Secrets(namespaceName)
_, err = secretClient.Create(ctx, secret, metav1.CreateOptions{})
if err != nil {
klog.Errorf("create secret failed ")
return nil, err
}
// mock jaeger server
ts := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
writer.WriteHeader(http.StatusOK)
}))
options := &servicemesh.Options{
IstioPilotHost: "",
KialiQueryHost: "",
JaegerQueryHost: ts.URL,
ServicemeshPrometheusHost: "",
}
handler := NewHandler(options, clientset, nil)
token, _ := json.Marshal(
&kiali.TokenResponse{
Username: "test",
Token: "test",
},
)
mc := &kiali.MockClient{
TokenResult: token,
RequestResult: "fake",
}
client := kiali.NewClient("token", nil, mc, "token", options.KialiQueryHost)
err = reflectutils.SetUnExportedField(handler, "client", client)
if err != nil {
klog.Errorf("apply mock client failed")
return nil, err
}
return handler, nil
}
func TestGetServiceTracing(t *testing.T) {
handler, err := prepare()
if err != nil {
t.Fatalf("init handler failed")
}
namespaceName := "namespace-test"
serviceName := "service-test"
url := fmt.Sprintf("/namespaces/%s/services/%s/traces", namespaceName, serviceName)
request, _ := http.NewRequest("GET", url, nil)
query := request.URL.Query()
query.Add("start", "1650167872000000")
query.Add("end", "1650211072000000")
query.Add("limit", "10")
request.URL.RawQuery = query.Encode()
restfulRequest := restful.NewRequest(request)
pathMap := make(map[string]string)
pathMap["namespace"] = namespaceName
pathMap["service"] = serviceName
if err := reflectutils.SetUnExportedField(restfulRequest, "pathParameters", pathMap); err != nil {
t.Fatalf("set pathParameters failed")
}
recorder := httptest.NewRecorder()
restfulResponse := restful.NewResponse(recorder)
restfulResponse.SetRequestAccepts("application/json")
handler.GetServiceTracing(restfulRequest, restfulResponse)
if status := restfulResponse.StatusCode(); status != http.StatusOK {
t.Errorf("handler returned wrong status code: got %v want %v", status, http.StatusOK)
}
}

View File

@@ -21,7 +21,6 @@ import (
"encoding/json"
"io/ioutil"
"net/http"
"net/url"
"reflect"
"testing"
@@ -58,7 +57,7 @@ func TestClient_Get(t *testing.T) {
Strategy: AuthStrategyAnonymous,
cache: nil,
client: &MockClient{
requestResult: "fake",
RequestResult: "fake",
},
ServiceToken: "token",
Host: "http://kiali.istio-system.svc",
@@ -76,8 +75,8 @@ func TestClient_Get(t *testing.T) {
Strategy: AuthStrategyToken,
cache: nil,
client: &MockClient{
tokenResult: token,
requestResult: "fake",
TokenResult: token,
RequestResult: "fake",
},
ServiceToken: "token",
Host: "http://kiali.istio-system.svc",
@@ -95,8 +94,8 @@ func TestClient_Get(t *testing.T) {
Strategy: AuthStrategyToken,
cache: cache.NewSimpleCache(),
client: &MockClient{
tokenResult: token,
requestResult: "fake",
TokenResult: token,
RequestResult: "fake",
},
ServiceToken: "token",
Host: "http://kiali.istio-system.svc",
@@ -129,22 +128,3 @@ func TestClient_Get(t *testing.T) {
})
}
}
type MockClient struct {
tokenResult []byte
requestResult string
}
func (c *MockClient) Do(req *http.Request) (*http.Response, error) {
return &http.Response{
StatusCode: 200,
Body: ioutil.NopCloser(bytes.NewReader([]byte(c.requestResult))),
}, nil
}
func (c *MockClient) PostForm(url string, data url.Values) (resp *http.Response, err error) {
return &http.Response{
StatusCode: 200,
Body: ioutil.NopCloser(bytes.NewReader(c.tokenResult)),
}, nil
}

View File

@@ -0,0 +1,27 @@
package kiali
import (
"bytes"
"io/ioutil"
"net/http"
"net/url"
)
type MockClient struct {
TokenResult []byte
RequestResult string
}
func (c *MockClient) Do(req *http.Request) (*http.Response, error) {
return &http.Response{
StatusCode: 200,
Body: ioutil.NopCloser(bytes.NewReader([]byte(c.RequestResult))),
}, nil
}
func (c *MockClient) PostForm(url string, data url.Values) (resp *http.Response, err error) {
return &http.Response{
StatusCode: 200,
Body: ioutil.NopCloser(bytes.NewReader(c.TokenResult)),
}, nil
}

View File

@@ -17,7 +17,9 @@ limitations under the License.
package reflectutils
import (
"fmt"
"reflect"
"unsafe"
)
func In(value interface{}, container interface{}) bool {
@@ -60,3 +62,15 @@ func Override(left interface{}, right interface{}) {
}
}
}
func SetUnExportedField(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
}