signer_ecs_ram_role_test.go 5.4 KB

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