github.com/anchore/syft@v1.38.2/syft/pkg/cataloger/binary/elf_package_test.go (about)

     1  package binary
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	"github.com/google/go-cmp/cmp"
     8  	"github.com/google/go-cmp/cmp/cmpopts"
     9  	"github.com/stretchr/testify/assert"
    10  
    11  	"github.com/anchore/syft/syft/file"
    12  	"github.com/anchore/syft/syft/pkg"
    13  )
    14  
    15  func Test_packageURL(t *testing.T) {
    16  	tests := []struct {
    17  		name     string
    18  		metadata elfBinaryPackageNotes
    19  		want     string
    20  	}{
    21  		{
    22  			name: "elf-binary-package-cataloger",
    23  			metadata: elfBinaryPackageNotes{
    24  				Name:    "github.com/anchore/syft",
    25  				Version: "v0.1.0",
    26  				ELFBinaryPackageNoteJSONPayload: pkg.ELFBinaryPackageNoteJSONPayload{
    27  					System: "syftsys",
    28  				},
    29  			},
    30  			want: "pkg:generic/syftsys/github.com%2Fanchore%2Fsyft@v0.1.0",
    31  		},
    32  		{
    33  			name: "elf binary package short name",
    34  			metadata: elfBinaryPackageNotes{
    35  				Name:    "go.opencensus.io",
    36  				Version: "v0.23.0",
    37  				ELFBinaryPackageNoteJSONPayload: pkg.ELFBinaryPackageNoteJSONPayload{
    38  					System: "syftsys",
    39  				},
    40  			},
    41  			want: "pkg:generic/syftsys/go.opencensus.io@v0.23.0",
    42  		},
    43  		{
    44  			name: "no info",
    45  			metadata: elfBinaryPackageNotes{
    46  				Name:    "test",
    47  				Version: "1.0",
    48  				ELFBinaryPackageNoteJSONPayload: pkg.ELFBinaryPackageNoteJSONPayload{
    49  					Type: "rpm",
    50  				},
    51  			},
    52  			want: "pkg:rpm/test@1.0",
    53  		},
    54  		{
    55  			name: "with system",
    56  			metadata: elfBinaryPackageNotes{
    57  				Name:    "test",
    58  				Version: "1.0",
    59  				ELFBinaryPackageNoteJSONPayload: pkg.ELFBinaryPackageNoteJSONPayload{
    60  					Type:   "rpm",
    61  					System: "system",
    62  				},
    63  			},
    64  			want: "pkg:rpm/system/test@1.0",
    65  		},
    66  		{
    67  			name: "with os info preferred",
    68  			metadata: elfBinaryPackageNotes{
    69  				Name:    "test",
    70  				Version: "1.0",
    71  				ELFBinaryPackageNoteJSONPayload: pkg.ELFBinaryPackageNoteJSONPayload{
    72  					Type:      "rpm",
    73  					OS:        "fedora",
    74  					OSVersion: "2.0",
    75  					OSCPE:     "cpe:/o:someone:redhat:3.0",
    76  				},
    77  			},
    78  			want: "pkg:rpm/fedora/test@1.0?distro=fedora-2.0",
    79  		},
    80  		{
    81  			name: "with os info fallback to CPE parsing (missing version)",
    82  			metadata: elfBinaryPackageNotes{
    83  				Name:    "test",
    84  				Version: "1.0",
    85  				ELFBinaryPackageNoteJSONPayload: pkg.ELFBinaryPackageNoteJSONPayload{
    86  					Type:  "rpm",
    87  					OS:    "fedora",
    88  					OSCPE: "cpe:/o:someone:redhat:3.0",
    89  				},
    90  			},
    91  			want: "pkg:rpm/redhat/test@1.0?distro=redhat-3.0",
    92  		},
    93  		{
    94  			name: "with os info preferred (missing OS)",
    95  			metadata: elfBinaryPackageNotes{
    96  				Name:    "test",
    97  				Version: "1.0",
    98  				ELFBinaryPackageNoteJSONPayload: pkg.ELFBinaryPackageNoteJSONPayload{
    99  					Type:      "rpm",
   100  					OSVersion: "2.0",
   101  					OSCPE:     "cpe:/o:someone:redhat:3.0",
   102  				},
   103  			},
   104  			want: "pkg:rpm/redhat/test@1.0?distro=redhat-3.0",
   105  		},
   106  		{
   107  			name: "missing type",
   108  			metadata: elfBinaryPackageNotes{
   109  				Name:    "test",
   110  				Version: "1.0",
   111  				ELFBinaryPackageNoteJSONPayload: pkg.ELFBinaryPackageNoteJSONPayload{
   112  					System: "system",
   113  				},
   114  			},
   115  			want: "pkg:generic/system/test@1.0",
   116  		},
   117  		{
   118  			name: "bad or missing OSCPE data cannot be parsed allows for correct string",
   119  			metadata: elfBinaryPackageNotes{
   120  				Name:    "test",
   121  				Version: "1.0",
   122  				ELFBinaryPackageNoteJSONPayload: pkg.ELFBinaryPackageNoteJSONPayload{
   123  					System: "system",
   124  					OSCPE:  "%$#*(#*@&$(",
   125  				},
   126  			},
   127  			want: "pkg:generic/system/test@1.0",
   128  		},
   129  	}
   130  
   131  	for _, test := range tests {
   132  		t.Run(test.name, func(t *testing.T) {
   133  			assert.Equal(t, test.want, elfPackageURL(test.metadata))
   134  		})
   135  	}
   136  }
   137  
   138  func Test_newELFPackage(t *testing.T) {
   139  	ctx := context.TODO()
   140  	tests := []struct {
   141  		name     string
   142  		metadata elfBinaryPackageNotes
   143  		expected pkg.Package
   144  	}{
   145  		{
   146  			name: "elf-binary-package-cataloger",
   147  			metadata: elfBinaryPackageNotes{
   148  				Name:    "syfttestfixture",
   149  				Version: "0.01",
   150  				PURL:    "pkg:generic/syftsys/syfttestfixture@0.01",
   151  				CPE:     "cpe:/o:syft:syftsys_testfixture_syfttestfixture:0.01",
   152  				ELFBinaryPackageNoteJSONPayload: pkg.ELFBinaryPackageNoteJSONPayload{
   153  					Type:   "binary",
   154  					System: "syftsys",
   155  				},
   156  			},
   157  
   158  			expected: pkg.Package{
   159  				Name:    "syfttestfixture",
   160  				Version: "0.01",
   161  				Type:    "binary",
   162  				PURL:    "pkg:generic/syftsys/syfttestfixture@0.01",
   163  				Metadata: pkg.ELFBinaryPackageNoteJSONPayload{
   164  					Type:   "binary",
   165  					System: "syftsys",
   166  				},
   167  			},
   168  		},
   169  	}
   170  
   171  	for _, test := range tests {
   172  		t.Run(test.name, func(t *testing.T) {
   173  			actual := newELFPackage(ctx, test.metadata, file.NewLocationSet())
   174  			if diff := cmp.Diff(test.expected, actual, cmpopts.IgnoreFields(pkg.Package{}, "id"), cmpopts.IgnoreUnexported(pkg.Package{}, file.LocationSet{}, pkg.LicenseSet{})); diff != "" {
   175  				t.Errorf("newELFPackage() mismatch (-want +got):\n%s", diff)
   176  			}
   177  		})
   178  	}
   179  }