client_test.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  1. /*
  2. * Licensed under the Apache License, Version 2.0 (the "License");
  3. * you may not use this file except in compliance with the License.
  4. * You may obtain a copy of the License at
  5. *
  6. * http://www.apache.org/licenses/LICENSE-2.0
  7. *
  8. * Unless required by applicable law or agreed to in writing, software
  9. * distributed under the License is distributed on an "AS IS" BASIS,
  10. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. * See the License for the specific language governing permissions and
  12. * limitations under the License.
  13. */
  14. package sdk
  15. import (
  16. "encoding/json"
  17. "github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
  18. "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
  19. "github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
  20. "github.com/stretchr/testify/assert"
  21. "io/ioutil"
  22. "net/http"
  23. "os"
  24. "os/user"
  25. "testing"
  26. )
  27. var client, clientKeyPair, clientEcs, clientRoleArn *Client
  28. type TestConfig struct {
  29. AccessKeyId string
  30. AccessKeySecret string
  31. PublicKeyId string
  32. PrivateKey string
  33. RoleArn string
  34. ChildAK string
  35. ChildSecret string
  36. }
  37. type MockResponse struct {
  38. Headers map[string]string
  39. Body string
  40. Params map[string]string
  41. RemoteAddr string
  42. RemoteHost string
  43. QueryString string
  44. RequestURL string
  45. }
  46. func TestMain(m *testing.M) {
  47. testSetup()
  48. result := m.Run()
  49. testTearDown()
  50. os.Exit(result)
  51. }
  52. func getConfigFromFile() *TestConfig {
  53. usr, err := user.Current()
  54. if err != nil {
  55. panic(err)
  56. }
  57. configFilePath := usr.HomeDir + "/aliyun-sdk.json"
  58. data, err := ioutil.ReadFile(configFilePath)
  59. if err != nil {
  60. panic(err)
  61. }
  62. var config TestConfig
  63. json.Unmarshal(data, &config)
  64. return &config
  65. }
  66. func getConfigFromEnv() *TestConfig {
  67. config := &TestConfig{
  68. AccessKeyId: os.Getenv("ACCESS_KEY_ID"),
  69. AccessKeySecret: os.Getenv("ACCESS_KEY_SECRET"),
  70. PublicKeyId: os.Getenv("PUBLIC_KEY_ID"),
  71. PrivateKey: os.Getenv("PRIVATE_KEY"),
  72. RoleArn: os.Getenv("ROLE_ARN"),
  73. ChildAK: os.Getenv("CHILD_AK"),
  74. ChildSecret: os.Getenv("CHILD_SECRET"),
  75. }
  76. if config.AccessKeyId == "" {
  77. return nil
  78. } else {
  79. return config
  80. }
  81. }
  82. func testSetup() {
  83. testConfig := getConfigFromEnv()
  84. if testConfig == nil {
  85. testConfig = getConfigFromFile()
  86. }
  87. var err error
  88. clientConfig := NewConfig().
  89. WithEnableAsync(true).
  90. WithGoRoutinePoolSize(5).
  91. WithMaxTaskQueueSize(1000)
  92. credential := &credentials.BaseCredential{
  93. AccessKeyId: testConfig.AccessKeyId,
  94. AccessKeySecret: testConfig.AccessKeySecret,
  95. }
  96. client, err = NewClientWithOptions("cn-hangzhou", clientConfig, credential)
  97. if err != nil {
  98. panic(err)
  99. }
  100. //err = clientKeyPair.InitWithKeyPair("cn-hangzhou", testConfig.PublicKeyId, testConfig.PrivateKey, 3600)
  101. //if err != nil {
  102. // panic(err)
  103. //}
  104. //err = clientEcs.InitWithEcsInstance("cn-hangzhou", "conan")
  105. //if err != nil {
  106. // panic(err)
  107. //}
  108. //err = clientRoleArn.InitWithRoleArn("cn-hangzhou", testConfig.ChildAK, testConfig.ChildSecret, testConfig.RoleArn, "clientTest")
  109. //if err != nil {
  110. // panic(err)
  111. //}
  112. }
  113. func testTearDown() {
  114. }
  115. func TestNewClientWithAccessKey(t *testing.T) {
  116. assert.NotNil(t, client, "NewClientWithAccessKey failed")
  117. }
  118. func TestRoaGet(t *testing.T) {
  119. request := getFtTestRoaRequest()
  120. response := &responses.BaseResponse{}
  121. err := client.DoAction(request, response)
  122. assert.Nil(t, err)
  123. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  124. assert.NotNil(t, response.GetHttpContentString())
  125. var responseBean MockResponse
  126. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  127. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  128. assert.Equal(t, "HeaderParamValue", responseBean.Headers["Header-Param"])
  129. }
  130. func TestRoaPostForm(t *testing.T) {
  131. request := getFtTestRoaRequest()
  132. request.Method = requests.POST
  133. request.FormParams["BodyParam"] = "BodyParamValue"
  134. response := &responses.BaseResponse{}
  135. err := client.DoAction(request, response)
  136. assert.Nil(t, err)
  137. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  138. assert.NotNil(t, response.GetHttpContentString())
  139. var responseBean MockResponse
  140. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  141. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  142. assert.Equal(t, "HeaderParamValue", responseBean.Headers["Header-Param"])
  143. assert.Equal(t, "BodyParamValue", responseBean.Params["BodyParam"])
  144. }
  145. func TestRoaPostStream(t *testing.T) {
  146. request := getFtTestRoaRequest()
  147. request.Method = requests.POST
  148. request.Content = []byte("TestContent")
  149. response := &responses.BaseResponse{}
  150. err := client.DoAction(request, response)
  151. assert.Nil(t, err)
  152. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  153. assert.NotNil(t, response.GetHttpContentString())
  154. var responseBean MockResponse
  155. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  156. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  157. assert.Equal(t, "HeaderParamValue", responseBean.Headers["Header-Param"])
  158. assert.Equal(t, "TestContent", responseBean.Body)
  159. }
  160. func TestRoaPostJson(t *testing.T) {
  161. request := getFtTestRoaRequest()
  162. request.Method = requests.POST
  163. dataMap := map[string]string{"key": "value"}
  164. data, err := json.Marshal(dataMap)
  165. assert.Nil(t, err)
  166. request.Content = data
  167. request.SetContentType(requests.Json)
  168. response := &responses.BaseResponse{}
  169. err = client.DoAction(request, response)
  170. assert.Nil(t, err)
  171. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  172. assert.NotNil(t, response.GetHttpContentString())
  173. var responseBean MockResponse
  174. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  175. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  176. assert.Equal(t, "HeaderParamValue", responseBean.Headers["Header-Param"])
  177. assert.Equal(t, requests.Json, responseBean.Headers["Content-Type"])
  178. assert.Equal(t, string(data), responseBean.Body)
  179. }
  180. func TestRpcGet(t *testing.T) {
  181. request := getFtTestRpcRequest()
  182. request.Method = requests.GET
  183. response := &responses.BaseResponse{}
  184. err := client.DoAction(request, response)
  185. assert.Nil(t, err)
  186. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  187. assert.NotNil(t, response.GetHttpContentString())
  188. var responseBean MockResponse
  189. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  190. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  191. }
  192. func TestRpcGetForHttps(t *testing.T) {
  193. request := getFtTestRpcRequest()
  194. request.Method = requests.GET
  195. request.Scheme = requests.HTTPS
  196. response := &responses.BaseResponse{}
  197. err := client.DoAction(request, response)
  198. assert.Nil(t, err)
  199. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  200. assert.NotNil(t, response.GetHttpContentString())
  201. var responseBean MockResponse
  202. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  203. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  204. }
  205. func TestRoaGetForHttps(t *testing.T) {
  206. request := getFtTestRoaRequest()
  207. request.Scheme = requests.HTTPS
  208. response := &responses.BaseResponse{}
  209. err := client.DoAction(request, response)
  210. assert.Nil(t, err)
  211. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  212. assert.NotNil(t, response.GetHttpContentString())
  213. var responseBean MockResponse
  214. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  215. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  216. assert.Equal(t, "HeaderParamValue", responseBean.Headers["Header-Param"])
  217. }
  218. func TestRpcPost(t *testing.T) {
  219. request := getFtTestRpcRequest()
  220. request.FormParams["BodyParam"] = "BodyParamValue"
  221. response := &responses.BaseResponse{}
  222. err := client.DoAction(request, response)
  223. assert.Nil(t, err)
  224. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  225. assert.NotNil(t, response.GetHttpContentString())
  226. var responseBean MockResponse
  227. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  228. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  229. assert.Equal(t, "BodyParamValue", responseBean.Params["BodyParam"])
  230. }
  231. func getFtTestRoaRequest() (request *requests.RoaRequest) {
  232. request = &requests.RoaRequest{}
  233. request.InitWithApiInfo("Ft", "2016-01-02", "TestRoaApi", "/web/cloudapi", "", "")
  234. request.Domain = "ft.aliyuncs.com"
  235. request.Headers["Header-Param"] = "HeaderParamValue"
  236. request.QueryParams["QueryParam"] = "QueryParamValue"
  237. return
  238. }
  239. func getFtTestRpcRequest() (request *requests.RpcRequest) {
  240. request = &requests.RpcRequest{}
  241. request.InitWithApiInfo("Ft", "2016-01-01", "TestRpcApi", "", "")
  242. request.Domain = "ft.aliyuncs.com"
  243. request.QueryParams["QueryParam"] = "QueryParamValue"
  244. return
  245. }
  246. func getFtTestRpcRequestForEndpointLocation() (request *requests.RpcRequest) {
  247. request = &requests.RpcRequest{}
  248. request.InitWithApiInfo("Ft", "2016-01-01", "TestRpcApi", "ft", "openAPI")
  249. request.RegionId = "cn-hangzhou"
  250. request.QueryParams["QueryParam"] = "QueryParamValue"
  251. return
  252. }
  253. func getFtTestRpcRequestForEndpointXml() (request *requests.RpcRequest) {
  254. request = &requests.RpcRequest{}
  255. request.InitWithApiInfo("Ft", "2016-01-01", "TestRpcApi", "", "")
  256. request.RegionId = "cn-hangzhou"
  257. request.QueryParams["QueryParam"] = "QueryParamValue"
  258. return
  259. }
  260. func TestCommonRpcRequest(t *testing.T) {
  261. rpcRequest := requests.NewCommonRequest()
  262. rpcRequest.Product = "Ft"
  263. rpcRequest.Version = "2016-01-01"
  264. rpcRequest.Domain = "ft.aliyuncs.com"
  265. rpcRequest.ApiName = "TestRpcApi"
  266. rpcRequest.Method = "POST"
  267. rpcRequest.QueryParams["QueryParam"] = "QueryParamValue"
  268. rpcRequest.FormParams["BodyParam"] = "BodyParamValue"
  269. response, err := client.ProcessCommonRequest(rpcRequest)
  270. assert.Nil(t, err)
  271. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  272. assert.NotNil(t, response.GetHttpContentString())
  273. var responseBean MockResponse
  274. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  275. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  276. assert.Equal(t, "BodyParamValue", responseBean.Params["BodyParam"])
  277. }
  278. func TestCommonRoaRequest(t *testing.T) {
  279. roaRequest := requests.NewCommonRequest()
  280. roaRequest.Product = "Ft"
  281. roaRequest.Version = "2016-01-02"
  282. roaRequest.PathPattern = "/web/cloudapi"
  283. roaRequest.Domain = "ft.aliyuncs.com"
  284. roaRequest.Method = "POST"
  285. roaRequest.QueryParams["QueryParam"] = "QueryParamValue"
  286. roaRequest.FormParams["BodyParam"] = "BodyParamValue"
  287. response, err := client.ProcessCommonRequest(roaRequest)
  288. assert.Nil(t, err)
  289. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  290. assert.NotNil(t, response.GetHttpContentString())
  291. var responseBean MockResponse
  292. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  293. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  294. assert.Equal(t, "BodyParamValue", responseBean.Params["BodyParam"])
  295. }
  296. func TestRpcGetForEndpointXml(t *testing.T) {
  297. request := getFtTestRpcRequestForEndpointXml()
  298. request.Method = requests.GET
  299. request.RegionId = "cn-shanghai"
  300. response := &responses.BaseResponse{}
  301. err := client.DoAction(request, response)
  302. assert.Nil(t, err)
  303. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  304. assert.NotNil(t, response.GetHttpContentString())
  305. var responseBean MockResponse
  306. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  307. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  308. }
  309. func TestRpcGetForLocation(t *testing.T) {
  310. request := getFtTestRpcRequestForEndpointLocation()
  311. request.Method = requests.GET
  312. response := &responses.BaseResponse{}
  313. err := client.DoAction(request, response)
  314. assert.Nil(t, err)
  315. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  316. assert.NotNil(t, response.GetHttpContentString())
  317. var responseBean MockResponse
  318. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  319. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  320. }
  321. func TestRpcGetForLocationCache(t *testing.T) {
  322. request := getFtTestRpcRequestForEndpointLocation()
  323. request.Method = requests.GET
  324. response := &responses.BaseResponse{}
  325. err := client.DoAction(request, response)
  326. assert.Nil(t, err)
  327. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  328. assert.NotNil(t, response.GetHttpContentString())
  329. var responseBean MockResponse
  330. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  331. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  332. request2 := getFtTestRpcRequestForEndpointLocation()
  333. request2.Method = requests.GET
  334. err = client.DoAction(request2, response)
  335. assert.Nil(t, err)
  336. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  337. assert.NotNil(t, response.GetHttpContentString())
  338. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  339. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  340. }
  341. //func TestRpcGetForKeyPair(t *testing.T) {
  342. // request := getFtTestRpcRequest()
  343. // request.Method = requests.GET
  344. //
  345. // response := &responses.BaseResponse{}
  346. // err := clientKeyPair.DoAction(request, response)
  347. // assert.Nil(t, err)
  348. // assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  349. // assert.NotNil(t, response.GetHttpContentString())
  350. //
  351. // var responseBean MockResponse
  352. // json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  353. //
  354. // assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  355. //}
  356. /*func TestRpcGetForEcs(t *testing.T) {
  357. //测试接口,想测试的时候,要替换掉singer_ecs_instance中对应的变量,并且还要提供一个mock服务
  358. //requestUrl := "http://localhost:3500/latest/meta-data/ram/security-credentials/roleNameTest.json"
  359. request := getFtTestRpcRequest()
  360. request.Method = requests.GET
  361. response := &responses.BaseResponse{}
  362. err := clientEcs.DoAction(request, response)
  363. assert.Nil(t, err)
  364. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  365. assert.NotNil(t, response.GetHttpContentString())
  366. var responseBean MockResponse
  367. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  368. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  369. err = clientEcs.DoAction(request, response)
  370. assert.Nil(t, err)
  371. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  372. assert.NotNil(t, response.GetHttpContentString())
  373. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  374. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  375. }*/
  376. //func TestRpcGetForRoleArn(t *testing.T) {
  377. // request := getFtTestRpcRequest()
  378. // request.Method = requests.GET
  379. //
  380. // response := &responses.BaseResponse{}
  381. // err := clientRoleArn.DoAction(request, response)
  382. // assert.Nil(t, err)
  383. // assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  384. // assert.NotNil(t, response.GetHttpContentString())
  385. //
  386. // var responseBean MockResponse
  387. // json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  388. //
  389. // assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  390. //
  391. // err = clientRoleArn.DoAction(request, response)
  392. // assert.Nil(t, err)
  393. // assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  394. // assert.NotNil(t, response.GetHttpContentString())
  395. //
  396. // json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  397. //
  398. // assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  399. //}
  400. func TestCommonRoaRequestForAcceptXML(t *testing.T) {
  401. roaRequest := requests.NewCommonRequest()
  402. roaRequest.Product = "Acs"
  403. roaRequest.Version = "2015-01-01"
  404. roaRequest.ApiName = "GetGlobal"
  405. roaRequest.PathPattern = "/"
  406. roaRequest.Domain = "acs.aliyuncs.com"
  407. roaRequest.AcceptFormat = "XML"
  408. response, err := client.ProcessCommonRequest(roaRequest)
  409. assert.Nil(t, err)
  410. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  411. assert.NotNil(t, response.GetHttpContentString())
  412. }