kms_test.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. package alibaba
  2. import (
  3. "context"
  4. "fmt"
  5. "reflect"
  6. "strings"
  7. "testing"
  8. kmssdk "github.com/aliyun/alibaba-cloud-sdk-go/services/kms"
  9. esv1alpha1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1alpha1"
  10. fakesm "github.com/external-secrets/external-secrets/pkg/provider/alibaba/fake"
  11. )
  12. type keyManagementServiceTestCase struct {
  13. mockClient *fakesm.AlibabaMockClient
  14. apiInput *kmssdk.GetSecretValueRequest
  15. apiOutput *kmssdk.GetSecretValueResponse
  16. ref *esv1alpha1.ExternalSecretDataRemoteRef
  17. projectID string
  18. apiErr error
  19. expectError string
  20. expectedSecret string
  21. keyID []byte
  22. accessKey []byte
  23. // for testing secretmap
  24. expectedData map[string]string
  25. }
  26. func makeValidKMSTestCase() *keyManagementServiceTestCase {
  27. kmstc := keyManagementServiceTestCase{
  28. mockClient: &fakesm.AlibabaMockClient{},
  29. apiInput: makeValidAPIInput(),
  30. ref: makeValidRef(),
  31. apiOutput: makeValidAPIOutput(),
  32. projectID: "default",
  33. apiErr: nil,
  34. expectError: "",
  35. expectedSecret: "",
  36. expectedData: make(map[string]string),
  37. }
  38. kmstc.mockClient.WithValue(kmstc.apiInput, kmstc.apiOutput, kmstc.apiErr)
  39. return &kmstc
  40. }
  41. func makeValidRef() *esv1alpha1.ExternalSecretDataRemoteRef {
  42. return &esv1alpha1.ExternalSecretDataRemoteRef{
  43. Key: "/baz",
  44. Version: "default",
  45. }
  46. }
  47. func makeValidAPIInput() *kmssdk.GetSecretValueRequest {
  48. return &kmssdk.GetSecretValueRequest{
  49. SecretName: "projects/default/secrets//baz/versions/default",
  50. }
  51. }
  52. func makeValidAPIOutput() *kmssdk.GetSecretValueResponse {
  53. return &kmssdk.GetSecretValueResponse{}
  54. }
  55. func makeValidKMSTestCaseCustom(tweaks ...func(smtc *keyManagementServiceTestCase)) *keyManagementServiceTestCase {
  56. kmstc := makeValidKMSTestCase()
  57. for _, fn := range tweaks {
  58. fn(kmstc)
  59. }
  60. kmstc.mockClient.WithValue(kmstc.apiInput, kmstc.apiOutput, kmstc.apiErr)
  61. return kmstc
  62. }
  63. var setAPIErr = func(smtc *keyManagementServiceTestCase) {
  64. smtc.apiErr = fmt.Errorf("oh no")
  65. smtc.expectError = "oh no"
  66. }
  67. var setNilMockClient = func(smtc *keyManagementServiceTestCase) {
  68. smtc.mockClient = nil
  69. smtc.expectError = errUninitalizedAlibabaProvider
  70. }
  71. func TestAlibabaKMSGetSecret(t *testing.T) {
  72. secretData := make(map[string]interface{})
  73. secretValue := "changedvalue"
  74. secretData["payload"] = secretValue
  75. // good case: default version is set
  76. // key is passed in, output is sent back
  77. setSecretString := func(kmstc *keyManagementServiceTestCase) {
  78. }
  79. // good case: custom version set
  80. setCustomKey := func(smtc *keyManagementServiceTestCase) {
  81. }
  82. successCases := []*keyManagementServiceTestCase{
  83. makeValidKMSTestCase(),
  84. makeValidKMSTestCaseCustom(setSecretString),
  85. makeValidKMSTestCaseCustom(setCustomKey),
  86. makeValidKMSTestCaseCustom(setAPIErr),
  87. makeValidKMSTestCaseCustom(setNilMockClient),
  88. }
  89. sm := KeyManagementService{}
  90. for k, v := range successCases {
  91. sm.Client = v.mockClient
  92. out, err := sm.GetSecret(context.Background(), *v.ref)
  93. if !ErrorContains(err, v.expectError) {
  94. t.Errorf("[%d] unexpected error: %s, expected: '%s'", k, err.Error(), v.expectError)
  95. }
  96. if string(out) != v.expectedSecret {
  97. t.Errorf("[%d] unexpected secret: expected %s, got %s", k, v.expectedSecret, string(out))
  98. }
  99. }
  100. }
  101. func TestGetSecretMap(t *testing.T) {
  102. // good case: default version & deserialization
  103. setDeserialization := func(smtc *keyManagementServiceTestCase) {
  104. smtc.apiOutput.SecretData = (`{"foo":"bar"}`)
  105. smtc.expectedData["foo"] = "bar"
  106. }
  107. // bad case: invalid json
  108. setInvalidJSON := func(smtc *keyManagementServiceTestCase) {
  109. smtc.apiOutput.SecretData = aws.String(`-----------------`)
  110. pstc.expectError = "unable to unmarshal secret"
  111. }
  112. successCases := []*keyManagementServiceTestCase{
  113. makeValidKMSTestCaseCustom(setDeserialization),
  114. makeValidKMSTestCaseCustom(setInvalidJSON),
  115. makeValidKMSTestCaseCustom(setNilMockClient),
  116. makeValidKMSTestCaseCustom(setAPIErr),
  117. }
  118. sm := KeyManagementService{}
  119. for k, v := range successCases {
  120. sm.Client = v.mockClient
  121. out, err := sm.GetSecretMap(context.Background(), *v.ref)
  122. if !ErrorContains(err, v.expectError) {
  123. t.Errorf("[%d] unexpected error: %s, expected: '%s'", k, err.Error(), v.expectError)
  124. }
  125. if err == nil && !reflect.DeepEqual(out, v.expectedData) {
  126. t.Errorf("[%d] unexpected secret data: expected %#v, got %#v", k, v.expectedData, out)
  127. }
  128. }
  129. }
  130. func ErrorContains(out error, want string) bool {
  131. if out == nil {
  132. return want == ""
  133. }
  134. if want == "" {
  135. return false
  136. }
  137. return strings.Contains(out.Error(), want)
  138. }