github.com/anth0d/nomad@v0.0.0-20221214183521-ae3a0a2cad06/lib/cpuset/cpuset_test.go (about)

     1  package cpuset
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/hashicorp/nomad/ci"
     7  	"github.com/stretchr/testify/require"
     8  )
     9  
    10  func TestCPUSet_Size(t *testing.T) {
    11  	ci.Parallel(t)
    12  
    13  	set := New(0, 1, 2, 3)
    14  	require.Equal(t, 4, set.Size())
    15  	require.Equal(t, 0, New().Size())
    16  }
    17  
    18  func TestCPUSet_ToSlice(t *testing.T) {
    19  	ci.Parallel(t)
    20  
    21  	cases := []struct {
    22  		desc string
    23  		in   CPUSet
    24  		out  []uint16
    25  	}{
    26  		{
    27  			"empty cpuset",
    28  			New(),
    29  			[]uint16{},
    30  		},
    31  		{
    32  			"in order",
    33  			New(0, 1, 2, 3, 4, 5, 6, 7),
    34  			[]uint16{0, 1, 2, 3, 4, 5, 6, 7},
    35  		},
    36  		{
    37  			"out of order",
    38  			New(3, 1, 2, 0),
    39  			[]uint16{0, 1, 2, 3},
    40  		},
    41  	}
    42  
    43  	for _, c := range cases {
    44  		require.Exactly(t, c.out, c.in.ToSlice(), c.desc)
    45  	}
    46  }
    47  
    48  func TestCPUSet_Equal(t *testing.T) {
    49  	ci.Parallel(t)
    50  
    51  	cases := []struct {
    52  		a           CPUSet
    53  		b           CPUSet
    54  		shouldEqual bool
    55  	}{
    56  		{New(), New(), true},
    57  		{New(5), New(5), true},
    58  		{New(1, 2, 3, 4, 5), New(1, 2, 3, 4, 5), true},
    59  
    60  		{New(), New(5), false},
    61  		{New(5), New(), false},
    62  		{New(), New(1, 2, 3, 4, 5), false},
    63  		{New(1, 2, 3, 4, 5), New(), false},
    64  		{New(5), New(1, 2, 3, 4, 5), false},
    65  		{New(1, 2, 3, 4, 5), New(5), false},
    66  	}
    67  
    68  	for _, c := range cases {
    69  		require.Equal(t, c.shouldEqual, c.a.Equal(c.b))
    70  	}
    71  }
    72  
    73  func TestCPUSet_Union(t *testing.T) {
    74  	ci.Parallel(t)
    75  
    76  	cases := []struct {
    77  		a        CPUSet
    78  		b        CPUSet
    79  		expected CPUSet
    80  	}{
    81  		{New(), New(), New()},
    82  
    83  		{New(), New(0), New(0)},
    84  		{New(0), New(), New(0)},
    85  		{New(0), New(0), New(0)},
    86  
    87  		{New(), New(0, 1, 2, 3), New(0, 1, 2, 3)},
    88  		{New(0, 1), New(0, 1, 2, 3), New(0, 1, 2, 3)},
    89  		{New(2, 3), New(4, 5), New(2, 3, 4, 5)},
    90  		{New(3, 4), New(0, 1, 2, 3), New(0, 1, 2, 3, 4)},
    91  	}
    92  
    93  	for _, c := range cases {
    94  		require.Exactly(t, c.expected.ToSlice(), c.a.Union(c.b).ToSlice())
    95  	}
    96  }
    97  
    98  func TestCPUSet_Difference(t *testing.T) {
    99  	ci.Parallel(t)
   100  
   101  	cases := []struct {
   102  		a        CPUSet
   103  		b        CPUSet
   104  		expected CPUSet
   105  	}{
   106  		{New(), New(), New()},
   107  
   108  		{New(), New(0), New()},
   109  		{New(0), New(), New(0)},
   110  		{New(0), New(0), New()},
   111  
   112  		{New(0, 1), New(0, 1, 2, 3), New()},
   113  		{New(2, 3), New(4, 5), New(2, 3)},
   114  		{New(3, 4), New(0, 1, 2, 3), New(4)},
   115  	}
   116  
   117  	for _, c := range cases {
   118  		require.Exactly(t, c.expected.ToSlice(), c.a.Difference(c.b).ToSlice())
   119  	}
   120  }
   121  
   122  func TestCPUSet_IsSubsetOf(t *testing.T) {
   123  	ci.Parallel(t)
   124  
   125  	cases := []struct {
   126  		a        CPUSet
   127  		b        CPUSet
   128  		isSubset bool
   129  	}{
   130  		{New(0), New(0), true},
   131  		{New(), New(0), true},
   132  		{New(0), New(), false},
   133  		{New(1, 2), New(0, 1, 2, 3), true},
   134  		{New(2, 1), New(0, 1, 2, 3), true},
   135  		{New(3, 4), New(0, 1, 2, 3), false},
   136  	}
   137  
   138  	for _, c := range cases {
   139  		require.Equal(t, c.isSubset, c.a.IsSubsetOf(c.b))
   140  	}
   141  }
   142  
   143  func TestCPUSet_IsSupersetOf(t *testing.T) {
   144  	ci.Parallel(t)
   145  
   146  	cases := []struct {
   147  		a          CPUSet
   148  		b          CPUSet
   149  		isSuperset bool
   150  	}{
   151  		{New(0), New(0), true},
   152  		{New(0), New(), true},
   153  		{New(), New(0), false},
   154  		{New(0, 1, 2, 3), New(0), true},
   155  		{New(0, 1, 2, 3), New(2, 3), true},
   156  		{New(0, 1, 2, 3), New(2, 3, 4), false},
   157  	}
   158  
   159  	for _, c := range cases {
   160  		require.Equal(t, c.isSuperset, c.a.IsSupersetOf(c.b))
   161  	}
   162  }
   163  
   164  func TestCPUSet_ContainsAny(t *testing.T) {
   165  	ci.Parallel(t)
   166  
   167  	cases := []struct {
   168  		a           CPUSet
   169  		b           CPUSet
   170  		containsAny bool
   171  	}{
   172  		{New(0), New(0), true},
   173  		{New(0), New(), false},
   174  		{New(), New(0), false},
   175  		{New(0, 1, 2, 3), New(0), true},
   176  		{New(0, 1, 2, 3), New(2, 3), true},
   177  		{New(0, 1, 2, 3), New(2, 3, 4), true},
   178  	}
   179  
   180  	for _, c := range cases {
   181  		require.Equal(t, c.containsAny, c.a.ContainsAny(c.b))
   182  	}
   183  }
   184  
   185  func TestParse(t *testing.T) {
   186  	ci.Parallel(t)
   187  
   188  	cases := []struct {
   189  		cpuset   string
   190  		expected CPUSet
   191  	}{
   192  		{"", New()},
   193  		{"\n", New()},
   194  		{"1", New(1)},
   195  		{"1\n", New(1)},
   196  		{"0,1,2,3", New(0, 1, 2, 3)},
   197  		{"0-3", New(0, 1, 2, 3)},
   198  		{"0,2-3,5", New(0, 2, 3, 5)},
   199  	}
   200  
   201  	for _, c := range cases {
   202  		result, err := Parse(c.cpuset)
   203  		require.NoError(t, err)
   204  		require.True(t, result.Equal(c.expected))
   205  	}
   206  }
   207  
   208  func TestCPUSet_String(t *testing.T) {
   209  	ci.Parallel(t)
   210  
   211  	cases := []struct {
   212  		cpuset   CPUSet
   213  		expected string
   214  	}{
   215  		{New(), ""},
   216  		{New(0, 1, 2, 3), "0-3"},
   217  		{New(1, 3), "1,3"},
   218  		{New(0, 2, 3, 5), "0,2-3,5"},
   219  	}
   220  
   221  	for _, c := range cases {
   222  		require.Equal(t, c.expected, c.cpuset.String())
   223  	}
   224  }
   225  
   226  func TestCPUSet_Copy(t *testing.T) {
   227  	ci.Parallel(t)
   228  
   229  	original := New(1, 2, 3, 4, 5)
   230  	copied := original.Copy()
   231  	require.True(t, original.Equal(copied))
   232  
   233  	delete(copied.cpus, 3)
   234  	require.False(t, original.Equal(copied))
   235  	require.True(t, original.Equal(New(1, 2, 3, 4, 5)))
   236  	require.True(t, copied.Equal(New(1, 2, 4, 5)))
   237  }