github.com/nutsdb/nutsdb@v1.0.4/tx_set_test.go (about) 1 // Copyright 2019 The nutsdb Author. All rights reserved. 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 // http://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 nutsdb 16 17 import ( 18 "errors" 19 "fmt" 20 "testing" 21 22 "github.com/stretchr/testify/assert" 23 ) 24 25 func TestTx_SAdd(t *testing.T) { 26 bucket := "bucket" 27 28 runNutsDBTest(t, nil, func(t *testing.T, db *DB) { 29 txCreateBucket(t, db, DataStructureSet, bucket, nil) 30 txSAdd(t, db, bucket, []byte(""), []byte("val1"), ErrKeyEmpty, nil) 31 32 key := GetTestBytes(0) 33 num := 10 34 for i := 0; i < num; i++ { 35 txSAdd(t, db, bucket, key, GetTestBytes(i), nil, nil) 36 } 37 38 for i := 0; i < num; i++ { 39 txSIsMember(t, db, bucket, key, GetTestBytes(i), true) 40 } 41 42 txSIsMember(t, db, bucket, key, GetTestBytes(num), false) 43 }) 44 } 45 46 func TestTx_SRem(t *testing.T) { 47 bucket := "bucket" 48 49 runNutsDBTest(t, nil, func(t *testing.T, db *DB) { 50 txCreateBucket(t, db, DataStructureSet, bucket, nil) 51 key := []byte("key1") 52 val1 := []byte("one") 53 val2 := []byte("two") 54 val3 := []byte("three") 55 56 txSAdd(t, db, bucket, key, val1, nil, nil) 57 txSAdd(t, db, bucket, key, val2, nil, nil) 58 txSAdd(t, db, bucket, key, val3, nil, nil) 59 60 txSRem(t, db, bucket, key, val3, nil) 61 62 txSIsMember(t, db, bucket, key, val1, true) 63 txSIsMember(t, db, bucket, key, val2, true) 64 txSIsMember(t, db, bucket, key, val3, false) 65 }) 66 } 67 68 func TestTx_SRem2(t *testing.T) { 69 70 bucket := "bucket" 71 key := GetTestBytes(0) 72 val1 := GetTestBytes(0) 73 val2 := GetTestBytes(1) 74 75 runNutsDBTest(t, nil, func(t *testing.T, db *DB) { 76 txCreateBucket(t, db, DataStructureSet, bucket, nil) 77 txSAdd(t, db, bucket, key, val1, nil, nil) 78 txSAdd(t, db, bucket, key, val2, nil, nil) 79 80 txSRem(t, db, bucket, key, val1, nil) 81 txSRem(t, db, bucket, key, val1, ErrSetMemberNotExist) 82 83 txSRem(t, db, bucket, key, val2, nil) 84 85 txSAreMembers(t, db, bucket, key, false, val1, val2) 86 }) 87 } 88 89 func TestTx_SMembers(t *testing.T) { 90 bucket := "bucket" 91 fakeBucket := "fake_bucket" 92 key := GetTestBytes(0) 93 val1 := GetTestBytes(0) 94 val2 := GetTestBytes(1) 95 96 runNutsDBTest(t, nil, func(t *testing.T, db *DB) { 97 txCreateBucket(t, db, DataStructureSet, bucket, nil) 98 txSAdd(t, db, bucket, key, val1, nil, nil) 99 txSAdd(t, db, bucket, key, val2, nil, nil) 100 101 txSMembers(t, db, bucket, key, 2, nil) 102 103 txSIsMember(t, db, bucket, key, val1, true) 104 txSIsMember(t, db, bucket, key, val1, true) 105 106 txSMembers(t, db, fakeBucket, key, 0, ErrBucketNotExist) 107 }) 108 } 109 110 func TestTx_SCard(t *testing.T) { 111 bucket := "bucket" 112 fakeBucket := "fake_bucket" 113 key := GetTestBytes(0) 114 val1 := GetTestBytes(1) 115 val2 := GetTestBytes(2) 116 val3 := GetTestBytes(3) 117 118 runNutsDBTest(t, nil, func(t *testing.T, db *DB) { 119 txCreateBucket(t, db, DataStructureSet, bucket, nil) 120 txSAdd(t, db, bucket, key, val1, nil, nil) 121 txSAdd(t, db, bucket, key, val2, nil, nil) 122 txSAdd(t, db, bucket, key, val3, nil, nil) 123 124 txSCard(t, db, bucket, key, 3, nil) 125 126 txSCard(t, db, fakeBucket, key, 0, ErrBucketNotExist) 127 }) 128 } 129 130 func TestTx_SDiffByOneBucket(t *testing.T) { 131 bucket := "bucket" 132 fakeBucket := "fake_bucket" 133 key1 := GetTestBytes(0) 134 key2 := GetTestBytes(1) 135 key3 := GetTestBytes(2) 136 val1 := GetTestBytes(1) 137 val2 := GetTestBytes(2) 138 val3 := GetTestBytes(3) 139 val4 := GetTestBytes(4) 140 val5 := GetTestBytes(5) 141 142 runNutsDBTest(t, nil, func(t *testing.T, db *DB) { 143 txCreateBucket(t, db, DataStructureSet, bucket, nil) 144 txSAdd(t, db, bucket, key1, val1, nil, nil) 145 txSAdd(t, db, bucket, key1, val2, nil, nil) 146 txSAdd(t, db, bucket, key1, val3, nil, nil) 147 148 txSAdd(t, db, bucket, key2, val3, nil, nil) 149 txSAdd(t, db, bucket, key2, val4, nil, nil) 150 txSAdd(t, db, bucket, key2, val5, nil, nil) 151 152 diff := [][]byte{val1, val2} 153 txSDiffByOneBucket(t, db, bucket, key1, key2, diff, nil) 154 txSDiffByOneBucket(t, db, fakeBucket, key2, key1, nil, ErrBucketNotExist) 155 156 txSAdd(t, db, bucket, key3, val1, nil, nil) 157 txSAdd(t, db, bucket, key3, val2, nil, nil) 158 159 for _, val := range diff { 160 txSIsMember(t, db, bucket, key3, val, true) 161 } 162 }) 163 } 164 165 func TestTx_SDiffByTwoBuckets(t *testing.T) { 166 bucket1 := "bucket1" 167 bucket2 := "bucket2" 168 bucket3 := "bucket3" 169 fakeBucket := "fake_bucket_%d" 170 key1 := GetTestBytes(0) 171 key2 := GetTestBytes(1) 172 key3 := GetTestBytes(2) 173 val1 := GetTestBytes(1) 174 val2 := GetTestBytes(2) 175 val3 := GetTestBytes(3) 176 val4 := GetTestBytes(4) 177 val5 := GetTestBytes(5) 178 179 runNutsDBTest(t, nil, func(t *testing.T, db *DB) { 180 txCreateBucket(t, db, DataStructureSet, bucket1, nil) 181 txCreateBucket(t, db, DataStructureSet, bucket2, nil) 182 txCreateBucket(t, db, DataStructureSet, bucket3, nil) 183 184 txSAdd(t, db, bucket1, key1, val1, nil, nil) 185 txSAdd(t, db, bucket1, key1, val2, nil, nil) 186 txSAdd(t, db, bucket1, key1, val3, nil, nil) 187 188 txSAdd(t, db, bucket2, key2, val3, nil, nil) 189 txSAdd(t, db, bucket2, key2, val4, nil, nil) 190 txSAdd(t, db, bucket2, key2, val5, nil, nil) 191 192 diff := [][]byte{val1, val2} 193 txSDiffByTwoBucket(t, db, bucket1, key1, bucket2, key2, diff, nil) 194 195 txSDiffByTwoBucket(t, db, fmt.Sprintf(fakeBucket, 1), key1, bucket2, key2, nil, ErrBucketNotExist) 196 txSDiffByTwoBucket(t, db, bucket1, key1, fmt.Sprintf(fakeBucket, 2), key2, nil, ErrBucketNotExist) 197 198 txSAdd(t, db, bucket3, key3, val1, nil, nil) 199 txSAdd(t, db, bucket3, key3, val2, nil, nil) 200 201 for _, val := range diff { 202 txSIsMember(t, db, bucket3, key3, val, true) 203 } 204 }) 205 } 206 207 func TestTx_SPop(t *testing.T) { 208 bucket := "bucket" 209 fakeBucket := "fake_bucket" 210 key := GetTestBytes(0) 211 val1 := GetTestBytes(1) 212 val2 := GetTestBytes(2) 213 val3 := GetTestBytes(3) 214 215 runNutsDBTest(t, nil, func(t *testing.T, db *DB) { 216 txCreateBucket(t, db, DataStructureSet, bucket, nil) 217 txSAdd(t, db, bucket, key, val1, nil, nil) 218 txSAdd(t, db, bucket, key, val2, nil, nil) 219 txSAdd(t, db, bucket, key, val3, nil, nil) 220 221 txSCard(t, db, bucket, key, 3, nil) 222 txSPop(t, db, bucket, key, nil) 223 txSCard(t, db, bucket, key, 2, nil) 224 225 txSPop(t, db, fakeBucket, key, ErrBucketNotExist) 226 }) 227 228 } 229 230 func TestTx_SMoveByOneBucket(t *testing.T) { 231 bucket := "bucket" 232 fakeBucket := "fake_bucket" 233 key1 := GetTestBytes(0) 234 key2 := GetTestBytes(1) 235 val1 := GetTestBytes(1) 236 val2 := GetTestBytes(2) 237 val3 := GetTestBytes(3) 238 239 runNutsDBTest(t, nil, func(t *testing.T, db *DB) { 240 txCreateBucket(t, db, DataStructureSet, bucket, nil) 241 txSAdd(t, db, bucket, key1, val1, nil, nil) 242 txSAdd(t, db, bucket, key1, val2, nil, nil) 243 244 txSAdd(t, db, bucket, key2, val3, nil, nil) 245 246 txSMoveByOneBucket(t, db, bucket, key1, key2, val2, true, nil) 247 txSIsMember(t, db, bucket, key1, val2, false) 248 txSIsMember(t, db, bucket, key2, val2, true) 249 250 txSMoveByOneBucket(t, db, fakeBucket, key1, key2, val2, false, ErrBucketNotExist) 251 }) 252 } 253 254 func TestTx_SMoveByTwoBuckets(t *testing.T) { 255 bucket1 := "bucket1" 256 bucket2 := "bucket2" 257 fakeBucket := "fake_bucket_%d" 258 key1 := GetTestBytes(0) 259 key2 := GetTestBytes(1) 260 fakeKey1 := GetTestBytes(2) 261 fakeKey2 := GetTestBytes(3) 262 val1 := GetTestBytes(1) 263 val2 := GetTestBytes(2) 264 val3 := GetTestBytes(3) 265 266 runNutsDBTest(t, nil, func(t *testing.T, db *DB) { 267 txCreateBucket(t, db, DataStructureSet, bucket1, nil) 268 txCreateBucket(t, db, DataStructureSet, bucket2, nil) 269 txSAdd(t, db, bucket1, key1, val1, nil, nil) 270 txSAdd(t, db, bucket1, key1, val2, nil, nil) 271 272 txSAdd(t, db, bucket2, key2, val3, nil, nil) 273 274 txSMoveByTwoBuckets(t, db, bucket1, key1, bucket2, key2, val2, true, nil) 275 txSIsMember(t, db, bucket1, key1, val2, false) 276 txSIsMember(t, db, bucket2, key2, val2, true) 277 278 txSMoveByTwoBuckets(t, db, bucket1, fakeKey1, bucket2, key2, val2, false, ErrNotFoundKey) 279 txSMoveByTwoBuckets(t, db, bucket1, key1, bucket2, fakeKey2, val2, false, ErrNotFoundKey) 280 txSMoveByTwoBuckets(t, db, fmt.Sprintf(fakeBucket, 1), key1, bucket2, key2, val2, false, ErrBucketNotExist) 281 txSMoveByTwoBuckets(t, db, bucket1, key1, fmt.Sprintf(fakeBucket, 2), key2, val2, false, ErrBucketNotExist) 282 txSMoveByTwoBuckets(t, db, fmt.Sprintf(fakeBucket, 1), key1, fmt.Sprintf(fakeBucket, 2), key2, val2, false, ErrBucketNotExist) 283 }) 284 } 285 286 func TestTx_SUnionByOneBucket(t *testing.T) { 287 bucket := "bucket" 288 fakeBucket := "fake_bucket" 289 key1 := GetTestBytes(0) 290 key2 := GetTestBytes(1) 291 key3 := GetTestBytes(2) 292 293 val1 := GetTestBytes(1) 294 val2 := GetTestBytes(2) 295 val3 := GetTestBytes(3) 296 runNutsDBTest(t, nil, func(t *testing.T, db *DB) { 297 txCreateBucket(t, db, DataStructureSet, bucket, nil) 298 txSAdd(t, db, bucket, key1, val1, nil, nil) 299 txSAdd(t, db, bucket, key1, val2, nil, nil) 300 txSAdd(t, db, bucket, key2, val3, nil, nil) 301 txSAdd(t, db, bucket, key3, val1, nil, nil) 302 txSAdd(t, db, bucket, key3, val2, nil, nil) 303 txSAdd(t, db, bucket, key3, val3, nil, nil) 304 305 all := [][]byte{val1, val2, val3} 306 txSUnionByOneBucket(t, db, bucket, key1, key2, all, nil) 307 for _, item := range all { 308 txSIsMember(t, db, bucket, key3, item, true) 309 } 310 311 txSUnionByOneBucket(t, db, fakeBucket, key1, key2, nil, ErrBucketNotExist) 312 }) 313 } 314 315 func TestTx_SUnionByTwoBuckets(t *testing.T) { 316 bucket1 := "bucket1" 317 bucket2 := "bucket2" 318 fakeBucket := "fake_bucket_%d" 319 key1 := GetTestBytes(0) 320 key2 := GetTestBytes(1) 321 fakeKey1 := GetTestBytes(2) 322 fakeKey2 := GetTestBytes(3) 323 val1 := GetTestBytes(1) 324 val2 := GetTestBytes(2) 325 val3 := GetTestBytes(3) 326 327 runNutsDBTest(t, nil, func(t *testing.T, db *DB) { 328 txCreateBucket(t, db, DataStructureSet, bucket1, nil) 329 txCreateBucket(t, db, DataStructureSet, bucket2, nil) 330 txSAdd(t, db, bucket1, key1, val1, nil, nil) 331 txSAdd(t, db, bucket1, key1, val2, nil, nil) 332 txSAdd(t, db, bucket2, key2, val3, nil, nil) 333 334 all := [][]byte{val1, val2, val3} 335 txSUnionByTwoBuckets(t, db, bucket1, key1, bucket2, key2, all, nil) 336 337 txSUnionByTwoBuckets(t, db, fmt.Sprintf(fakeBucket, 1), key1, bucket2, key2, nil, ErrBucketNotExist) 338 txSUnionByTwoBuckets(t, db, bucket1, key1, fmt.Sprintf(fakeBucket, 2), key2, nil, ErrBucketNotExist) 339 txSUnionByTwoBuckets(t, db, bucket1, fakeKey1, bucket2, key2, nil, ErrNotFoundKey) 340 txSUnionByTwoBuckets(t, db, bucket1, key1, bucket2, fakeKey2, nil, ErrNotFoundKey) 341 }) 342 } 343 344 func TestTx_SHasKey(t *testing.T) { 345 bucket := "bucket" 346 fakeBucket := "fake_bucket" 347 key := GetTestBytes(0) 348 349 runNutsDBTest(t, nil, func(t *testing.T, db *DB) { 350 txCreateBucket(t, db, DataStructureSet, bucket, nil) 351 txSAdd(t, db, bucket, key, GetTestBytes(1), nil, nil) 352 353 txSHasKey(t, db, bucket, key, true) 354 txSHasKey(t, db, fakeBucket, key, false) 355 }) 356 } 357 358 func TestTx_SIsMember(t *testing.T) { 359 bucket := "bucket" 360 fakeBucket := "fake_bucket" 361 key := GetTestBytes(0) 362 fakeKey := GetTestBytes(1) 363 val := GetTestBytes(0) 364 fakeVal := GetTestBytes(1) 365 366 runNutsDBTest(t, nil, func(t *testing.T, db *DB) { 367 txCreateBucket(t, db, DataStructureSet, bucket, nil) 368 txSAdd(t, db, bucket, key, val, nil, nil) 369 370 txSIsMember(t, db, bucket, key, val, true) 371 txSIsMember(t, db, bucket, key, fakeVal, false) 372 txSIsMember(t, db, bucket, fakeKey, val, false) 373 txSIsMember(t, db, fakeBucket, fakeKey, val, false) 374 }) 375 } 376 377 func TestTx_SAreMembers(t *testing.T) { 378 bucket := "bucket" 379 fakeBucket := "fake_bucket" 380 key := GetTestBytes(0) 381 fakeKey := GetTestBytes(1) 382 val1 := GetTestBytes(0) 383 val2 := GetTestBytes(1) 384 fakeVal := GetTestBytes(2) 385 386 runNutsDBTest(t, nil, func(t *testing.T, db *DB) { 387 txCreateBucket(t, db, DataStructureSet, bucket, nil) 388 txSAdd(t, db, bucket, key, val1, nil, nil) 389 txSAdd(t, db, bucket, key, val2, nil, nil) 390 391 txSAreMembers(t, db, bucket, key, true) 392 txSAreMembers(t, db, bucket, key, true, val1) 393 txSAreMembers(t, db, bucket, key, true, val2) 394 txSAreMembers(t, db, bucket, key, true, val1, val2) 395 txSAreMembers(t, db, bucket, key, false, fakeVal) 396 txSAreMembers(t, db, bucket, fakeKey, false, val1) 397 txSAreMembers(t, db, fakeBucket, key, false, val1) 398 }) 399 } 400 401 func TestTx_SKeys(t *testing.T) { 402 bucket := "bucket" 403 key := "key_%d" 404 val := GetTestBytes(0) 405 406 runNutsDBTest(t, nil, func(t *testing.T, db *DB) { 407 txCreateBucket(t, db, DataStructureSet, bucket, nil) 408 num := 3 409 for i := 0; i < num; i++ { 410 txSAdd(t, db, bucket, []byte(fmt.Sprintf(key, i)), val, nil, nil) 411 } 412 413 var keys []string 414 txSKeys(t, db, bucket, "*", func(key string) bool { 415 keys = append(keys, key) 416 return true 417 }, num, nil) 418 419 keys = []string{} 420 txSKeys(t, db, bucket, "*", func(key string) bool { 421 keys = append(keys, key) 422 return len(keys) != num-1 423 }, num-1, nil) 424 425 keys = []string{} 426 txSKeys(t, db, bucket, "fake_key*", func(key string) bool { 427 keys = append(keys, key) 428 return true 429 }, 0, nil) 430 }) 431 } 432 433 func TestErrBucketAndKey(t *testing.T) { 434 435 got := ErrBucketAndKey("foo", []byte("bar")) 436 437 assert.True(t, 438 errors.Is(got, ErrBucketNotFound)) 439 } 440 441 func TestErrNotFoundKeyInBucket(t *testing.T) { 442 443 got := ErrNotFoundKeyInBucket("foo", []byte("bar")) 444 445 assert.True(t, 446 errors.Is(got, ErrNotFoundKey)) 447 }