github.com/jlmeeker/kismatic@v1.10.1-0.20180612190640-57f9005a1f1a/pkg/inspector/check/package_manager_test.go (about) 1 package check 2 3 import ( 4 "errors" 5 "fmt" 6 "testing" 7 ) 8 9 type runMock struct { 10 aptGetOut string 11 aptGetErr error 12 yumOut string 13 yumErr error 14 dpkgOut string 15 dpkgErr error 16 } 17 18 func (m runMock) run(cmd string, args ...string) ([]byte, error) { 19 switch cmd { 20 default: 21 panic(fmt.Sprintf("mock does not implement command %s", cmd)) 22 case "apt-get": 23 return []byte(m.aptGetOut), m.aptGetErr 24 case "yum": 25 return []byte(m.yumOut), m.yumErr 26 case "dpkg": 27 return []byte(m.dpkgOut), m.dpkgErr 28 } 29 } 30 31 func TestRPMPackageManagerPackageAvailable(t *testing.T) { 32 out := ` 33 potentiallySomeGarbageData 34 389-ds-base.x86_64 1.3.4.0-33.el7_2 updates 35 389-ds-base-devel.x86_64 1.3.4.0-33.el7_2 updates 36 389-ds-base-libs.x86_64 1.3.4.0-33.el7_2 updates 37 Cython.x86_64 0.19-3.el7 base 38 ElectricFence.i686 2.2.2-39.el7 base 39 NetworkManager.x86_64 1:1.0.6-30.el7_2 @koji-override-1` 40 41 mock := runMock{ 42 yumOut: out, 43 } 44 m := rpmManager{ 45 run: mock.run, 46 } 47 p := PackageQuery{"NetworkManager", "1:1.0.6-30.el7_2"} 48 ok, _ := m.IsAvailable(p) 49 if !ok { 50 t.Error("expected true, but got false") 51 } 52 } 53 54 func TestRPMPackageManagerPackageNotFound(t *testing.T) { 55 out := `Error: No matching Packages to list` 56 mock := runMock{ 57 yumOut: out, 58 yumErr: errors.New("yum exits with non-zero if no packages match"), 59 } 60 m := rpmManager{ 61 run: mock.run, 62 } 63 p := PackageQuery{"NonExistent", "1.0"} 64 ok, err := m.IsAvailable(p) 65 if ok { 66 t.Error("expected false, but got true") 67 } 68 if err != nil { 69 t.Errorf("got an unexpected error: %v", err) 70 } 71 } 72 73 func TestRPMPackageManagerNameMatchVersionNoMatch(t *testing.T) { 74 out := ` 75 NetworkManager.x86_64 1:1.0.6-30.el7_2 @koji-override-1` 76 mock := runMock{ 77 yumOut: out, 78 } 79 m := rpmManager{ 80 run: mock.run, 81 } 82 p := PackageQuery{"NetworkManager", "1:1.0.7-30.el7_2"} 83 ok, err := m.IsAvailable(p) 84 if ok { 85 t.Error("expected false, but got true") 86 } 87 if err != nil { 88 t.Errorf("got an unexpected error: %v", err) 89 } 90 } 91 92 func TestRPMPackageManagerAnyVersion(t *testing.T) { 93 out := ` 94 NetworkManager.x86_64 1:1.0.6-30.el7_2 @koji-override-1` 95 mock := runMock{ 96 yumOut: out, 97 } 98 m := rpmManager{ 99 run: mock.run, 100 } 101 p := PackageQuery{"NetworkManager", ""} 102 ok, err := m.IsAvailable(p) 103 if !ok { 104 t.Error("expected true, but got false") 105 } 106 if err != nil { 107 t.Errorf("got an unexpected error: %v", err) 108 } 109 } 110 111 func TestRPMPackageManagerNameNoMatchVersionMatch(t *testing.T) { 112 out := ` 113 NetworkManager.x86_64 1:1.0.6-30.el7_2 @koji-override-1` 114 mock := runMock{ 115 yumOut: out, 116 } 117 m := rpmManager{ 118 run: mock.run, 119 } 120 p := PackageQuery{"NetworkManagr", "1:1.0.6-30.el7_2"} 121 ok, err := m.IsAvailable(p) 122 if ok { 123 t.Error("expected false, but got true") 124 } 125 if err != nil { 126 t.Errorf("got an unexpected error: %v", err) 127 } 128 } 129 130 func TestRPMPackageManagerExecError(t *testing.T) { 131 mock := runMock{ 132 yumErr: fmt.Errorf("some error"), 133 } 134 m := rpmManager{ 135 run: mock.run, 136 } 137 p := PackageQuery{"SomePkg", "1.0"} 138 ok, err := m.IsAvailable(p) 139 if ok { 140 t.Error("expected false, but got true") 141 } 142 if err == nil { 143 t.Error("expected an error, but didn't get one") 144 } 145 } 146 147 func TestDebPackageManagerIsInstalled(t *testing.T) { 148 out := `Desired=Unknown/Install/Remove/Purge/Hold 149 | Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend 150 |/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad) 151 ||/ Name Version Architecture Description 152 +++-=====================================================-===============================-===============================-================================================================================================================ 153 ii libc6:amd64 2.23-0ubuntu3 amd64 GNU C Library: Shared libraries` 154 mock := runMock{ 155 dpkgOut: out, 156 } 157 m := debManager{ 158 run: mock.run, 159 } 160 p := PackageQuery{"libc6", "2.23"} 161 ok, _ := m.IsAvailable(p) 162 if !ok { 163 t.Errorf("expected true, but got false") 164 } 165 } 166 167 func TestDebPackageManagerAnyVersion(t *testing.T) { 168 out := `Desired=Unknown/Install/Remove/Purge/Hold 169 | Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend 170 |/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad) 171 ||/ Name Version Architecture Description 172 +++-=====================================================-===============================-===============================-================================================================================================================ 173 ii libc6:amd64 2.23-0ubuntu3 amd64 GNU C Library: Shared libraries` 174 mock := runMock{ 175 dpkgOut: out, 176 } 177 m := debManager{ 178 run: mock.run, 179 } 180 p := PackageQuery{"libc6", ""} 181 ok, _ := m.IsAvailable(p) 182 if !ok { 183 t.Errorf("expected true, but got false") 184 } 185 } 186 187 func TestDebPackageManagerUN(t *testing.T) { 188 out := `Desired=Unknown/Install/Remove/Purge/Hold 189 | Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend 190 |/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad) 191 ||/ Name Version Architecture Description 192 +++-============================================-===========================-===========================-============================================================================================== 193 un docker <none> <none> (no description available)` 194 mock := runMock{ 195 dpkgOut: out, 196 } 197 m := debManager{ 198 run: mock.run, 199 } 200 p := PackageQuery{"docker", ""} 201 ok, _ := m.IsInstalled(p) 202 if ok { 203 t.Errorf("expected false, but got true") 204 } 205 } 206 207 func TestDebPackageManagerPackageNotInstalledButAvailable(t *testing.T) { 208 mock := runMock{ 209 dpkgOut: "dpkg-query: no packages found matching libc6a", 210 dpkgErr: errors.New("dpkg returns error msg and exits non-zero in this case"), 211 aptGetOut: "we don't really care about this output, just the non-zero exit status", 212 aptGetErr: nil, 213 } 214 m := debManager{ 215 run: mock.run, 216 } 217 p := PackageQuery{"libc6a", "1.0"} 218 ok, err := m.IsAvailable(p) 219 if !ok { 220 t.Errorf("expected true, got false") 221 } 222 if err != nil { 223 t.Errorf("unexpected error occurred") 224 } 225 } 226 227 func TestDebPackageManagerPackageNotInstalledNotAvailable(t *testing.T) { 228 mock := runMock{ 229 dpkgOut: "dpkg-query: no packages found matching libc6a", 230 dpkgErr: errors.New("dpkg returns error msg and exits non-zero in this case"), 231 aptGetErr: errors.New("apt-get returns error msg and exits non-zero when package not found"), 232 aptGetOut: "E: Unable to locate package libc6a", 233 } 234 m := debManager{ 235 run: mock.run, 236 } 237 p := PackageQuery{"libc6a", "1.0"} 238 ok, err := m.IsAvailable(p) 239 if ok { 240 t.Errorf("expected false, but got true") 241 } 242 if err != nil { 243 t.Errorf("got an unexpected error: %v", err) 244 } 245 } 246 247 func TestDebPackageManagerExecError(t *testing.T) { 248 mock := runMock{ 249 dpkgErr: errors.New("some error happened"), 250 } 251 m := debManager{ 252 run: mock.run, 253 } 254 p := PackageQuery{"", ""} 255 ok, err := m.IsInstalled(p) 256 if ok { 257 t.Error("expected false, but got true") 258 } 259 if err == nil { 260 t.Error("expected an error, but didn't get one") 261 } 262 } 263 264 func TestDebPackageManagerExecError2(t *testing.T) { 265 mock := runMock{ 266 aptGetErr: errors.New("some error happened"), 267 } 268 m := debManager{ 269 run: mock.run, 270 } 271 p := PackageQuery{"", ""} 272 ok, err := m.IsAvailable(p) 273 if ok { 274 t.Error("expected false, but got true") 275 } 276 if err == nil { 277 t.Error("expected an error, but didn't get one") 278 } 279 }