core_test.go 12 KB

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