github.com/cilium/cilium@v1.16.2/pkg/labels/arraylist_test.go (about)

     1  // SPDX-License-Identifier: Apache-2.0
     2  // Copyright Authors of Cilium
     3  
     4  package labels
     5  
     6  import (
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/require"
    10  )
    11  
    12  func TestLabelArrayListEquals(t *testing.T) {
    13  	list1 := LabelArrayList{
    14  		{
    15  			NewLabel("env", "devel", LabelSourceAny),
    16  			NewLabel("user", "bob", LabelSourceContainer),
    17  		},
    18  		{
    19  			NewLabel("foo", "bar", LabelSourceAny),
    20  		},
    21  	}
    22  	list2 := LabelArrayList{
    23  		{
    24  			NewLabel("env", "devel", LabelSourceAny),
    25  			NewLabel("user", "bob", LabelSourceContainer),
    26  		},
    27  		{
    28  			NewLabel("foo", "bar", LabelSourceAny),
    29  		},
    30  	}
    31  	list3 := LabelArrayList{
    32  		{
    33  			NewLabel("foo", "bar", LabelSourceAny),
    34  		},
    35  		{
    36  			NewLabel("env", "devel", LabelSourceAny),
    37  			NewLabel("user", "bob", LabelSourceContainer),
    38  		},
    39  	}
    40  	list4 := LabelArrayList{
    41  		{
    42  			NewLabel("env", "devel", LabelSourceAny),
    43  			NewLabel("user", "bob", LabelSourceContainer),
    44  		},
    45  	}
    46  	list5 := LabelArrayList(nil)
    47  	list6 := LabelArrayList{}
    48  
    49  	require.Equal(t, true, list1.Equals(list1))
    50  	require.Equal(t, true, list1.Equals(list2))
    51  	require.Equal(t, false, list1.Equals(list3))
    52  	require.Equal(t, false, list1.Equals(list4))
    53  	require.Equal(t, false, list1.Equals(list5))
    54  	require.Equal(t, false, list1.Equals(list6))
    55  
    56  	require.Equal(t, true, list2.Equals(list1))
    57  	require.Equal(t, true, list2.Equals(list2))
    58  	require.Equal(t, false, list2.Equals(list3))
    59  	require.Equal(t, false, list2.Equals(list4))
    60  	require.Equal(t, false, list2.Equals(list5))
    61  	require.Equal(t, false, list2.Equals(list6))
    62  
    63  	require.Equal(t, false, list3.Equals(list1))
    64  	require.Equal(t, false, list3.Equals(list2))
    65  	require.Equal(t, true, list3.Equals(list3))
    66  	require.Equal(t, false, list3.Equals(list4))
    67  	require.Equal(t, false, list3.Equals(list5))
    68  	require.Equal(t, false, list3.Equals(list6))
    69  
    70  	require.Equal(t, false, list4.Equals(list1))
    71  	require.Equal(t, false, list4.Equals(list2))
    72  	require.Equal(t, false, list4.Equals(list3))
    73  	require.Equal(t, true, list4.Equals(list4))
    74  	require.Equal(t, false, list4.Equals(list5))
    75  	require.Equal(t, false, list4.Equals(list6))
    76  
    77  	require.Equal(t, false, list5.Equals(list1))
    78  	require.Equal(t, false, list5.Equals(list2))
    79  	require.Equal(t, false, list5.Equals(list3))
    80  	require.Equal(t, false, list5.Equals(list4))
    81  	require.Equal(t, true, list5.Equals(list5))
    82  	require.Equal(t, true, list5.Equals(list6))
    83  
    84  	require.Equal(t, false, list6.Equals(list1))
    85  	require.Equal(t, false, list6.Equals(list2))
    86  	require.Equal(t, false, list6.Equals(list3))
    87  	require.Equal(t, false, list6.Equals(list4))
    88  	require.Equal(t, true, list6.Equals(list5))
    89  	require.Equal(t, true, list6.Equals(list6))
    90  }
    91  
    92  func TestLabelArrayListSort(t *testing.T) {
    93  	require.EqualValues(t, LabelArrayList(nil), LabelArrayList(nil).Sort())
    94  	require.EqualValues(t, LabelArrayList{}, LabelArrayList{}.Sort())
    95  
    96  	list1 := LabelArrayList{
    97  		{
    98  			NewLabel("env", "devel", LabelSourceAny),
    99  			NewLabel("user", "bob", LabelSourceContainer),
   100  		},
   101  		{
   102  			NewLabel("aaa", "", LabelSourceReserved),
   103  		},
   104  		{
   105  			NewLabel("env", "devel", LabelSourceAny),
   106  			NewLabel("user", "bob", LabelSourceContainer),
   107  			NewLabel("xyz", "", LabelSourceAny),
   108  		},
   109  		{
   110  			NewLabel("env", "devel", LabelSourceAny),
   111  		},
   112  		nil,
   113  		{
   114  			NewLabel("foo", "bar", LabelSourceAny),
   115  		},
   116  	}
   117  	expected1 := LabelArrayList{
   118  		nil,
   119  		{
   120  			NewLabel("aaa", "", LabelSourceReserved),
   121  		},
   122  		{
   123  			NewLabel("env", "devel", LabelSourceAny),
   124  		},
   125  		{
   126  			NewLabel("env", "devel", LabelSourceAny),
   127  			NewLabel("user", "bob", LabelSourceContainer),
   128  		},
   129  		{
   130  			NewLabel("env", "devel", LabelSourceAny),
   131  			NewLabel("user", "bob", LabelSourceContainer),
   132  			NewLabel("xyz", "", LabelSourceAny),
   133  		},
   134  		{
   135  			NewLabel("foo", "bar", LabelSourceAny),
   136  		},
   137  	}
   138  
   139  	require.EqualValues(t, expected1, list1.Sort())
   140  
   141  	list2 := LabelArrayList{
   142  		{
   143  			NewLabel("aaa", "", LabelSourceReserved),
   144  		},
   145  		{
   146  			NewLabel("env", "devel", LabelSourceAny),
   147  		},
   148  		{
   149  			NewLabel("aaa", "", LabelSourceAny),
   150  		},
   151  	}
   152  	expected2 := LabelArrayList{
   153  		{
   154  			NewLabel("aaa", "", LabelSourceAny),
   155  		},
   156  		{
   157  			NewLabel("aaa", "", LabelSourceReserved),
   158  		},
   159  		{
   160  			NewLabel("env", "devel", LabelSourceAny),
   161  		},
   162  	}
   163  	require.EqualValues(t, expected2, list2.Sort())
   164  }
   165  
   166  func TestLabelArrayListMergeSorted(t *testing.T) {
   167  	list1 := LabelArrayList{
   168  		{
   169  			NewLabel("env", "devel", LabelSourceAny),
   170  			NewLabel("user", "bob", LabelSourceContainer),
   171  		},
   172  		{
   173  			NewLabel("foo", "bar", LabelSourceAny),
   174  		},
   175  	}
   176  	list2 := LabelArrayList{
   177  		{
   178  			NewLabel("env", "devel", LabelSourceAny),
   179  			NewLabel("user", "bob", LabelSourceContainer),
   180  		},
   181  		{
   182  			NewLabel("foo", "bar", LabelSourceAny),
   183  		},
   184  	}
   185  	list3 := LabelArrayList{
   186  		{
   187  			NewLabel("foo", "bar", LabelSourceAny),
   188  		},
   189  		{
   190  			NewLabel("env", "devel", LabelSourceAny),
   191  			NewLabel("user", "bob", LabelSourceContainer),
   192  		},
   193  	}
   194  	list4 := LabelArrayList{
   195  		{
   196  			NewLabel("env", "devel", LabelSourceAny),
   197  			NewLabel("user", "bob", LabelSourceContainer),
   198  		},
   199  	}
   200  	list5 := LabelArrayList(nil)
   201  	list6 := LabelArrayList{}
   202  	list7 := LabelArrayList{
   203  		{
   204  			NewLabel("env", "prod", LabelSourceAny),
   205  			NewLabel("user", "alice", LabelSourceContainer),
   206  		},
   207  	}
   208  
   209  	expected1 := LabelArrayList{
   210  		{
   211  			NewLabel("env", "devel", LabelSourceAny),
   212  			NewLabel("user", "bob", LabelSourceContainer),
   213  		},
   214  		{
   215  			NewLabel("foo", "bar", LabelSourceAny),
   216  		},
   217  	}
   218  
   219  	cases := []struct {
   220  		name     string
   221  		a, b     LabelArrayList
   222  		expected LabelArrayList
   223  	}{
   224  		{name: "same list", a: list1, b: list1, expected: expected1},
   225  		{name: "equal lists", a: list1, b: list2, expected: expected1},
   226  		{name: "unsorted equal lists", a: list1, b: list3, expected: expected1},
   227  		{name: "list b contained in list a", a: list1, b: list4, expected: expected1},
   228  		{name: "list a contained in list b", a: list4, b: list1, expected: expected1},
   229  		{name: "nil label arrays", a: list1, b: list5, expected: list1},
   230  		{name: "empty label array lists", a: list1, b: list6, expected: list1},
   231  		{name: "two different lists", a: list1, b: list7, expected: LabelArrayList{
   232  			{
   233  				NewLabel("env", "devel", LabelSourceAny),
   234  				NewLabel("user", "bob", LabelSourceContainer),
   235  			},
   236  			{
   237  				NewLabel("env", "prod", LabelSourceAny),
   238  				NewLabel("user", "alice", LabelSourceContainer),
   239  			},
   240  			{
   241  				NewLabel("foo", "bar", LabelSourceAny),
   242  			},
   243  		}},
   244  	}
   245  
   246  	for _, tc := range cases {
   247  		// Copy to avoid polluting lists for the next cases.
   248  		a := tc.a.DeepCopy()
   249  		b := tc.b.DeepCopy()
   250  		a.Merge(b...)
   251  		require.EqualValues(t, tc.expected, a, tc.name)
   252  		require.EqualValues(t, a.Sort(), a, tc.name+" returned unsorted result")
   253  
   254  		a = tc.a.DeepCopy().Sort()
   255  		b = tc.b.DeepCopy().Sort()
   256  		a.MergeSorted(b)
   257  		require.EqualValues(t, tc.expected, a, tc.name+" MergeSorted")
   258  		require.EqualValues(t, a.Sort(), a, tc.name+" MergeSorted returned unsorted result")
   259  	}
   260  }