oracle_test.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. /*
  2. Licensed under the Apache License, Version 2.0 (the "License");
  3. you may not use this file except in compliance with the License.
  4. You may obtain a copy of the License at
  5. http://www.apache.org/licenses/LICENSE-2.0
  6. Unless required by applicable law or agreed to in writing, software
  7. distributed under the License is distributed on an "AS IS" BASIS,
  8. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  9. See the License for the specific language governing permissions and
  10. limitations under the License.
  11. */
  12. package oracle
  13. import (
  14. "context"
  15. "encoding/base64"
  16. "fmt"
  17. "reflect"
  18. "strings"
  19. "testing"
  20. secrets "github.com/oracle/oci-go-sdk/v45/secrets"
  21. utilpointer "k8s.io/utils/pointer"
  22. esv1alpha1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1alpha1"
  23. fakeoracle "github.com/external-secrets/external-secrets/pkg/provider/oracle/fake"
  24. "github.com/external-secrets/external-secrets/pkg/utils"
  25. )
  26. type vaultTestCase struct {
  27. mockClient *fakeoracle.OracleMockClient
  28. apiInput *secrets.GetSecretBundleByNameRequest
  29. apiOutput *secrets.GetSecretBundleByNameResponse
  30. ref *esv1alpha1.ExternalSecretDataRemoteRef
  31. refFrom *esv1alpha1.ExternalSecretDataFromRemoteRef
  32. apiErr error
  33. expectError string
  34. expectedSecret string
  35. // for testing secretmap
  36. expectedData map[string][]byte
  37. }
  38. func makeValidVaultTestCase() *vaultTestCase {
  39. smtc := vaultTestCase{
  40. mockClient: &fakeoracle.OracleMockClient{},
  41. apiInput: makeValidAPIInput(),
  42. ref: utils.MakeValidRef(),
  43. refFrom: utils.MakeValidRefFrom(),
  44. apiOutput: makeValidAPIOutput(),
  45. apiErr: nil,
  46. expectError: "",
  47. expectedSecret: "",
  48. expectedData: map[string][]byte{},
  49. }
  50. smtc.mockClient.WithValue(*smtc.apiInput, *smtc.apiOutput, smtc.apiErr)
  51. return &smtc
  52. }
  53. func makeValidAPIInput() *secrets.GetSecretBundleByNameRequest {
  54. return &secrets.GetSecretBundleByNameRequest{
  55. SecretName: utilpointer.StringPtr("test-secret"),
  56. VaultId: utilpointer.StringPtr("test-vault"),
  57. }
  58. }
  59. func makeValidAPIOutput() *secrets.GetSecretBundleByNameResponse {
  60. return &secrets.GetSecretBundleByNameResponse{
  61. SecretBundle: secrets.SecretBundle{},
  62. }
  63. }
  64. func makeValidVaultTestCaseCustom(tweaks ...func(smtc *vaultTestCase)) *vaultTestCase {
  65. smtc := makeValidVaultTestCase()
  66. for _, fn := range tweaks {
  67. fn(smtc)
  68. }
  69. smtc.mockClient.WithValue(*smtc.apiInput, *smtc.apiOutput, smtc.apiErr)
  70. return smtc
  71. }
  72. // This case can be shared by both GetSecret and GetSecretMap tests.
  73. // bad case: set apiErr.
  74. var setAPIErr = func(smtc *vaultTestCase) {
  75. smtc.apiErr = fmt.Errorf("oh no")
  76. smtc.expectError = "oh no"
  77. }
  78. var setNilMockClient = func(smtc *vaultTestCase) {
  79. smtc.mockClient = nil
  80. smtc.expectError = errUninitalizedOracleProvider
  81. }
  82. func TestOracleVaultGetSecret(t *testing.T) {
  83. secretValue := "changedvalue"
  84. // good case: default version is set
  85. // key is passed in, output is sent back
  86. setSecretString := func(smtc *vaultTestCase) {
  87. smtc.apiOutput = &secrets.GetSecretBundleByNameResponse{
  88. SecretBundle: secrets.SecretBundle{
  89. SecretId: utilpointer.StringPtr("test-id"),
  90. VersionNumber: utilpointer.Int64(1),
  91. SecretBundleContent: secrets.Base64SecretBundleContentDetails{
  92. Content: utilpointer.StringPtr(base64.StdEncoding.EncodeToString([]byte(secretValue))),
  93. },
  94. },
  95. }
  96. smtc.expectedSecret = secretValue
  97. }
  98. successCases := []*vaultTestCase{
  99. makeValidVaultTestCaseCustom(setAPIErr),
  100. makeValidVaultTestCaseCustom(setNilMockClient),
  101. makeValidVaultTestCaseCustom(setSecretString),
  102. }
  103. sm := VaultManagementService{}
  104. for k, v := range successCases {
  105. sm.Client = v.mockClient
  106. fmt.Println(*v.ref)
  107. out, err := sm.GetSecret(context.Background(), *v.ref)
  108. if !ErrorContains(err, v.expectError) {
  109. t.Errorf("[%d] unexpected error: %s, expected: '%s'", k, err.Error(), v.expectError)
  110. }
  111. if string(out) != v.expectedSecret {
  112. t.Errorf("[%d] unexpected secret: expected %s, got %s", k, v.expectedSecret, string(out))
  113. }
  114. }
  115. }
  116. func TestGetSecretMap(t *testing.T) {
  117. // good case: default version & deserialization
  118. setDeserialization := func(smtc *vaultTestCase) {
  119. smtc.apiOutput.SecretBundleContent = secrets.Base64SecretBundleContentDetails{
  120. Content: utilpointer.StringPtr(base64.StdEncoding.EncodeToString([]byte(`{"foo":"bar"}`))),
  121. }
  122. smtc.expectedData["foo"] = []byte("bar")
  123. }
  124. // bad case: invalid json
  125. setInvalidJSON := func(smtc *vaultTestCase) {
  126. smtc.apiOutput.SecretBundleContent = secrets.Base64SecretBundleContentDetails{
  127. Content: utilpointer.StringPtr(base64.StdEncoding.EncodeToString([]byte(`-----------------`))),
  128. }
  129. smtc.expectError = "unable to unmarshal secret"
  130. }
  131. successCases := []*vaultTestCase{
  132. makeValidVaultTestCaseCustom(setDeserialization),
  133. makeValidVaultTestCaseCustom(setInvalidJSON),
  134. makeValidVaultTestCaseCustom(setNilMockClient),
  135. makeValidVaultTestCaseCustom(setAPIErr),
  136. }
  137. sm := VaultManagementService{}
  138. for k, v := range successCases {
  139. sm.Client = v.mockClient
  140. out, err := sm.GetSecretMap(context.Background(), *v.refFrom)
  141. if !ErrorContains(err, v.expectError) {
  142. t.Errorf("[%d] unexpected error: %s, expected: '%s'", k, err.Error(), v.expectError)
  143. }
  144. if err == nil && !reflect.DeepEqual(out, v.expectedData) {
  145. t.Errorf("[%d] unexpected secret data: expected %#v, got %#v", k, v.expectedData, out)
  146. }
  147. }
  148. }
  149. func ErrorContains(out error, want string) bool {
  150. if out == nil {
  151. return want == ""
  152. }
  153. if want == "" {
  154. return false
  155. }
  156. return strings.Contains(out.Error(), want)
  157. }