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 }