Skip to content

Commit b6d95e2

Browse files
Refactor block eventing unit tests (#760)
Simplify tests by using an abstraction to the eventing set up and invocation so that a set of common tests can be applied to block, filtered block, and block and private data unit tests. Signed-off-by: Mark S. Lewis <Mark.S.Lewis@outlook.com>
1 parent 5edc6fa commit b6d95e2

File tree

7 files changed

+480
-738
lines changed

7 files changed

+480
-738
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ require (
1111
github.com/stretchr/testify v1.9.0
1212
golang.org/x/crypto v0.28.0
1313
google.golang.org/grpc v1.67.1
14-
google.golang.org/protobuf v1.34.2
14+
google.golang.org/protobuf v1.35.1
1515
)
1616

1717
require (

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:
6666
google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=
6767
google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E=
6868
google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA=
69-
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
70-
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
69+
google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
70+
google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
7171
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
7272
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
7373
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=

pkg/client/blockevents_test.go

Lines changed: 10 additions & 245 deletions
Original file line numberDiff line numberDiff line change
@@ -5,185 +5,14 @@ package client
55

66
import (
77
"context"
8-
"errors"
9-
"io"
108
"testing"
119

1210
"github.com/hyperledger/fabric-protos-go-apiv2/common"
13-
"github.com/hyperledger/fabric-protos-go-apiv2/orderer"
1411
"github.com/hyperledger/fabric-protos-go-apiv2/peer"
1512
"github.com/stretchr/testify/require"
16-
"google.golang.org/grpc"
17-
"google.golang.org/grpc/codes"
18-
"google.golang.org/grpc/status"
1913
)
2014

2115
func TestBlockEvents(t *testing.T) {
22-
t.Run("Returns connect error", func(t *testing.T) {
23-
expected := NewStatusError(t, codes.Aborted, "BLOCK_EVENTS_ERROR")
24-
25-
mockConnection := NewMockClientConnInterface(t)
26-
ExpectDeliver(mockConnection, WithNewStreamError(expected))
27-
28-
ctx, cancel := context.WithCancel(context.Background())
29-
defer cancel()
30-
31-
network := AssertNewTestNetwork(t, "NETWORK", WithClientConnection(mockConnection))
32-
_, err := network.BlockEvents(ctx)
33-
34-
require.Equal(t, status.Code(expected), status.Code(err), "status code")
35-
require.ErrorIs(t, err, expected, "error type: %T", err)
36-
require.ErrorContains(t, err, expected.Error(), "message")
37-
})
38-
39-
for testName, testCase := range map[string]struct {
40-
options []BlockEventsOption
41-
expected *orderer.SeekInfo
42-
}{
43-
"Sends valid request with default start position": {
44-
options: nil,
45-
expected: &orderer.SeekInfo{
46-
Start: &orderer.SeekPosition{
47-
Type: &orderer.SeekPosition_NextCommit{
48-
NextCommit: &orderer.SeekNextCommit{},
49-
},
50-
},
51-
Stop: seekLargestBlockNumber(),
52-
},
53-
},
54-
"Sends valid request with specified start block number": {
55-
options: []BlockEventsOption{
56-
WithStartBlock(418),
57-
},
58-
expected: &orderer.SeekInfo{
59-
Start: &orderer.SeekPosition{
60-
Type: &orderer.SeekPosition_Specified{
61-
Specified: &orderer.SeekSpecified{
62-
Number: 418,
63-
},
64-
},
65-
},
66-
Stop: seekLargestBlockNumber(),
67-
},
68-
},
69-
"Uses specified start block instead of unset checkpoint": {
70-
options: []BlockEventsOption{
71-
WithStartBlock(418),
72-
WithCheckpoint(new(InMemoryCheckpointer)),
73-
},
74-
expected: &orderer.SeekInfo{
75-
Start: &orderer.SeekPosition{
76-
Type: &orderer.SeekPosition_Specified{
77-
Specified: &orderer.SeekSpecified{
78-
Number: 418,
79-
},
80-
},
81-
},
82-
Stop: seekLargestBlockNumber(),
83-
},
84-
},
85-
"Uses checkpoint block instead of specified start block": {
86-
options: func() []BlockEventsOption {
87-
checkpointer := new(InMemoryCheckpointer)
88-
checkpointer.CheckpointBlock(500)
89-
return []BlockEventsOption{
90-
WithStartBlock(418),
91-
WithCheckpoint(checkpointer),
92-
}
93-
}(),
94-
expected: &orderer.SeekInfo{
95-
Start: &orderer.SeekPosition{
96-
Type: &orderer.SeekPosition_Specified{
97-
Specified: &orderer.SeekSpecified{
98-
Number: 501,
99-
},
100-
},
101-
},
102-
Stop: seekLargestBlockNumber(),
103-
},
104-
},
105-
"Uses checkpoint block zero with set transaction ID instead of specified start block": {
106-
options: func() []BlockEventsOption {
107-
checkpointer := new(InMemoryCheckpointer)
108-
checkpointer.CheckpointTransaction(0, "transctionId")
109-
return []BlockEventsOption{
110-
WithStartBlock(418),
111-
WithCheckpoint(checkpointer),
112-
}
113-
}(),
114-
expected: &orderer.SeekInfo{
115-
Start: &orderer.SeekPosition{
116-
Type: &orderer.SeekPosition_Specified{
117-
Specified: &orderer.SeekSpecified{
118-
Number: 0,
119-
},
120-
},
121-
},
122-
Stop: seekLargestBlockNumber(),
123-
},
124-
},
125-
"Uses default start position with unset checkpoint and no start block": {
126-
options: []BlockEventsOption{
127-
WithCheckpoint(new(InMemoryCheckpointer)),
128-
},
129-
expected: &orderer.SeekInfo{
130-
Start: &orderer.SeekPosition{
131-
Type: &orderer.SeekPosition_NextCommit{
132-
NextCommit: &orderer.SeekNextCommit{},
133-
},
134-
},
135-
Stop: seekLargestBlockNumber(),
136-
},
137-
},
138-
} {
139-
t.Run(testName, func(t *testing.T) {
140-
mockConnection := NewMockClientConnInterface(t)
141-
mockStream := NewMockClientStream(t)
142-
ExpectDeliver(mockConnection, WithNewStreamResult(mockStream))
143-
144-
messages := make(chan *common.Envelope, 1)
145-
ExpectSendMsg(mockStream, CaptureSendMsg(messages))
146-
mockStream.EXPECT().CloseSend().Maybe().Return(nil)
147-
ExpectRecvMsg(mockStream).Maybe().Return(io.EOF)
148-
149-
ctx, cancel := context.WithCancel(context.Background())
150-
defer cancel()
151-
152-
network := AssertNewTestNetwork(t, "NETWORK", WithClientConnection(mockConnection))
153-
_, err := network.BlockEvents(ctx, testCase.options...)
154-
require.NoError(t, err)
155-
156-
payload := &common.Payload{}
157-
AssertUnmarshal(t, (<-messages).GetPayload(), payload)
158-
AssertValidBlockEventRequestHeader(t, payload, network.Name())
159-
actual := &orderer.SeekInfo{}
160-
AssertUnmarshal(t, payload.GetData(), actual)
161-
162-
AssertProtoEqual(t, testCase.expected, actual)
163-
})
164-
}
165-
166-
t.Run("Closes event channel on receive error", func(t *testing.T) {
167-
mockConnection := NewMockClientConnInterface(t)
168-
mockStream := NewMockClientStream(t)
169-
ExpectDeliver(mockConnection, WithNewStreamResult(mockStream))
170-
171-
ExpectSendMsg(mockStream)
172-
mockStream.EXPECT().CloseSend().Maybe().Return(nil)
173-
ExpectRecvMsg(mockStream).Return(errors.New("fake"))
174-
175-
ctx, cancel := context.WithCancel(context.Background())
176-
defer cancel()
177-
178-
network := AssertNewTestNetwork(t, "NETWORK", WithClientConnection(mockConnection))
179-
receive, err := network.BlockEvents(ctx, WithStartBlock(418))
180-
require.NoError(t, err)
181-
182-
actual, ok := <-receive
183-
184-
require.False(t, ok, "Expected event listening to be cancelled, got %v", actual)
185-
})
186-
18716
t.Run("Receives events", func(t *testing.T) {
18817
expected := []*common.Block{
18918
{
@@ -208,13 +37,6 @@ func TestBlockEvents(t *testing.T) {
20837
},
20938
}
21039

211-
mockConnection := NewMockClientConnInterface(t)
212-
mockStream := NewMockClientStream(t)
213-
ExpectDeliver(mockConnection, WithNewStreamResult(mockStream))
214-
215-
ExpectSendMsg(mockStream)
216-
mockStream.EXPECT().CloseSend().Maybe().Return(nil)
217-
21840
var responses []*peer.DeliverResponse
21941
for _, block := range expected {
22042
responses = append(responses, &peer.DeliverResponse{
@@ -223,29 +45,23 @@ func TestBlockEvents(t *testing.T) {
22345
},
22446
})
22547
}
226-
ExpectRecvMsg(mockStream, WithRecvMsgs(responses...))
48+
49+
tester := NewBlockEventsTest(t)
50+
tester.SetResponses(responses...)
22751

22852
ctx, cancel := context.WithCancel(context.Background())
22953
defer cancel()
23054

231-
network := AssertNewTestNetwork(t, "NETWORK", WithClientConnection(mockConnection))
232-
receive, err := network.BlockEvents(ctx)
55+
err := tester.Events(ctx)
23356
require.NoError(t, err)
23457

23558
for _, event := range expected {
236-
actual := <-receive
59+
actual := <-tester.BlockEvents
23760
AssertProtoEqual(t, event, actual)
23861
}
23962
})
24063

24164
t.Run("Closes event channel on non-block message", func(t *testing.T) {
242-
mockConnection := NewMockClientConnInterface(t)
243-
mockStream := NewMockClientStream(t)
244-
ExpectDeliver(mockConnection, WithNewStreamResult(mockStream))
245-
246-
ExpectSendMsg(mockStream)
247-
mockStream.EXPECT().CloseSend().Maybe().Return(nil)
248-
24965
block := &common.Block{
25066
Header: &common.BlockHeader{
25167
Number: 1,
@@ -273,13 +89,14 @@ func TestBlockEvents(t *testing.T) {
27389
},
27490
},
27591
}
276-
ExpectRecvMsg(mockStream, WithRecvMsgs(responses...))
92+
93+
tester := NewBlockEventsTest(t)
94+
tester.SetResponses(responses...)
27795

27896
ctx, cancel := context.WithCancel(context.Background())
27997
defer cancel()
28098

281-
network := AssertNewTestNetwork(t, "NETWORK", WithClientConnection(mockConnection))
282-
receive, err := network.BlockEvents(ctx)
99+
err := tester.Events(ctx)
283100
require.NoError(t, err)
284101

285102
expected := []*common.Block{
@@ -288,60 +105,8 @@ func TestBlockEvents(t *testing.T) {
288105
nil,
289106
}
290107
for _, event := range expected {
291-
actual := <-receive
108+
actual := <-tester.BlockEvents
292109
AssertProtoEqual(t, event, actual)
293110
}
294111
})
295-
296-
t.Run("Uses specified gRPC call options", func(t *testing.T) {
297-
expected := grpc.WaitForReady(true)
298-
299-
mockConnection := NewMockClientConnInterface(t)
300-
mockStream := NewMockClientStream(t)
301-
options := make(chan []grpc.CallOption, 1)
302-
ExpectDeliver(mockConnection, CaptureNewStreamOptions(options), WithNewStreamResult(mockStream))
303-
304-
ExpectSendMsg(mockStream)
305-
mockStream.EXPECT().CloseSend().Maybe().Return(nil)
306-
ExpectRecvMsg(mockStream).Maybe().Return(io.EOF)
307-
308-
ctx, cancel := context.WithCancel(context.Background())
309-
defer cancel()
310-
311-
network := AssertNewTestNetwork(t, "NETWORK", WithClientConnection(mockConnection))
312-
request, err := network.NewBlockEventsRequest()
313-
require.NoError(t, err, "NewBlockEventsRequest")
314-
315-
_, err = request.Events(ctx, expected)
316-
require.NoError(t, err, "Events")
317-
318-
require.Contains(t, (<-options), expected, "CallOptions")
319-
})
320-
321-
t.Run("Sends request with TLS client certificate hash", func(t *testing.T) {
322-
expected := []byte("TLS_CLIENT_CERTIFICATE_HASH")
323-
324-
mockConnection := NewMockClientConnInterface(t)
325-
mockStream := NewMockClientStream(t)
326-
ExpectDeliver(mockConnection, WithNewStreamResult(mockStream))
327-
328-
requests := make(chan *common.Envelope, 1)
329-
ExpectSendMsg(mockStream, CaptureSendMsg(requests))
330-
mockStream.EXPECT().CloseSend().Maybe().Return(nil)
331-
ExpectRecvMsg(mockStream).Maybe().Return(io.EOF)
332-
333-
ctx, cancel := context.WithCancel(context.Background())
334-
defer cancel()
335-
336-
network := AssertNewTestNetwork(t, "NETWORK", WithClientConnection(mockConnection), WithTLSClientCertificateHash(expected))
337-
_, err := network.BlockEvents(ctx)
338-
require.NoError(t, err)
339-
340-
payload := &common.Payload{}
341-
AssertUnmarshal(t, (<-requests).GetPayload(), payload)
342-
channelHeader := &common.ChannelHeader{}
343-
AssertUnmarshal(t, payload.GetHeader().GetChannelHeader(), channelHeader)
344-
345-
require.Equal(t, expected, channelHeader.GetTlsCertHash())
346-
})
347112
}

0 commit comments

Comments
 (0)