client_test.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495
  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/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. config := getConfigFromEnv()
  84. if config == nil {
  85. config = getConfigFromFile()
  86. }
  87. tr := &http.Transport{
  88. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  89. }
  90. client = &Client{
  91. config: &Config{
  92. HttpTransport: tr,
  93. },
  94. }
  95. clientEcs = &Client{}
  96. clientRoleArn = &Client{
  97. config: &Config{
  98. HttpTransport: tr,
  99. },
  100. }
  101. clientKeyPair = &Client{
  102. config: &Config{
  103. HttpTransport: tr,
  104. },
  105. }
  106. err := client.InitWithAccessKey("cn-hangzhou", config.AccessKeyId, config.AccessKeySecret)
  107. if err != nil {
  108. panic(err)
  109. }
  110. //err = clientKeyPair.InitWithKeyPair("cn-hangzhou", config.PublicKeyId, config.PrivateKey, 3600)
  111. //if err != nil {
  112. // panic(err)
  113. //}
  114. err = clientEcs.InitWithEcsInstance("cn-hangzhou", "conan")
  115. if err != nil {
  116. panic(err)
  117. }
  118. err = clientRoleArn.InitWithRoleArn("cn-hangzhou", config.ChildAK, config.ChildSecret, config.RoleArn, "clientTest")
  119. if err != nil {
  120. panic(err)
  121. }
  122. }
  123. func testTearDown() {
  124. }
  125. func TestNewClientWithAccessKey(t *testing.T) {
  126. assert.NotNil(t, client, "NewClientWithAccessKey failed")
  127. }
  128. func TestRoaGet(t *testing.T) {
  129. request := getFtTestRoaRequest()
  130. response := &responses.BaseResponse{}
  131. err := client.DoAction(request, response)
  132. assert.Nil(t, err)
  133. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  134. assert.NotNil(t, response.GetHttpContentString())
  135. var responseBean MockResponse
  136. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  137. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  138. assert.Equal(t, "HeaderParamValue", responseBean.Headers["Header-Param"])
  139. }
  140. func TestRoaPostForm(t *testing.T) {
  141. request := getFtTestRoaRequest()
  142. request.Method = requests.POST
  143. request.FormParams["BodyParam"] = "BodyParamValue"
  144. response := &responses.BaseResponse{}
  145. err := client.DoAction(request, response)
  146. assert.Nil(t, err)
  147. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  148. assert.NotNil(t, response.GetHttpContentString())
  149. var responseBean MockResponse
  150. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  151. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  152. assert.Equal(t, "HeaderParamValue", responseBean.Headers["Header-Param"])
  153. assert.Equal(t, "BodyParamValue", responseBean.Params["BodyParam"])
  154. }
  155. func TestRoaPostStream(t *testing.T) {
  156. request := getFtTestRoaRequest()
  157. request.Method = requests.POST
  158. request.Content = []byte("TestContent")
  159. response := &responses.BaseResponse{}
  160. err := client.DoAction(request, response)
  161. assert.Nil(t, err)
  162. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  163. assert.NotNil(t, response.GetHttpContentString())
  164. var responseBean MockResponse
  165. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  166. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  167. assert.Equal(t, "HeaderParamValue", responseBean.Headers["Header-Param"])
  168. assert.Equal(t, "TestContent", responseBean.Body)
  169. }
  170. func TestRoaPostJson(t *testing.T) {
  171. request := getFtTestRoaRequest()
  172. request.Method = requests.POST
  173. dataMap := map[string]string{"key": "value"}
  174. data, err := json.Marshal(dataMap)
  175. assert.Nil(t, err)
  176. request.Content = data
  177. request.SetContentType(requests.Json)
  178. response := &responses.BaseResponse{}
  179. err = client.DoAction(request, response)
  180. assert.Nil(t, err)
  181. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  182. assert.NotNil(t, response.GetHttpContentString())
  183. var responseBean MockResponse
  184. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  185. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  186. assert.Equal(t, "HeaderParamValue", responseBean.Headers["Header-Param"])
  187. assert.Equal(t, requests.Json, responseBean.Headers["Content-Type"])
  188. assert.Equal(t, string(data), responseBean.Body)
  189. }
  190. func TestRpcGet(t *testing.T) {
  191. request := getFtTestRpcRequest()
  192. request.Method = requests.GET
  193. response := &responses.BaseResponse{}
  194. err := client.DoAction(request, response)
  195. assert.Nil(t, err)
  196. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  197. assert.NotNil(t, response.GetHttpContentString())
  198. var responseBean MockResponse
  199. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  200. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  201. }
  202. func TestRpcGetForHttps(t *testing.T) {
  203. request := getFtTestRpcRequest()
  204. request.Method = requests.GET
  205. request.Scheme = requests.HTTPS
  206. response := &responses.BaseResponse{}
  207. err := client.DoAction(request, response)
  208. assert.Nil(t, err)
  209. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  210. assert.NotNil(t, response.GetHttpContentString())
  211. var responseBean MockResponse
  212. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  213. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  214. }
  215. func TestRoaGetForHttps(t *testing.T) {
  216. request := getFtTestRoaRequest()
  217. request.Scheme = requests.HTTPS
  218. response := &responses.BaseResponse{}
  219. err := client.DoAction(request, response)
  220. assert.Nil(t, err)
  221. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  222. assert.NotNil(t, response.GetHttpContentString())
  223. var responseBean MockResponse
  224. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  225. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  226. assert.Equal(t, "HeaderParamValue", responseBean.Headers["Header-Param"])
  227. }
  228. func TestRpcPost(t *testing.T) {
  229. request := getFtTestRpcRequest()
  230. request.FormParams["BodyParam"] = "BodyParamValue"
  231. response := &responses.BaseResponse{}
  232. err := client.DoAction(request, response)
  233. assert.Nil(t, err)
  234. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  235. assert.NotNil(t, response.GetHttpContentString())
  236. var responseBean MockResponse
  237. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  238. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  239. assert.Equal(t, "BodyParamValue", responseBean.Params["BodyParam"])
  240. }
  241. func getFtTestRoaRequest() (request *requests.RoaRequest) {
  242. request = &requests.RoaRequest{}
  243. request.InitWithApiInfo("Ft", "2016-01-02", "TestRoaApi", "/web/cloudapi", "", "")
  244. request.Domain = "ft.aliyuncs.com"
  245. request.Headers["Header-Param"] = "HeaderParamValue"
  246. request.QueryParams["QueryParam"] = "QueryParamValue"
  247. return
  248. }
  249. func getFtTestRpcRequest() (request *requests.RpcRequest) {
  250. request = &requests.RpcRequest{}
  251. request.InitWithApiInfo("Ft", "2016-01-01", "TestRpcApi", "", "")
  252. request.Domain = "ft.aliyuncs.com"
  253. request.QueryParams["QueryParam"] = "QueryParamValue"
  254. return
  255. }
  256. func getFtTestRpcRequestForEndpointLocation() (request *requests.RpcRequest) {
  257. request = &requests.RpcRequest{}
  258. request.InitWithApiInfo("Ft", "2016-01-01", "TestRpcApi", "ft", "openAPI")
  259. request.RegionId = "cn-hangzhou"
  260. request.QueryParams["QueryParam"] = "QueryParamValue"
  261. return
  262. }
  263. func getFtTestRpcRequestForEndpointXml() (request *requests.RpcRequest) {
  264. request = &requests.RpcRequest{}
  265. request.InitWithApiInfo("Ft", "2016-01-01", "TestRpcApi", "", "")
  266. request.RegionId = "cn-hangzhou"
  267. request.QueryParams["QueryParam"] = "QueryParamValue"
  268. return
  269. }
  270. func TestCommonRpcRequest(t *testing.T) {
  271. rpcRequest := requests.NewCommonRequest()
  272. rpcRequest.Product = "Ft"
  273. rpcRequest.Version = "2016-01-01"
  274. rpcRequest.Domain = "ft.aliyuncs.com"
  275. rpcRequest.ApiName = "TestRpcApi"
  276. rpcRequest.Method = "POST"
  277. rpcRequest.QueryParams["QueryParam"] = "QueryParamValue"
  278. rpcRequest.FormParams["BodyParam"] = "BodyParamValue"
  279. response, err := client.ProcessCommonRequest(rpcRequest)
  280. assert.Nil(t, err)
  281. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  282. assert.NotNil(t, response.GetHttpContentString())
  283. var responseBean MockResponse
  284. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  285. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  286. assert.Equal(t, "BodyParamValue", responseBean.Params["BodyParam"])
  287. }
  288. func TestCommonRoaRequest(t *testing.T) {
  289. roaRequest := requests.NewCommonRequest()
  290. roaRequest.Product = "Ft"
  291. roaRequest.Version = "2016-01-02"
  292. roaRequest.PathPattern = "/web/cloudapi"
  293. roaRequest.Domain = "ft.aliyuncs.com"
  294. roaRequest.Method = "POST"
  295. roaRequest.QueryParams["QueryParam"] = "QueryParamValue"
  296. roaRequest.FormParams["BodyParam"] = "BodyParamValue"
  297. response, err := client.ProcessCommonRequest(roaRequest)
  298. assert.Nil(t, err)
  299. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  300. assert.NotNil(t, response.GetHttpContentString())
  301. var responseBean MockResponse
  302. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  303. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  304. assert.Equal(t, "BodyParamValue", responseBean.Params["BodyParam"])
  305. }
  306. func TestRpcGetForEndpointXml(t *testing.T) {
  307. request := getFtTestRpcRequestForEndpointXml()
  308. request.Method = requests.GET
  309. request.RegionId = "cn-shanghai"
  310. response := &responses.BaseResponse{}
  311. err := client.DoAction(request, response)
  312. assert.Nil(t, err)
  313. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  314. assert.NotNil(t, response.GetHttpContentString())
  315. var responseBean MockResponse
  316. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  317. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  318. }
  319. func TestRpcGetForLocation(t *testing.T) {
  320. request := getFtTestRpcRequestForEndpointLocation()
  321. request.Method = requests.GET
  322. response := &responses.BaseResponse{}
  323. err := client.DoAction(request, response)
  324. assert.Nil(t, err)
  325. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  326. assert.NotNil(t, response.GetHttpContentString())
  327. var responseBean MockResponse
  328. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  329. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  330. }
  331. func TestRpcGetForLocationCache(t *testing.T) {
  332. request := getFtTestRpcRequestForEndpointLocation()
  333. request.Method = requests.GET
  334. response := &responses.BaseResponse{}
  335. err := client.DoAction(request, response)
  336. assert.Nil(t, err)
  337. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  338. assert.NotNil(t, response.GetHttpContentString())
  339. var responseBean MockResponse
  340. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  341. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  342. request2 := getFtTestRpcRequestForEndpointLocation()
  343. request2.Method = requests.GET
  344. err = client.DoAction(request2, response)
  345. assert.Nil(t, err)
  346. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  347. assert.NotNil(t, response.GetHttpContentString())
  348. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  349. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  350. }
  351. func TestRpcGetForKeyPair(t *testing.T) {
  352. request := getFtTestRpcRequest()
  353. request.Method = requests.GET
  354. response := &responses.BaseResponse{}
  355. err := clientKeyPair.DoAction(request, response)
  356. assert.Nil(t, err)
  357. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  358. assert.NotNil(t, response.GetHttpContentString())
  359. var responseBean MockResponse
  360. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  361. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  362. }
  363. /*func TestRpcGetForEcs(t *testing.T) {
  364. //测试接口,想测试的时候,要替换掉singer_ecs_instance中对应的变量,并且还要提供一个mock服务
  365. //requestUrl := "http://localhost:3500/latest/meta-data/ram/security-credentials/roleNameTest.json"
  366. request := getFtTestRpcRequest()
  367. request.Method = requests.GET
  368. response := &responses.BaseResponse{}
  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. var responseBean MockResponse
  374. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  375. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  376. err = clientEcs.DoAction(request, response)
  377. assert.Nil(t, err)
  378. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  379. assert.NotNil(t, response.GetHttpContentString())
  380. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  381. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  382. }*/
  383. func TestRpcGetForRoleArn(t *testing.T) {
  384. request := getFtTestRpcRequest()
  385. request.Method = requests.GET
  386. response := &responses.BaseResponse{}
  387. err := clientRoleArn.DoAction(request, response)
  388. assert.Nil(t, err)
  389. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  390. assert.NotNil(t, response.GetHttpContentString())
  391. var responseBean MockResponse
  392. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  393. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  394. err = clientRoleArn.DoAction(request, response)
  395. assert.Nil(t, err)
  396. assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
  397. assert.NotNil(t, response.GetHttpContentString())
  398. json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
  399. assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
  400. }