Skip to content

Commit 07e7628

Browse files
committed
Add unit test for the collector
1 parent 8f0d9b4 commit 07e7628

File tree

2 files changed

+175
-0
lines changed

2 files changed

+175
-0
lines changed
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
package collector
2+
3+
import (
4+
"crypto/rand"
5+
"testing"
6+
"time"
7+
8+
core_types "github.com/gnolang/gno/pkgs/bft/rpc/core/types"
9+
"github.com/gnolang/gno/pkgs/bft/types"
10+
"github.com/gnolang/gno/pkgs/crypto/tmhash"
11+
"github.com/stretchr/testify/assert"
12+
)
13+
14+
// generateRandomData generates random 32B chunks
15+
func generateRandomData(t *testing.T, count int) [][]byte {
16+
t.Helper()
17+
18+
data := make([][]byte, count)
19+
20+
for i := 0; i < count; i++ {
21+
buf := make([]byte, 32)
22+
23+
_, err := rand.Read(buf)
24+
if err != nil {
25+
t.Fatalf("unable to generate random data, %v", err)
26+
}
27+
28+
data[i] = buf
29+
}
30+
31+
return data
32+
}
33+
34+
func TestCollector_GetRunResults(t *testing.T) {
35+
t.Parallel()
36+
37+
numTxs := 100
38+
startTime := time.Now()
39+
blockTimes := make([]time.Time, numTxs)
40+
41+
for i := 0; i < numTxs; i++ {
42+
if i == 0 {
43+
blockTimes[i] = startTime
44+
}
45+
46+
blockTimes[i] = startTime.Add(time.Duration(i) * time.Second)
47+
}
48+
49+
txs := generateRandomData(t, numTxs)
50+
txHashes := make([][]byte, numTxs)
51+
52+
for i := 0; i < numTxs; i++ {
53+
txHashes[i] = tmhash.Sum(txs[i])
54+
}
55+
56+
var (
57+
gasLimit = int64(1000)
58+
gasUsed = int64(100)
59+
60+
mockClient = &mockClient{
61+
getBlockFn: func(height *int64) (*core_types.ResultBlock, error) {
62+
if *height > int64(numTxs) {
63+
t.Fatalf("invalid height requested")
64+
}
65+
66+
return &core_types.ResultBlock{
67+
BlockMeta: &types.BlockMeta{
68+
Header: types.Header{
69+
Height: *height,
70+
Time: blockTimes[*height-1],
71+
NumTxs: 1,
72+
},
73+
},
74+
Block: &types.Block{
75+
Data: types.Data{
76+
Txs: []types.Tx{
77+
txs[*height-1],
78+
},
79+
},
80+
},
81+
}, nil
82+
},
83+
getLatestBlockHeightFn: func() (int64, error) {
84+
return int64(numTxs), nil
85+
},
86+
getBlockGasLimitFn: func(height int64) (int64, error) {
87+
if height > int64(numTxs) {
88+
t.Fatalf("invalid height requested")
89+
}
90+
91+
return gasLimit, nil
92+
},
93+
getBlockGasUsedFn: func(height int64) (int64, error) {
94+
if height > int64(numTxs) {
95+
t.Fatalf("invalid height requested")
96+
}
97+
98+
return gasUsed, nil
99+
},
100+
}
101+
)
102+
103+
// Create the collector
104+
c := NewCollector(mockClient)
105+
c.requestTimeout = time.Second * 0
106+
107+
// Collect the results
108+
result, err := c.GetRunResult(txHashes, 1)
109+
if err != nil {
110+
t.Fatalf("unable to get run results, %v", err)
111+
}
112+
113+
if result == nil {
114+
t.Fatal("result should not be nil")
115+
}
116+
117+
assert.Equal(t, 2, result.AverageTPS) // 1 tx per block; 100 blocks; 1s per block;
118+
assert.Len(t, result.Blocks, numTxs)
119+
120+
for index, block := range result.Blocks {
121+
assert.Equal(t, int64(index+1), block.Number)
122+
assert.Equal(t, gasUsed, block.GasUsed)
123+
assert.Equal(t, gasLimit, block.GasLimit)
124+
assert.Equal(t, int64(1), block.Transactions)
125+
}
126+
}

internal/collector/mock_test.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package collector
2+
3+
import core_types "github.com/gnolang/gno/pkgs/bft/rpc/core/types"
4+
5+
type (
6+
getBlockDelegate func(height *int64) (*core_types.ResultBlock, error)
7+
getBlockGasUsedDelegate func(height int64) (int64, error)
8+
getBlockGasLimitDelegate func(height int64) (int64, error)
9+
getLatestBlockHeightDelegate func() (int64, error)
10+
)
11+
12+
type mockClient struct {
13+
getBlockFn getBlockDelegate
14+
getBlockGasUsedFn getBlockGasUsedDelegate
15+
getBlockGasLimitFn getBlockGasLimitDelegate
16+
getLatestBlockHeightFn getLatestBlockHeightDelegate
17+
}
18+
19+
func (m *mockClient) GetBlock(height *int64) (*core_types.ResultBlock, error) {
20+
if m.getBlockFn != nil {
21+
return m.getBlockFn(height)
22+
}
23+
24+
return nil, nil
25+
}
26+
27+
func (m *mockClient) GetBlockGasUsed(height int64) (int64, error) {
28+
if m.getBlockGasUsedFn != nil {
29+
return m.getBlockGasUsedFn(height)
30+
}
31+
32+
return 0, nil
33+
}
34+
35+
func (m *mockClient) GetBlockGasLimit(height int64) (int64, error) {
36+
if m.getBlockGasLimitFn != nil {
37+
return m.getBlockGasLimitFn(height)
38+
}
39+
40+
return 0, nil
41+
}
42+
43+
func (m *mockClient) GetLatestBlockHeight() (int64, error) {
44+
if m.getLatestBlockHeightFn != nil {
45+
return m.getLatestBlockHeightFn()
46+
}
47+
48+
return 0, nil
49+
}

0 commit comments

Comments
 (0)