github.com/Jeffail/benthos/v3@v3.65.0/internal/integration/cache_test_definitions.go (about)

     1  package integration
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/Jeffail/benthos/v3/lib/types"
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  // CacheTestOpenClose checks that the cache can be started, an item added, and
    15  // then stopped.
    16  func CacheTestOpenClose() CacheTestDefinition {
    17  	return namedCacheTest(
    18  		"can open and close",
    19  		func(t *testing.T, env *cacheTestEnvironment) {
    20  			t.Parallel()
    21  
    22  			cache := initCache(t, env)
    23  			t.Cleanup(func() {
    24  				closeCache(t, cache)
    25  			})
    26  
    27  			require.NoError(t, cache.Add("foo", []byte("bar")))
    28  
    29  			res, err := cache.Get("foo")
    30  			require.NoError(t, err)
    31  			assert.Equal(t, "bar", string(res))
    32  		},
    33  	)
    34  }
    35  
    36  // CacheTestMissingKey checks that we get an error on missing key.
    37  func CacheTestMissingKey() CacheTestDefinition {
    38  	return namedCacheTest(
    39  		"return consistent error on missing key",
    40  		func(t *testing.T, env *cacheTestEnvironment) {
    41  			t.Parallel()
    42  
    43  			cache := initCache(t, env)
    44  			t.Cleanup(func() {
    45  				closeCache(t, cache)
    46  			})
    47  
    48  			_, err := cache.Get("missingkey")
    49  			assert.EqualError(t, err, "key does not exist")
    50  		},
    51  	)
    52  }
    53  
    54  // CacheTestDoubleAdd ensures that a double add returns an error.
    55  func CacheTestDoubleAdd() CacheTestDefinition {
    56  	return namedCacheTest(
    57  		"add with duplicate key fails",
    58  		func(t *testing.T, env *cacheTestEnvironment) {
    59  			t.Parallel()
    60  
    61  			cache := initCache(t, env)
    62  			t.Cleanup(func() {
    63  				closeCache(t, cache)
    64  			})
    65  
    66  			require.NoError(t, cache.Add("addkey", []byte("first")))
    67  
    68  			assert.Eventually(t, func() bool {
    69  				return errors.Is(cache.Add("addkey", []byte("second")), types.ErrKeyAlreadyExists)
    70  			}, time.Minute, time.Second)
    71  
    72  			res, err := cache.Get("addkey")
    73  			require.NoError(t, err)
    74  			assert.Equal(t, "first", string(res))
    75  		},
    76  	)
    77  }
    78  
    79  // CacheTestDelete checks that deletes work.
    80  func CacheTestDelete() CacheTestDefinition {
    81  	return namedCacheTest(
    82  		"can set and delete keys",
    83  		func(t *testing.T, env *cacheTestEnvironment) {
    84  			t.Parallel()
    85  
    86  			cache := initCache(t, env)
    87  			t.Cleanup(func() {
    88  				closeCache(t, cache)
    89  			})
    90  
    91  			require.NoError(t, cache.Add("addkey", []byte("first")))
    92  
    93  			res, err := cache.Get("addkey")
    94  			require.NoError(t, err)
    95  			assert.Equal(t, "first", string(res))
    96  
    97  			require.NoError(t, cache.Delete("addkey"))
    98  
    99  			_, err = cache.Get("addkey")
   100  			require.EqualError(t, err, "key does not exist")
   101  		},
   102  	)
   103  }
   104  
   105  // CacheTestGetAndSet checks that we can set and then get n items.
   106  func CacheTestGetAndSet(n int) CacheTestDefinition {
   107  	return namedCacheTest(
   108  		"can get and set",
   109  		func(t *testing.T, env *cacheTestEnvironment) {
   110  			t.Parallel()
   111  
   112  			cache := initCache(t, env)
   113  			t.Cleanup(func() {
   114  				closeCache(t, cache)
   115  			})
   116  
   117  			for i := 0; i < n; i++ {
   118  				key := fmt.Sprintf("key:%v", i)
   119  				value := fmt.Sprintf("value:%v", i)
   120  				require.NoError(t, cache.Set(key, []byte(value)))
   121  			}
   122  
   123  			for i := 0; i < n; i++ {
   124  				key := fmt.Sprintf("key:%v", i)
   125  				value := fmt.Sprintf("value:%v", i)
   126  
   127  				res, err := cache.Get(key)
   128  				require.NoError(t, err)
   129  				assert.Equal(t, value, string(res))
   130  			}
   131  		},
   132  	)
   133  }