github.com/cornelk/go-cloud@v0.17.1/secrets/awskms/kms_test.go (about) 1 // Copyright 2019 The Go Cloud Development Kit Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // https://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package awskms 16 17 import ( 18 "context" 19 "errors" 20 "fmt" 21 "os" 22 "testing" 23 24 "github.com/aws/aws-sdk-go/aws/awserr" 25 "github.com/aws/aws-sdk-go/aws/session" 26 "github.com/aws/aws-sdk-go/service/kms" 27 "github.com/cornelk/go-cloud/internal/testing/setup" 28 "github.com/cornelk/go-cloud/secrets" 29 "github.com/cornelk/go-cloud/secrets/driver" 30 "github.com/cornelk/go-cloud/secrets/drivertest" 31 ) 32 33 const ( 34 keyID1 = "alias/test-secrets" 35 keyID2 = "alias/test-secrets2" 36 region = "us-east-2" 37 ) 38 39 type harness struct { 40 client *kms.KMS 41 close func() 42 } 43 44 func (h *harness) MakeDriver(ctx context.Context) (driver.Keeper, driver.Keeper, error) { 45 return &keeper{keyID: keyID1, client: h.client}, &keeper{keyID: keyID2, client: h.client}, nil 46 } 47 48 func (h *harness) Close() { 49 h.close() 50 } 51 52 func newHarness(ctx context.Context, t *testing.T) (drivertest.Harness, error) { 53 sess, _, done, _ := setup.NewAWSSession(ctx, t, region) 54 return &harness{ 55 client: kms.New(sess), 56 close: done, 57 }, nil 58 } 59 60 func TestConformance(t *testing.T) { 61 drivertest.RunConformanceTests(t, newHarness, []drivertest.AsTest{verifyAs{}}) 62 } 63 64 type verifyAs struct{} 65 66 func (v verifyAs) Name() string { 67 return "verify As function" 68 } 69 70 func (v verifyAs) ErrorCheck(k *secrets.Keeper, err error) error { 71 var e awserr.Error 72 if !k.ErrorAs(err, &e) { 73 return errors.New("Keeper.ErrorAs failed") 74 } 75 if e.Code() != kms.ErrCodeInvalidCiphertextException { 76 return fmt.Errorf("got %q, want %q", e.Code(), kms.ErrCodeInvalidCiphertextException) 77 } 78 return nil 79 } 80 81 // KMS-specific tests. 82 83 func TestNoSessionProvidedError(t *testing.T) { 84 if _, err := Dial(nil); err == nil { 85 t.Error("got nil, want no AWS session provided") 86 } 87 } 88 89 func TestNoConnectionError(t *testing.T) { 90 prevAccessKey := os.Getenv("AWS_ACCESS_KEY") 91 prevSecretKey := os.Getenv("AWS_SECRET_KEY") 92 prevRegion := os.Getenv("AWS_REGION") 93 os.Setenv("AWS_ACCESS_KEY", "myaccesskey") 94 os.Setenv("AWS_SECRET_KEY", "mysecretkey") 95 os.Setenv("AWS_REGION", "us-east-1") 96 defer func() { 97 os.Setenv("AWS_ACCESS_KEY", prevAccessKey) 98 os.Setenv("AWS_SECRET_KEY", prevSecretKey) 99 os.Setenv("AWS_REGION", prevRegion) 100 }() 101 sess, err := session.NewSession() 102 if err != nil { 103 t.Fatal(err) 104 } 105 106 client, err := Dial(sess) 107 if err != nil { 108 t.Fatal(err) 109 } 110 keeper := OpenKeeper(client, keyID1, nil) 111 defer keeper.Close() 112 113 if _, err := keeper.Encrypt(context.Background(), []byte("test")); err == nil { 114 t.Error("got nil, want UnrecognizedClientException") 115 } 116 } 117 118 func TestOpenKeeper(t *testing.T) { 119 tests := []struct { 120 URL string 121 WantErr bool 122 }{ 123 // OK. 124 {"awskms://alias/my-key", false}, 125 // OK, overriding region. 126 {"awskms://alias/my-key?region=us-west1", false}, 127 // Unknown parameter. 128 {"awskms://alias/my-key?param=value", true}, 129 } 130 131 ctx := context.Background() 132 for _, test := range tests { 133 keeper, err := secrets.OpenKeeper(ctx, test.URL) 134 if (err != nil) != test.WantErr { 135 t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr) 136 } 137 if err == nil { 138 if err = keeper.Close(); err != nil { 139 t.Errorf("%s: got error during close: %v", test.URL, err) 140 } 141 } 142 } 143 }