@@ -50,4 +50,94 @@ func TestGetMerkleProofForCoinbase(t *testing.T) {
5050 require .NoError (t , topTree .AddNode (* subtree2 .RootHash (), subtree2 .Fees , subtree1 .SizeInBytes ))
5151 assert .Equal (t , expectedRootHash , topTree .RootHash ().String ())
5252 })
53+
54+ t .Run ("empty subtrees" , func (t * testing.T ) {
55+ _ , err := GetMerkleProofForCoinbase ([]* Subtree {})
56+ require .Error (t , err )
57+ assert .Contains (t , err .Error (), "no subtrees available" )
58+ })
59+
60+ t .Run ("error from GetMerkleProof" , func (t * testing.T ) {
61+ // Create a subtree with no nodes to trigger error
62+ subtree , err := NewTree (2 )
63+ require .NoError (t , err )
64+
65+ _ , err = GetMerkleProofForCoinbase ([]* Subtree {subtree })
66+ require .Error (t , err )
67+ })
68+ }
69+
70+ func TestBuildMerkleTreeStoreFromBytes (t * testing.T ) {
71+ t .Run ("empty nodes" , func (t * testing.T ) {
72+ merkles , err := BuildMerkleTreeStoreFromBytes ([]Node {})
73+ require .NoError (t , err )
74+ assert .NotNil (t , merkles )
75+ assert .Empty (t , * merkles )
76+ })
77+
78+ t .Run ("single node" , func (t * testing.T ) {
79+ hash1 , _ := chainhash .NewHashFromStr ("97af9ad3583e2f83fc1e44e475e3a3ee31ec032449cc88b491479ef7d187c115" )
80+ nodes := []Node {
81+ {Hash : * hash1 , Fee : 100 , SizeInBytes : 200 },
82+ }
83+
84+ merkles , err := BuildMerkleTreeStoreFromBytes (nodes )
85+ require .NoError (t , err )
86+ assert .NotNil (t , merkles )
87+ // Single node case returns the hash itself
88+ assert .Len (t , * merkles , 1 )
89+ assert .Equal (t , * hash1 , (* merkles )[0 ])
90+ })
91+
92+ t .Run ("two nodes" , func (t * testing.T ) {
93+ hash1 , _ := chainhash .NewHashFromStr ("97af9ad3583e2f83fc1e44e475e3a3ee31ec032449cc88b491479ef7d187c115" )
94+ hash2 , _ := chainhash .NewHashFromStr ("7ce05dda56bc523048186c0f0474eb21c92fe35de6d014bd016834637a3ed08d" )
95+ nodes := []Node {
96+ {Hash : * hash1 , Fee : 100 , SizeInBytes : 200 },
97+ {Hash : * hash2 , Fee : 150 , SizeInBytes : 250 },
98+ }
99+
100+ merkles , err := BuildMerkleTreeStoreFromBytes (nodes )
101+ require .NoError (t , err )
102+ assert .NotNil (t , merkles )
103+ assert .Len (t , * merkles , 1 )
104+ })
105+
106+ t .Run ("multiple nodes" , func (t * testing.T ) {
107+ hash1 , _ := chainhash .NewHashFromStr ("97af9ad3583e2f83fc1e44e475e3a3ee31ec032449cc88b491479ef7d187c115" )
108+ hash2 , _ := chainhash .NewHashFromStr ("7ce05dda56bc523048186c0f0474eb21c92fe35de6d014bd016834637a3ed08d" )
109+ hash3 , _ := chainhash .NewHashFromStr ("3070fb937289e24720c827cbc24f3fce5c361cd7e174392a700a9f42051609e0" )
110+ hash4 , _ := chainhash .NewHashFromStr ("d3cde0ab7142cc99acb31c5b5e1e941faed1c5cf5f8b63ed663972845d663487" )
111+ nodes := []Node {
112+ {Hash : * hash1 , Fee : 100 , SizeInBytes : 200 },
113+ {Hash : * hash2 , Fee : 150 , SizeInBytes : 250 },
114+ {Hash : * hash3 , Fee : 175 , SizeInBytes : 275 },
115+ {Hash : * hash4 , Fee : 200 , SizeInBytes : 300 },
116+ }
117+
118+ merkles , err := BuildMerkleTreeStoreFromBytes (nodes )
119+ require .NoError (t , err )
120+ assert .NotNil (t , merkles )
121+ // For 4 nodes, we need 3 merkle hashes (one for the root)
122+ assert .Len (t , * merkles , 3 )
123+ })
124+
125+ t .Run ("large tree with parallel processing" , func (t * testing.T ) {
126+ // Create more than 1024 nodes to trigger parallel processing
127+ nodes := make ([]Node , 2048 )
128+ for i := 0 ; i < 2048 ; i ++ {
129+ hash := chainhash .HashH ([]byte {byte (i >> 8 ), byte (i )})
130+ nodes [i ] = Node {
131+ Hash : hash ,
132+ Fee : uint64 (i ), //nolint:gosec // G115: Safe conversion, i is limited to 2048
133+ SizeInBytes : uint64 (i * 10 ), //nolint:gosec // G115: Safe conversion, i*10 is limited to 20480
134+ }
135+ }
136+
137+ merkles , err := BuildMerkleTreeStoreFromBytes (nodes )
138+ require .NoError (t , err )
139+ assert .NotNil (t , merkles )
140+ // For 2048 nodes, we expect 2047 merkle hashes
141+ assert .Len (t , * merkles , 2047 )
142+ })
53143}
0 commit comments