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  }