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 }