diff options
-rw-r--r-- | lib/chef/provider/package/yum/python_helper.rb | 3 | ||||
-rw-r--r-- | lib/chef/provider/package/yum/yum_cache.rb | 18 | ||||
-rw-r--r-- | spec/unit/provider/package/yum/yum_cache_spec.rb | 89 |
3 files changed, 104 insertions, 6 deletions
diff --git a/lib/chef/provider/package/yum/python_helper.rb b/lib/chef/provider/package/yum/python_helper.rb index 2488ca38c1..cbdd85bbbd 100644 --- a/lib/chef/provider/package/yum/python_helper.rb +++ b/lib/chef/provider/package/yum/python_helper.rb @@ -1,5 +1,5 @@ # -# Copyright:: Copyright 2016-2017, Chef Software Inc. +# Copyright:: Copyright 2016-2018, Chef Software Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,6 +18,7 @@ require "chef/mixin/which" require "chef/mixin/shell_out" require "chef/provider/package/yum/version" +require "singleton" require "timeout" class Chef diff --git a/lib/chef/provider/package/yum/yum_cache.rb b/lib/chef/provider/package/yum/yum_cache.rb index 2a6c6b8d2a..2c29e6ad71 100644 --- a/lib/chef/provider/package/yum/yum_cache.rb +++ b/lib/chef/provider/package/yum/yum_cache.rb @@ -20,11 +20,16 @@ require "chef/provider/package/yum/python_helper" require "chef/provider/package" require "singleton" +# +# These are largely historical APIs, the YumCache object no longer exists and this is a +# fascade over the python helper class. It should be considered deprecated-lite and +# no new APIs should be added and should be added to the python_helper instead. +# + class Chef class Provider class Package class Yum < Chef::Provider::Package - # Cache for our installed and available packages, pulled in from yum-dump.py class YumCache include Singleton @@ -54,12 +59,12 @@ class Chef def available_version(name) p = python_helper.package_query(:whatavailable, name) - "#{p.version}.#{p.arch}" + "#{p.version}.#{p.arch}" unless p.version.nil? end def installed_version(name) p = python_helper.package_query(:whatinstalled, name) - "#{p.version}.#{p.arch}" + "#{p.version}.#{p.arch}" unless p.version.nil? end def package_available?(name) @@ -67,13 +72,16 @@ class Chef !p.version.nil? end + # NOTE that it is the responsibility of the python_helper to get these APIs correct and + # we do not do any validation here that the e.g. version or arch matches the requested value + # (because the bigger issue there is a buggy+broken python_helper -- so don't try to fix those + # kinds of bugs here) def version_available?(name, version, arch = nil) p = python_helper.package_query(:whatavailable, name, version, arch) !p.version.nil? end - private - + # @api private def python_helper @python_helper ||= PythonHelper.instance end diff --git a/spec/unit/provider/package/yum/yum_cache_spec.rb b/spec/unit/provider/package/yum/yum_cache_spec.rb new file mode 100644 index 0000000000..ba78987de7 --- /dev/null +++ b/spec/unit/provider/package/yum/yum_cache_spec.rb @@ -0,0 +1,89 @@ +# +# Copyright:: Copyright 2018-2018, Chef Software Inc. +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +require "spec_helper" + +describe Chef::Provider::Package::Yum::YumCache do + let(:yum_cache) { Chef::Provider::Package::Yum::YumCache.instance } + + let(:python_helper) { instance_double(Chef::Provider::Package::Yum::PythonHelper) } + + def yum_version(name, version, arch) + Chef::Provider::Package::Yum::Version.new(name, version, arch) + end + + before(:each) do + allow( yum_cache ).to receive(:python_helper).and_return(python_helper) + end + + it "package_available? returns false if the helper reports the available version is nil" do + expect( python_helper ).to receive(:package_query).with(:whatavailable, "foo").and_return( yum_version("foo", nil, nil) ) + expect( yum_cache.package_available?("foo") ).to be false + end + + it "package_available? returns true if the helper returns an available version" do + expect( python_helper ).to receive(:package_query).with(:whatavailable, "foo").and_return( yum_version("foo", "1.2.3-1", "x86_64") ) + expect( yum_cache.package_available?("foo") ).to be true + end + + it "version_available? returns false if the helper reports the available version is nil" do + expect( python_helper ).to receive(:package_query).with(:whatavailable, "foo", "1.2.3", nil).and_return( yum_version("foo", nil, nil) ) + expect( yum_cache.version_available?("foo", "1.2.3") ).to be false + end + + it "version_available? returns true if the helper returns an available version" do + expect( python_helper ).to receive(:package_query).with(:whatavailable, "foo", "1.2.3", nil).and_return( yum_version("foo", "1.2.3-1", "x86_64") ) + expect( yum_cache.version_available?("foo", "1.2.3") ).to be true + end + + it "version_available? with an arch returns false if the helper reports the available version is nil" do + expect( python_helper ).to receive(:package_query).with(:whatavailable, "foo", "1.2.3", "x86_64").and_return( yum_version("foo", nil, nil) ) + expect( yum_cache.version_available?("foo", "1.2.3", "x86_64") ).to be false + end + + it "version_available? with an arch returns true if the helper returns an available version" do + expect( python_helper ).to receive(:package_query).with(:whatavailable, "foo", "1.2.3", "x86_64").and_return( yum_version("foo", "1.2.3-1", "x86_64") ) + expect( yum_cache.version_available?("foo", "1.2.3", "x86_64") ).to be true + end + + [ :refresh, :reload, :reload_installed, :reload_provides, :reset, :reset_installed ].each do |method| + it "restarts the python helper when #{method} is called" do + expect( python_helper ).to receive(:restart) + yum_cache.send(method) + end + end + + it "installed_version? returns nil if the helper reports the installed version is nil" do + expect( python_helper ).to receive(:package_query).with(:whatinstalled, "foo").and_return( yum_version("foo", nil, nil) ) + expect( yum_cache.installed_version("foo") ).to be nil + end + + it "installed_version? returns version string if the helper returns an installed version" do + expect( python_helper ).to receive(:package_query).with(:whatinstalled, "foo").and_return( yum_version("foo", "1.2.3-1", "x86_64") ) + expect( yum_cache.installed_version("foo") ).to eql("1.2.3-1.x86_64") + end + + it "available_version? returns nil if the helper reports the available version is nil" do + expect( python_helper ).to receive(:package_query).with(:whatavailable, "foo").and_return( yum_version("foo", nil, nil) ) + expect( yum_cache.available_version("foo") ).to be nil + end + + it "available_version? returns version string if the helper returns an available version" do + expect( python_helper ).to receive(:package_query).with(:whatavailable, "foo").and_return( yum_version("foo", "1.2.3-1", "x86_64") ) + expect( yum_cache.available_version("foo") ).to eql("1.2.3-1.x86_64") + end +end |