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

     1  package db
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"testing"
     7  )
     8  
     9  // Empty iterator for empty db.
    10  func TestPrefixIteratorNoMatchNil(t *testing.T) {
    11  	for backend := range backends {
    12  		t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) {
    13  			db, dir := newTempDB(t, backend)
    14  			defer os.RemoveAll(dir)
    15  			itr := IteratePrefix(db, []byte("2"))
    16  
    17  			checkInvalid(t, itr)
    18  		})
    19  	}
    20  }
    21  
    22  // Empty iterator for db populated after iterator created.
    23  func TestPrefixIteratorNoMatch1(t *testing.T) {
    24  	for backend := range backends {
    25  		if backend == BoltDBBackend {
    26  			t.Log("bolt does not support concurrent writes while iterating")
    27  			continue
    28  		}
    29  
    30  		t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) {
    31  			db, dir := newTempDB(t, backend)
    32  			defer os.RemoveAll(dir)
    33  			itr := IteratePrefix(db, []byte("2"))
    34  			db.SetSync(bz("1"), bz("value_1"))
    35  
    36  			checkInvalid(t, itr)
    37  		})
    38  	}
    39  }
    40  
    41  // Empty iterator for prefix starting after db entry.
    42  func TestPrefixIteratorNoMatch2(t *testing.T) {
    43  	for backend := range backends {
    44  		t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) {
    45  			db, dir := newTempDB(t, backend)
    46  			defer os.RemoveAll(dir)
    47  			db.SetSync(bz("3"), bz("value_3"))
    48  			itr := IteratePrefix(db, []byte("4"))
    49  
    50  			checkInvalid(t, itr)
    51  		})
    52  	}
    53  }
    54  
    55  // Iterator with single val for db with single val, starting from that val.
    56  func TestPrefixIteratorMatch1(t *testing.T) {
    57  	for backend := range backends {
    58  		t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) {
    59  			db, dir := newTempDB(t, backend)
    60  			defer os.RemoveAll(dir)
    61  			db.SetSync(bz("2"), bz("value_2"))
    62  			itr := IteratePrefix(db, bz("2"))
    63  
    64  			checkValid(t, itr, true)
    65  			checkItem(t, itr, bz("2"), bz("value_2"))
    66  			checkNext(t, itr, false)
    67  
    68  			// Once invalid...
    69  			checkInvalid(t, itr)
    70  		})
    71  	}
    72  }
    73  
    74  // Iterator with prefix iterates over everything with same prefix.
    75  func TestPrefixIteratorMatches1N(t *testing.T) {
    76  	for backend := range backends {
    77  		t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) {
    78  			db, dir := newTempDB(t, backend)
    79  			defer os.RemoveAll(dir)
    80  
    81  			// prefixed
    82  			db.SetSync(bz("a/1"), bz("value_1"))
    83  			db.SetSync(bz("a/3"), bz("value_3"))
    84  
    85  			// not
    86  			db.SetSync(bz("b/3"), bz("value_3"))
    87  			db.SetSync(bz("a-3"), bz("value_3"))
    88  			db.SetSync(bz("a.3"), bz("value_3"))
    89  			db.SetSync(bz("abcdefg"), bz("value_3"))
    90  			itr := IteratePrefix(db, bz("a/"))
    91  
    92  			checkValid(t, itr, true)
    93  			checkItem(t, itr, bz("a/1"), bz("value_1"))
    94  			checkNext(t, itr, true)
    95  			checkItem(t, itr, bz("a/3"), bz("value_3"))
    96  
    97  			// Bad!
    98  			checkNext(t, itr, false)
    99  
   100  			//Once invalid...
   101  			checkInvalid(t, itr)
   102  		})
   103  	}
   104  }