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  }