itchef/cookbooks/cpe_helpers/spec/public_rpm_spec.rb (161 lines of code) (raw):

# Copyright (c) Facebook, Inc. and its affiliates. # require 'chefspec' require_relative '../libraries/cpe_helpers' describe CPE::Helpers do context 'When looking up an uninstalled package' do before do allow(CPE::Helpers).to receive(:shell_out).and_return( double( :error? => true, :stdout => 'package foobar is not installed\n', ), ) end it 'rpm_installed? returns false on a versionless match' do expect(CPE::Helpers.rpm_installed?('foobar')). to eq(false) end it 'rpm_installed? returns false when given VR' do expect(CPE::Helpers.rpm_installed?('foobar', '1.0-1.fc29')). to eq(false) end it 'rpm_installed? returns false when given EVR' do expect(CPE::Helpers.rpm_installed?('foobar', '1:1.0-1.fc29')). to eq(false) end it 'rpm_installed? returns false when given VR, epoch on' do expect(CPE::Helpers.rpm_installed?('foobar', '1.0-1.fc29', true)). to eq(false) end it 'rpm_installed? returns false when given EVR, epoch on' do expect(CPE::Helpers.rpm_installed?('foobar', '1:1.0-1.fc29', true)). to eq(false) end end context 'When looking up an installed epoched package' do epoch = 2 ver = '20181008_160002_e326bd0c3c21' rel = '1.acme.fc27' before do allow(CPE::Helpers).to receive(:shell_out).and_return( double( :error? => false, :stdout => "#{epoch}:#{ver}-#{rel}", ), ) end it 'rpm_installed? returns true on a versionless match' do expect(CPE::Helpers.rpm_installed?('acme-tnt')). to eq(true) end it 'rpm_installed? returns true with matching VR, epoch off' do expect(CPE::Helpers.rpm_installed?( 'acme-tnt', "#{ver}-#{rel}" )).to eq(true) end it 'rpm_installed? returns false with matching VR, epoch on' do expect(CPE::Helpers.rpm_installed?( 'acme-tnt', "#{ver}-#{rel}", true )).to eq(false) end it 'rpm_installed? returns true with matching EVR, epoch on' do expect(CPE::Helpers.rpm_installed?( 'acme-tnt', "#{epoch}:#{ver}-#{rel}", true )).to eq(true) end it 'rpm_installed? returns true with unmatched VR, epoch off' do expect(CPE::Helpers.rpm_installed?( 'acme-tnt', '20180628_115900_cf99325oie-1.acme.fc27' )).to eq(false) end it 'rpm_installed? returns false with unmatched VR, epoch on' do expect(CPE::Helpers.rpm_installed?( 'acme-tnt', "#{epoch}:20180628_115900_e2neh45ineht-1.acme.fc27", true, )).to eq(false) end it 'rpm_installed? returns false with unmatched E, epoch on' do expect(CPE::Helpers.rpm_installed?( 'acme-tnt', "1:#{ver}-#{rel}", true, )).to eq(false) end end context 'When looking up an installed unepoched package' do epoch = '(none)' ver = '4.4.23' rel = '5.fc29' before do allow(CPE::Helpers).to receive(:shell_out).and_return( double( :error? => false, :stdout => "#{epoch}:#{ver}-#{rel}", ), ) end it 'rpm_installed? returns true on a versionless match' do expect(CPE::Helpers.rpm_installed?('bash')). to eq(true) end it 'rpm_installed? returns true with matching VR, epoch off' do expect(CPE::Helpers.rpm_installed?( 'bash', "#{ver}-#{rel}" )).to eq(true) end it 'rpm_installed? returns true with matching VR, epoch on' do expect(CPE::Helpers.rpm_installed?( 'bash', "#{ver}-#{rel}", true )).to eq(true) end it 'rpm_installed? returns true with matching EVR, epoch on' do expect(CPE::Helpers.rpm_installed?( 'bash', "0:#{ver}-#{rel}", true )).to eq(true) end it 'rpm_installed? returns false with unmatched VR, epoch off' do expect(CPE::Helpers.rpm_installed?( 'bash', '4.4.23-2.fb1.el7' )).to eq(false) end end context 'When looking up a package with multiple versions' do rpm_qf = "rpm -q --queryformat '%{EPOCH}:%{VERSION}-%{RELEASE}'" ver = '0:4.18.16-300.fc29' before do allow(CPE::Helpers).to receive(:shell_out). with("#{rpm_qf} kernel"). and_return( double( :error? => false, :stdout => '(none):4.18.16-300.fc29(none):4.19.8-300.fc29', ), ) allow(CPE::Helpers).to receive(:shell_out). with("#{rpm_qf} kernel-#{ver}"). and_return( double( :error? => false, :stdout => '(none):4.18.16-300.fc29', ), ) end it 'rpm_installed? returns true' do expect(CPE::Helpers.rpm_installed?( 'kernel', ver )).to eq(true) end end context 'When comparing versions with alphabetical letters' do it 'prerelease versions are less than non-prerelease versions' do expect(CPE::Helpers.rpm_cmpver('1.0.0a1-5', '1.0.0-1')).to eq(-1) end it 'postrelease versions are greater than non-prerelease versions' do expect(CPE::Helpers.rpm_cmpver('1.0.2o-1', '1.0.0-5')).to eq(1) end it 'can handle dots before the letter like Arch Linux\'s 1.9.5.p2' do expect(CPE::Helpers.rpm_cmpver('1.9.5.p2-1', '1.9.5-2')).to eq(1) end end end