signer_ram_role_arn_test.go 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. package signers
  2. import (
  3. "bytes"
  4. "fmt"
  5. "io/ioutil"
  6. "net/http"
  7. "strconv"
  8. "strings"
  9. "testing"
  10. "github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
  11. "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
  12. "github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
  13. "github.com/stretchr/testify/assert"
  14. )
  15. func Test_NewRamRoleArnSigner(t *testing.T) {
  16. c := credentials.NewRamRoleArnCredential("accessKeyId", "accessKeySecret", "roleArn", "roleSessionName", 3500)
  17. signer, err := NewRamRoleArnSigner(c, nil)
  18. assert.Nil(t, err)
  19. assert.Equal(t, "roleSessionName", signer.roleSessionName)
  20. assert.Equal(t, 3500, signer.credentialExpiration)
  21. assert.Equal(t, "HMAC-SHA1", signer.GetName())
  22. assert.Equal(t, "", signer.GetType())
  23. assert.Equal(t, "1.0", signer.GetVersion())
  24. c = credentials.NewRamRoleArnCredential("accessKeyId", "accessKeySecret", "roleArn", "", 0)
  25. signer, err = NewRamRoleArnSigner(c, nil)
  26. assert.Nil(t, err)
  27. assert.True(t, strings.HasPrefix(signer.roleSessionName, "aliyun-go-sdk-"))
  28. assert.Equal(t, 3600, signer.credentialExpiration)
  29. c = credentials.NewRamRoleArnCredential("accessKeyId", "accessKeySecret", "roleArn", "", 100)
  30. signer, err = NewRamRoleArnSigner(c, nil)
  31. assert.NotNil(t, err)
  32. assert.Equal(t, "[SDK.InvalidParam] Assume Role session duration should be in the range of 15min - 1Hr", err.Error())
  33. }
  34. func Test_RamRoleArn_buildCommonRequest(t *testing.T) {
  35. c := credentials.NewRamRoleArnCredential("accessKeyId", "accessKeySecret", "roleArn", "roleSessionName", 3600)
  36. s, err := NewRamRoleArnSigner(c, func(*requests.CommonRequest, interface{}) (response *responses.CommonResponse, err error) {
  37. return nil, fmt.Errorf("common api fails")
  38. })
  39. assert.Nil(t, err)
  40. request, err := s.buildCommonRequest()
  41. assert.Nil(t, err)
  42. assert.NotNil(t, request)
  43. assert.Equal(t, "Sts", request.Product)
  44. assert.Equal(t, "2015-04-01", request.Version)
  45. assert.Equal(t, "AssumeRole", request.ApiName)
  46. assert.Equal(t, "HTTPS", request.Scheme)
  47. assert.Equal(t, "roleArn", request.QueryParams["RoleArn"])
  48. assert.Equal(t, "roleSessionName", request.QueryParams["RoleSessionName"])
  49. assert.Equal(t, "3600", request.QueryParams["DurationSeconds"])
  50. assert.Nil(t, s.GetSessionCredential())
  51. }
  52. func Test_RamRoleArn_GetAccessKeyId(t *testing.T) {
  53. c := credentials.NewRamRoleArnCredential("accessKeyId", "accessKeySecret", "roleArn", "roleSessionName", 3600)
  54. s, err := NewRamRoleArnSigner(c, func(*requests.CommonRequest, interface{}) (response *responses.CommonResponse, err error) {
  55. return nil, fmt.Errorf("common api fails")
  56. })
  57. assert.Nil(t, err)
  58. assert.NotNil(t, s)
  59. accessKeyId, err := s.GetAccessKeyId()
  60. assert.Equal(t, "common api fails", err.Error())
  61. assert.Equal(t, "", accessKeyId)
  62. }
  63. func Test_RamRoleArn_GetAccessKeyId2(t *testing.T) {
  64. // default response is not OK
  65. c := credentials.NewRamRoleArnCredential("accessKeyId", "accessKeySecret", "roleArn", "roleSessionName", 3600)
  66. s, err := NewRamRoleArnSigner(c, func(*requests.CommonRequest, interface{}) (response *responses.CommonResponse, err error) {
  67. return responses.NewCommonResponse(), nil
  68. })
  69. assert.Nil(t, err)
  70. assert.NotNil(t, s)
  71. // s.lastUpdateTimestamp = time.Now().Unix() - 1000
  72. accessKeyId, err := s.GetAccessKeyId()
  73. assert.Equal(t, "SDK.ServerError\nErrorCode: \nRecommend: refresh session token failed\nRequestId: \nMessage: ", err.Error())
  74. assert.Equal(t, "", accessKeyId)
  75. }
  76. func Test_RamRoleArn_GetAccessKeyId3(t *testing.T) {
  77. c := credentials.NewRamRoleArnCredential("accessKeyId", "accessKeySecret", "roleArn", "roleSessionName", 3600)
  78. // Mock the 200 response and invalid json
  79. s, err := NewRamRoleArnSigner(c, func(*requests.CommonRequest, interface{}) (response *responses.CommonResponse, err error) {
  80. res := responses.NewCommonResponse()
  81. statusCode := 200
  82. status := strconv.Itoa(statusCode)
  83. httpresp := &http.Response{
  84. Proto: "HTTP/1.1",
  85. ProtoMajor: 1,
  86. Header: make(http.Header),
  87. StatusCode: statusCode,
  88. Status: status + " " + http.StatusText(statusCode),
  89. }
  90. httpresp.Body = ioutil.NopCloser(bytes.NewReader([]byte("invalid json")))
  91. responses.Unmarshal(res, httpresp, "JSON")
  92. return res, nil
  93. })
  94. assert.Nil(t, err)
  95. assert.NotNil(t, s)
  96. // s.lastUpdateTimestamp = time.Now().Unix() - 1000
  97. accessKeyId, err := s.GetAccessKeyId()
  98. assert.NotNil(t, err)
  99. assert.Equal(t, "refresh RoleArn sts token err, json.Unmarshal fail: invalid character 'i' looking for beginning of value", err.Error())
  100. assert.Equal(t, "", accessKeyId)
  101. }
  102. func Test_RamRoleArn_GetAccessKeyId4(t *testing.T) {
  103. c := credentials.NewRamRoleArnCredential("accessKeyId", "accessKeySecret", "roleArn", "roleSessionName", 3600)
  104. // Mock the 200 response and invalid json
  105. s, err := NewRamRoleArnSigner(c, func(*requests.CommonRequest, interface{}) (response *responses.CommonResponse, err error) {
  106. res := responses.NewCommonResponse()
  107. statusCode := 200
  108. header := make(http.Header)
  109. status := strconv.Itoa(statusCode)
  110. httpresp := &http.Response{
  111. Proto: "HTTP/1.1",
  112. ProtoMajor: 1,
  113. Header: header,
  114. StatusCode: statusCode,
  115. Status: status + " " + http.StatusText(statusCode),
  116. }
  117. httpresp.Header = make(http.Header)
  118. httpresp.Body = ioutil.NopCloser(bytes.NewReader([]byte("{}")))
  119. responses.Unmarshal(res, httpresp, "JSON")
  120. return res, nil
  121. })
  122. assert.Nil(t, err)
  123. assert.NotNil(t, s)
  124. // s.lastUpdateTimestamp = time.Now().Unix() - 1000
  125. accessKeyId, err := s.GetAccessKeyId()
  126. assert.Nil(t, err)
  127. assert.Equal(t, "", accessKeyId)
  128. }
  129. func Test_RamRoleArn_GetAccessKeyIdAndSign(t *testing.T) {
  130. c := credentials.NewRamRoleArnCredential("accessKeyId", "accessKeySecret", "roleArn", "roleSessionName", 3600)
  131. // mock 200 response and valid json and valid result
  132. s, err := NewRamRoleArnSigner(c, func(*requests.CommonRequest, interface{}) (response *responses.CommonResponse, err error) {
  133. res := responses.NewCommonResponse()
  134. statusCode := 200
  135. header := make(http.Header)
  136. status := strconv.Itoa(statusCode)
  137. httpresp := &http.Response{
  138. Proto: "HTTP/1.1",
  139. ProtoMajor: 1,
  140. Header: header,
  141. StatusCode: statusCode,
  142. Status: status + " " + http.StatusText(statusCode),
  143. }
  144. json := `{"Credentials":{"AccessKeyId":"access key id","AccessKeySecret": "access key secret","SecurityToken":"security token"}}`
  145. httpresp.Body = ioutil.NopCloser(bytes.NewReader([]byte(json)))
  146. responses.Unmarshal(res, httpresp, "JSON")
  147. return res, nil
  148. })
  149. assert.Nil(t, err)
  150. assert.NotNil(t, s)
  151. // s.lastUpdateTimestamp = time.Now().Unix() - 1000
  152. accessKeyId, err := s.GetAccessKeyId()
  153. assert.Nil(t, err)
  154. assert.Equal(t, "access key id", accessKeyId)
  155. params := s.GetExtraParam()
  156. assert.NotNil(t, params)
  157. assert.Len(t, params, 1)
  158. assert.Equal(t, "security token", params["SecurityToken"])
  159. // assert.Nil(t, err)
  160. signature := s.Sign("string to sign", "/")
  161. assert.Equal(t, "dcM4bWGEoD5QUp9xhLW3SfcWfgs=", signature)
  162. }
  163. func Test_RamRoleArn_GetExtraParam_Fail(t *testing.T) {
  164. c := credentials.NewRamRoleArnWithPolicyCredential("accessKeyId", "accessKeySecret", "roleArn", "roleSessionName", "policy", 3600)
  165. // mock 200 response and valid json and valid result
  166. s, err := NewRamRoleArnSigner(c, func(*requests.CommonRequest, interface{}) (response *responses.CommonResponse, err error) {
  167. res := responses.NewCommonResponse()
  168. statusCode := 200
  169. header := make(http.Header)
  170. status := strconv.Itoa(statusCode)
  171. httpresp := &http.Response{
  172. Proto: "HTTP/1.1",
  173. ProtoMajor: 1,
  174. Header: header,
  175. StatusCode: statusCode,
  176. Status: status + " " + http.StatusText(statusCode),
  177. }
  178. json := `{"Credentials":{"AccessKeyId":"access key id","AccessKeySecret": "access key secret","SecurityToken":""}}`
  179. httpresp.Body = ioutil.NopCloser(bytes.NewReader([]byte(json)))
  180. responses.Unmarshal(res, httpresp, "JSON")
  181. return res, nil
  182. })
  183. assert.Nil(t, err)
  184. assert.NotNil(t, s)
  185. params := s.GetExtraParam()
  186. assert.Len(t, params, 0)
  187. }