github.com/cilium/cilium@v1.16.2/pkg/maps/multicast/subscribermap_test.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright Authors of Cilium 3 4 package multicast 5 6 import ( 7 "net/netip" 8 "testing" 9 10 "github.com/cilium/ebpf/rlimit" 11 "github.com/stretchr/testify/assert" 12 13 "github.com/cilium/cilium/pkg/bpf" 14 "github.com/cilium/cilium/pkg/testutils" 15 ) 16 17 const ( 18 TestGroupV4OuterMapName = "test_cilium_mcast_group_v4_outer" 19 ) 20 21 func TestSubscriberMap(t *testing.T) { 22 testutils.PrivilegedTest(t) 23 24 bpf.CheckOrMountFS("") 25 assert.NoError(t, rlimit.RemoveMemlock()) 26 27 groupMapEBPF := NewGroupV4OuterMap(TestGroupV4OuterMapName) 28 err := groupMapEBPF.OpenOrCreate() 29 groupMapEBPF.Unpin() 30 assert.NoError(t, err) 31 32 t.Cleanup(func() { 33 t.Logf("Cleaning up GroupV4OuterMap") 34 if err := groupMapEBPF.Close(); err != nil { 35 t.Logf("Failed to cleanup Multicast Subscriber map: %v", err) 36 } 37 }) 38 39 // Cast to our interface to get a useful method set. 40 groupMap := GroupV4Map(groupMapEBPF) 41 42 // Multicast group1 to insert 43 group1 := netip.MustParseAddr("229.0.0.1") 44 45 group2 := netip.MustParseAddr("229.0.0.2") 46 47 // Insert group, no error expected 48 assert.NoError(t, groupMap.Insert(group1)) 49 50 // Insert group2, no error expected 51 assert.NoError(t, groupMap.Insert(group2)) 52 53 // Insert duplicate group, should detect error 54 assert.Error(t, groupMap.Insert(group1)) 55 56 // Check we can list created multicast groups 57 groups, err := groupMap.List() 58 assert.NoError(t, err) 59 assert.Len(t, groups, 2) 60 // eBPF map iteration is non-deterministic, so check in a loop 61 for _, group := range groups { 62 if (group1.Compare(group) != 0) && (group2.Compare(group) != 0) { 63 t.Fatalf("group %v did not match either of our created multicast groups", group) 64 } 65 } 66 67 // Lookup first subscriber 68 subMap, err := groupMap.Lookup(group1) 69 assert.NoError(t, err) 70 71 // Lookup second subscriber 72 _, err = groupMap.Lookup(group1) 73 assert.NoError(t, err) 74 75 // Insert a subscriber into subscriber inner map 76 src := netip.MustParseAddr("192.168.0.1") 77 subscriber := SubscriberV4{ 78 SAddr: src, 79 Ifindex: 1, 80 IsRemote: true, 81 } 82 83 assert.NoError(t, subMap.Insert(&subscriber)) 84 85 // Lookup subscriber 86 var subFound *SubscriberV4 87 subFound, err = subMap.Lookup(src) 88 assert.NoError(t, err) 89 90 // Subscriber should be equal 91 assert.Equal(t, subscriber, *subFound) 92 93 // Check we can list created subscriber 94 subs, err := subMap.List() 95 assert.NoError(t, err) 96 assert.Len(t, subs, 1) 97 assert.Equal(t, subscriber, *subs[0]) 98 99 // Delete the subscriber 100 assert.NoError(t, subMap.Delete(src)) 101 102 // Ensure deletion 103 _, err = subMap.Lookup(src) 104 assert.Error(t, err) 105 106 // Delete multicast group 107 groupMap.Delete(group1) 108 groupMap.Delete(group2) 109 110 // ensure multicast group deletion 111 _, err = groupMap.Lookup(group1) 112 assert.Error(t, err) 113 _, err = groupMap.Lookup(group2) 114 assert.Error(t, err) 115 }