signer_key_pair_test.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. package signers
  2. import (
  3. "bytes"
  4. "fmt"
  5. "io/ioutil"
  6. "net/http"
  7. "strconv"
  8. "testing"
  9. "github.com/stretchr/testify/assert"
  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. )
  14. func TestKeyPairError(t *testing.T) {
  15. c := credentials.NewRsaKeyPairCredential("privateKey", "publicKey", 1)
  16. _, err := NewSignerKeyPair(c, nil)
  17. assert.NotNil(t, err)
  18. assert.Equal(t, "[SDK.InvalidParam] Key Pair session duration should be in the range of 15min - 1Hr", err.Error())
  19. }
  20. func TestKeyPairOk(t *testing.T) {
  21. c := credentials.NewRsaKeyPairCredential("privateKey", "publicKey", 0)
  22. s, err := NewSignerKeyPair(c, nil)
  23. assert.Nil(t, err)
  24. assert.NotNil(t, s)
  25. assert.Equal(t, 3600, s.credentialExpiration)
  26. c = credentials.NewRsaKeyPairCredential("privateKey", "publicKey", 3500)
  27. s, err = NewSignerKeyPair(c, nil)
  28. assert.Nil(t, err)
  29. assert.NotNil(t, s)
  30. assert.Equal(t, 3500, s.credentialExpiration)
  31. assert.Equal(t, "HMAC-SHA1", s.GetName())
  32. assert.Equal(t, "1.0", s.GetVersion())
  33. assert.Equal(t, "", s.GetType())
  34. assert.Len(t, s.GetExtraParam(), 0)
  35. // nothing
  36. s.Shutdown()
  37. }
  38. func Test_buildCommonRequest(t *testing.T) {
  39. c := credentials.NewRsaKeyPairCredential("privateKey", "publicKey", 0)
  40. s, err := NewSignerKeyPair(c, func(*requests.CommonRequest, interface{}) (response *responses.CommonResponse, err error) {
  41. return nil, fmt.Errorf("common api fails")
  42. })
  43. assert.Nil(t, err)
  44. request, err := s.buildCommonRequest()
  45. assert.Nil(t, err)
  46. assert.NotNil(t, request)
  47. assert.Equal(t, "Sts", request.Product)
  48. assert.Equal(t, "2015-04-01", request.Version)
  49. assert.Equal(t, "GenerateSessionAccessKey", request.ApiName)
  50. assert.Equal(t, "HTTPS", request.Scheme)
  51. assert.Equal(t, "publicKey", request.QueryParams["PublicKeyId"])
  52. assert.Equal(t, "3600", request.QueryParams["DurationSeconds"])
  53. }
  54. func TestGetAccessKeyId(t *testing.T) {
  55. c := credentials.NewRsaKeyPairCredential("privateKey", "publicKey", 0)
  56. s, err := NewSignerKeyPair(c, func(*requests.CommonRequest, interface{}) (response *responses.CommonResponse, err error) {
  57. return nil, fmt.Errorf("common api fails")
  58. })
  59. assert.Nil(t, err)
  60. assert.NotNil(t, s)
  61. accessKeyId, err := s.GetAccessKeyId()
  62. assert.Equal(t, "common api fails", err.Error())
  63. assert.Equal(t, "", accessKeyId)
  64. }
  65. func TestGetAccessKeyId2(t *testing.T) {
  66. // default response is not OK
  67. c := credentials.NewRsaKeyPairCredential("privateKey", "publicKey", 0)
  68. s, err := NewSignerKeyPair(c, func(*requests.CommonRequest, interface{}) (response *responses.CommonResponse, err error) {
  69. return responses.NewCommonResponse(), nil
  70. })
  71. assert.Nil(t, err)
  72. assert.NotNil(t, s)
  73. // s.lastUpdateTimestamp = time.Now().Unix() - 1000
  74. accessKeyId, err := s.GetAccessKeyId()
  75. assert.Equal(t, "SDK.ServerError\nErrorCode: \nRecommend: refresh session AccessKey failed\nRequestId: \nMessage: ", err.Error())
  76. assert.Equal(t, "", accessKeyId)
  77. }
  78. func TestGetAccessKeyId3(t *testing.T) {
  79. c := credentials.NewRsaKeyPairCredential("privateKey", "publicKey", 0)
  80. // Mock the 200 response and invalid json
  81. s, err := NewSignerKeyPair(c, func(*requests.CommonRequest, interface{}) (response *responses.CommonResponse, err error) {
  82. res := responses.NewCommonResponse()
  83. statusCode := 200
  84. header := make(http.Header)
  85. status := strconv.Itoa(statusCode)
  86. httpresp := &http.Response{
  87. Proto: "HTTP/1.1",
  88. ProtoMajor: 1,
  89. Header: header,
  90. StatusCode: statusCode,
  91. Status: status + " " + http.StatusText(statusCode),
  92. }
  93. httpresp.Header = make(http.Header)
  94. httpresp.Body = ioutil.NopCloser(bytes.NewReader([]byte("invalid json")))
  95. responses.Unmarshal(res, httpresp, "JSON")
  96. return res, nil
  97. })
  98. assert.Nil(t, err)
  99. assert.NotNil(t, s)
  100. // s.lastUpdateTimestamp = time.Now().Unix() - 1000
  101. accessKeyId, err := s.GetAccessKeyId()
  102. assert.NotNil(t, err)
  103. assert.Equal(t, "refresh KeyPair err, json.Unmarshal fail: invalid character 'i' looking for beginning of value", err.Error())
  104. assert.Equal(t, "", accessKeyId)
  105. }
  106. func TestGetAccessKeyId4(t *testing.T) {
  107. c := credentials.NewRsaKeyPairCredential("privateKey", "publicKey", 0)
  108. // mock 200 response and valid json, but no data
  109. s, err := NewSignerKeyPair(c, func(*requests.CommonRequest, interface{}) (response *responses.CommonResponse, err error) {
  110. res := responses.NewCommonResponse()
  111. statusCode := 200
  112. header := make(http.Header)
  113. status := strconv.Itoa(statusCode)
  114. httpresp := &http.Response{
  115. Proto: "HTTP/1.1",
  116. ProtoMajor: 1,
  117. Header: header,
  118. StatusCode: statusCode,
  119. Status: status + " " + http.StatusText(statusCode),
  120. }
  121. httpresp.Header = make(http.Header)
  122. httpresp.Body = ioutil.NopCloser(bytes.NewReader([]byte("{}")))
  123. responses.Unmarshal(res, httpresp, "JSON")
  124. return res, nil
  125. })
  126. assert.Nil(t, err)
  127. assert.NotNil(t, s)
  128. // s.lastUpdateTimestamp = time.Now().Unix() - 1000
  129. accessKeyId, err := s.GetAccessKeyId()
  130. assert.Nil(t, err)
  131. assert.Equal(t, "", accessKeyId)
  132. }
  133. func TestGetAccessKeyIdAndSign(t *testing.T) {
  134. c := credentials.NewRsaKeyPairCredential("privateKey", "publicKey", 0)
  135. // mock 200 response and valid json and valid result
  136. s, err := NewSignerKeyPair(c, func(*requests.CommonRequest, interface{}) (response *responses.CommonResponse, err error) {
  137. res := responses.NewCommonResponse()
  138. statusCode := 200
  139. header := make(http.Header)
  140. status := strconv.Itoa(statusCode)
  141. httpresp := &http.Response{
  142. Proto: "HTTP/1.1",
  143. ProtoMajor: 1,
  144. Header: header,
  145. StatusCode: statusCode,
  146. Status: status + " " + http.StatusText(statusCode),
  147. }
  148. httpresp.Header = make(http.Header)
  149. json := `{"SessionAccessKey":{"SessionAccessKeyId":"session access key id","SessionAccessKeySecret": "session access key secret"}}`
  150. httpresp.Body = ioutil.NopCloser(bytes.NewReader([]byte(json)))
  151. responses.Unmarshal(res, httpresp, "JSON")
  152. return res, nil
  153. })
  154. assert.Nil(t, err)
  155. assert.NotNil(t, s)
  156. // s.lastUpdateTimestamp = time.Now().Unix() - 1000
  157. accessKeyId, err := s.GetAccessKeyId()
  158. assert.Nil(t, err)
  159. assert.Equal(t, "session access key id", accessKeyId)
  160. // no need update
  161. err = s.ensureCredential()
  162. assert.Nil(t, err)
  163. signature := s.Sign("string to sign", "/")
  164. assert.Equal(t, "a3pLxd685VW4u078cdBKVh/Qf/A=", signature)
  165. }