go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/providers/os/resources/packages/rpm_packages_test.go (about) 1 // Copyright (c) Mondoo, Inc. 2 // SPDX-License-Identifier: BUSL-1.1 3 4 package packages_test 5 6 import ( 7 "bytes" 8 "fmt" 9 "io" 10 "os" 11 "path/filepath" 12 "testing" 13 14 rpmdb "github.com/knqyf263/go-rpmdb/pkg" 15 "github.com/stretchr/testify/assert" 16 "github.com/stretchr/testify/require" 17 "go.mondoo.com/cnquery/providers/os/connection/mock" 18 "go.mondoo.com/cnquery/providers/os/resources/packages" 19 ) 20 21 func TestRedhat7Parser(t *testing.T) { 22 mock, err := mock.New("./testdata/packages_redhat7.toml", nil) 23 if err != nil { 24 t.Fatal(err) 25 } 26 27 c, err := mock.RunCommand("rpm -qa --queryformat '%{NAME} %{EPOCHNUM}:%{VERSION}-%{RELEASE} %{ARCH} %{SUMMARY}\\n'") 28 if err != nil { 29 t.Fatal(err) 30 } 31 32 m := packages.ParseRpmPackages(c.Stdout) 33 assert.Equal(t, 144, len(m), "detected the right amount of packages") 34 35 var p packages.Package 36 p = packages.Package{ 37 Name: "ncurses-base", 38 Version: "5.9-14.20130511.el7_4", 39 Arch: "noarch", 40 Description: "Descriptions of common terminals", 41 Format: packages.RpmPkgFormat, 42 } 43 assert.Contains(t, m, p, "ncurses-base") 44 45 p = packages.Package{ 46 Name: "libstdc++", 47 Version: "4.8.5-28.el7_5.1", 48 Arch: "x86_64", 49 Description: "GNU Standard C++ Library", 50 Format: packages.RpmPkgFormat, 51 } 52 assert.Contains(t, m, p, "libstdc detected") 53 54 p = packages.Package{ 55 Name: "iputils", 56 Version: "20160308-10.el7", 57 Arch: "x86_64", 58 Description: "Network monitoring tools including ping", 59 Format: packages.RpmPkgFormat, 60 } 61 assert.Contains(t, m, p, "gpg-pubkey detected") 62 63 p = packages.Package{ 64 Name: "openssl-libs", 65 Version: "1:1.0.2k-12.el7", 66 Arch: "x86_64", 67 Description: "A general purpose cryptography library with TLS implementation", 68 Format: packages.RpmPkgFormat, 69 } 70 assert.Contains(t, m, p, "gpg-pubkey detected") 71 72 p = packages.Package{ 73 Name: "dbus-libs", 74 Version: "1:1.10.24-7.el7", 75 Arch: "x86_64", 76 Description: "Libraries for accessing D-BUS", 77 Format: packages.RpmPkgFormat, 78 } 79 assert.Contains(t, m, p, "gpg-pubkey detected") 80 } 81 82 func TestRedhat6Parser(t *testing.T) { 83 mock, err := mock.New("./testdata/packages_redhat6.toml", nil) 84 if err != nil { 85 t.Fatal(err) 86 } 87 88 c, err := mock.RunCommand("rpm -qa --queryformat '%{NAME} %{EPOCH}:%{VERSION}-%{RELEASE} %{ARCH} %{SUMMARY}\\n'") 89 if err != nil { 90 t.Fatal(err) 91 } 92 93 m := packages.ParseRpmPackages(c.Stdout) 94 assert.Equal(t, 8, len(m), "detected the right amount of packages") 95 96 var p packages.Package 97 p = packages.Package{ 98 Name: "ElectricFence", 99 Version: "2.1-3", 100 Arch: "i386", 101 Description: "A debugger which detects memory allocation violations.", 102 Format: packages.RpmPkgFormat, 103 } 104 assert.Contains(t, m, p, "ElectricFence") 105 106 p = packages.Package{ 107 Name: "shadow-utils", 108 Version: "1:19990827-10", 109 Arch: "i386", 110 Description: "Utilities for managing shadow password files and user/group accounts.", 111 Format: packages.RpmPkgFormat, 112 } 113 assert.Contains(t, m, p, "shadow-utils") 114 115 p = packages.Package{ 116 Name: "arpwatch", 117 Version: "1:2.1a4-19", 118 Arch: "i386", 119 Description: "Network monitoring tools for tracking IP addresses on a network.", 120 Format: packages.RpmPkgFormat, 121 } 122 assert.Contains(t, m, p, "arpwatch") 123 124 p = packages.Package{ 125 Name: "bash", 126 Version: "1.14.7-22", 127 Arch: "i386", 128 Description: "The GNU Bourne Again shell (bash) version 1.14.", 129 Format: packages.RpmPkgFormat, 130 } 131 assert.Contains(t, m, p, "bash") 132 } 133 134 func TestPhoton4ImageParser(t *testing.T) { 135 // to create this test file, run the following command: 136 // mondoo scan docker image photon:4.0 --record 137 mock, err := mock.New("./testdata/packages_photon_image.toml", nil) 138 if err != nil { 139 t.Fatal(err) 140 } 141 142 rpmTmpDir, err := os.MkdirTemp(os.TempDir(), "mondoo-rpmdb") 143 require.NoError(t, err) 144 defer os.RemoveAll(rpmTmpDir) 145 146 fWriter, err := os.Create(filepath.Join(rpmTmpDir, "rpmdb.sqlite")) 147 require.NoError(t, err) 148 defer fWriter.Close() 149 150 f, err := mock.FileSystem().Open(filepath.Join("/var/lib/rpm", "rpmdb.sqlite")) 151 require.NoError(t, err) 152 defer f.Close() 153 154 _, err = io.Copy(fWriter, f) 155 require.NoError(t, err) 156 157 packageList := bytes.Buffer{} 158 db, err := rpmdb.Open(filepath.Join(rpmTmpDir, "rpmdb.sqlite")) 159 require.NoError(t, err) 160 161 pkgList, err := db.ListPackages() 162 require.NoError(t, err) 163 164 for _, pkg := range pkgList { 165 packageList.WriteString(fmt.Sprintf("%s %d:%s-%s %s %s\n", pkg.Name, pkg.EpochNum(), pkg.Version, pkg.Release, pkg.Arch, pkg.Summary)) 166 } 167 168 m := packages.ParseRpmPackages(&packageList) 169 assert.Equal(t, 36, len(m), "detected the right amount of packages") 170 171 var p packages.Package 172 p = packages.Package{ 173 Name: "ncurses-libs", 174 Version: "6.2-6.ph4", 175 Arch: "x86_64", 176 Description: "Ncurses Libraries", 177 Format: packages.RpmPkgFormat, 178 } 179 assert.Contains(t, m, p, "ncurses-libs") 180 181 p = packages.Package{ 182 Name: "bash", 183 Version: "5.0-2.ph4", 184 Arch: "x86_64", 185 Description: "Bourne-Again SHell", 186 Format: packages.RpmPkgFormat, 187 } 188 assert.Contains(t, m, p, "bash") 189 190 p = packages.Package{ 191 Name: "sqlite-libs", 192 Version: "3.38.5-1.ph4", 193 Arch: "x86_64", 194 Description: "sqlite3 library", 195 Format: packages.RpmPkgFormat, 196 } 197 assert.Contains(t, m, p, "sqlite-libs") 198 }