Skip to content

Commit 93d8e2b

Browse files
authored
test: Add benchmarks for KMS signer (#3205)
Add kms signer benchmarks
1 parent 162cda6 commit 93d8e2b

File tree

2 files changed

+152
-0
lines changed

2 files changed

+152
-0
lines changed
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package aws
2+
3+
import (
4+
"bytes"
5+
"os"
6+
"testing"
7+
"time"
8+
9+
"github.com/stretchr/testify/require"
10+
"google.golang.org/protobuf/proto"
11+
12+
pb "github.com/evstack/ev-node/types/pb/evnode/v1"
13+
)
14+
15+
// BenchmarkKmsSignerSign test kms round trip
16+
// export EVNODE_E2E_GCP_KMS_KEY_NAME=projects/<project-id>/locations/<region>/keyRings/<keyring-name>/cryptoKeys/<key-name>/cryptoKeyVersions/1
17+
// export EVNODE_E2E_GCP_KMS_CREDENTIALS_FILE=...
18+
// go test -v -bench=BenchmarkKmsSignerSign -benchtime=3s -count=10 -run='^$' ./pkg/signer/gcp
19+
func BenchmarkKmsSignerSign(b *testing.B) {
20+
keyID := os.Getenv("EVNODE_E2E_AWS_KMS_KEY_ID")
21+
if keyID == "" {
22+
b.Skip("set EVNODE_E2E_AWS_KMS_KEY_ID to run AWS KMS benchmark")
23+
}
24+
25+
region := firstNonEmpty(
26+
os.Getenv("EVNODE_E2E_AWS_KMS_REGION"),
27+
os.Getenv("AWS_REGION"),
28+
os.Getenv("AWS_DEFAULT_REGION"),
29+
)
30+
profile := os.Getenv("EVNODE_E2E_AWS_KMS_PROFILE")
31+
32+
signer, err := NewKmsSigner(b.Context(), region, profile, keyID, &Options{
33+
Timeout: 10 * time.Second,
34+
MaxRetries: 0,
35+
})
36+
require.NoError(b, err)
37+
38+
headerData := benchmarkHeaderData(b)
39+
40+
b.ReportAllocs()
41+
b.SetBytes(int64(len(headerData)))
42+
b.ResetTimer()
43+
44+
for b.Loop() {
45+
_, err := signer.Sign(b.Context(), headerData)
46+
require.NoError(b, err)
47+
}
48+
}
49+
50+
func firstNonEmpty(values ...string) string {
51+
for _, value := range values {
52+
if value != "" {
53+
return value
54+
}
55+
}
56+
57+
return ""
58+
}
59+
60+
func benchmarkHeaderData(b *testing.B) []byte {
61+
b.Helper()
62+
63+
header := &pb.Header{
64+
Version: &pb.Version{
65+
Block: 11,
66+
App: 1,
67+
},
68+
Height: 1,
69+
Time: 1743091200000000000, // 2025-03-27T00:00:00Z
70+
LastHeaderHash: bytes.Repeat([]byte{0x3b}, 32),
71+
DataHash: bytes.Repeat([]byte{0x78}, 32),
72+
AppHash: bytes.Repeat([]byte{0xf5}, 32),
73+
ProposerAddress: bytes.Repeat([]byte{0x25}, 32),
74+
ValidatorHash: bytes.Repeat([]byte{0x25}, 32),
75+
ChainId: "benchmark-chain",
76+
}
77+
78+
headerData, err := proto.Marshal(header)
79+
require.NoError(b, err)
80+
require.NotEmpty(b, headerData)
81+
82+
return headerData
83+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package gcp
2+
3+
import (
4+
"bytes"
5+
"os"
6+
"testing"
7+
"time"
8+
9+
"github.com/stretchr/testify/require"
10+
"google.golang.org/protobuf/proto"
11+
12+
pb "github.com/evstack/ev-node/types/pb/evnode/v1"
13+
)
14+
15+
// BenchmarkKmsSignerSign test kms round trip
16+
// export EVNODE_E2E_AWS_KMS_KEY_ID="arn:aws:kms:...."
17+
// export EVNODE_E2E_AWS_KMS_REGION=eu-west-1
18+
// go test -v -bench=BenchmarkKmsSignerSign -benchtime=3s -count=10 -run='^$' ./pkg/signer/aws
19+
func BenchmarkKmsSignerSign(b *testing.B) {
20+
keyName := os.Getenv("EVNODE_E2E_GCP_KMS_KEY_NAME")
21+
if keyName == "" {
22+
b.Skip("set EVNODE_E2E_GCP_KMS_KEY_NAME to run GCP KMS benchmark")
23+
}
24+
25+
credentialsFile := os.Getenv("EVNODE_E2E_GCP_KMS_CREDENTIALS_FILE")
26+
27+
signer, err := NewKmsSigner(b.Context(), keyName, &Options{
28+
CredentialsFile: credentialsFile,
29+
Timeout: 1 * time.Second,
30+
MaxRetries: 0,
31+
})
32+
require.NoError(b, err)
33+
34+
headerData := benchmarkHeaderData(b)
35+
36+
b.ReportAllocs()
37+
b.SetBytes(int64(len(headerData)))
38+
b.ResetTimer()
39+
40+
for b.Loop() {
41+
_, err := signer.Sign(b.Context(), headerData)
42+
require.NoError(b, err)
43+
}
44+
}
45+
46+
func benchmarkHeaderData(b *testing.B) []byte {
47+
b.Helper()
48+
49+
header := &pb.Header{
50+
Version: &pb.Version{
51+
Block: 11,
52+
App: 1,
53+
},
54+
Height: 1,
55+
Time: 1743091200000000000, // 2025-03-27T00:00:00Z
56+
LastHeaderHash: bytes.Repeat([]byte{0x3b}, 32),
57+
DataHash: bytes.Repeat([]byte{0x78}, 32),
58+
AppHash: bytes.Repeat([]byte{0xf5}, 32),
59+
ProposerAddress: bytes.Repeat([]byte{0x25}, 32),
60+
ValidatorHash: bytes.Repeat([]byte{0x25}, 32),
61+
ChainId: "benchmark-chain",
62+
}
63+
64+
headerData, err := proto.Marshal(header)
65+
require.NoError(b, err)
66+
require.NotEmpty(b, headerData)
67+
68+
return headerData
69+
}

0 commit comments

Comments
 (0)