github.com/tendermint/tmlibs@v0.9.0/db/db_test.go (about)

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