|
1 | 1 | package iavl
|
2 | 2 |
|
3 | 3 | import (
|
| 4 | + "encoding/binary" |
4 | 5 | "testing"
|
5 | 6 |
|
6 | 7 | "github.com/stretchr/testify/assert"
|
7 | 8 | "github.com/stretchr/testify/require"
|
| 9 | + "golang.org/x/crypto/sha3" |
8 | 10 |
|
9 | 11 | dbm "github.com/cosmos/iavl/db"
|
10 | 12 | )
|
@@ -69,6 +71,80 @@ func ExampleImporter() {
|
69 | 71 | }
|
70 | 72 | }
|
71 | 73 |
|
| 74 | +func TestImporterDataIntegrity(t *testing.T) { |
| 75 | + // run multiple times to ensure the data integrity |
| 76 | + tree := NewMutableTree(dbm.NewMemDB(), 0, false, NewNopLogger()) |
| 77 | + |
| 78 | + // write more than maxBatchSize |
| 79 | + for i := 0; i < maxBatchSize+1; i++ { |
| 80 | + bz := sha3.Sum256(binary.BigEndian.AppendUint64([]byte{}, uint64(i))) |
| 81 | + _, err := tree.Set(bz[:], []byte{byte(i)}) |
| 82 | + if err != nil { |
| 83 | + require.NoError(t, err) |
| 84 | + } |
| 85 | + } |
| 86 | + |
| 87 | + _, version, err := tree.SaveVersion() |
| 88 | + require.NoError(t, err) |
| 89 | + |
| 90 | + itree, err := tree.GetImmutable(version) |
| 91 | + require.NoError(t, err) |
| 92 | + |
| 93 | + exporter, err := itree.Export() |
| 94 | + require.NoError(t, err) |
| 95 | + |
| 96 | + defer exporter.Close() |
| 97 | + exported := []*ExportNode{} |
| 98 | + for { |
| 99 | + var node *ExportNode |
| 100 | + node, err = exporter.Next() |
| 101 | + if err == ErrorExportDone { |
| 102 | + break |
| 103 | + } |
| 104 | + |
| 105 | + require.NoError(t, err) |
| 106 | + exported = append(exported, node) |
| 107 | + } |
| 108 | + |
| 109 | + tempDir := t.TempDir() |
| 110 | + db, err := dbm.NewDB("importer-test", "goleveldb", tempDir) |
| 111 | + require.NoError(t, err) |
| 112 | + newTree := NewMutableTree(db, 0, false, NewNopLogger()) |
| 113 | + importer, err := newTree.Import(version) |
| 114 | + require.NoError(t, err) |
| 115 | + |
| 116 | + for _, node := range exported { |
| 117 | + err = importer.Add(node) |
| 118 | + require.NoError(t, err) |
| 119 | + } |
| 120 | + err = importer.Commit() |
| 121 | + require.NoError(t, err) |
| 122 | + importer.Close() |
| 123 | + |
| 124 | + _, version, err = newTree.SaveVersion() |
| 125 | + require.NoError(t, err) |
| 126 | + err = newTree.Close() |
| 127 | + require.NoError(t, err) |
| 128 | + err = db.Close() |
| 129 | + require.NoError(t, err) |
| 130 | + |
| 131 | + // check if the tree is the same |
| 132 | + db, err = dbm.NewDB("importer-test", "goleveldb", tempDir) |
| 133 | + require.NoError(t, err) |
| 134 | + newTree = NewMutableTree(db, 0, false, NewNopLogger()) |
| 135 | + _, err = newTree.LoadVersion(version) |
| 136 | + require.NoError(t, err) |
| 137 | + itree, err = newTree.GetImmutable(version) |
| 138 | + require.NoError(t, err) |
| 139 | + |
| 140 | + for i := 0; i < maxBatchSize+1; i++ { |
| 141 | + bz := sha3.Sum256(binary.BigEndian.AppendUint64([]byte{}, uint64(i))) |
| 142 | + value, err := itree.Get(bz[:]) |
| 143 | + require.NoError(t, err) |
| 144 | + require.Equal(t, []byte{byte(i)}, value) |
| 145 | + } |
| 146 | +} |
| 147 | + |
72 | 148 | func TestImporter_NegativeVersion(t *testing.T) {
|
73 | 149 | tree := NewMutableTree(dbm.NewMemDB(), 0, false, NewNopLogger())
|
74 | 150 | _, err := tree.Import(-1)
|
|
0 commit comments