github.com/lineaje-labs/syft@v0.98.1-0.20231227153149-9e393f60ff1b/syft/pkg/cataloger/debian/cataloger_test.go (about)

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