1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
require 'spec_helper'
describe Puppet::Type.type(:package).provider(:yum) do
include PuppetSpec::Fixtures
it_behaves_like 'RHEL package provider', described_class, 'yum'
describe "when supplied the source param" do
let(:name) { 'baz' }
let(:resource) do
Puppet::Type.type(:package).new(
:name => name,
:provider => 'yum',
)
end
let(:provider) do
provider = described_class.new
provider.resource = resource
provider
end
before { described_class.stubs(:command).with(:cmd).returns("/usr/bin/yum") }
context "when installing" do
it "should use the supplied source as the explicit path to a package to install" do
resource[:ensure] = :present
resource[:source] = "/foo/bar/baz-1.1.0.rpm"
provider.expects(:execute).with do |arr|
expect(arr[-2..-1]).to eq([:install, "/foo/bar/baz-1.1.0.rpm"])
end
provider.install
end
end
context "when ensuring a specific version" do
it "should use the suppplied source as the explicit path to the package to update" do
# The first query response informs yum provider that package 1.1.0 is
# already installed, and the second that it's been upgraded
provider.expects(:query).twice.returns({:ensure => "1.1.0"}, {:ensure => "1.2.0"})
resource[:ensure] = "1.2.0"
resource[:source] = "http://foo.repo.com/baz-1.2.0.rpm"
provider.expects(:execute).with do |arr|
expect(arr[-2..-1]).to eq(['update', "http://foo.repo.com/baz-1.2.0.rpm"])
end
provider.install
end
end
end
context "parsing the output of check-update" do
context "with no multiline entries" do
let(:check_update) { File.read(my_fixture("yum-check-update-simple.txt")) }
let(:output) { described_class.parse_updates(check_update) }
it 'creates an entry for each package keyed on the package name' do
expect(output['curl']).to eq([{:name => 'curl', :epoch => '0', :version => '7.32.0', :release => '10.fc20', :arch => 'i686'}, {:name => 'curl', :epoch => '0', :version => '7.32.0', :release => '10.fc20', :arch => 'x86_64'}])
expect(output['gawk']).to eq([{:name => 'gawk', :epoch => '0', :version => '4.1.0', :release => '3.fc20', :arch => 'i686'}])
expect(output['dhclient']).to eq([{:name => 'dhclient', :epoch => '12', :version => '4.1.1', :release => '38.P1.fc20', :arch => 'i686'}])
expect(output['selinux-policy']).to eq([{:name => 'selinux-policy', :epoch => '0', :version => '3.12.1', :release => '163.fc20', :arch => 'noarch'}])
end
it 'creates an entry for each package keyed on the package name and package architecture' do
expect(output['curl.i686']).to eq([{:name => 'curl', :epoch => '0', :version => '7.32.0', :release => '10.fc20', :arch => 'i686'}])
expect(output['curl.x86_64']).to eq([{:name => 'curl', :epoch => '0', :version => '7.32.0', :release => '10.fc20', :arch => 'x86_64'}])
expect(output['gawk.i686']).to eq([{:name => 'gawk', :epoch => '0', :version => '4.1.0', :release => '3.fc20', :arch => 'i686'}])
expect(output['dhclient.i686']).to eq([{:name => 'dhclient', :epoch => '12', :version => '4.1.1', :release => '38.P1.fc20', :arch => 'i686'}])
expect(output['selinux-policy.noarch']).to eq([{:name => 'selinux-policy', :epoch => '0', :version => '3.12.1', :release => '163.fc20', :arch => 'noarch'}])
expect(output['java-1.8.0-openjdk.x86_64']).to eq([{:name => 'java-1.8.0-openjdk', :epoch => '1', :version => '1.8.0.131', :release => '2.b11.el7_3', :arch => 'x86_64'}])
end
end
context "with multiline entries" do
let(:check_update) { File.read(my_fixture("yum-check-update-multiline.txt")) }
let(:output) { described_class.parse_updates(check_update) }
it "parses multi-line values as a single package tuple" do
expect(output['libpcap']).to eq([{:name => 'libpcap', :epoch => '14', :version => '1.4.0', :release => '1.20130826git2dbcaa1.el6', :arch => 'x86_64'}])
end
end
context "with obsoleted packages" do
let(:check_update) { File.read(my_fixture("yum-check-update-obsoletes.txt")) }
let(:output) { described_class.parse_updates(check_update) }
it "ignores all entries including and after 'Obsoleting Packages'" do
expect(output).not_to include("Obsoleting")
expect(output).not_to include("NetworkManager-bluetooth.x86_64")
expect(output).not_to include("1:1.0.0-14.git20150121.b4ea599c.el7")
end
end
context "with security notifications" do
let(:check_update) { File.read(my_fixture("yum-check-update-security.txt")) }
let(:output) { described_class.parse_updates(check_update) }
it "ignores all entries including and after 'Security'" do
expect(output).not_to include("Security")
end
it "includes updates before 'Security'" do
expect(output).to include("yum-plugin-fastestmirror.noarch")
end
end
context "with broken update notices" do
let(:check_update) { File.read(my_fixture("yum-check-update-broken-notices.txt")) }
let(:output) { described_class.parse_updates(check_update) }
it "ignores all entries including and after 'Update'" do
expect(output).not_to include("Update")
end
it "includes updates before 'Update'" do
expect(output).to include("yum-plugin-fastestmirror.noarch")
end
end
context "with improper package names in output" do
it "raises an exception parsing package name" do
expect {
described_class.update_to_hash('badpackagename', '1')
}.to raise_exception(Exception, /Failed to parse/)
end
end
context "with trailing plugin output" do
let(:check_update) { File.read(my_fixture("yum-check-update-plugin-output.txt")) }
let(:output) { described_class.parse_updates(check_update) }
it "parses correctly formatted entries" do
expect(output['bash']).to eq([{:name => 'bash', :epoch => '0', :version => '4.2.46', :release => '12.el7', :arch => 'x86_64'}])
end
it "ignores all mentions of plugin output" do
expect(output).not_to include("Random plugin")
end
end
end
end
|