github.com/eris-ltd/erisdb@v0.25.0/storage/rwtree_test.go (about)

     1  package storage
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/require"
     8  
     9  	"github.com/stretchr/testify/assert"
    10  	dbm "github.com/tendermint/tendermint/libs/db"
    11  )
    12  
    13  func TestSave(t *testing.T) {
    14  	db := dbm.NewMemDB()
    15  	rwt := NewRWTree(db, 100)
    16  	foo := bz("foo")
    17  	gaa := bz("gaa")
    18  	dam := bz("dam")
    19  	rwt.Set(foo, gaa)
    20  	rwt.Save()
    21  	assert.Equal(t, gaa, rwt.Get(foo))
    22  	rwt.Set(foo, dam)
    23  	_, _, err := rwt.Save()
    24  	require.NoError(t, err)
    25  	assert.Equal(t, dam, rwt.Get(foo))
    26  }
    27  
    28  func TestEmptyTree(t *testing.T) {
    29  	db := dbm.NewMemDB()
    30  	rwt := NewRWTree(db, 100)
    31  	fmt.Printf("%X\n", rwt.Hash())
    32  }
    33  
    34  func TestRollback(t *testing.T) {
    35  	db := dbm.NewMemDB()
    36  	rwt := NewRWTree(db, 100)
    37  	rwt.Set(bz("Raffle"), bz("Topper"))
    38  	_, _, err := rwt.Save()
    39  
    40  	foo := bz("foo")
    41  	gaa := bz("gaa")
    42  	dam := bz("dam")
    43  	rwt.Set(foo, gaa)
    44  	hash1, version1, err := rwt.Save()
    45  	require.NoError(t, err)
    46  
    47  	// Perform some writes on top of version1
    48  	rwt.Set(foo, gaa)
    49  	rwt.Set(gaa, dam)
    50  	hash2, version2, err := rwt.Save()
    51  	rwt.Iterate(nil, nil, true, func(key, value []byte) error {
    52  		fmt.Println(string(key), " => ", string(value))
    53  		return nil
    54  	})
    55  	require.NoError(t, err)
    56  
    57  	// Make a new tree
    58  	rwt = NewRWTree(db, 100)
    59  	err = rwt.Load(version1, true)
    60  	require.NoError(t, err)
    61  	// If you load version1 the working hash is that which you saved after version0, i.e. hash0
    62  	require.Equal(t, hash1, rwt.Hash())
    63  
    64  	// Run the same writes again
    65  	rwt.Set(foo, gaa)
    66  	rwt.Set(gaa, dam)
    67  	hash3, version3, err := rwt.Save()
    68  	require.NoError(t, err)
    69  	rwt.Iterate(nil, nil, true, func(key, value []byte) error {
    70  		fmt.Println(string(key), " => ", string(value))
    71  		return nil
    72  	})
    73  
    74  	// Expect the same hashes
    75  	assert.Equal(t, hash2, hash3)
    76  	assert.Equal(t, version2, version3)
    77  }
    78  
    79  func TestVersionDivergence(t *testing.T) {
    80  	// This test serves as a reminder that IAVL nodes contain the version and a new node is created for every write
    81  	rwt1 := NewRWTree(dbm.NewMemDB(), 100)
    82  	rwt1.Set(bz("Raffle"), bz("Topper"))
    83  	hash11, _, err := rwt1.Save()
    84  	require.NoError(t, err)
    85  
    86  	rwt2 := NewRWTree(dbm.NewMemDB(), 100)
    87  	rwt2.Set(bz("Raffle"), bz("Topper"))
    88  	hash21, _, err := rwt2.Save()
    89  	require.NoError(t, err)
    90  
    91  	// The following 'ought' to be idempotent but isn't since it replaces the previous node with an identical one, but
    92  	// with an incremented version number
    93  	rwt2.Set(bz("Raffle"), bz("Topper"))
    94  	hash22, _, err := rwt2.Save()
    95  	require.NoError(t, err)
    96  
    97  	assert.Equal(t, hash11, hash21)
    98  	assert.NotEqual(t, hash11, hash22)
    99  }
   100  
   101  func TestMutableTree_Iterate(t *testing.T) {
   102  	mut := NewMutableTree(dbm.NewMemDB(), 100)
   103  	mut.Set(bz("aa"), bz("1"))
   104  	mut.Set(bz("aab"), bz("2"))
   105  	mut.Set(bz("aac"), bz("3"))
   106  	mut.Set(bz("aad"), bz("4"))
   107  	mut.Set(bz("ab"), bz("5"))
   108  	_, _, err := mut.SaveVersion()
   109  	require.NoError(t, err)
   110  	mut.IterateRange(bz("aab"), bz("aad"), true, func(key []byte, value []byte) bool {
   111  		fmt.Printf("%q -> %q\n", key, value)
   112  		return false
   113  	})
   114  	fmt.Println("foo")
   115  	mut.IterateRange(bz("aab"), bz("aad"), false, func(key []byte, value []byte) bool {
   116  		fmt.Printf("%q -> %q\n", key, value)
   117  		return false
   118  	})
   119  	fmt.Println("foo")
   120  	mut.IterateRange(bz("aad"), bz("aab"), true, func(key []byte, value []byte) bool {
   121  		fmt.Printf("%q -> %q\n", key, value)
   122  		return false
   123  	})
   124  }