From ff0800b1d3c1c41d6356592f0e789003c05ad81f Mon Sep 17 00:00:00 2001 From: Parimal Deshmukh Date: Mon, 15 Apr 2019 18:24:26 +0000 Subject: [PATCH] Added tests for and fixed bug in err caching delay --- scintegtests/integration_test.go | 28 ++++++++++++++++++++++++++-- secretcache/cacheItem.go | 2 +- secretcache/cache_test.go | 12 ++++++++++-- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/scintegtests/integration_test.go b/scintegtests/integration_test.go index 52afb86..2fca7ca 100644 --- a/scintegtests/integration_test.go +++ b/scintegtests/integration_test.go @@ -2,6 +2,7 @@ package scintegtests import ( "bytes" + "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/secretsmanager" "github.com/aws/aws-sdk-go/service/secretsmanager/secretsmanageriface" @@ -13,14 +14,15 @@ import ( ) var ( - randStringSet = []rune("abcdefghijklmnopqrstuvwxyz0123456789") + randStringSet = []rune("abcdefghijklmnopqrstuvwxyz0123456789") secretNamePrefix = "scIntegTest_" - subTests = []func(t *testing.T, api secretsmanageriface.SecretsManagerAPI) string{ + subTests = []func(t *testing.T, api secretsmanageriface.SecretsManagerAPI) string{ integTest_getSecretBinary, integTest_getSecretBinaryWithStage, integTest_getSecretString, integTest_getSecretStringWithStage, integTest_getSecretStringWithTTL, + integTest_getSecretStringNoSecret, } ) @@ -108,6 +110,11 @@ func getPrevRunSecrets(secretsManagerClient *secretsmanager.SecretsManager) []st func performDelete(secretNames *[]string, secretsManagerClient *secretsmanager.SecretsManager, forceDelete bool) { for _, secretName := range *secretNames { + + if secretName == "" { + continue + } + time.Sleep(time.Second / 2) _, _ = secretsManagerClient.DeleteSecret(&secretsmanager.DeleteSecretInput{ SecretId: &secretName, @@ -355,3 +362,20 @@ func integTest_getSecretStringWithTTL(t *testing.T, api secretsmanageriface.Secr return *createResult.ARN } + +func integTest_getSecretStringNoSecret(t *testing.T, api secretsmanageriface.SecretsManagerAPI) string { + cache, _ := secretcache.New( + func(c *secretcache.Cache) { c.Client = api }, + ) + + secretName := "NoSuchSecret" + _, err := cache.GetSecretString(secretName) + + if err == nil { + t.Errorf("Expected to not find a secret called %s", secretName) + } else if awsErr, _ := err.(awserr.Error); awsErr.Code() != secretsmanager.ErrCodeResourceNotFoundException { + t.Errorf("Expected %s err but got %s", secretsmanager.ErrCodeResourceNotFoundException, awsErr.Code()) + } + + return "" +} diff --git a/secretcache/cacheItem.go b/secretcache/cacheItem.go index 44d4e6c..911efc3 100644 --- a/secretcache/cacheItem.go +++ b/secretcache/cacheItem.go @@ -146,7 +146,7 @@ func (ci *secretCacheItem) refresh() { ci.err = err delay := exceptionRetryDelayBase * math.Pow(exceptionRetryGrowthFactor, float64(ci.errorCount)) delay = math.Min(delay, exceptionRetryDelayMax) - delayDuration := time.Nanosecond * time.Duration(delay) + delayDuration := time.Millisecond * time.Duration(delay) ci.nextRetryTime = time.Now().Add(delayDuration).UnixNano() return } diff --git a/secretcache/cache_test.go b/secretcache/cache_test.go index a90f156..51874f5 100644 --- a/secretcache/cache_test.go +++ b/secretcache/cache_test.go @@ -324,9 +324,13 @@ func TestGetSecretStringMultipleNotFound(t *testing.T) { _, err := secretCache.GetSecretStringWithStage("test", "versionStage-42") if err == nil { - t.Fatalf("Expected error for a missing secret") + t.Fatalf("Expected error: secretNotFound for a missing secret") } } + + if mockClient.DescribeSecretCallCount != 1 { + t.Fatalf("Expected a single call to DescribeSecret API, got %d", mockClient.DescribeSecretCallCount) + } } func TestGetSecretBinaryMultipleNotFound(t *testing.T) { @@ -343,9 +347,13 @@ func TestGetSecretBinaryMultipleNotFound(t *testing.T) { _, err := secretCache.GetSecretBinaryWithStage("test", "versionStage-42") if err == nil { - t.Fatalf("Expected error for a missing secret") + t.Fatalf("Expected error: secretNotFound for a missing secret") } } + + if mockClient.DescribeSecretCallCount != 1 { + t.Fatalf("Expected a single call to DescribeSecret API, got %d", mockClient.DescribeSecretCallCount) + } } func TestGetSecretVersionStageEmpty(t *testing.T) {