github.com/anth0d/nomad@v0.0.0-20221214183521-ae3a0a2cad06/drivers/shared/capabilities/set_test.go (about)

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