@@ -2,8 +2,12 @@ package pubsub
22
33import (
44 "context"
5+ "fmt"
6+ "slices"
57 "testing"
68 "time"
9+
10+ pb "github.com/libp2p/go-libp2p-pubsub/pb"
711)
812
913func TestNewRpcQueue (t * testing.T ) {
@@ -227,3 +231,112 @@ func TestRpcQueueCancelPop(t *testing.T) {
227231 t .Fatalf ("rpc queue Pop returns wrong error when it's cancelled" )
228232 }
229233}
234+
235+ func TestRPCQueueCancellations (t * testing.T ) {
236+ maxSize := 32
237+ q := newRpcQueue (maxSize )
238+
239+ getMesssages := func (n int ) ([]* pb.Message , []string ) {
240+ msgs := make ([]* pb.Message , n )
241+ msgIDs := make ([]string , n )
242+ for i := range msgs {
243+ msgs [i ] = & pb.Message {Data : []byte (fmt .Sprintf ("message%d" , i + 1 ))}
244+ msgIDs [i ] = fmt .Sprintf ("msg%d" , i + 1 )
245+ }
246+ return msgs , msgIDs
247+ }
248+
249+ t .Run ("cancel all" , func (t * testing.T ) {
250+ msgs , msgIDs := getMesssages (10 )
251+ rpc := & RPC {
252+ RPC : pb.RPC {Publish : slices .Clone (msgs )},
253+ MsgIDs : slices .Clone (msgIDs ),
254+ }
255+ q .Push (rpc , true )
256+ q .CancelMessages (msgIDs )
257+ popped , err := q .Pop (context .Background ())
258+ if err != nil {
259+ t .Fatalf ("failed to pop RPC: %v" , err )
260+ }
261+ if len (popped .Publish ) != 0 {
262+ t .Fatalf ("expected popped.Publish to be empty, got %v" , popped .Publish )
263+ }
264+ if len (popped .MsgIDs ) != 0 {
265+ t .Fatalf ("expected popped.MsgIDs to be empty, got %v" , popped .MsgIDs )
266+ }
267+ if len (q .queuedMsgIDs ) != 0 {
268+ t .Fatalf ("expected q.queuedMsgIDs to be empty, got %v" , q .queuedMsgIDs )
269+ }
270+ if len (q .cancelledIDs ) != 0 {
271+ t .Fatalf ("expected q.cancelledIDs to be empty, got %v" , q .cancelledIDs )
272+ }
273+ })
274+
275+ t .Run ("cancel some" , func (t * testing.T ) {
276+ msgs , msgIDs := getMesssages (10 )
277+ rpc := & RPC {
278+ RPC : pb.RPC {Publish : slices .Clone (msgs )},
279+ MsgIDs : slices .Clone (msgIDs ),
280+ }
281+ q .Push (rpc , true )
282+ q .CancelMessages (msgIDs [:3 ])
283+ popped , err := q .Pop (context .Background ())
284+ if err != nil {
285+ t .Fatalf ("failed to pop RPC: %v" , err )
286+ }
287+ if ! slices .Equal (msgs [3 :], popped .Publish ) {
288+ t .Fatalf ("expected popped.Publish to be %v, got %v" , msgs [3 :], popped .Publish )
289+ }
290+ if ! slices .Equal (msgIDs [3 :], popped .MsgIDs ) {
291+ t .Fatalf ("expected popped.MsgIDs to be %v, got %v" , msgIDs [3 :], popped .MsgIDs )
292+ }
293+ if len (q .queuedMsgIDs ) != 0 {
294+ t .Fatalf ("expected q.queuedMsgIDs to be empty, got %v" , q .queuedMsgIDs )
295+ }
296+ if len (q .cancelledIDs ) != 0 {
297+ t .Fatalf ("expected q.cancelledIDs to be empty, got %v" , q .cancelledIDs )
298+ }
299+ })
300+
301+ t .Run ("cancel duplicate" , func (t * testing.T ) {
302+ msgs , msgIDs := getMesssages (10 )
303+ rpc := & RPC {
304+ RPC : pb.RPC {Publish : slices .Clone (msgs )},
305+ MsgIDs : slices .Clone (msgIDs ),
306+ }
307+ q .Push (rpc , true )
308+ rpc2 := & RPC {
309+ RPC : pb.RPC {Publish : slices .Clone (msgs )},
310+ MsgIDs : slices .Clone (msgIDs ),
311+ }
312+ q .Push (rpc2 , true )
313+ q .CancelMessages (msgIDs [:3 ])
314+ popped , err := q .Pop (context .Background ())
315+ if err != nil {
316+ t .Fatalf ("failed to pop RPC: %v" , err )
317+ }
318+ if ! slices .Equal (msgs [3 :], popped .Publish ) {
319+ t .Fatalf ("expected popped.Publish to be %v, got %v" , msgs [3 :], popped .Publish )
320+ }
321+ if ! slices .Equal (msgIDs [3 :], popped .MsgIDs ) {
322+ t .Fatalf ("expected popped.MsgIDs to be %v, got %v" , msgIDs [3 :], popped .MsgIDs )
323+ }
324+
325+ popped , err = q .Pop (context .Background ())
326+ if err != nil {
327+ t .Fatalf ("failed to pop RPC: %v" , err )
328+ }
329+ if ! slices .Equal (msgs [3 :], popped .Publish ) {
330+ t .Fatalf ("expected popped.Publish to be %v, got %v" , msgs [3 :], popped .Publish )
331+ }
332+ if ! slices .Equal (msgIDs [3 :], popped .MsgIDs ) {
333+ t .Fatalf ("expected popped.MsgIDs to be %v, got %v" , msgIDs [3 :], popped .MsgIDs )
334+ }
335+ if len (q .queuedMsgIDs ) != 0 {
336+ t .Fatalf ("expected q.queuedMsgIDs to be empty, got %v" , q .queuedMsgIDs )
337+ }
338+ if len (q .cancelledIDs ) != 0 {
339+ t .Fatalf ("expected q.cancelledIDs to be empty, got %v" , q .cancelledIDs )
340+ }
341+ })
342+ }
0 commit comments