github.com/nutsdb/nutsdb@v1.0.4/errors_test.go (about) 1 package nutsdb 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/stretchr/testify/require" 8 9 "github.com/pkg/errors" 10 "github.com/stretchr/testify/assert" 11 ) 12 13 func TestIsKeyNotFound(t *testing.T) { 14 ts := []struct { 15 err error 16 17 want bool 18 }{ 19 { 20 ErrKeyNotFound, 21 true, 22 }, 23 { 24 errors.Wrap(ErrKeyNotFound, "foobar"), 25 true, 26 }, 27 { 28 errors.New("foo bar"), 29 false, 30 }, 31 } 32 33 for _, tc := range ts { 34 got := IsKeyNotFound(tc.err) 35 36 assert.Equal(t, tc.want, got) 37 } 38 } 39 40 func TestIsKeyEmpty(t *testing.T) { 41 type args struct { 42 err error 43 } 44 tests := []struct { 45 name string 46 args args 47 want bool 48 }{ 49 {"case1", args{fmt.Errorf("foo error")}, false}, 50 {"case2", args{fmt.Errorf("foo error,%w", errors.New("sourceErr"))}, false}, 51 {"case3", args{fmt.Errorf("foo error,%w", ErrKeyEmpty)}, true}, 52 {"case4_errors.Wrap", args{errors.Wrap(ErrKeyEmpty, "foo Err")}, true}, 53 {"case5_errors.Wrapf", args{errors.Wrapf(ErrKeyEmpty, "foo Err %s", ErrKeyEmpty.Error())}, true}, 54 {"case6_errors.rawError", args{ErrKeyEmpty}, true}, 55 {"case6_errors.keynotfoundErr", args{ErrKeyNotFound}, false}, 56 // {"case5", args{errors.Wrap())}, true}, 57 } 58 for _, tt := range tests { 59 t.Run(tt.name, func(t *testing.T) { 60 if got := IsKeyEmpty(tt.args.err); got != tt.want { 61 t.Errorf("IsKeyEmpty() = %v, want %v", got, tt.want) 62 } 63 }) 64 } 65 } 66 67 func TestIsBucketNotFound(t *testing.T) { 68 ts := []struct { 69 err error 70 want bool 71 }{ 72 { 73 ErrBucketNotFound, 74 true, 75 }, 76 { 77 errors.Wrap(ErrBucketNotFound, "foobar"), 78 true, 79 }, 80 { 81 errors.New("foobar"), 82 false, 83 }, 84 } 85 86 for _, tc := range ts { 87 got := IsBucketNotFound(tc.err) 88 89 assert.Equal(t, tc.want, got) 90 } 91 } 92 93 func TestIsBucketEmpty(t *testing.T) { 94 ts := []struct { 95 err error 96 want bool 97 }{ 98 { 99 ErrBucketEmpty, 100 true, 101 }, 102 { 103 errors.Wrap(ErrBucketEmpty, "foobar"), 104 true, 105 }, 106 { 107 errors.New("foobar"), 108 false, 109 }, 110 } 111 112 for _, tc := range ts { 113 got := IsBucketEmpty(tc.err) 114 115 assert.Equal(t, tc.want, got) 116 } 117 } 118 119 func TestIsDBClosed(t *testing.T) { 120 InitOpt("", true) 121 bucket := "test_closed" 122 key := []byte("foo") 123 val := []byte("bar") 124 db, err = Open(opt) 125 126 t.Run("db can be used before closed", func(t *testing.T) { 127 txCreateBucket(t, db, DataStructureBTree, bucket, nil) 128 129 err = db.Update( 130 func(tx *Tx) error { 131 return tx.Put(bucket, key, val, Persistent) 132 }) 133 require.NoError(t, err) 134 }) 135 assert.NoError(t, db.Close()) 136 137 t.Run("db can't be used after closed", func(t *testing.T) { 138 err = db.Update( 139 func(tx *Tx) error { 140 return tx.Put(bucket, key, val, Persistent) 141 }) 142 got := IsDBClosed(err) 143 assert.Equal(t, true, got) 144 }) 145 } 146 147 func TestIsPrefixScan(t *testing.T) { 148 bucket := "test_prefix_scan" 149 t.Run("if prefix scanning not found the result return true", func(t *testing.T) { 150 withDefaultDB(t, func(t *testing.T, db *DB) { 151 { 152 txCreateBucket(t, db, DataStructureBTree, bucket, nil) 153 tx, err := db.Begin(true) 154 require.NoError(t, err) 155 for i := 0; i <= 10; i++ { 156 key := []byte("key_" + fmt.Sprintf("%07d", i)) 157 val := []byte("val" + fmt.Sprintf("%07d", i)) 158 err = tx.Put(bucket, key, val, Persistent) 159 assert.NoError(t, err) 160 } 161 assert.NoError(t, tx.Commit()) 162 } 163 { 164 tx, err = db.Begin(false) 165 require.NoError(t, err) 166 prefix := []byte("key_") 167 es, err := tx.PrefixScan(bucket, prefix, 0, 10) 168 assert.NoError(t, tx.Commit()) 169 assert.NotEmpty(t, es) 170 got := IsPrefixScan(err) 171 assert.Equal(t, false, got) 172 } 173 { 174 tx, err = db.Begin(false) 175 require.NoError(t, err) 176 prefix := []byte("foo_") 177 es, err := tx.PrefixScan(bucket, prefix, 0, 10) 178 assert.NoError(t, tx.Commit()) 179 assert.Empty(t, es) 180 got := IsPrefixScan(err) 181 assert.Equal(t, true, got) 182 } 183 }) 184 }) 185 } 186 187 func TestIsPrefixSearchScan(t *testing.T) { 188 regs := "(.+)" 189 bucket := "test_prefix_search_scan" 190 t.Run("if prefix and search scanning not found the result return true", func(t *testing.T) { 191 withDefaultDB(t, func(t *testing.T, db *DB) { 192 { 193 txCreateBucket(t, db, DataStructureBTree, bucket, nil) 194 195 tx, err := db.Begin(true) 196 require.NoError(t, err) 197 for i := 0; i <= 10; i++ { 198 key := []byte("key_" + fmt.Sprintf("%07d", i)) 199 val := []byte("val" + fmt.Sprintf("%07d", i)) 200 err = tx.Put(bucket, key, val, Persistent) 201 assert.NoError(t, err) 202 } 203 assert.NoError(t, tx.Commit()) 204 } 205 { 206 tx, err = db.Begin(false) 207 require.NoError(t, err) 208 prefix := []byte("key_") 209 es, err := tx.PrefixSearchScan(bucket, prefix, regs, 0, 10) 210 assert.NoError(t, tx.Commit()) 211 assert.NotEmpty(t, es) 212 got := IsPrefixSearchScan(err) 213 assert.Equal(t, false, got) 214 } 215 { 216 tx, err = db.Begin(false) 217 require.NoError(t, err) 218 prefix := []byte("foo_") 219 es, err := tx.PrefixSearchScan(bucket, prefix, regs, 0, 10) 220 assert.NoError(t, tx.Commit()) 221 assert.Empty(t, es) 222 got := IsPrefixSearchScan(err) 223 assert.Equal(t, true, got) 224 } 225 }) 226 }) 227 }