Skip to content

Commit 56a9cbf

Browse files
committed
feat: fuzzer benching
1 parent ef5fcfe commit 56a9cbf

File tree

4 files changed

+160
-5
lines changed

4 files changed

+160
-5
lines changed

Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,3 +103,7 @@ bench: build-bandersnatch build-erasurecoding
103103
endif
104104
go test -bench=^$(NAME)$$ ./tests/integration --tags=traces,tiny | tee benchmark_results.txt
105105
python3 bench-stats.py benchmark_results.txt
106+
107+
.PHONY: bench
108+
bench-fuzzer:
109+
go test -bench=^$(NAME)$$ ./pkg/traceutil --tags=traces,tiny

pkg/traceutil/converter.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ func CreatePeerInfoMessage() *conformance.Message {
1515
JamVersion: conformance.Version{
1616
Major: 0,
1717
Minor: 7,
18-
Patch: 1,
18+
Patch: 2,
1919
},
2020
AppVersion: conformance.Version{
2121
Major: 1,
@@ -56,9 +56,9 @@ func TraceToConformancePostState(trace integration.Trace) conformance.State {
5656
return traceStateToConformanceState(trace.PostState)
5757
}
5858

59-
func CreateGetStateMessage(stateRootHash crypto.Hash) *conformance.Message {
59+
func CreateGetStateMessage(headerHash crypto.Hash) *conformance.Message {
6060
return conformance.NewMessage(conformance.GetState{
61-
HeaderHash: stateRootHash,
61+
HeaderHash: headerHash,
6262
})
6363
}
6464

pkg/traceutil/fuzzer_bench_test.go

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
//go:build tiny
2+
3+
package traceutil
4+
5+
import (
6+
"context"
7+
"net"
8+
"testing"
9+
10+
"github.com/eigerco/strawberry/pkg/conformance"
11+
"github.com/eigerco/strawberry/pkg/network/handlers"
12+
"github.com/eigerco/strawberry/pkg/serialization/codec/jam"
13+
"github.com/stretchr/testify/require"
14+
)
15+
16+
func BenchmarkTestVectorFileWithGenesis(b *testing.B) {
17+
// Parse the trace vector
18+
b.Skip("This is used for manual testing with a local jam target")
19+
genesis, err := ParseGenesisFile(b, "genesis.bin")
20+
require.NoError(b, err)
21+
require.NotEmpty(b, genesis)
22+
block, err := ParseTraceFile(b, "00000001.bin")
23+
require.NoError(b, err)
24+
require.NotEmpty(b, block)
25+
26+
// Create a connection and first message (PeerInfo)
27+
peerInfoMessage := CreatePeerInfoMessage()
28+
conn, err := net.Dial("unix", "/tmp/jam_target.sock")
29+
require.NoError(b, err)
30+
defer func() {
31+
require.NoError(b, conn.Close())
32+
}()
33+
msgBytes, err := jam.Marshal(peerInfoMessage)
34+
require.NoError(b, err)
35+
// Send PeerInfo message
36+
ctx := context.Background()
37+
err = handlers.WriteMessageWithContext(ctx, conn, msgBytes)
38+
require.NoError(b, err)
39+
// Read the response
40+
response, err := handlers.ReadMessageWithContext(ctx, conn)
41+
require.NoError(b, err)
42+
require.NotEmpty(b, response)
43+
respMsg := &conformance.Message{}
44+
err = jam.Unmarshal(response.Content, respMsg)
45+
require.NoError(b, err)
46+
require.NotNil(b, respMsg)
47+
48+
b.ResetTimer() // Reset timer after setup
49+
50+
for i := 0; i < b.N; i++ {
51+
// Create the Initialize message (Prestate)
52+
initMessage := GenesisToConformanceInitialize(genesis)
53+
initMsg := conformance.NewMessage(initMessage)
54+
initMsgBytes, err := jam.Marshal(initMsg)
55+
require.NoError(b, err)
56+
// Send the Initialize message
57+
err = handlers.WriteMessageWithContext(ctx, conn, initMsgBytes)
58+
require.NoError(b, err)
59+
// Read the response to the Initialize message
60+
initResponse, err := handlers.ReadMessageWithContext(ctx, conn)
61+
require.NoError(b, err)
62+
require.NotEmpty(b, initResponse)
63+
initRespMsg := &conformance.Message{}
64+
err = jam.Unmarshal(initResponse.Content, initRespMsg)
65+
require.NoError(b, err)
66+
require.NotNil(b, initRespMsg)
67+
68+
// Send the ImportBlock message
69+
blockImportMessage := TraceToConformanceImportBlock(block)
70+
blockImportMsg := conformance.NewMessage(blockImportMessage)
71+
blockImportMsgBytes, err := jam.Marshal(blockImportMsg)
72+
require.NoError(b, err)
73+
err = handlers.WriteMessageWithContext(ctx, conn, blockImportMsgBytes)
74+
require.NoError(b, err)
75+
// Read the response to the ImportBlock message (StateRoot)
76+
importResponse, err := handlers.ReadMessageWithContext(ctx, conn)
77+
require.NoError(b, err)
78+
require.NotEmpty(b, importResponse)
79+
importRespMsg := &conformance.Message{}
80+
err = jam.Unmarshal(importResponse.Content, importRespMsg)
81+
require.NoError(b, err)
82+
require.NotNil(b, importRespMsg)
83+
}
84+
}
85+
86+
func BenchmarkTestVectorFileOnly(b *testing.B) {
87+
// Parse the trace vector
88+
b.Skip("This is used for manual testing with a local jam target")
89+
data, err := ParseTraceFile(b, "00000001.bin")
90+
require.NoError(b, err)
91+
require.NotEmpty(b, data)
92+
93+
// Create a connection and first message (PeerInfo)
94+
peerInfoMessage := CreatePeerInfoMessage()
95+
conn, err := net.Dial("unix", "/tmp/jam_target.sock")
96+
require.NoError(b, err)
97+
defer func() {
98+
require.NoError(b, conn.Close())
99+
}()
100+
msgBytes, err := jam.Marshal(peerInfoMessage)
101+
require.NoError(b, err)
102+
// Send PeerInfo message
103+
ctx := context.Background()
104+
err = handlers.WriteMessageWithContext(ctx, conn, msgBytes)
105+
require.NoError(b, err)
106+
// Read the response
107+
response, err := handlers.ReadMessageWithContext(ctx, conn)
108+
require.NoError(b, err)
109+
require.NotEmpty(b, response)
110+
respMsg := &conformance.Message{}
111+
err = jam.Unmarshal(response.Content, respMsg)
112+
require.NoError(b, err)
113+
require.NotNil(b, respMsg)
114+
115+
b.ResetTimer() // Reset timer after setup
116+
117+
for i := 0; i < b.N; i++ {
118+
// Create the Initialize message (Prestate)
119+
initMessage := TraceToConformanceInitialize(data)
120+
initMsg := conformance.NewMessage(initMessage)
121+
initMsgBytes, err := jam.Marshal(initMsg)
122+
require.NoError(b, err)
123+
// Send the Initialize message
124+
err = handlers.WriteMessageWithContext(ctx, conn, initMsgBytes)
125+
require.NoError(b, err)
126+
// Read the response to the Initialize message
127+
initResponse, err := handlers.ReadMessageWithContext(ctx, conn)
128+
require.NoError(b, err)
129+
require.NotEmpty(b, initResponse)
130+
initRespMsg := &conformance.Message{}
131+
err = jam.Unmarshal(initResponse.Content, initRespMsg)
132+
require.NoError(b, err)
133+
require.NotNil(b, initRespMsg)
134+
135+
// Send the ImportBlock message
136+
blockImportMessage := TraceToConformanceImportBlock(data)
137+
blockImportMsg := conformance.NewMessage(blockImportMessage)
138+
blockImportMsgBytes, err := jam.Marshal(blockImportMsg)
139+
require.NoError(b, err)
140+
err = handlers.WriteMessageWithContext(ctx, conn, blockImportMsgBytes)
141+
require.NoError(b, err)
142+
// Read the response to the ImportBlock message (StateRoot)
143+
importResponse, err := handlers.ReadMessageWithContext(ctx, conn)
144+
require.NoError(b, err)
145+
require.NotEmpty(b, importResponse)
146+
importRespMsg := &conformance.Message{}
147+
err = jam.Unmarshal(importResponse.Content, importRespMsg)
148+
require.NoError(b, err)
149+
require.NotNil(b, importRespMsg)
150+
}
151+
}

pkg/traceutil/fuzzer_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ func readVectorFile(path string) ([]byte, error) {
2222
return os.ReadFile(filepath.Join(vectorsDir, path))
2323
}
2424

25-
func ParseTraceFile(t *testing.T, path string) (integration.Trace, error) {
25+
func ParseTraceFile(t require.TestingT, path string) (integration.Trace, error) {
2626
var trace integration.Trace
2727
data, err := readVectorFile(path)
2828
require.NoError(t, err)
@@ -31,7 +31,7 @@ func ParseTraceFile(t *testing.T, path string) (integration.Trace, error) {
3131
return trace, nil
3232
}
3333

34-
func ParseGenesisFile(t *testing.T, path string) (integration.Genesis, error) {
34+
func ParseGenesisFile(t require.TestingT, path string) (integration.Genesis, error) {
3535
var genesis integration.Genesis
3636
data, err := readVectorFile(path)
3737
require.NoError(t, err)

0 commit comments

Comments
 (0)