Skip to content

Commit 6544e57

Browse files
committed
[FAB-3462] Unit tests for gossip message comparator
Gossip protobuf related files has poor test code coverage, this commit takes care to add test coverage by adding tests cases for gossip message coverage. Change-Id: I6287f0b65f45d8e7463ab18376c4a8891fb19852 Signed-off-by: Artem Barger <[email protected]>
1 parent f4a7631 commit 6544e57

File tree

3 files changed

+253
-3
lines changed

3 files changed

+253
-3
lines changed

gossip/common/common.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ type InvalidationResult int
5656

5757
const (
5858
// MessageNoAction means messages have no relation
59-
MessageNoAction = iota
59+
MessageNoAction InvalidationResult = iota
6060
// MessageInvalidates means message invalidates the other message
6161
MessageInvalidates
6262
// MessageInvalidated means message is invalidated by the other message

protos/gossip/extensions.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,8 @@ package gossip
1818

1919
import (
2020
"bytes"
21-
"fmt"
22-
2321
"errors"
22+
"fmt"
2423

2524
"github.com/golang/protobuf/proto"
2625
"github.com/hyperledger/fabric/gossip/api"

protos/gossip/extensions_test.go

+251
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"fmt"
2121
"testing"
2222

23+
"github.com/hyperledger/fabric/gossip/common"
2324
"github.com/stretchr/testify/assert"
2425
)
2526

@@ -136,6 +137,205 @@ func TestToString(t *testing.T) {
136137
assert.NotContains(t, fmt.Sprintf("%v", sMsg), "2")
137138
}
138139

140+
func TestAliveMessageNoActionTaken(t *testing.T) {
141+
comparator := NewGossipMessageComparator(1)
142+
143+
sMsg1 := signedGossipMessage("testChannel", &GossipMessage_AliveMsg{
144+
AliveMsg: &AliveMessage{
145+
Membership: &Member{
146+
Endpoint: "localhost",
147+
Metadata: []byte{1, 2, 3, 4, 5},
148+
PkiId: []byte{17},
149+
},
150+
Timestamp: &PeerTime{
151+
IncNumber: 1,
152+
SeqNum: 1,
153+
},
154+
Identity: []byte("peerID1"),
155+
},
156+
})
157+
158+
sMsg2 := signedGossipMessage("testChannel", &GossipMessage_AliveMsg{
159+
AliveMsg: &AliveMessage{
160+
Membership: &Member{
161+
Endpoint: "localhost",
162+
Metadata: []byte{1, 2, 3, 4, 5},
163+
PkiId: []byte{15},
164+
},
165+
Timestamp: &PeerTime{
166+
IncNumber: 2,
167+
SeqNum: 2,
168+
},
169+
Identity: []byte("peerID1"),
170+
},
171+
})
172+
173+
assert.Equal(t, comparator(sMsg1, sMsg2), common.MessageNoAction)
174+
}
175+
176+
func TestStateInfoMessageNoActionTaken(t *testing.T) {
177+
comparator := NewGossipMessageComparator(1)
178+
179+
// msg1 and msg2 have same channel mac, while different pkid, while
180+
// msg and msg3 same pkid and different channel mac
181+
182+
sMsg1 := signedGossipMessage("testChannel", stateInfoMessage(1, 1, []byte{17}, []byte{17, 13}))
183+
sMsg2 := signedGossipMessage("testChannel", stateInfoMessage(1, 1, []byte{13}, []byte{17, 13}))
184+
185+
// We only should compare comparable messages, e.g. message from same peer
186+
// In any other cases no invalidation should be taken.
187+
assert.Equal(t, comparator(sMsg1, sMsg2), common.MessageNoAction)
188+
}
189+
190+
func TestStateInfoMessagesInvalidation(t *testing.T) {
191+
comparator := NewGossipMessageComparator(1)
192+
193+
sMsg1 := signedGossipMessage("testChannel", stateInfoMessage(1, 1, []byte{17}, []byte{17}))
194+
sMsg2 := signedGossipMessage("testChannel", stateInfoMessage(1, 1, []byte{17}, []byte{17}))
195+
sMsg3 := signedGossipMessage("testChannel", stateInfoMessage(1, 2, []byte{17}, []byte{17}))
196+
sMsg4 := signedGossipMessage("testChannel", stateInfoMessage(2, 1, []byte{17}, []byte{17}))
197+
198+
assert.Equal(t, comparator(sMsg1, sMsg2), common.MessageInvalidated)
199+
200+
assert.Equal(t, comparator(sMsg1, sMsg3), common.MessageInvalidated)
201+
assert.Equal(t, comparator(sMsg3, sMsg1), common.MessageInvalidates)
202+
203+
assert.Equal(t, comparator(sMsg1, sMsg4), common.MessageInvalidated)
204+
assert.Equal(t, comparator(sMsg4, sMsg1), common.MessageInvalidates)
205+
206+
assert.Equal(t, comparator(sMsg3, sMsg4), common.MessageInvalidated)
207+
assert.Equal(t, comparator(sMsg4, sMsg3), common.MessageInvalidates)
208+
}
209+
210+
func TestAliveMessageInvalidation(t *testing.T) {
211+
comparator := NewGossipMessageComparator(1)
212+
213+
sMsg1 := signedGossipMessage("testChannel", &GossipMessage_AliveMsg{
214+
AliveMsg: &AliveMessage{
215+
Membership: &Member{
216+
Endpoint: "localhost",
217+
Metadata: []byte{1, 2, 3, 4, 5},
218+
PkiId: []byte{17},
219+
},
220+
Timestamp: &PeerTime{
221+
IncNumber: 1,
222+
SeqNum: 1,
223+
},
224+
Identity: []byte("peerID1"),
225+
},
226+
})
227+
228+
sMsg2 := signedGossipMessage("testChannel", &GossipMessage_AliveMsg{
229+
AliveMsg: &AliveMessage{
230+
Membership: &Member{
231+
Endpoint: "localhost",
232+
Metadata: []byte{1, 2, 3, 4, 5},
233+
PkiId: []byte{17},
234+
},
235+
Timestamp: &PeerTime{
236+
IncNumber: 2,
237+
SeqNum: 2,
238+
},
239+
Identity: []byte("peerID1"),
240+
},
241+
})
242+
243+
sMsg3 := signedGossipMessage("testChannel", &GossipMessage_AliveMsg{
244+
AliveMsg: &AliveMessage{
245+
Membership: &Member{
246+
Endpoint: "localhost",
247+
Metadata: []byte{1, 2, 3, 4, 5},
248+
PkiId: []byte{17},
249+
},
250+
Timestamp: &PeerTime{
251+
IncNumber: 1,
252+
SeqNum: 2,
253+
},
254+
Identity: []byte("peerID1"),
255+
},
256+
})
257+
258+
assert.Equal(t, comparator(sMsg1, sMsg2), common.MessageInvalidated)
259+
assert.Equal(t, comparator(sMsg2, sMsg1), common.MessageInvalidates)
260+
assert.Equal(t, comparator(sMsg1, sMsg3), common.MessageInvalidated)
261+
assert.Equal(t, comparator(sMsg3, sMsg1), common.MessageInvalidates)
262+
}
263+
264+
func TestDataMessageInvalidation(t *testing.T) {
265+
comparator := NewGossipMessageComparator(5)
266+
267+
data := []byte{1, 1, 1}
268+
sMsg1 := signedGossipMessage("testChannel", dataMessage(1, "hash", data))
269+
sMsg2 := signedGossipMessage("testChannel", dataMessage(1, "hash", data))
270+
sMsg3 := signedGossipMessage("testChannel", dataMessage(1, "newHash", data))
271+
sMsg4 := signedGossipMessage("testChannel", dataMessage(2, "newHash", data))
272+
sMsg5 := signedGossipMessage("testChannel", dataMessage(7, "newHash", data))
273+
274+
assert.Equal(t, comparator(sMsg1, sMsg2), common.MessageInvalidated)
275+
assert.Equal(t, comparator(sMsg1, sMsg3), common.MessageNoAction)
276+
assert.Equal(t, comparator(sMsg1, sMsg4), common.MessageNoAction)
277+
assert.Equal(t, comparator(sMsg1, sMsg5), common.MessageInvalidated)
278+
assert.Equal(t, comparator(sMsg5, sMsg1), common.MessageInvalidates)
279+
}
280+
281+
func TestIdentityMessagesInvalidation(t *testing.T) {
282+
comparator := NewGossipMessageComparator(5)
283+
284+
msg1 := signedGossipMessage("testChannel", &GossipMessage_PeerIdentity{
285+
PeerIdentity: &PeerIdentity{
286+
PkiId: []byte{17},
287+
Cert: []byte{1, 2, 3, 4},
288+
Metadata: nil,
289+
},
290+
})
291+
292+
msg2 := signedGossipMessage("testChannel", &GossipMessage_PeerIdentity{
293+
PeerIdentity: &PeerIdentity{
294+
PkiId: []byte{17},
295+
Cert: []byte{1, 2, 3, 4},
296+
Metadata: nil,
297+
},
298+
})
299+
300+
msg3 := signedGossipMessage("testChannel", &GossipMessage_PeerIdentity{
301+
PeerIdentity: &PeerIdentity{
302+
PkiId: []byte{11},
303+
Cert: []byte{11, 21, 31, 41},
304+
Metadata: nil,
305+
},
306+
})
307+
308+
assert.Equal(t, comparator(msg1, msg2), common.MessageInvalidated)
309+
assert.Equal(t, comparator(msg1, msg3), common.MessageNoAction)
310+
}
311+
312+
func TestLeadershipMessagesNoAction(t *testing.T) {
313+
comparator := NewGossipMessageComparator(5)
314+
315+
msg1 := signedGossipMessage("testChannel", leadershipMessage(1, 1, []byte{17}))
316+
msg2 := signedGossipMessage("testChannel", leadershipMessage(1, 1, []byte{11}))
317+
318+
// If message with different pkid's no action should be taken
319+
assert.Equal(t, comparator(msg1, msg2), common.MessageNoAction)
320+
}
321+
322+
func TestLeadershipMessagesInvalidation(t *testing.T) {
323+
comparator := NewGossipMessageComparator(5)
324+
325+
pkiID := []byte{17}
326+
msg1 := signedGossipMessage("testChannel", leadershipMessage(1, 1, pkiID))
327+
msg2 := signedGossipMessage("testChannel", leadershipMessage(1, 2, pkiID))
328+
msg3 := signedGossipMessage("testChannel", leadershipMessage(2, 1, pkiID))
329+
330+
// If message with different pkid's no action should be taken
331+
assert.Equal(t, comparator(msg1, msg2), common.MessageInvalidated)
332+
assert.Equal(t, comparator(msg2, msg1), common.MessageInvalidates)
333+
assert.Equal(t, comparator(msg1, msg3), common.MessageInvalidated)
334+
assert.Equal(t, comparator(msg3, msg1), common.MessageInvalidates)
335+
assert.Equal(t, comparator(msg2, msg3), common.MessageInvalidated)
336+
assert.Equal(t, comparator(msg3, msg2), common.MessageInvalidates)
337+
}
338+
139339
func envelopes() []*Envelope {
140340
return []*Envelope{
141341
{Payload: []byte{2, 2, 2},
@@ -147,3 +347,54 @@ func envelopes() []*Envelope {
147347
},
148348
}
149349
}
350+
351+
func leadershipMessage(incNum uint64, seqNum uint64, pkid []byte) *GossipMessage_LeadershipMsg {
352+
return &GossipMessage_LeadershipMsg{
353+
LeadershipMsg: &LeadershipMessage{
354+
PkiId: pkid,
355+
IsDeclaration: false,
356+
Timestamp: &PeerTime{
357+
IncNumber: incNum,
358+
SeqNum: seqNum,
359+
},
360+
},
361+
}
362+
}
363+
364+
func stateInfoMessage(incNumber uint64, seqNum uint64, pkid []byte, mac []byte) *GossipMessage_StateInfo {
365+
return &GossipMessage_StateInfo{
366+
StateInfo: &StateInfo{
367+
Metadata: []byte{},
368+
Timestamp: &PeerTime{
369+
IncNumber: incNumber,
370+
SeqNum: seqNum,
371+
},
372+
PkiId: pkid,
373+
ChannelMAC: mac,
374+
},
375+
}
376+
}
377+
378+
func dataMessage(seqNum uint64, hash string, data []byte) *GossipMessage_DataMsg {
379+
return &GossipMessage_DataMsg{
380+
DataMsg: &DataMessage{
381+
Payload: &Payload{
382+
SeqNum: seqNum,
383+
Hash: hash,
384+
Data: data,
385+
},
386+
},
387+
}
388+
}
389+
390+
func signedGossipMessage(channelID string, content isGossipMessage_Content) *SignedGossipMessage {
391+
return &SignedGossipMessage{
392+
GossipMessage: &GossipMessage{
393+
Channel: []byte("testChannel"),
394+
Tag: GossipMessage_EMPTY,
395+
Nonce: 0,
396+
Content: content,
397+
},
398+
Envelope: envelopes()[0],
399+
}
400+
}

0 commit comments

Comments
 (0)