github.com/noqcks/syft@v0.0.0-20230920222752-a9e2c4e288e5/syft/pkg/cataloger/deb/cataloger_test.go (about)

     1  package deb
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/anchore/syft/syft/file"
     7  	"github.com/anchore/syft/syft/pkg"
     8  	"github.com/anchore/syft/syft/pkg/cataloger/internal/pkgtest"
     9  )
    10  
    11  func TestDpkgCataloger(t *testing.T) {
    12  	tests := []struct {
    13  		name     string
    14  		expected []pkg.Package
    15  	}{
    16  		{
    17  			name: "image-dpkg",
    18  			expected: []pkg.Package{
    19  				{
    20  					Name:    "libpam-runtime",
    21  					Version: "1.1.8-3.6",
    22  					FoundBy: "dpkgdb-cataloger",
    23  					Licenses: pkg.NewLicenseSet(
    24  						pkg.NewLicenseFromLocations("GPL-1", file.NewVirtualLocation("/usr/share/doc/libpam-runtime/copyright", "/usr/share/doc/libpam-runtime/copyright")),
    25  						pkg.NewLicenseFromLocations("GPL-2", file.NewVirtualLocation("/usr/share/doc/libpam-runtime/copyright", "/usr/share/doc/libpam-runtime/copyright")),
    26  						pkg.NewLicenseFromLocations("LGPL-2.1", file.NewVirtualLocation("/usr/share/doc/libpam-runtime/copyright", "/usr/share/doc/libpam-runtime/copyright")),
    27  					),
    28  					Locations: file.NewLocationSet(
    29  						file.NewVirtualLocation("/var/lib/dpkg/status", "/var/lib/dpkg/status"),
    30  						file.NewVirtualLocation("/var/lib/dpkg/info/libpam-runtime.md5sums", "/var/lib/dpkg/info/libpam-runtime.md5sums"),
    31  						file.NewVirtualLocation("/var/lib/dpkg/info/libpam-runtime.conffiles", "/var/lib/dpkg/info/libpam-runtime.conffiles"),
    32  						file.NewVirtualLocation("/usr/share/doc/libpam-runtime/copyright", "/usr/share/doc/libpam-runtime/copyright"),
    33  					),
    34  					Type:         pkg.DebPkg,
    35  					MetadataType: pkg.DpkgMetadataType,
    36  					Metadata: pkg.DpkgMetadata{
    37  						Package:       "libpam-runtime",
    38  						Source:        "pam",
    39  						Version:       "1.1.8-3.6",
    40  						Architecture:  "all",
    41  						Maintainer:    "Steve Langasek <vorlon@debian.org>",
    42  						InstalledSize: 1016,
    43  						Description: `Runtime support for the PAM library
    44   Contains configuration files and  directories required for
    45   authentication  to work on Debian systems.  This package is required
    46   on almost all installations.`,
    47  						Files: []pkg.DpkgFileRecord{
    48  							{
    49  								Path: "/etc/pam.conf",
    50  								Digest: &file.Digest{
    51  									Algorithm: "md5",
    52  									Value:     "87fc76f18e98ee7d3848f6b81b3391e5",
    53  								},
    54  								IsConfigFile: true,
    55  							},
    56  							{
    57  								Path: "/etc/pam.d/other",
    58  								Digest: &file.Digest{
    59  									Algorithm: "md5",
    60  									Value:     "31aa7f2181889ffb00b87df4126d1701",
    61  								},
    62  								IsConfigFile: true,
    63  							},
    64  							{Path: "/lib/x86_64-linux-gnu/libz.so.1.2.11", Digest: &file.Digest{
    65  								Algorithm: "md5",
    66  								Value:     "55f905631797551d4d936a34c7e73474",
    67  							}},
    68  							{Path: "/usr/share/doc/zlib1g/changelog.Debian.gz", Digest: &file.Digest{
    69  								Algorithm: "md5",
    70  								Value:     "cede84bda30d2380217f97753c8ccf3a",
    71  							}},
    72  							{Path: "/usr/share/doc/zlib1g/changelog.gz", Digest: &file.Digest{
    73  								Algorithm: "md5",
    74  								Value:     "f3c9dafa6da7992c47328b4464f6d122",
    75  							}},
    76  							{Path: "/usr/share/doc/zlib1g/copyright", Digest: &file.Digest{
    77  								Algorithm: "md5",
    78  								Value:     "a4fae96070439a5209a62ae5b8017ab2",
    79  							}},
    80  						},
    81  					},
    82  				},
    83  			},
    84  		},
    85  		{
    86  			name: "image-distroless-deb",
    87  			expected: []pkg.Package{
    88  				{
    89  					Name:    "libsqlite3-0",
    90  					Version: "3.34.1-3",
    91  					FoundBy: "dpkgdb-cataloger",
    92  					Licenses: pkg.NewLicenseSet(
    93  						pkg.NewLicenseFromLocations("public-domain", file.NewVirtualLocation("/usr/share/doc/libsqlite3-0/copyright", "/usr/share/doc/libsqlite3-0/copyright")),
    94  						pkg.NewLicenseFromLocations("GPL-2+", file.NewVirtualLocation("/usr/share/doc/libsqlite3-0/copyright", "/usr/share/doc/libsqlite3-0/copyright")),
    95  						pkg.NewLicenseFromLocations("GPL-2", file.NewVirtualLocation("/usr/share/doc/libsqlite3-0/copyright", "/usr/share/doc/libsqlite3-0/copyright")),
    96  					),
    97  					Locations: file.NewLocationSet(
    98  						file.NewVirtualLocation("/var/lib/dpkg/status.d/libsqlite3-0", "/var/lib/dpkg/status.d/libsqlite3-0"),
    99  						file.NewVirtualLocation("/var/lib/dpkg/status.d/libsqlite3-0.md5sums", "/var/lib/dpkg/status.d/libsqlite3-0.md5sums"),
   100  						file.NewVirtualLocation("/usr/share/doc/libsqlite3-0/copyright", "/usr/share/doc/libsqlite3-0/copyright"),
   101  					),
   102  					Type:         pkg.DebPkg,
   103  					MetadataType: pkg.DpkgMetadataType,
   104  					Metadata: pkg.DpkgMetadata{
   105  						Package:       "libsqlite3-0",
   106  						Source:        "sqlite3",
   107  						Version:       "3.34.1-3",
   108  						Architecture:  "arm64",
   109  						Maintainer:    "Laszlo Boszormenyi (GCS) <gcs@debian.org>",
   110  						InstalledSize: 1490,
   111  						Description: `SQLite 3 shared library
   112   SQLite is a C library that implements an SQL database engine.
   113   Programs that link with the SQLite library can have SQL database
   114   access without running a separate RDBMS process.`,
   115  						Files: []pkg.DpkgFileRecord{
   116  							{Path: "/usr/lib/aarch64-linux-gnu/libsqlite3.so.0.8.6", Digest: &file.Digest{
   117  								Algorithm: "md5",
   118  								Value:     "e11d70c96979a1328ae4e7e50542782b",
   119  							}},
   120  							{Path: "/usr/share/doc/libsqlite3-0/README.Debian", Digest: &file.Digest{
   121  								Algorithm: "md5",
   122  								Value:     "9d8facc2fa9d2df52f1c7cb4e5fa4741",
   123  							}},
   124  							{Path: "/usr/share/doc/libsqlite3-0/changelog.Debian.gz", Digest: &file.Digest{
   125  								Algorithm: "md5",
   126  								Value:     "a58942e742f5056be0595e6ba69a323f",
   127  							}},
   128  							{Path: "/usr/share/doc/libsqlite3-0/changelog.gz", Digest: &file.Digest{
   129  								Algorithm: "md5",
   130  								Value:     "52317be84c3ca44b7888c6921131e37d",
   131  							}},
   132  							{Path: "/usr/share/doc/libsqlite3-0/changelog.html.gz", Digest: &file.Digest{
   133  								Algorithm: "md5",
   134  								Value:     "a856310354e6c8768e85b39ae838dd0a",
   135  							}},
   136  							{Path: "/usr/share/doc/libsqlite3-0/copyright", Digest: &file.Digest{
   137  								Algorithm: "md5",
   138  								Value:     "be64db3e095486e5e105652c51199358",
   139  							}},
   140  						},
   141  					},
   142  				},
   143  			},
   144  		},
   145  	}
   146  
   147  	for _, tt := range tests {
   148  		t.Run(tt.name, func(t *testing.T) {
   149  			c := NewDpkgdbCataloger()
   150  			pkgtest.NewCatalogTester().
   151  				WithImageResolver(t, tt.name).
   152  				IgnoreLocationLayer(). // this fixture can be rebuilt, thus the layer ID will change
   153  				Expects(tt.expected, nil).
   154  				TestCataloger(t, c)
   155  		})
   156  	}
   157  }
   158  
   159  func TestCataloger_Globs(t *testing.T) {
   160  	tests := []struct {
   161  		name     string
   162  		fixture  string
   163  		expected []string
   164  	}{
   165  		{
   166  			name:    "obtain db status files",
   167  			fixture: "test-fixtures/glob-paths",
   168  			expected: []string{
   169  				"var/lib/dpkg/status",
   170  				"var/lib/dpkg/status.d/pkg-1.0",
   171  				"usr/lib/opkg/status",
   172  				"usr/lib/opkg/info/pkg-1.0.control",
   173  			},
   174  		},
   175  	}
   176  
   177  	for _, test := range tests {
   178  		t.Run(test.name, func(t *testing.T) {
   179  			pkgtest.NewCatalogTester().
   180  				FromDirectory(t, test.fixture).
   181  				ExpectsResolverContentQueries(test.expected).
   182  				TestCataloger(t, NewDpkgdbCataloger())
   183  		})
   184  	}
   185  }