|
17 | 17 | package bintrie |
18 | 18 |
|
19 | 19 | import ( |
| 20 | + "bytes" |
20 | 21 | "testing" |
21 | 22 |
|
22 | 23 | "github.com/ethereum/go-ethereum/common" |
@@ -94,14 +95,82 @@ func TestHashedNodeInsertValuesAtStem(t *testing.T) { |
94 | 95 | stem := make([]byte, StemSize) |
95 | 96 | values := make([][]byte, StemNodeWidth) |
96 | 97 |
|
| 98 | + // Test 1: nil resolver should return an error |
97 | 99 | _, err := node.InsertValuesAtStem(stem, values, nil, 0) |
98 | 100 | if err == nil { |
99 | | - t.Fatal("Expected error for InsertValuesAtStem on HashedNode") |
| 101 | + t.Fatal("Expected error for InsertValuesAtStem on HashedNode with nil resolver") |
100 | 102 | } |
101 | 103 |
|
102 | | - if err.Error() != "insertValuesAtStem not implemented for hashed node" { |
| 104 | + if err.Error() != "InsertValuesAtStem resolve error: resolver is nil" { |
103 | 105 | t.Errorf("Unexpected error message: %v", err) |
104 | 106 | } |
| 107 | + |
| 108 | + // Test 2: mock resolver returning invalid data should return deserialization error |
| 109 | + mockResolver := func(path []byte, hash common.Hash) ([]byte, error) { |
| 110 | + // Return invalid/nonsense data that cannot be deserialized |
| 111 | + return []byte{0xff, 0xff, 0xff}, nil |
| 112 | + } |
| 113 | + |
| 114 | + _, err = node.InsertValuesAtStem(stem, values, mockResolver, 0) |
| 115 | + if err == nil { |
| 116 | + t.Fatal("Expected error for InsertValuesAtStem on HashedNode with invalid resolver data") |
| 117 | + } |
| 118 | + |
| 119 | + expectedPrefix := "InsertValuesAtStem node deserialization error:" |
| 120 | + if len(err.Error()) < len(expectedPrefix) || err.Error()[:len(expectedPrefix)] != expectedPrefix { |
| 121 | + t.Errorf("Expected deserialization error, got: %v", err) |
| 122 | + } |
| 123 | + |
| 124 | + // Test 3: mock resolver returning valid serialized node should succeed |
| 125 | + stem = make([]byte, StemSize) |
| 126 | + stem[0] = 0xaa |
| 127 | + var originalValues [StemNodeWidth][]byte |
| 128 | + originalValues[0] = common.HexToHash("0x1111111111111111111111111111111111111111111111111111111111111111").Bytes() |
| 129 | + originalValues[1] = common.HexToHash("0x2222222222222222222222222222222222222222222222222222222222222222").Bytes() |
| 130 | + |
| 131 | + originalNode := &StemNode{ |
| 132 | + Stem: stem, |
| 133 | + Values: originalValues[:], |
| 134 | + depth: 0, |
| 135 | + } |
| 136 | + |
| 137 | + // Serialize the node |
| 138 | + serialized := SerializeNode(originalNode) |
| 139 | + |
| 140 | + // Create a mock resolver that returns the serialized node |
| 141 | + validResolver := func(path []byte, hash common.Hash) ([]byte, error) { |
| 142 | + return serialized, nil |
| 143 | + } |
| 144 | + |
| 145 | + var newValues [StemNodeWidth][]byte |
| 146 | + newValues[2] = common.HexToHash("0x3333333333333333333333333333333333333333333333333333333333333333").Bytes() |
| 147 | + |
| 148 | + resolvedNode, err := node.InsertValuesAtStem(stem, newValues[:], validResolver, 0) |
| 149 | + if err != nil { |
| 150 | + t.Fatalf("Expected successful resolution and insertion, got error: %v", err) |
| 151 | + } |
| 152 | + |
| 153 | + resultStem, ok := resolvedNode.(*StemNode) |
| 154 | + if !ok { |
| 155 | + t.Fatalf("Expected resolved node to be *StemNode, got %T", resolvedNode) |
| 156 | + } |
| 157 | + |
| 158 | + if !bytes.Equal(resultStem.Stem, stem) { |
| 159 | + t.Errorf("Stem mismatch: expected %x, got %x", stem, resultStem.Stem) |
| 160 | + } |
| 161 | + |
| 162 | + // Verify the original values are preserved |
| 163 | + if !bytes.Equal(resultStem.Values[0], originalValues[0]) { |
| 164 | + t.Errorf("Original value at index 0 not preserved: expected %x, got %x", originalValues[0], resultStem.Values[0]) |
| 165 | + } |
| 166 | + if !bytes.Equal(resultStem.Values[1], originalValues[1]) { |
| 167 | + t.Errorf("Original value at index 1 not preserved: expected %x, got %x", originalValues[1], resultStem.Values[1]) |
| 168 | + } |
| 169 | + |
| 170 | + // Verify the new value was inserted |
| 171 | + if !bytes.Equal(resultStem.Values[2], newValues[2]) { |
| 172 | + t.Errorf("New value at index 2 not inserted correctly: expected %x, got %x", newValues[2], resultStem.Values[2]) |
| 173 | + } |
105 | 174 | } |
106 | 175 |
|
107 | 176 | // TestHashedNodeToDot tests the toDot method for visualization |
|
0 commit comments