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  }