github.com/hernad/nomad@v1.6.112/drivers/shared/capabilities/set_test.go (about)

     1  // Copyright (c) HashiCorp, Inc.
     2  // SPDX-License-Identifier: MPL-2.0
     3  
     4  package capabilities
     5  
     6  import (
     7  	"testing"
     8  
     9  	"github.com/hernad/nomad/ci"
    10  	"github.com/stretchr/testify/require"
    11  )
    12  
    13  func TestSet_Empty(t *testing.T) {
    14  	ci.Parallel(t)
    15  
    16  	t.Run("nil", func(t *testing.T) {
    17  		result := New(nil).Empty()
    18  		require.True(t, result)
    19  	})
    20  
    21  	t.Run("empty", func(t *testing.T) {
    22  		result := New([]string{}).Empty()
    23  		require.True(t, result)
    24  	})
    25  
    26  	t.Run("full", func(t *testing.T) {
    27  		result := New([]string{"chown", "sys_time"}).Empty()
    28  		require.False(t, result)
    29  	})
    30  }
    31  
    32  func TestSet_New(t *testing.T) {
    33  	ci.Parallel(t)
    34  
    35  	t.Run("duplicates", func(t *testing.T) {
    36  		result := New([]string{"chown", "sys_time", "chown"})
    37  		require.Equal(t, "chown, sys_time", result.String())
    38  	})
    39  
    40  	t.Run("empty string", func(t *testing.T) {
    41  		result := New([]string{""})
    42  		require.True(t, result.Empty())
    43  	})
    44  
    45  	t.Run("all", func(t *testing.T) {
    46  		result := New([]string{"all"})
    47  		exp := len(Supported().Slice(false))
    48  		require.Len(t, result.Slice(false), exp)
    49  	})
    50  }
    51  
    52  func TestSet_Slice(t *testing.T) {
    53  	ci.Parallel(t)
    54  
    55  	exp := []string{"chown", "net_raw", "sys_time"}
    56  
    57  	t.Run("lower case", func(t *testing.T) {
    58  		s := New([]string{"net_raw", "chown", "sys_time"})
    59  		require.Equal(t, exp, s.Slice(false))
    60  	})
    61  
    62  	t.Run("upper case", func(t *testing.T) {
    63  		s := New([]string{"NET_RAW", "CHOWN", "SYS_TIME"})
    64  		require.Equal(t, exp, s.Slice(false))
    65  	})
    66  
    67  	t.Run("prefix", func(t *testing.T) {
    68  		s := New([]string{"CAP_net_raw", "sys_TIME", "cap_chown"})
    69  		require.Equal(t, exp, s.Slice(false))
    70  	})
    71  }
    72  
    73  func TestSet_String(t *testing.T) {
    74  	ci.Parallel(t)
    75  
    76  	t.Run("empty", func(t *testing.T) {
    77  		result := New(nil).String()
    78  		require.Equal(t, "", result)
    79  	})
    80  
    81  	t.Run("full", func(t *testing.T) {
    82  		exp := "chown, net_raw, sys_time"
    83  		in := []string{"net_raw", "CAP_CHOWN", "cap_sys_time"}
    84  		result := New(in).String()
    85  		require.Equal(t, exp, result)
    86  	})
    87  }
    88  
    89  func TestSet_Add(t *testing.T) {
    90  	ci.Parallel(t)
    91  
    92  	t.Run("add one", func(t *testing.T) {
    93  		s := New([]string{"chown", "net_raw"})
    94  		require.Equal(t, "chown, net_raw", s.String())
    95  
    96  		s.Add("CAP_SYS_TIME")
    97  		require.Equal(t, "chown, net_raw, sys_time", s.String())
    98  
    99  		s.Add("AF_NET")
   100  		require.Equal(t, "af_net, chown, net_raw, sys_time", s.String())
   101  	})
   102  
   103  	t.Run("add empty string", func(t *testing.T) {
   104  		s := New([]string{"chown"})
   105  		s.Add("")
   106  		require.Equal(t, "chown", s.String())
   107  	})
   108  
   109  	t.Run("add all", func(t *testing.T) {
   110  		s := New([]string{"chown", "net_raw"})
   111  		require.Equal(t, "chown, net_raw", s.String())
   112  
   113  		exp := len(Supported().Slice(false))
   114  		s.Add("all")
   115  		require.Len(t, s.Slice(false), exp)
   116  	})
   117  
   118  }
   119  
   120  func TestSet_Remove(t *testing.T) {
   121  	ci.Parallel(t)
   122  
   123  	t.Run("remove one", func(t *testing.T) {
   124  		s := New([]string{"af_net", "chown", "net_raw", "seteuid", "sys_time"})
   125  		s.Remove([]string{"CAP_NET_RAW"})
   126  		require.Equal(t, "af_net, chown, seteuid, sys_time", s.String())
   127  	})
   128  
   129  	t.Run("remove couple", func(t *testing.T) {
   130  		s := New([]string{"af_net", "chown", "net_raw", "seteuid", "sys_time"})
   131  		s.Remove([]string{"CAP_NET_RAW", "af_net"})
   132  		require.Equal(t, "chown, seteuid, sys_time", s.String())
   133  	})
   134  
   135  	t.Run("remove all", func(t *testing.T) {
   136  		s := New([]string{"af_net", "chown", "net_raw", "seteuid", "sys_time"})
   137  		s.Remove([]string{"all"})
   138  		require.True(t, s.Empty())
   139  		require.Equal(t, "", s.String())
   140  	})
   141  }
   142  
   143  func TestSet_Difference(t *testing.T) {
   144  	ci.Parallel(t)
   145  
   146  	t.Run("a is empty", func(t *testing.T) {
   147  		a := New(nil)
   148  		b := New([]string{"chown", "af_net"})
   149  		result := a.Difference(b)
   150  		require.Equal(t, "af_net, chown", result.String())
   151  	})
   152  
   153  	t.Run("b is empty", func(t *testing.T) {
   154  		a := New([]string{"chown", "af_net"})
   155  		b := New(nil)
   156  		result := a.Difference(b)
   157  		require.True(t, result.Empty())
   158  	})
   159  
   160  	t.Run("a diff b", func(t *testing.T) {
   161  		a := New([]string{"A", "b", "C", "d", "e", "f"})
   162  		b := New([]string{"B", "x", "Y", "a"})
   163  		result := a.Difference(b)
   164  		require.Equal(t, "x, y", result.String())
   165  	})
   166  }
   167  
   168  func TestSet_Intersect(t *testing.T) {
   169  	ci.Parallel(t)
   170  
   171  	t.Run("empty", func(t *testing.T) {
   172  		a := New(nil)
   173  		b := New([]string{"a", "b"})
   174  
   175  		result := a.Intersect(b)
   176  		require.True(t, result.Empty())
   177  
   178  		result2 := b.Intersect(a)
   179  		require.True(t, result2.Empty())
   180  	})
   181  
   182  	t.Run("intersect", func(t *testing.T) {
   183  		a := New([]string{"A", "b", "C", "d", "e", "f", "G"})
   184  		b := New([]string{"Z", "B", "E", "f", "y"})
   185  
   186  		result := a.Intersect(b)
   187  		require.Equal(t, "b, e, f", result.String())
   188  
   189  		result2 := b.Intersect(a)
   190  		require.Equal(t, "b, e, f", result2.String())
   191  	})
   192  }
   193  
   194  func TestSet_Union(t *testing.T) {
   195  	ci.Parallel(t)
   196  
   197  	t.Run("empty", func(t *testing.T) {
   198  		a := New(nil)
   199  		b := New([]string{"a", "b"})
   200  
   201  		result := a.Union(b)
   202  		require.Equal(t, "a, b", result.String())
   203  
   204  		result2 := b.Union(a)
   205  		require.Equal(t, "a, b", result2.String())
   206  	})
   207  
   208  	t.Run("union", func(t *testing.T) {
   209  		a := New([]string{"A", "b", "C", "d", "e", "f", "G"})
   210  		b := New([]string{"Z", "B", "E", "f", "y"})
   211  
   212  		result := a.Union(b)
   213  		require.Equal(t, "a, b, c, d, e, f, g, y, z", result.String())
   214  
   215  		result2 := b.Union(a)
   216  		require.Equal(t, "a, b, c, d, e, f, g, y, z", result2.String())
   217  	})
   218  }