github.com/in-toto/in-toto-golang@v0.9.1-0.20240517212500-990269f763cf/in_toto/util_test.go (about)

     1  package in_toto
     2  
     3  import (
     4  	"os"
     5  	"reflect"
     6  	"sort"
     7  	"testing"
     8  )
     9  
    10  func TestSet(t *testing.T) {
    11  	testSet := NewSet()
    12  	if testSet.Has("a") {
    13  		t.Errorf("not added element 'a' in set %s", testSet.Slice())
    14  	}
    15  	testSet.Add("a")
    16  	if !testSet.Has("a") {
    17  		t.Errorf("added element 'a' not in set %s", testSet.Slice())
    18  	}
    19  	testSet.Add("a")
    20  	setLen := len(testSet)
    21  	if setLen != 1 {
    22  		t.Errorf("expected len 1, got %v for set %s", setLen, testSet.Slice())
    23  	}
    24  	testSet.Remove("a")
    25  	if testSet.Has("a") {
    26  		t.Errorf("removed element 'a' in set %s", testSet.Slice())
    27  	}
    28  	// Nothing should happen
    29  	testSet.Remove("a")
    30  }
    31  
    32  func TestSetIntersection(t *testing.T) {
    33  	testSet1 := NewSet("a", "b", "c")
    34  	testSet2 := NewSet("b", "c", "d")
    35  	expected := NewSet("b", "c")
    36  	res := testSet1.Intersection(testSet2)
    37  
    38  	if !reflect.DeepEqual(res, expected) {
    39  		t.Errorf("expected %s, got %s", expected.Slice(), res.Slice())
    40  	}
    41  }
    42  
    43  func TestSetDifference(t *testing.T) {
    44  	testSet1 := NewSet("a", "b", "c")
    45  	testSet2 := NewSet("b", "c", "d")
    46  	expected := NewSet("a")
    47  	res := testSet1.Difference(testSet2)
    48  
    49  	if !reflect.DeepEqual(res, expected) {
    50  		t.Errorf("expected %s, got %s", expected.Slice(), res.Slice())
    51  	}
    52  }
    53  
    54  func TestSetSlice(t *testing.T) {
    55  	testSet := NewSet("a", "b", "c")
    56  	expected := []string{"a", "b", "c"}
    57  
    58  	res := testSet.Slice()
    59  	sort.Strings(res)
    60  	if !reflect.DeepEqual(res, expected) {
    61  		t.Errorf("expected: %s, got: %s", expected, res)
    62  	}
    63  }
    64  
    65  func TestSetFilter(t *testing.T) {
    66  	cases := []struct {
    67  		name           string
    68  		pattern        string
    69  		base, expected Set
    70  	}{
    71  		{"match foo", "foo", NewSet("foo", "foobar", "bar"), NewSet("foo")},
    72  		{"match with wildcard", "foo*", NewSet("foo", "foobar", "bar"), NewSet("foo", "foobar")},
    73  		{"no match", "foo", NewSet("bar"), NewSet()},
    74  		{"no match (due to invalid pattern)", "[", NewSet("["), NewSet()},
    75  	}
    76  
    77  	for _, tc := range cases {
    78  		t.Run(tc.name, func(t *testing.T) {
    79  			res := tc.base.Filter(tc.pattern)
    80  			if !reflect.DeepEqual(res, tc.expected) {
    81  				t.Errorf("expected: %s, got: %s", tc.expected.Slice(), res.Slice())
    82  			}
    83  		})
    84  	}
    85  }
    86  
    87  func TestArtifactsDictKeyStrings(t *testing.T) {
    88  	expected := []string{"a", "b", "c"}
    89  	testMap := map[string]HashObj{"a": nil, "b": nil, "c": nil}
    90  	res := artifactsDictKeyStrings(testMap)
    91  	sort.Strings(res)
    92  	if !reflect.DeepEqual(res, expected) {
    93  		t.Errorf("expected: %s, got: %s", expected, res)
    94  	}
    95  }
    96  
    97  func TestSubsetCheck(t *testing.T) {
    98  	tables := []struct {
    99  		subset   []string
   100  		superset Set
   101  		result   bool
   102  	}{
   103  		{[]string{"sha256"}, NewSet("sha256", "sha512"), true},
   104  		{[]string{"sha512"}, NewSet("sha256"), false},
   105  		{[]string{"sha256", "sha512"}, NewSet("sha128", "sha256", "sha512"), true},
   106  		{[]string{"sha256", "sha512", "sha384"}, NewSet("sha128"), false},
   107  	}
   108  	for _, table := range tables {
   109  		result := table.superset.IsSubSet(NewSet(table.subset...))
   110  		if table.result != result {
   111  			t.Errorf("result mismatch for: %#v, %#v, got: %t, should have got: %t", table.subset, table.superset, result, table.result)
   112  		}
   113  	}
   114  }
   115  
   116  func TestIsWritable(t *testing.T) {
   117  	notWritable, err := os.MkdirTemp("", "")
   118  	if err != nil {
   119  		t.Error(err)
   120  	}
   121  	writable, err := os.MkdirTemp("", "")
   122  	if err != nil {
   123  		t.Error(err)
   124  	}
   125  
   126  	err = os.Chmod(notWritable, os.FileMode(0000))
   127  	if err != nil {
   128  		t.Error(err)
   129  	}
   130  
   131  	err = isWritable(notWritable)
   132  	if err == nil {
   133  		t.Errorf("%s should be not writable, but is writable", notWritable)
   134  	}
   135  
   136  	err = isWritable(writable)
   137  	if err != nil {
   138  		t.Errorf("%s should be writable, but it is not writable", writable)
   139  	}
   140  }