github.com/anchore/syft@v1.38.2/internal/unknown/coordinate_error_test.go (about) 1 package unknown 2 3 import ( 4 "errors" 5 "fmt" 6 "strings" 7 "testing" 8 9 "github.com/stretchr/testify/require" 10 11 "github.com/anchore/syft/syft/file" 12 ) 13 14 func Test_visitErrors(t *testing.T) { 15 tests := []struct { 16 name string 17 in error 18 transform func(error) error 19 expected string 20 }{ 21 { 22 name: "return", 23 in: fmt.Errorf("err1"), 24 transform: func(e error) error { 25 return e 26 }, 27 expected: "err1", 28 }, 29 { 30 name: "omit", 31 in: fmt.Errorf("err1"), 32 transform: func(_ error) error { 33 return nil 34 }, 35 expected: "<nil>", 36 }, 37 { 38 name: "wrapped return", 39 in: fmt.Errorf("wrapped: %w", fmt.Errorf("err1")), 40 transform: func(e error) error { 41 return e 42 }, 43 expected: "wrapped: err1", 44 }, 45 { 46 name: "wrapped omit", 47 in: fmt.Errorf("wrapped: %w", fmt.Errorf("err1")), 48 transform: func(e error) error { 49 if e.Error() == "err1" { 50 return nil 51 } 52 return e 53 }, 54 expected: "<nil>", 55 }, 56 { 57 name: "joined return", 58 in: errors.Join(fmt.Errorf("err1"), fmt.Errorf("err2")), 59 transform: func(e error) error { 60 return e 61 }, 62 expected: "err1\nerr2", 63 }, 64 { 65 name: "joined omit", 66 in: errors.Join(fmt.Errorf("err1"), fmt.Errorf("err2")), 67 transform: func(_ error) error { 68 return nil 69 }, 70 expected: "<nil>", 71 }, 72 { 73 name: "joined omit first", 74 in: errors.Join(fmt.Errorf("err1"), fmt.Errorf("err2")), 75 transform: func(e error) error { 76 if e.Error() == "err1" { 77 return nil 78 } 79 return e 80 }, 81 expected: "err2", 82 }, 83 { 84 name: "joined wrapped return", 85 in: errors.Join(fmt.Errorf("wrapped: %w", fmt.Errorf("err1")), fmt.Errorf("err2")), 86 transform: func(e error) error { 87 return e 88 }, 89 expected: "wrapped: err1\nerr2", 90 }, 91 { 92 name: "joined wrapped omit first", 93 in: errors.Join(fmt.Errorf("wrapped: %w", fmt.Errorf("err1")), fmt.Errorf("err2")), 94 transform: func(e error) error { 95 if e.Error() == "err1" { 96 return nil 97 } 98 return e 99 }, 100 expected: "err2", 101 }, 102 } 103 for _, test := range tests { 104 t.Run(test.name, func(t *testing.T) { 105 gotErr := visitErrors(test.in, test.transform) 106 got := fmt.Sprintf("%v", gotErr) 107 require.Equal(t, test.expected, got) 108 }) 109 } 110 } 111 112 func Test_Join(t *testing.T) { 113 err1 := fmt.Errorf("err1") 114 err2 := fmt.Errorf("err2") 115 116 tests := []struct { 117 name string `` 118 in []error 119 expected string 120 }{ 121 { 122 name: "basic", 123 in: []error{fmt.Errorf("err")}, 124 expected: "err", 125 }, 126 { 127 name: "wrapped", 128 in: []error{fmt.Errorf("outer: %w", fmt.Errorf("err"))}, 129 expected: "outer: err", 130 }, 131 { 132 name: "wrapped joined", 133 in: []error{errors.Join(fmt.Errorf("outer: %w", fmt.Errorf("err1")), fmt.Errorf("err2"))}, 134 expected: "outer: err1\nerr2", 135 }, 136 { 137 name: "duplicates", 138 in: []error{err1, err1, err2}, 139 expected: "err1\nerr2", 140 }, 141 { 142 name: "nested duplicates", 143 in: []error{errors.Join(err1, err2), err1, err2}, 144 expected: "err1\nerr2", 145 }, 146 { 147 name: "nested duplicates coords", 148 in: []error{New(file.NewLocation("l1"), errors.Join(fmt.Errorf("err1"), fmt.Errorf("err2"))), fmt.Errorf("err1"), fmt.Errorf("err2")}, 149 expected: "l1: err1\nl1: err2\nerr1\nerr2", 150 }, 151 { 152 name: "all nil", 153 in: []error{nil, nil, nil}, 154 expected: "", 155 }, 156 } 157 for _, test := range tests { 158 t.Run(test.name, func(t *testing.T) { 159 got := Join(test.in...) 160 if test.expected == "" { 161 require.Nil(t, got) 162 return 163 } 164 require.NotNil(t, got) 165 require.Equal(t, test.expected, got.Error()) 166 }) 167 } 168 } 169 170 func Test_flatten(t *testing.T) { 171 coords := file.Coordinates{ 172 RealPath: "real/path", 173 } 174 e1 := fmt.Errorf("e1") 175 e2 := fmt.Errorf("e2") 176 c1 := New(coords, fmt.Errorf("c1")) 177 c2 := New(coords, fmt.Errorf("c2")) 178 tests := []struct { 179 name string `` 180 in error 181 expected string 182 }{ 183 { 184 name: "basic", 185 in: errors.Join(e1, e2), 186 expected: "e1//e2", 187 }, 188 { 189 name: "coords", 190 in: New(coords, e1), 191 expected: "real/path: e1", 192 }, 193 { 194 name: "coords with joined children", 195 in: New(coords, errors.Join(e1, e2)), 196 expected: "real/path: e1//real/path: e2", 197 }, 198 { 199 name: "very nested", 200 in: errors.Join(errors.Join(errors.Join(errors.Join(e1, c1), e2), c2), e2), 201 expected: "e1//real/path: c1//e2//real/path: c2//e2", 202 }, 203 } 204 toString := func(errs ...error) string { 205 var parts []string 206 for _, e := range errs { 207 parts = append(parts, e.Error()) 208 } 209 return strings.Join(parts, "//") 210 } 211 for _, test := range tests { 212 t.Run(test.name, func(t *testing.T) { 213 got := flatten(test.in) 214 require.NotNil(t, got) 215 require.Equal(t, test.expected, toString(got...)) 216 }) 217 } 218 } 219 220 func Test_Append(t *testing.T) { 221 e1 := New(file.NewLocation("l1"), fmt.Errorf("e1")) 222 e2 := Append(e1, file.NewLocation("l2"), fmt.Errorf("e2")) 223 e3 := Appendf(e2, file.NewLocation("l3"), "%s", "e3") 224 require.Equal(t, "l1: e1\nl2: e2\nl3: e3", e3.Error()) 225 226 e1 = New(file.NewLocation("l1"), nil) 227 require.Nil(t, e1) 228 e2 = Append(e1, file.NewLocation("l2"), fmt.Errorf("e2")) 229 e3 = Appendf(e2, file.NewLocation("l3"), "%s", "e3") 230 require.Equal(t, "l2: e2\nl3: e3", e3.Error()) 231 232 e1 = New(file.NewLocation("l1"), fmt.Errorf("e1")) 233 e2 = Append(e1, file.NewLocation("l2"), nil) 234 e3 = Appendf(e2, file.NewLocation("l3"), "%s", "e3") 235 require.Equal(t, "l1: e1\nl3: e3", e3.Error()) 236 }