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  }