Browse Source

improve test case for location_resolver.go

Jackson Tian 7 years ago
parent
commit
dce88c97a5
2 changed files with 145 additions and 2 deletions
  1. 12 2
      sdk/endpoints/location_resolver.go
  2. 133 0
      sdk/endpoints/location_resolver_test.go

+ 12 - 2
sdk/endpoints/location_resolver.go

@@ -89,13 +89,23 @@ func (resolver *LocationResolver) TryResolve(param *ResolveParam) (endpoint stri
 	}
 
 	response, err := param.CommonApi(getEndpointRequest)
-	if err != nil || !response.IsSuccess() {
+	if err != nil {
+		support = false
+		return
+	}
+
+	if !response.IsSuccess() {
 		support = false
 		return
 	}
 
 	var getEndpointResponse GetEndpointResponse
-	json.Unmarshal([]byte(response.GetHttpContentString()), &getEndpointResponse)
+	err = json.Unmarshal([]byte(response.GetHttpContentString()), &getEndpointResponse)
+	if err != nil {
+		support = false
+		return
+	}
+
 	if !getEndpointResponse.Success || getEndpointResponse.Endpoints == nil {
 		support = false
 		return

+ 133 - 0
sdk/endpoints/location_resolver_test.go

@@ -1,6 +1,10 @@
 package endpoints
 
 import (
+	"bytes"
+	"io/ioutil"
+	"net/http"
+	"strconv"
 	"testing"
 
 	"github.com/stretchr/testify/assert"
@@ -40,3 +44,132 @@ func TestLocationResolver_TryResolve_LocationWithError(t *testing.T) {
 	assert.Equal(t, false, support)
 	assert.Equal(t, "[SDK.MockError] Mock error", err.Error())
 }
+
+func makeHTTPResponse(statusCode int, content string) (res *http.Response) {
+	header := make(http.Header)
+	status := strconv.Itoa(statusCode)
+	res = &http.Response{
+		Proto:      "HTTP/1.1",
+		ProtoMajor: 1,
+		Header:     header,
+		StatusCode: statusCode,
+		Status:     status + " " + http.StatusText(statusCode),
+	}
+	res.Header = make(http.Header)
+	res.Body = ioutil.NopCloser(bytes.NewReader([]byte(content)))
+	return
+}
+
+func TestLocationResolver_TryResolve_LocationWith404(t *testing.T) {
+	resolver := &LocationResolver{}
+	resolveParam := &ResolveParam{
+		LocationProduct: "ecs",
+		RegionId:        "cn-hangzhou",
+		Product:         "ecs",
+		CommonApi: func(request *requests.CommonRequest) (response *responses.CommonResponse, err error) {
+			response = responses.NewCommonResponse()
+			responses.Unmarshal(response, makeHTTPResponse(404, "content"), "JSON")
+			return
+		},
+	}
+	endpoint, support, err := resolver.TryResolve(resolveParam)
+	assert.Equal(t, "", endpoint)
+	assert.Equal(t, false, support)
+	assert.Nil(t, err)
+}
+
+func TestLocationResolver_TryResolve_LocationWith200InvalidJSON(t *testing.T) {
+	resolver := &LocationResolver{}
+	resolveParam := &ResolveParam{
+		LocationProduct: "ecs",
+		RegionId:        "cn-hangzhou",
+		Product:         "ecs",
+		CommonApi: func(request *requests.CommonRequest) (response *responses.CommonResponse, err error) {
+			response = responses.NewCommonResponse()
+			responses.Unmarshal(response, makeHTTPResponse(200, "content"), "JSON")
+			return
+		},
+	}
+	endpoint, support, err := resolver.TryResolve(resolveParam)
+	assert.Equal(t, "", endpoint)
+	assert.Equal(t, false, support)
+	assert.Equal(t, "invalid character 'c' looking for beginning of value", err.Error())
+}
+
+func TestLocationResolver_TryResolve_LocationWith200ValidJSON(t *testing.T) {
+	resolver := &LocationResolver{}
+	resolveParam := &ResolveParam{
+		LocationProduct: "ecs",
+		RegionId:        "cn-hangzhou",
+		Product:         "ecs",
+		CommonApi: func(request *requests.CommonRequest) (response *responses.CommonResponse, err error) {
+			response = responses.NewCommonResponse()
+			responses.Unmarshal(response, makeHTTPResponse(200, `{"Code":"Success","RequestId":"request id"}`), "JSON")
+			return
+		},
+	}
+	endpoint, support, err := resolver.TryResolve(resolveParam)
+	assert.Equal(t, "", endpoint)
+	assert.Equal(t, false, support)
+	assert.Nil(t, err)
+	// assert.Equal(t, "json: cannot unmarshal array into Go struct field GetEndpointResponse.Endpoints of type endpoints.EndpointsObj", err.Error())
+}
+
+func TestLocationResolver_TryResolve_LocationWith200(t *testing.T) {
+	resolver := &LocationResolver{}
+	resolveParam := &ResolveParam{
+		LocationProduct: "ecs",
+		RegionId:        "cn-hangzhou",
+		Product:         "ecs",
+		CommonApi: func(request *requests.CommonRequest) (response *responses.CommonResponse, err error) {
+			response = responses.NewCommonResponse()
+			responses.Unmarshal(response, makeHTTPResponse(200, `{"Success":true,"RequestId":"request id","Endpoints":{"Endpoint":[]}}`), "JSON")
+			return
+		},
+	}
+	endpoint, support, err := resolver.TryResolve(resolveParam)
+	assert.Equal(t, "", endpoint)
+	assert.Equal(t, false, support)
+	assert.Nil(t, err)
+}
+
+func TestLocationResolver_TryResolve_Location_With_Endpoint(t *testing.T) {
+	resolver := &LocationResolver{}
+	resolveParam := &ResolveParam{
+		LocationProduct: "ecs",
+		RegionId:        "cn-hangzhou",
+		Product:         "ecs",
+		CommonApi: func(request *requests.CommonRequest) (response *responses.CommonResponse, err error) {
+			response = responses.NewCommonResponse()
+			responses.Unmarshal(response, makeHTTPResponse(200, `{"Success":true,"RequestId":"request id","Endpoints":{"Endpoint":[{"Endpoint":"domain.com"}]}}`), "JSON")
+			return
+		},
+	}
+	endpoint, support, err := resolver.TryResolve(resolveParam)
+	assert.Equal(t, "domain.com", endpoint)
+	assert.Equal(t, true, support)
+	assert.Nil(t, err)
+	// hit the cache
+	endpoint, support, err = resolver.TryResolve(resolveParam)
+	assert.Equal(t, "domain.com", endpoint)
+	assert.Equal(t, true, support)
+	assert.Nil(t, err)
+}
+
+func TestLocationResolver_TryResolve_Location_With_EmptyEndpoint(t *testing.T) {
+	resolver := &LocationResolver{}
+	resolveParam := &ResolveParam{
+		LocationProduct: "ecs2",
+		RegionId:        "cn-hangzhou",
+		Product:         "ecs2",
+		CommonApi: func(request *requests.CommonRequest) (response *responses.CommonResponse, err error) {
+			response = responses.NewCommonResponse()
+			responses.Unmarshal(response, makeHTTPResponse(200, `{"Success":true,"RequestId":"request id","Endpoints":{"Endpoint":[{"Endpoint":""}]}}`), "JSON")
+			return
+		},
+	}
+	endpoint, support, err := resolver.TryResolve(resolveParam)
+	assert.Equal(t, "", endpoint)
+	assert.Equal(t, false, support)
+	assert.Nil(t, err)
+}