github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/iavl/unsaved_fast_interator_test.go (about)

     1  package iavl
     2  
     3  import (
     4  	"github.com/stretchr/testify/require"
     5  	"testing"
     6  )
     7  
     8  type ExceptedKey struct {
     9  	key      string
    10  	fastNode interface{}
    11  }
    12  
    13  func TestUnsavedFastIterator(t *testing.T) {
    14  	start := []byte("test01")
    15  	end := []byte("test100")
    16  
    17  	cases := []struct {
    18  		name                     string
    19  		unsavedfastNodeAdditions map[string]*FastNode
    20  		unsavedfastNodeRemovals  map[string]interface{}
    21  		expected                 []ExceptedKey
    22  		init                     func() *nodeDB
    23  	}{
    24  		{
    25  			"interator with additions and ndb success",
    26  			map[string]*FastNode{
    27  				"test01": NewFastNode([]byte("test01"), []byte("test01valuenew"), 11),
    28  				"test02": NewFastNode([]byte("test02"), []byte("test02valuenew"), 11),
    29  			},
    30  			make(map[string]interface{}),
    31  			[]ExceptedKey{
    32  				ExceptedKey{"test01", NewFastNode([]byte("test01"), []byte("test01valuenew"), 11)},
    33  				ExceptedKey{"test02", NewFastNode([]byte("test02"), []byte("test02valuenew"), 11)},
    34  				ExceptedKey{"test03", NewFastNode([]byte("test03"), []byte("test03valueold"), 11)},
    35  				ExceptedKey{"test04", NewFastNode([]byte("test04"), []byte("test04valueold"), 11)},
    36  			},
    37  			func() *nodeDB {
    38  				tree, err := getRandDBNameTestTree(0)
    39  				require.NoError(t, err)
    40  				tree.set([]byte("test01"), []byte("test01valueold"))
    41  				tree.set([]byte("test02"), []byte("test02valueold"))
    42  				tree.set([]byte("test03"), []byte("test03valueold"))
    43  				tree.set([]byte("test04"), []byte("test04valueold"))
    44  				tree.SaveVersion(false)
    45  				return tree.ndb
    46  			},
    47  		},
    48  		{
    49  			"interator with removals and ndb success",
    50  			map[string]*FastNode{},
    51  			map[string]interface{}{
    52  				"test03": NewFastNode([]byte("test03"), []byte("test03value"), 11),
    53  				"test04": NewFastNode([]byte("test04"), []byte("test04value"), 11),
    54  			},
    55  			[]ExceptedKey{
    56  				ExceptedKey{"test01", NewFastNode([]byte("test01"), []byte("test01valueold"), 11)},
    57  				ExceptedKey{"test02", NewFastNode([]byte("test02"), []byte("test02valueold"), 11)},
    58  			},
    59  			func() *nodeDB {
    60  				tree, err := getRandDBNameTestTree(0)
    61  				require.NoError(t, err)
    62  				tree.set([]byte("test01"), []byte("test01valueold"))
    63  				tree.set([]byte("test02"), []byte("test02valueold"))
    64  				tree.set([]byte("test03"), []byte("test03valueold"))
    65  				tree.set([]byte("test04"), []byte("test04valueold"))
    66  				tree.SaveVersion(false)
    67  				return tree.ndb
    68  			},
    69  		},
    70  		{
    71  			"interator fastnode and ndb interator with new fastnode additions same with ndb without removals success",
    72  			map[string]*FastNode{
    73  				"test01": NewFastNode([]byte("test01"), []byte("test01valuenew"), 11),
    74  				"test02": NewFastNode([]byte("test02"), []byte("test02valuenew"), 11),
    75  			},
    76  			make(map[string]interface{}),
    77  			[]ExceptedKey{
    78  				ExceptedKey{"test01", NewFastNode([]byte("test01"), []byte("test01valuenew"), 11)},
    79  				ExceptedKey{"test02", NewFastNode([]byte("test02"), []byte("test02valuenew"), 11)},
    80  				ExceptedKey{"test03", NewFastNode([]byte("test03"), []byte("test03valueold"), 11)},
    81  				ExceptedKey{"test04", NewFastNode([]byte("test04"), []byte("test04valueold"), 11)},
    82  			},
    83  			func() *nodeDB {
    84  				tree, err := getRandDBNameTestTree(0)
    85  				require.NoError(t, err)
    86  				tree.set([]byte("test01"), []byte("test01valueold"))
    87  				tree.set([]byte("test02"), []byte("test02valueold"))
    88  				tree.set([]byte("test03"), []byte("test03valueold"))
    89  				tree.set([]byte("test04"), []byte("test04valueold"))
    90  				tree.SaveVersion(false)
    91  				return tree.ndb
    92  			},
    93  		},
    94  		{
    95  			"interator fastnode and ndb with deletions success",
    96  			map[string]*FastNode{
    97  				"test01": NewFastNode([]byte("test01"), []byte("test01valuenew"), 11),
    98  				"test02": NewFastNode([]byte("test02"), []byte("test02valuenew"), 11),
    99  			},
   100  			map[string]interface{}{
   101  				"test03": NewFastNode([]byte("test03"), []byte("test03value"), 11),
   102  				"test04": NewFastNode([]byte("test04"), []byte("test04value"), 11),
   103  			},
   104  			[]ExceptedKey{
   105  				ExceptedKey{"test01", NewFastNode([]byte("test01"), []byte("test01valuenew"), 11)},
   106  				ExceptedKey{"test02", NewFastNode([]byte("test02"), []byte("test02valuenew"), 11)},
   107  				ExceptedKey{"test05", NewFastNode([]byte("test05"), []byte("test05valueold"), 11)},
   108  				ExceptedKey{"test06", NewFastNode([]byte("test06"), []byte("test06valueold"), 11)},
   109  			},
   110  			func() *nodeDB {
   111  				tree, err := getRandDBNameTestTree(0)
   112  				require.NoError(t, err)
   113  				tree.set([]byte("test01"), []byte("test01valueold"))
   114  				tree.set([]byte("test02"), []byte("test02valueold"))
   115  				tree.set([]byte("test03"), []byte("test03valueold"))
   116  				tree.set([]byte("test04"), []byte("test04valueold"))
   117  				tree.set([]byte("test05"), []byte("test05valueold"))
   118  				tree.set([]byte("test06"), []byte("test06valueold"))
   119  				tree.SaveVersion(false)
   120  				return tree.ndb
   121  			},
   122  		},
   123  		{
   124  			"interator fastnode without ndb success",
   125  			map[string]*FastNode{
   126  				"test01": NewFastNode([]byte("test01"), []byte("test01valuenew"), 11),
   127  				"test02": NewFastNode([]byte("test02"), []byte("test02valuenew"), 11),
   128  			},
   129  			map[string]interface{}{},
   130  			[]ExceptedKey{
   131  				ExceptedKey{"test01", NewFastNode([]byte("test01"), []byte("test01valuenew"), 11)},
   132  				ExceptedKey{"test02", NewFastNode([]byte("test02"), []byte("test02valuenew"), 11)},
   133  			},
   134  			func() *nodeDB {
   135  				tree, err := getRandDBNameTestTree(0)
   136  				require.NoError(t, err)
   137  				tree.SaveVersion(false)
   138  				return tree.ndb
   139  			},
   140  		},
   141  		{
   142  			"interator only with ndb success",
   143  			map[string]*FastNode{},
   144  			map[string]interface{}{},
   145  			[]ExceptedKey{
   146  				ExceptedKey{"test01", NewFastNode([]byte("test01"), []byte("test01valueold"), 11)},
   147  				ExceptedKey{"test02", NewFastNode([]byte("test02"), []byte("test02valueold"), 11)},
   148  			},
   149  			func() *nodeDB {
   150  				tree, err := getRandDBNameTestTree(0)
   151  				require.NoError(t, err)
   152  				tree.set([]byte("test01"), []byte("test01valueold"))
   153  				tree.set([]byte("test02"), []byte("test02valueold"))
   154  				tree.SaveVersion(false)
   155  				tree.SaveVersion(false)
   156  				return tree.ndb
   157  			},
   158  		},
   159  	}
   160  	for _, c := range cases {
   161  		ndb := c.init()
   162  		iter := newUnsavedFastIterator(start, end, true, ndb, c.unsavedfastNodeAdditions, c.unsavedfastNodeRemovals)
   163  		for i := 0; iter.Valid(); iter.Next() {
   164  			expectedKey := c.expected[i].key
   165  			expectedValue := c.expected[i].fastNode.(*FastNode).value
   166  			require.EqualValues(t, iter.Key(), expectedKey)
   167  			require.EqualValues(t, iter.Value(), expectedValue)
   168  			i++
   169  		}
   170  	}
   171  }