Skip to content

Commit f68200d

Browse files
committed
Add 'TestDeduplicateProtoTxMessages'.
1 parent 921df09 commit f68200d

1 file changed

Lines changed: 93 additions & 0 deletions

File tree

pkg/node/helpers_internal_test.go

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package node
2+
3+
import (
4+
"context"
5+
"testing"
6+
"time"
7+
8+
"github.com/stretchr/testify/assert"
9+
10+
"github.com/wavesplatform/gowaves/pkg/p2p/peer"
11+
"github.com/wavesplatform/gowaves/pkg/proto"
12+
)
13+
14+
func testContext(t *testing.T) (context.Context, context.CancelFunc) {
15+
t.Helper()
16+
ctx, cancel := context.WithCancel(context.Background())
17+
t.Cleanup(cancel)
18+
return ctx, cancel
19+
}
20+
21+
func filledMsgChan(values ...proto.Message) chan peer.ProtoMessage {
22+
ch := make(chan peer.ProtoMessage, len(values))
23+
for _, v := range values {
24+
ch <- peer.ProtoMessage{
25+
ID: nil, // ID is not used in this test.
26+
Message: v,
27+
}
28+
}
29+
return ch
30+
}
31+
32+
func readProtoMessages(t *testing.T, ch <-chan peer.ProtoMessage, expectedMsgCount int) []proto.Message {
33+
timeout := time.NewTimer(5 * time.Second)
34+
messages := make([]proto.Message, 0, expectedMsgCount)
35+
for range expectedMsgCount {
36+
select {
37+
case <-timeout.C:
38+
t.Fatalf("timed out waiting for messages, check expectedMsgCount=%d", expectedMsgCount)
39+
case msg := <-ch:
40+
messages = append(messages, msg.Message)
41+
}
42+
}
43+
select {
44+
case msg := <-ch:
45+
t.Fatalf("unexpected message=%+v received, expected exactly %d messages", msg, expectedMsgCount)
46+
default:
47+
// No more messages expected, this is fine.
48+
}
49+
return messages
50+
}
51+
52+
func TestDeduplicateProtoTxMessages(t *testing.T) {
53+
messages := filledMsgChan(
54+
&proto.TransactionMessage{Transaction: nil},
55+
&proto.TransactionMessage{Transaction: nil}, // duplicate
56+
&proto.PBTransactionMessage{Transaction: nil}, // considered as duplicate because payloads are equal
57+
&proto.TransactionMessage{Transaction: []byte{1, 2, 3}},
58+
&proto.TransactionMessage{Transaction: []byte{1, 2, 3}}, // duplicate
59+
&proto.PBTransactionMessage{Transaction: []byte{1, 2, 3}}, // duplicate, payloads are equal
60+
&proto.PBTransactionMessage{Transaction: []byte{42}},
61+
&proto.TransactionMessage{Transaction: []byte{42}}, // duplicate, payloads are equal
62+
// -- non-transaction messages
63+
&proto.ScoreMessage{Score: nil},
64+
&proto.ScoreMessage{Score: nil},
65+
&proto.ScoreMessage{Score: []byte{1, 2, 3}},
66+
&proto.ScoreMessage{Score: []byte{1, 2, 3}},
67+
&proto.ScoreMessage{Score: []byte{42}},
68+
&proto.ScoreMessage{Score: []byte{42}},
69+
&proto.ScoreMessage{Score: []byte{21}},
70+
)
71+
72+
expected := []proto.Message{
73+
&proto.TransactionMessage{Transaction: nil},
74+
&proto.TransactionMessage{Transaction: []byte{1, 2, 3}},
75+
&proto.PBTransactionMessage{Transaction: []byte{42}},
76+
// -- non-transaction messages
77+
&proto.ScoreMessage{Score: nil},
78+
&proto.ScoreMessage{Score: nil},
79+
&proto.ScoreMessage{Score: []byte{1, 2, 3}},
80+
&proto.ScoreMessage{Score: []byte{1, 2, 3}},
81+
&proto.ScoreMessage{Score: []byte{42}},
82+
&proto.ScoreMessage{Score: []byte{42}},
83+
&proto.ScoreMessage{Score: []byte{21}},
84+
}
85+
86+
ctx, cancel := testContext(t)
87+
deduplicated, _, wg := deduplicateProtoTxMessages(ctx, messages)
88+
defer wg.Wait()
89+
defer cancel()
90+
91+
actual := readProtoMessages(t, deduplicated, len(expected))
92+
assert.ElementsMatch(t, expected, actual)
93+
}

0 commit comments

Comments
 (0)