github.com/evdatsion/aphelion-dpos-bft@v0.32.1/libs/db/db_test.go (about)

     1  package db
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/assert"
     9  )
    10  
    11  func TestDBIteratorSingleKey(t *testing.T) {
    12  	for backend := range backends {
    13  		t.Run(fmt.Sprintf("Backend %s", backend), func(t *testing.T) {
    14  			db, dir := newTempDB(t, backend)
    15  			defer os.RemoveAll(dir)
    16  
    17  			db.SetSync(bz("1"), bz("value_1"))
    18  			itr := db.Iterator(nil, nil)
    19  
    20  			checkValid(t, itr, true)
    21  			checkNext(t, itr, false)
    22  			checkValid(t, itr, false)
    23  			checkNextPanics(t, itr)
    24  
    25  			// Once invalid...
    26  			checkInvalid(t, itr)
    27  		})
    28  	}
    29  }
    30  
    31  func TestDBIteratorTwoKeys(t *testing.T) {
    32  	for backend := range backends {
    33  		t.Run(fmt.Sprintf("Backend %s", backend), func(t *testing.T) {
    34  			db, dir := newTempDB(t, backend)
    35  			defer os.RemoveAll(dir)
    36  
    37  			db.SetSync(bz("1"), bz("value_1"))
    38  			db.SetSync(bz("2"), bz("value_1"))
    39  
    40  			{ // Fail by calling Next too much
    41  				itr := db.Iterator(nil, nil)
    42  				checkValid(t, itr, true)
    43  
    44  				checkNext(t, itr, true)
    45  				checkValid(t, itr, true)
    46  
    47  				checkNext(t, itr, false)
    48  				checkValid(t, itr, false)
    49  
    50  				checkNextPanics(t, itr)
    51  
    52  				// Once invalid...
    53  				checkInvalid(t, itr)
    54  			}
    55  		})
    56  	}
    57  }
    58  
    59  func TestDBIteratorMany(t *testing.T) {
    60  	for backend := range backends {
    61  		t.Run(fmt.Sprintf("Backend %s", backend), func(t *testing.T) {
    62  			db, dir := newTempDB(t, backend)
    63  			defer os.RemoveAll(dir)
    64  
    65  			keys := make([][]byte, 100)
    66  			for i := 0; i < 100; i++ {
    67  				keys[i] = []byte{byte(i)}
    68  			}
    69  
    70  			value := []byte{5}
    71  			for _, k := range keys {
    72  				db.Set(k, value)
    73  			}
    74  
    75  			itr := db.Iterator(nil, nil)
    76  			defer itr.Close()
    77  			for ; itr.Valid(); itr.Next() {
    78  				assert.Equal(t, db.Get(itr.Key()), itr.Value())
    79  			}
    80  		})
    81  	}
    82  }
    83  
    84  func TestDBIteratorEmpty(t *testing.T) {
    85  	for backend := range backends {
    86  		t.Run(fmt.Sprintf("Backend %s", backend), func(t *testing.T) {
    87  			db, dir := newTempDB(t, backend)
    88  			defer os.RemoveAll(dir)
    89  
    90  			itr := db.Iterator(nil, nil)
    91  
    92  			checkInvalid(t, itr)
    93  		})
    94  	}
    95  }
    96  
    97  func TestDBIteratorEmptyBeginAfter(t *testing.T) {
    98  	for backend := range backends {
    99  		t.Run(fmt.Sprintf("Backend %s", backend), func(t *testing.T) {
   100  			db, dir := newTempDB(t, backend)
   101  			defer os.RemoveAll(dir)
   102  
   103  			itr := db.Iterator(bz("1"), nil)
   104  
   105  			checkInvalid(t, itr)
   106  		})
   107  	}
   108  }
   109  
   110  func TestDBIteratorNonemptyBeginAfter(t *testing.T) {
   111  	for backend := range backends {
   112  		t.Run(fmt.Sprintf("Backend %s", backend), func(t *testing.T) {
   113  			db, dir := newTempDB(t, backend)
   114  			defer os.RemoveAll(dir)
   115  
   116  			db.SetSync(bz("1"), bz("value_1"))
   117  			itr := db.Iterator(bz("2"), nil)
   118  
   119  			checkInvalid(t, itr)
   120  		})
   121  	}
   122  }
   123  
   124  func TestDBBatchWrite(t *testing.T) {
   125  	testCases := []struct {
   126  		modify func(batch Batch)
   127  		calls  map[string]int
   128  	}{
   129  		0: {
   130  			func(batch Batch) {
   131  				batch.Set(bz("1"), bz("1"))
   132  				batch.Set(bz("2"), bz("2"))
   133  				batch.Delete(bz("3"))
   134  				batch.Set(bz("4"), bz("4"))
   135  				batch.Write()
   136  			},
   137  			map[string]int{
   138  				"Set": 0, "SetSync": 0, "SetNoLock": 3, "SetNoLockSync": 0,
   139  				"Delete": 0, "DeleteSync": 0, "DeleteNoLock": 1, "DeleteNoLockSync": 0,
   140  			},
   141  		},
   142  		1: {
   143  			func(batch Batch) {
   144  				batch.Set(bz("1"), bz("1"))
   145  				batch.Set(bz("2"), bz("2"))
   146  				batch.Set(bz("4"), bz("4"))
   147  				batch.Delete(bz("3"))
   148  				batch.Write()
   149  			},
   150  			map[string]int{
   151  				"Set": 0, "SetSync": 0, "SetNoLock": 3, "SetNoLockSync": 0,
   152  				"Delete": 0, "DeleteSync": 0, "DeleteNoLock": 1, "DeleteNoLockSync": 0,
   153  			},
   154  		},
   155  		2: {
   156  			func(batch Batch) {
   157  				batch.Set(bz("1"), bz("1"))
   158  				batch.Set(bz("2"), bz("2"))
   159  				batch.Delete(bz("3"))
   160  				batch.Set(bz("4"), bz("4"))
   161  				batch.WriteSync()
   162  			},
   163  			map[string]int{
   164  				"Set": 0, "SetSync": 0, "SetNoLock": 2, "SetNoLockSync": 1,
   165  				"Delete": 0, "DeleteSync": 0, "DeleteNoLock": 1, "DeleteNoLockSync": 0,
   166  			},
   167  		},
   168  		3: {
   169  			func(batch Batch) {
   170  				batch.Set(bz("1"), bz("1"))
   171  				batch.Set(bz("2"), bz("2"))
   172  				batch.Set(bz("4"), bz("4"))
   173  				batch.Delete(bz("3"))
   174  				batch.WriteSync()
   175  			},
   176  			map[string]int{
   177  				"Set": 0, "SetSync": 0, "SetNoLock": 3, "SetNoLockSync": 0,
   178  				"Delete": 0, "DeleteSync": 0, "DeleteNoLock": 0, "DeleteNoLockSync": 1,
   179  			},
   180  		},
   181  	}
   182  
   183  	for i, tc := range testCases {
   184  		mdb := newMockDB()
   185  		batch := mdb.NewBatch()
   186  
   187  		tc.modify(batch)
   188  
   189  		for call, exp := range tc.calls {
   190  			got := mdb.calls[call]
   191  			assert.Equal(t, exp, got, "#%v - key: %s", i, call)
   192  		}
   193  	}
   194  }