client_test.go 17 KB

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