core_test.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. package integration
  2. import (
  3. "net/http"
  4. "net/http/httptest"
  5. "net/http/httputil"
  6. "net/url"
  7. "os"
  8. "strings"
  9. "testing"
  10. "time"
  11. "github.com/aliyun/alibaba-cloud-sdk-go/sdk"
  12. "github.com/aliyun/alibaba-cloud-sdk-go/sdk/errors"
  13. "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
  14. "github.com/stretchr/testify/assert"
  15. )
  16. func Test_DescribeRegionsWithCommonRequestWithRPC(t *testing.T) {
  17. request := requests.NewCommonRequest()
  18. request.Version = "2014-05-26"
  19. request.Product = "Ecs"
  20. request.ApiName = "DescribeRegions"
  21. request.SetDomain("ecs.aliyuncs.com")
  22. request.TransToAcsRequest()
  23. client, err := sdk.NewClientWithAccessKey(os.Getenv("REGION_ID"), os.Getenv("ACCESS_KEY_ID"), os.Getenv("ACCESS_KEY_SECRET"))
  24. assert.Nil(t, err)
  25. response, err := client.ProcessCommonRequest(request)
  26. assert.Nil(t, err)
  27. assert.True(t, response.IsSuccess())
  28. }
  29. func Test_DescribeRegionsWithCommonRequestWithSTStoken(t *testing.T) {
  30. assumeresponse, err := createAssumeRole()
  31. assert.Nil(t, err)
  32. credential := assumeresponse.Credentials
  33. request := requests.NewCommonRequest()
  34. request.Version = "2014-05-26"
  35. request.Product = "Ecs"
  36. request.ApiName = "DescribeRegions"
  37. request.SetDomain("ecs.aliyuncs.com")
  38. request.TransToAcsRequest()
  39. client, err := sdk.NewClientWithStsToken(os.Getenv("REGION_ID"), credential.AccessKeyId, credential.AccessKeySecret, credential.SecurityToken)
  40. assert.Nil(t, err)
  41. response, err := client.ProcessCommonRequest(request)
  42. assert.Nil(t, err)
  43. assert.True(t, response.IsSuccess())
  44. }
  45. func Test_DescribeRegionsWithCommonRequestWithHTTPS(t *testing.T) {
  46. request := requests.NewCommonRequest()
  47. request.Version = "2014-05-26"
  48. request.Product = "Ecs"
  49. request.ApiName = "DescribeRegions"
  50. request.SetDomain("ecs.aliyuncs.com")
  51. request.TransToAcsRequest()
  52. request.SetScheme("HTTPS")
  53. client, err := sdk.NewClientWithAccessKey(os.Getenv("REGION_ID"), os.Getenv("ACCESS_KEY_ID"), os.Getenv("ACCESS_KEY_SECRET"))
  54. assert.Nil(t, err)
  55. response, err := client.ProcessCommonRequest(request)
  56. assert.Nil(t, err)
  57. assert.True(t, response.IsSuccess())
  58. }
  59. func Test_DescribeRegionsWithCommonRequestWithUnicodeSpecificParams(t *testing.T) {
  60. request := requests.NewCommonRequest()
  61. request.Version = "2014-05-26"
  62. request.Product = "Ecs"
  63. request.ApiName = "DescribeRegions"
  64. request.SetDomain("ecs.aliyuncs.com")
  65. request.TransToAcsRequest()
  66. request.SetContent([]byte("sdk&-杭&&&州-test"))
  67. client, err := sdk.NewClientWithAccessKey(os.Getenv("REGION_ID"), os.Getenv("ACCESS_KEY_ID"), os.Getenv("ACCESS_KEY_SECRET"))
  68. assert.Nil(t, err)
  69. response, err := client.ProcessCommonRequest(request)
  70. assert.Nil(t, err)
  71. assert.True(t, response.IsSuccess())
  72. }
  73. func Test_DescribeRegionsWithCommonRequestWithError(t *testing.T) {
  74. request := requests.NewCommonRequest()
  75. request.Version = "2014-05-26"
  76. request.Product = "Ecs"
  77. request.ApiName = "Describe"
  78. request.SetDomain("ecs.aliyuncs.com")
  79. request.TransToAcsRequest()
  80. client, err := sdk.NewClientWithAccessKey(os.Getenv("REGION_ID"), os.Getenv("ACCESS_KEY_ID"), os.Getenv("ACCESS_KEY_SECRET"))
  81. assert.Nil(t, err)
  82. _, err = client.ProcessCommonRequest(request)
  83. realerr := err.(errors.Error)
  84. assert.Equal(t, "InvalidParameter", realerr.ErrorCode())
  85. assert.Equal(t, "The specified parameter \"Action or Version\" is not valid.", realerr.Message())
  86. }
  87. func Test_DescribeRegionsWithCommonRequestWithIncompleteSignature(t *testing.T) {
  88. request := requests.NewCommonRequest()
  89. request.Version = "2014-05-26"
  90. request.AcceptFormat = "json"
  91. request.SetScheme("https")
  92. request.Method = "POST"
  93. request.ApiName = "DescribeRegions"
  94. request.SetDomain("ecs.aliyuncs.com")
  95. request.TransToAcsRequest()
  96. client, err := sdk.NewClientWithAccessKey(os.Getenv("REGION_ID"), os.Getenv("ACCESS_KEY_ID"), strings.ToUpper(os.Getenv("ACCESS_KEY_SECRET")))
  97. assert.Nil(t, err)
  98. _, err = client.ProcessCommonRequest(request)
  99. realerr := err.(*errors.ServerError)
  100. assert.Equal(t, "IncompleteSignature", realerr.ErrorCode())
  101. assert.Equal(t, "InvalidAccessKeySecret: Please check you AccessKeySecret", realerr.Recommend())
  102. }
  103. func Test_DescribeClustersWithCommonRequestWithROA(t *testing.T) {
  104. client, err := sdk.NewClientWithAccessKey(os.Getenv("REGION_ID"), os.Getenv("ACCESS_KEY_ID"), os.Getenv("ACCESS_KEY_SECRET"))
  105. assert.Nil(t, err)
  106. request := requests.NewCommonRequest()
  107. request.Method = "GET"
  108. request.Domain = "cs.aliyuncs.com"
  109. request.Version = "2015-12-15"
  110. request.PathPattern = "/clusters/[ClusterId]"
  111. request.QueryParams["RegionId"] = os.Getenv("REGION_ID")
  112. request.TransToAcsRequest()
  113. _, err = client.ProcessCommonRequest(request)
  114. assert.NotNil(t, err)
  115. assert.Contains(t, err.Error(), "Request url is invalid")
  116. }
  117. func Test_DescribeClustersWithCommonRequestWithSignatureDostNotMatch(t *testing.T) {
  118. client, err := sdk.NewClientWithAccessKey(os.Getenv("REGION_ID"), os.Getenv("ACCESS_KEY_ID"), strings.ToUpper(os.Getenv("ACCESS_KEY_SECRET")))
  119. assert.Nil(t, err)
  120. request := requests.NewCommonRequest()
  121. request.Method = "GET"
  122. request.Domain = "cs.aliyuncs.com"
  123. request.Version = "2015-12-15"
  124. request.PathPattern = "/clusters/[ClusterId]"
  125. request.QueryParams["RegionId"] = os.Getenv("REGION_ID")
  126. request.TransToAcsRequest()
  127. _, err = client.ProcessCommonRequest(request)
  128. assert.NotNil(t, err)
  129. real, _ := err.(*errors.ServerError)
  130. assert.Contains(t, real.Recommend(), "InvalidAccessKeySecret: Please check you AccessKeySecret")
  131. assert.Equal(t, real.ErrorCode(), "SignatureDoesNotMatch")
  132. }
  133. func Test_DescribeClustersWithCommonRequestWithROAWithSTStoken(t *testing.T) {
  134. assumeresponse, err := createAssumeRole()
  135. assert.Nil(t, err)
  136. credential := assumeresponse.Credentials
  137. client, err := sdk.NewClientWithStsToken(os.Getenv("REGION_ID"), credential.AccessKeyId, credential.AccessKeySecret, credential.SecurityToken)
  138. assert.Nil(t, err)
  139. request := requests.NewCommonRequest()
  140. request.Method = "GET"
  141. request.Domain = "cs.aliyuncs.com"
  142. request.Version = "2015-12-15"
  143. request.PathPattern = "/clusters/[ClusterId]"
  144. request.QueryParams["RegionId"] = os.Getenv("REGION_ID")
  145. request.TransToAcsRequest()
  146. _, err = client.ProcessCommonRequest(request)
  147. assert.NotNil(t, err)
  148. assert.Contains(t, err.Error(), "Request url is invalid")
  149. }
  150. func Test_DescribeClusterDetailWithCommonRequestWithROAWithHTTPS(t *testing.T) {
  151. client, err := sdk.NewClientWithAccessKey(os.Getenv("REGION_ID"), os.Getenv("ACCESS_KEY_ID"), os.Getenv("ACCESS_KEY_SECRET"))
  152. assert.Nil(t, err)
  153. request := requests.NewCommonRequest()
  154. request.Method = "GET"
  155. request.Domain = "cs.aliyuncs.com"
  156. request.Version = "2015-12-15"
  157. request.SetScheme("HTTPS")
  158. request.PathPattern = "/clusters/[ClusterId]"
  159. request.QueryParams["RegionId"] = os.Getenv("REGION_ID")
  160. request.TransToAcsRequest()
  161. _, err = client.ProcessCommonRequest(request)
  162. assert.NotNil(t, err)
  163. assert.Contains(t, err.Error(), "Request url is invalid")
  164. }
  165. func Test_DescribeClusterDetailWithCommonRequestWithTimeout(t *testing.T) {
  166. client, err := sdk.NewClientWithAccessKey(os.Getenv("REGION_ID"), os.Getenv("ACCESS_KEY_ID"), os.Getenv("ACCESS_KEY_SECRET"))
  167. assert.Nil(t, err)
  168. request := requests.NewCommonRequest()
  169. request.Domain = "cs.aliyuncs.com"
  170. request.Version = "2015-12-15"
  171. request.SetScheme("HTTPS")
  172. request.PathPattern = "/clusters/[ClusterId]"
  173. request.QueryParams["RegionId"] = os.Getenv("REGION_ID")
  174. request.ReadTimeout = 1 * time.Millisecond
  175. request.ConnectTimeout = 1 * time.Millisecond
  176. request.TransToAcsRequest()
  177. _, err = client.ProcessCommonRequest(request)
  178. assert.NotNil(t, err)
  179. assert.Contains(t, err.Error(), "Connect timeout. Please set a valid ConnectTimeout.")
  180. request.ConnectTimeout = 1 * time.Second
  181. _, err = client.ProcessCommonRequest(request)
  182. assert.NotNil(t, err)
  183. assert.Contains(t, err.Error(), "Read timeout. Please set a valid ReadTimeout.")
  184. }
  185. func Test_CreateInstanceWithCommonRequestWithPolicy(t *testing.T) {
  186. err := createAttachPolicyToRole()
  187. assert.Nil(t, err)
  188. subaccesskeyid, subaccesskeysecret, err := createAccessKey()
  189. assert.Nil(t, err)
  190. client, err := sdk.NewClientWithRamRoleArnAndPolicy(os.Getenv("REGION_ID"), subaccesskeyid, subaccesskeysecret, rolearn, "alice_test", "")
  191. assert.Nil(t, err)
  192. request := requests.NewCommonRequest()
  193. request.Method = "POST"
  194. request.Product = "Ecs"
  195. request.Domain = "ecs.aliyuncs.com"
  196. request.Version = "2014-05-26"
  197. request.SetScheme("HTTPS")
  198. request.ApiName = "CreateInstance"
  199. request.QueryParams["ImageId"] = "win2008r2_64_ent_sp1_en-us_40G_alibase_20170915.vhd"
  200. request.QueryParams["InstanceType"] = "ecs.g5.large"
  201. request.TransToAcsRequest()
  202. _, err = client.ProcessCommonRequest(request)
  203. assert.NotNil(t, err)
  204. assert.Contains(t, err.Error(), "This resource type is not supported; please try other resource types.")
  205. policy := `{
  206. "Version": "1",
  207. "Statement": [
  208. {
  209. "Action": "rds:*",
  210. "Resource": "*",
  211. "Effect": "Allow"
  212. },
  213. {
  214. "Action": "dms:LoginDatabase",
  215. "Resource": "acs:rds:*:*:*",
  216. "Effect": "Allow"
  217. }
  218. ]
  219. }`
  220. client, err = sdk.NewClientWithRamRoleArnAndPolicy(os.Getenv("REGION_ID"), subaccesskeyid, subaccesskeysecret, rolearn, "alice_test", policy)
  221. assert.Nil(t, err)
  222. _, err = client.ProcessCommonRequest(request)
  223. assert.NotNil(t, err)
  224. assert.Contains(t, err.Error(), "User not authorized to operate on the specified resource, or this API doesn't support RAM.")
  225. }
  226. func handlerTrue(w http.ResponseWriter, r *http.Request) {
  227. w.WriteHeader(200)
  228. w.Write([]byte("test"))
  229. return
  230. }
  231. func handlerFake(w http.ResponseWriter, r *http.Request) {
  232. trueserver := handlerTrueServer()
  233. url, err := url.Parse(trueserver.URL)
  234. if err != nil {
  235. return
  236. }
  237. proxy := httputil.NewSingleHostReverseProxy(url)
  238. w.Write([]byte("sdk"))
  239. proxy.ServeHTTP(w, r)
  240. return
  241. }
  242. func handlerFakeServer() (server *httptest.Server) {
  243. server = httptest.NewServer(http.HandlerFunc(handlerFake))
  244. return server
  245. }
  246. func handlerTrueServer() (server *httptest.Server) {
  247. server = httptest.NewServer(http.HandlerFunc(handlerTrue))
  248. return server
  249. }
  250. func Test_HTTPProxy(t *testing.T) {
  251. ts := handlerFakeServer()
  252. ts1 := handlerTrueServer()
  253. defer func() {
  254. ts.Close()
  255. ts1.Close()
  256. }()
  257. client, err := sdk.NewClientWithAccessKey(os.Getenv("REGION_ID"), os.Getenv("ACCESS_KEY_ID"), os.Getenv("ACCESS_KEY_SECRET"))
  258. assert.Nil(t, err)
  259. request := requests.NewCommonRequest()
  260. domain := strings.Replace(ts1.URL, "http://", "", 1)
  261. request.Domain = domain
  262. request.Version = "2015-12-15"
  263. request.TransToAcsRequest()
  264. resp, err := client.ProcessCommonRequest(request)
  265. assert.Nil(t, err)
  266. assert.Equal(t, 200, resp.GetHttpStatus())
  267. assert.Equal(t, "test", resp.GetHttpContentString())
  268. originEnv := os.Getenv("HTTP_PROXY")
  269. os.Setenv("HTTP_PROXY", ts.URL)
  270. resp, err = client.ProcessCommonRequest(request)
  271. assert.Nil(t, err)
  272. assert.Equal(t, 200, resp.GetHttpStatus())
  273. assert.Equal(t, "sdktest", resp.GetHttpContentString())
  274. os.Setenv("HTTP_PROXY", originEnv)
  275. }