Skip to content

Commit 470e2e2

Browse files
committed
Add longer test vector and benchmarks.
1 parent 07d46ab commit 470e2e2

File tree

2 files changed

+423
-0
lines changed

2 files changed

+423
-0
lines changed

merkle_test.go

+127
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package merkle
22

33
import (
4+
"crypto/sha256"
45
"encoding/hex"
6+
"io"
7+
"os"
58
"testing"
69

710
"golang.org/x/crypto/sha3"
@@ -34,3 +37,127 @@ func TestMerkleRoot(t *testing.T) {
3437
}
3538
}
3639
}
40+
41+
func TestText(t *testing.T) {
42+
f, err := os.Open("testdata/udhr.txt")
43+
if err != nil {
44+
t.Fatal(err)
45+
}
46+
defer f.Close()
47+
48+
const chunksize = 256
49+
50+
tree := NewTree(sha256.New)
51+
var frontier Frontier
52+
53+
for {
54+
var buf [chunksize]byte
55+
n, err := io.ReadFull(f, buf[:])
56+
if err == io.EOF {
57+
// "The error is EOF only if no bytes were read."
58+
break
59+
}
60+
if err != nil && err != io.ErrUnexpectedEOF {
61+
t.Fatal(err)
62+
}
63+
tree.Add(buf[:n])
64+
frontier.Exclude(buf[:n])
65+
}
66+
67+
const treeWantHex = "8acc3ef309961457bde157842e2a9d7b403294c30172b497372c19acecc622e5"
68+
treeRoot := tree.Root()
69+
treeRootHex := hex.EncodeToString(treeRoot)
70+
if treeRootHex != treeWantHex {
71+
t.Errorf("merkle tree: got %s, want %s", treeRootHex, treeWantHex)
72+
}
73+
74+
const frontierWantHex = "a2403ca567d0b94085296973d1953f9e341b27a666010c1f9fe967e5aac0140b"
75+
frontierRoot := frontier.MerkleRoot(sha256.New)
76+
frontierRootHex := hex.EncodeToString(frontierRoot)
77+
if frontierRootHex != frontierWantHex {
78+
t.Errorf("frontier: got %s, want %s", frontierRootHex, frontierWantHex)
79+
}
80+
}
81+
82+
func BenchmarkTextMerkleTree(b *testing.B) {
83+
for i := 0; i < b.N; i++ {
84+
func() {
85+
f, err := os.Open("testdata/udhr.txt")
86+
if err != nil {
87+
b.Fatal(err)
88+
}
89+
defer f.Close()
90+
91+
const chunksize = 256
92+
tree := NewTree(sha256.New)
93+
for {
94+
var buf [chunksize]byte
95+
n, err := io.ReadFull(f, buf[:])
96+
if err == io.EOF {
97+
// "The error is EOF only if no bytes were read."
98+
break
99+
}
100+
if err != nil && err != io.ErrUnexpectedEOF {
101+
b.Fatal(err)
102+
}
103+
tree.Add(buf[:n])
104+
}
105+
tree.Root()
106+
}()
107+
}
108+
}
109+
110+
func BenchmarkTextFrontier(b *testing.B) {
111+
for i := 0; i < b.N; i++ {
112+
func() {
113+
f, err := os.Open("testdata/udhr.txt")
114+
if err != nil {
115+
b.Fatal(err)
116+
}
117+
defer f.Close()
118+
119+
const chunksize = 256
120+
var frontier Frontier
121+
for {
122+
var buf [chunksize]byte
123+
n, err := io.ReadFull(f, buf[:])
124+
if err == io.EOF {
125+
// "The error is EOF only if no bytes were read."
126+
break
127+
}
128+
if err != nil && err != io.ErrUnexpectedEOF {
129+
b.Fatal(err)
130+
}
131+
frontier.Exclude(buf[:n])
132+
}
133+
}()
134+
}
135+
}
136+
137+
func BenchmarkTextFrontierMerkleRoot(b *testing.B) {
138+
for i := 0; i < b.N; i++ {
139+
func() {
140+
f, err := os.Open("testdata/udhr.txt")
141+
if err != nil {
142+
b.Fatal(err)
143+
}
144+
defer f.Close()
145+
146+
const chunksize = 256
147+
var frontier Frontier
148+
for {
149+
var buf [chunksize]byte
150+
n, err := io.ReadFull(f, buf[:])
151+
if err == io.EOF {
152+
// "The error is EOF only if no bytes were read."
153+
break
154+
}
155+
if err != nil && err != io.ErrUnexpectedEOF {
156+
b.Fatal(err)
157+
}
158+
frontier.Exclude(buf[:n])
159+
}
160+
frontier.MerkleRoot(sha256.New)
161+
}()
162+
}
163+
}

0 commit comments

Comments
 (0)