github.com/influx6/npkg@v0.8.8/nstorage/internal/tharness/test_harness.go (about)

     1  package tharness
     2  
     3  import (
     4  	"fmt"
     5  	"math/rand"
     6  	"strings"
     7  	"testing"
     8  	"time"
     9  	"unsafe"
    10  
    11  	"github.com/stretchr/testify/require"
    12  
    13  	"github.com/influx6/npkg/nstorage"
    14  )
    15  
    16  func TestByteStoreRemoveKeys(t *testing.T, store nstorage.ByteStore) {
    17  	var keys []string
    18  	for i := 0; i < 10; i++ {
    19  		var key = fmt.Sprintf("day-%d", i)
    20  		keys = append(keys, key)
    21  		require.NoError(t, store.Save(key, string2Bytes("i")))
    22  	}
    23  
    24  	var values, err = store.GetAnyKeys(keys...)
    25  	require.NoError(t, err)
    26  	require.Len(t, values, len(keys))
    27  
    28  	require.NoError(t, store.RemoveKeys(keys...))
    29  
    30  	var _, err2 = store.GetAllKeys(keys...)
    31  	require.Error(t, err2)
    32  }
    33  
    34  func TestByteStoreScanMatch(t *testing.T, store nstorage.ByteStore) {
    35  	for i := 0; i < 10; i++ {
    36  		var key = fmt.Sprintf("day-%d", i)
    37  		require.NoError(t, store.Save(key, string2Bytes("i")))
    38  	}
    39  
    40  	var result, err = store.ScanMatch(2, 0, "", "")
    41  
    42  	require.NoError(t, err, "ScanMatch should not fail")
    43  	require.Len(t, result.Keys, 2)
    44  
    45  	if len(result.LastKey) == 0 {
    46  		require.Equal(t, int(result.LastIndex), 2)
    47  	} else {
    48  		require.NotEmpty(t, result.LastKey)
    49  		require.Equal(t, result.Keys[len(result.Keys)-1], result.LastKey)
    50  	}
    51  
    52  	result, err = store.ScanMatch(2, result.LastIndex, result.LastKey, "")
    53  
    54  	require.NoError(t, err, "ScanMatch should not fail")
    55  	require.Len(t, result.Keys, 2)
    56  
    57  	if len(result.LastKey) == 0 {
    58  		require.Equal(t, int(result.LastIndex), 4)
    59  	} else {
    60  		require.NotEmpty(t, result.LastKey)
    61  		require.Equal(t, result.Keys[len(result.Keys)-1], result.LastKey)
    62  	}
    63  }
    64  
    65  func TestByteStoreGetAnykeys(t *testing.T, store nstorage.ByteStore) {
    66  	var keys []string
    67  	for i := 0; i < 10; i++ {
    68  		var key = fmt.Sprintf("day-%d", i)
    69  		keys = append(keys, key)
    70  		require.NoError(t, store.Save(key, string2Bytes("i")))
    71  	}
    72  
    73  	var values, err = store.GetAnyKeys(keys...)
    74  
    75  	require.NoError(t, err)
    76  	require.Len(t, values, len(keys))
    77  }
    78  
    79  func TestByteStoreGetAllkeys(t *testing.T, store nstorage.ByteStore) {
    80  	var keys []string
    81  	for i := 0; i < 10; i++ {
    82  		var key = fmt.Sprintf("day-%d", i)
    83  		keys = append(keys, key)
    84  		require.NoError(t, store.Save(key, string2Bytes("i")))
    85  	}
    86  
    87  	var values, err = store.GetAllKeys(keys...)
    88  
    89  	require.NoError(t, err)
    90  	require.Len(t, values, len(keys))
    91  }
    92  
    93  func TestByteStoreFindAll(t *testing.T, store nstorage.ByteStore) {
    94  	for i := 0; i < 10; i++ {
    95  		var key = fmt.Sprintf("day-%d", i)
    96  		require.NoError(t, store.Save(key, string2Bytes("i")))
    97  	}
    98  
    99  	var keys, keyErr = store.Keys()
   100  	require.NoError(t, keyErr)
   101  	require.NotEmpty(t, keys)
   102  
   103  	var count int
   104  	var err = store.Each(func(val []byte, k string) error {
   105  		require.NotEmpty(t, val)
   106  		require.NotEmpty(t, k)
   107  		count++
   108  		return nil
   109  	})
   110  
   111  	require.NoError(t, err)
   112  	require.True(t, count >= 10)
   113  }
   114  
   115  func TestByteStoreFindPrefix(t *testing.T, store nstorage.ByteStore) {
   116  	var keys []string
   117  	for i := 0; i < 10; i++ {
   118  		var key = fmt.Sprintf("day-%d", i)
   119  		keys = append(keys, key)
   120  		require.NoError(t, store.Save(key, string2Bytes("i")))
   121  	}
   122  
   123  	var inKeys, getKeysErr = store.Keys()
   124  	require.NoError(t, getKeysErr)
   125  	require.NotEmpty(t, inKeys)
   126  
   127  	var returnedKeys, keyErr = store.EachKeyMatch("day-.+")
   128  	require.NoError(t, keyErr)
   129  	require.NotEmpty(t, returnedKeys)
   130  
   131  	for _, v := range keys {
   132  		require.True(t, hasSuffixInList(returnedKeys, v))
   133  	}
   134  
   135  	var returnedKeys2, keyErr2 = store.EachKeyMatch("day-0")
   136  	require.NoError(t, keyErr2)
   137  	require.Len(t, returnedKeys2, 1)
   138  }
   139  
   140  func hasSuffixInList(v []string, k string) bool {
   141  	for _, vk := range v {
   142  		if strings.HasSuffix(vk, k) {
   143  			return true
   144  		}
   145  	}
   146  	return false
   147  }
   148  
   149  func TestByteStoreFindEach(t *testing.T, store nstorage.ByteStore) {
   150  	for i := 0; i < 10; i++ {
   151  		var key = fmt.Sprintf("day-%d", i)
   152  		require.NoError(t, store.Save(key, string2Bytes("i")))
   153  	}
   154  
   155  	var keys, keyErr = store.Keys()
   156  	require.NoError(t, keyErr)
   157  	require.NotEmpty(t, keys)
   158  
   159  	var count int
   160  	var err = store.Each(func(val []byte, k string) error {
   161  		if count >= 2 {
   162  			return nstorage.ErrJustStop
   163  		}
   164  		count++
   165  		return nil
   166  	})
   167  
   168  	require.NoError(t, err)
   169  	require.Equal(t, 2, count)
   170  }
   171  
   172  func TestByteStore(t *testing.T, store nstorage.ByteStore) {
   173  	require.NoError(t, store.Save("day", string2Bytes("wrecker")))
   174  	var val, err = store.Get("day")
   175  	require.NoError(t, err)
   176  	require.Equal(t, "wrecker", bytes2String(val))
   177  
   178  	var exist bool
   179  	exist, err = store.Exists("day")
   180  	require.NoError(t, err)
   181  	require.True(t, exist)
   182  
   183  	var newValue = "tweeter"
   184  	require.NoError(t, store.Update("day", string2Bytes(newValue)))
   185  
   186  	exist, err = store.Exists("day")
   187  	require.NoError(t, err)
   188  	require.True(t, exist)
   189  
   190  	var keyValue, kerr = store.Get("day")
   191  	require.NoError(t, kerr)
   192  	require.Equal(t, newValue, string(keyValue))
   193  
   194  	var count int
   195  	require.NoError(t, store.Each(func(v []byte, k string) error {
   196  		count++
   197  		return nil
   198  	}))
   199  
   200  	require.NotEqual(t, 0, count)
   201  
   202  	val, err = store.Remove("day")
   203  	require.NoError(t, err)
   204  	require.Equal(t, "tweeter", bytes2String(val))
   205  }
   206  
   207  func TestExpiryReset(t *testing.T, store nstorage.ExpirableStore) {
   208  	require.NoError(t, store.SaveTTL("day", string2Bytes("wrecker"), 3*time.Second))
   209  
   210  	var val, err = store.Get("day")
   211  	require.NoError(t, err)
   212  	require.Equal(t, "wrecker", bytes2String(val))
   213  
   214  	ttl, err := store.TTL("day")
   215  	require.NoError(t, err)
   216  	require.True(t, ttl <= 3*time.Second)
   217  
   218  	require.NoError(t, store.ResetTTL("day", time.Second))
   219  
   220  	ttl, err = store.TTL("day")
   221  	require.NoError(t, err)
   222  	require.True(t, ttl <= time.Second)
   223  
   224  	var terr = store.ResetTTL("day", 0)
   225  	require.NoError(t, terr)
   226  
   227  	ttl, err = store.TTL("day")
   228  	require.NoError(t, err)
   229  	require.True(t, ttl <= 0)
   230  
   231  	var val2, err2 = store.Get("day")
   232  	require.NoError(t, err2)
   233  	require.Equal(t, "wrecker", bytes2String(val2))
   234  }
   235  
   236  func TestExpirableStore(t *testing.T, store nstorage.ExpirableStore) {
   237  	require.NoError(t, store.SaveTTL("day", string2Bytes("wrecker"), 3*time.Second))
   238  
   239  	var val, err = store.Get("day")
   240  	require.NoError(t, err)
   241  	require.Equal(t, "wrecker", bytes2String(val))
   242  
   243  	ttl, err := store.TTL("day")
   244  	require.NoError(t, err)
   245  	require.True(t, ttl > 0)
   246  
   247  	require.NoError(t, store.ExtendTTL("day", time.Second))
   248  
   249  	ttl, err = store.TTL("day")
   250  	require.NoError(t, err)
   251  	require.True(t, ttl > 0)
   252  
   253  	require.NoError(t, store.UpdateTTL("day", string2Bytes("tweeter"), time.Second))
   254  
   255  	val, err = store.Get("day")
   256  	require.NoError(t, err)
   257  	require.Equal(t, "tweeter", bytes2String(val))
   258  
   259  	var ttl2, terr = store.TTL("day")
   260  	require.NoError(t, terr)
   261  	require.True(t, ttl > ttl2, fmt.Sprintf("TTL1: %q, TTL2: %q", ttl, ttl2))
   262  }
   263  
   264  func bytes2String(bc []byte) string {
   265  	return *(*string)(unsafe.Pointer(&bc))
   266  }
   267  
   268  func string2Bytes(bc string) []byte {
   269  	return *(*[]byte)(unsafe.Pointer(&bc))
   270  }
   271  
   272  var alphabets = "abcdefghijklmnoprz"
   273  
   274  func randomString() string {
   275  	var in = rand.Intn(len(alphabets))
   276  	return string(alphabets[in])
   277  }