client_test.go 16 KB

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