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  }