signer_ecs_ram_role_test.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. package signers
  2. import (
  3. "fmt"
  4. "net/http"
  5. "net/http/httptest"
  6. "strings"
  7. "testing"
  8. "time"
  9. "github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
  10. "github.com/stretchr/testify/assert"
  11. )
  12. func Test_ECSRamRole(t *testing.T) {
  13. c := credentials.NewEcsRamRoleCredential("roleName")
  14. singer := NewEcsRamRoleSigner(c, nil)
  15. assert.NotNil(t, singer)
  16. assert.Equal(t, "HMAC-SHA1", singer.GetName())
  17. assert.Equal(t, "", singer.GetType())
  18. assert.Equal(t, "1.0", singer.GetVersion())
  19. }
  20. func Test_EcsRamRoleSigner_buildCommonRequest(t *testing.T) {
  21. c := credentials.NewEcsRamRoleCredential("roleName")
  22. s := NewEcsRamRoleSigner(c, nil)
  23. request, err := s.buildCommonRequest()
  24. assert.Nil(t, err)
  25. assert.Nil(t, request)
  26. }
  27. func Test_EcsRamRoleSigner_GetAccessKeyId(t *testing.T) {
  28. c := credentials.NewEcsRamRoleCredential("roleName")
  29. s := NewEcsRamRoleSigner(c, nil)
  30. assert.NotNil(t, s)
  31. // Update our securityCredURL to point at our local test server.
  32. originalSecurityCredURL := securityCredURL
  33. securityCredURL = strings.Replace(securityCredURL, "http://100.100.100.200", "http://invalid-domain-xxx", -1)
  34. defer func() {
  35. securityCredURL = originalSecurityCredURL
  36. }()
  37. accessKeyId, err := s.GetAccessKeyId()
  38. assert.True(t, strings.HasSuffix(err.Error(), "no such host"))
  39. assert.Equal(t, "", accessKeyId)
  40. }
  41. func mockServer(status int, json string) (server *httptest.Server) {
  42. // Start a test server locally.
  43. ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  44. switch r.URL.Path {
  45. case "/latest/meta-data/ram/security-credentials/roleName":
  46. w.WriteHeader(status)
  47. w.Write([]byte(json))
  48. }
  49. }))
  50. return ts
  51. }
  52. func Test_EcsRamRoleSigner_GetAccessKeyId2(t *testing.T) {
  53. c := credentials.NewEcsRamRoleCredential("roleName")
  54. s := NewEcsRamRoleSigner(c, nil)
  55. assert.NotNil(t, s)
  56. // Start a test server locally.
  57. ts := mockServer(400, "{}")
  58. defer ts.Close()
  59. originalSecurityCredURL := securityCredURL
  60. securityCredURL = strings.Replace(securityCredURL, "http://100.100.100.200", ts.URL, -1)
  61. defer func() {
  62. securityCredURL = originalSecurityCredURL
  63. }()
  64. accessKeyId, err := s.GetAccessKeyId()
  65. assert.Equal(t, "SDK.ServerError\nErrorCode: \nRecommend: \nRequestId: \nMessage: {}", err.Error())
  66. assert.Equal(t, "", accessKeyId)
  67. }
  68. func Test_EcsRamRoleSigner_GetAccessKeyId3(t *testing.T) {
  69. c := credentials.NewEcsRamRoleCredential("roleName")
  70. s := NewEcsRamRoleSigner(c, nil)
  71. assert.NotNil(t, s)
  72. // Start a test server locally.
  73. ts := mockServer(200, "invalid json")
  74. defer ts.Close()
  75. originalSecurityCredURL := securityCredURL
  76. securityCredURL = strings.Replace(securityCredURL, "http://100.100.100.200", ts.URL, -1)
  77. defer func() {
  78. securityCredURL = originalSecurityCredURL
  79. }()
  80. accessKeyId, err := s.GetAccessKeyId()
  81. assert.Equal(t, "refresh Ecs sts token err, json.Unmarshal fail: invalid character 'i' looking for beginning of value", err.Error())
  82. assert.Equal(t, "", accessKeyId)
  83. }
  84. func Test_EcsRamRoleSigner_GetAccessKeyId4(t *testing.T) {
  85. c := credentials.NewEcsRamRoleCredential("roleName")
  86. s := NewEcsRamRoleSigner(c, nil)
  87. assert.NotNil(t, s)
  88. // Start a test server locally.
  89. ts := mockServer(200, `{"Code":"Fails"}`)
  90. defer ts.Close()
  91. originalSecurityCredURL := securityCredURL
  92. securityCredURL = strings.Replace(securityCredURL, "http://100.100.100.200", ts.URL, -1)
  93. defer func() {
  94. securityCredURL = originalSecurityCredURL
  95. }()
  96. accessKeyId, err := s.GetAccessKeyId()
  97. assert.Equal(t, "refresh Ecs sts token err, Code is not Success", err.Error())
  98. assert.Equal(t, "", accessKeyId)
  99. }
  100. func Test_EcsRamRoleSigner_GetAccessKeyId5(t *testing.T) {
  101. c := credentials.NewEcsRamRoleCredential("roleName")
  102. s := NewEcsRamRoleSigner(c, nil)
  103. assert.NotNil(t, s)
  104. // Start a test server locally.
  105. ts := mockServer(200, `{"Code":"Success"}`)
  106. defer ts.Close()
  107. originalSecurityCredURL := securityCredURL
  108. securityCredURL = strings.Replace(securityCredURL, "http://100.100.100.200", ts.URL, -1)
  109. defer func() {
  110. securityCredURL = originalSecurityCredURL
  111. }()
  112. accessKeyId, err := s.GetAccessKeyId()
  113. assert.Nil(t, err)
  114. assert.Equal(t, "", accessKeyId)
  115. }
  116. func Test_EcsRamRoleSigner_GetAccessKeyId6(t *testing.T) {
  117. c := credentials.NewEcsRamRoleCredential("roleName")
  118. s := NewEcsRamRoleSigner(c, nil)
  119. assert.NotNil(t, s)
  120. // Start a test server locally.
  121. ts := mockServer(201, `{"Code":"Success"}`)
  122. defer ts.Close()
  123. originalSecurityCredURL := securityCredURL
  124. securityCredURL = strings.Replace(securityCredURL, "http://100.100.100.200", ts.URL, -1)
  125. defer func() {
  126. securityCredURL = originalSecurityCredURL
  127. }()
  128. accessKeyId, err := s.GetAccessKeyId()
  129. assert.Equal(t, "refresh Ecs sts token err, httpStatus: 201, message = {\"Code\":\"Success\"}", err.Error())
  130. assert.Equal(t, "", accessKeyId)
  131. }
  132. func Test_EcsRamRoleSigner_GetAccessKeyId_Success(t *testing.T) {
  133. c := credentials.NewEcsRamRoleCredential("roleName")
  134. s := NewEcsRamRoleSigner(c, nil)
  135. assert.NotNil(t, s)
  136. // Start a test server locally.
  137. nextDay := time.Now().AddDate(0, 0, 1)
  138. ts := mockServer(200, fmt.Sprintf(`{
  139. "Code": "Success",
  140. "AccessKeyId":"access key id",
  141. "AccessKeySecret":"access key secret",
  142. "SecurityToken":"security token",
  143. "Expiration": "%s"
  144. }`, nextDay.Format("2006-01-02T15:04:05Z")))
  145. defer ts.Close()
  146. originalSecurityCredURL := securityCredURL
  147. securityCredURL = strings.Replace(securityCredURL, "http://100.100.100.200", ts.URL, -1)
  148. defer func() {
  149. securityCredURL = originalSecurityCredURL
  150. }()
  151. // sessionCredential should be nil
  152. assert.Len(t, s.GetExtraParam(), 0)
  153. assert.Nil(t, s.GetSessionCredential())
  154. accessKeyId, err := s.GetAccessKeyId()
  155. assert.Nil(t, err)
  156. assert.Equal(t, "access key id", accessKeyId)
  157. expiration := s.credentialExpiration
  158. accessKeyId, err = s.GetAccessKeyId()
  159. assert.NotNil(t, s.GetSessionCredential())
  160. assert.Nil(t, err)
  161. assert.Equal(t, "access key id", accessKeyId)
  162. assert.Len(t, s.GetExtraParam(), 1)
  163. assert.Equal(t, "security token", s.GetExtraParam()["SecurityToken"])
  164. // the expiration should not changed. hit cache
  165. assert.Equal(t, expiration, s.credentialExpiration)
  166. assert.Equal(t, "dcM4bWGEoD5QUp9xhLW3SfcWfgs=", s.Sign("string to sign", "/"))
  167. s.sessionCredential.StsToken = ""
  168. assert.Len(t, s.GetExtraParam(), 0)
  169. }