diff options
author | dheerajd-msys <dheeraj.dubey@msystechnologies.com> | 2018-08-28 17:44:16 +0530 |
---|---|---|
committer | dheerajd-msys <dheeraj.dubey@msystechnologies.com> | 2018-09-25 11:36:10 +0530 |
commit | bf03eadf0ed4533932d026a1aaa2cced7b77d743 (patch) | |
tree | a71aa26d6165411a60fcd29c4c879efe93a81c5f | |
parent | 7b0adfc8f0b6507919f201f5314b4be5b794a1ba (diff) | |
download | chef-bf03eadf0ed4533932d026a1aaa2cced7b77d743.tar.gz |
functional test added
Signed-off-by: dheerajd-msys <dheeraj.dubey@msystechnologies.com>
16 files changed, 244 insertions, 1 deletions
diff --git a/spec/functional/assets/zypprepo/chef_rpm-1.10-1.aarch64.rpm b/spec/functional/assets/zypprepo/chef_rpm-1.10-1.aarch64.rpm Binary files differnew file mode 100644 index 0000000000..808e5c64c9 --- /dev/null +++ b/spec/functional/assets/zypprepo/chef_rpm-1.10-1.aarch64.rpm diff --git a/spec/functional/assets/zypprepo/chef_rpm-1.10-1.i686.rpm b/spec/functional/assets/zypprepo/chef_rpm-1.10-1.i686.rpm Binary files differnew file mode 100644 index 0000000000..ed7b6ddc8e --- /dev/null +++ b/spec/functional/assets/zypprepo/chef_rpm-1.10-1.i686.rpm diff --git a/spec/functional/assets/zypprepo/chef_rpm-1.10-1.ppc64.rpm b/spec/functional/assets/zypprepo/chef_rpm-1.10-1.ppc64.rpm Binary files differnew file mode 100644 index 0000000000..f3683b3c89 --- /dev/null +++ b/spec/functional/assets/zypprepo/chef_rpm-1.10-1.ppc64.rpm diff --git a/spec/functional/assets/zypprepo/chef_rpm-1.10-1.ppc64le.rpm b/spec/functional/assets/zypprepo/chef_rpm-1.10-1.ppc64le.rpm Binary files differnew file mode 100644 index 0000000000..4f8de433d9 --- /dev/null +++ b/spec/functional/assets/zypprepo/chef_rpm-1.10-1.ppc64le.rpm diff --git a/spec/functional/assets/zypprepo/chef_rpm-1.10-1.s390x.rpm b/spec/functional/assets/zypprepo/chef_rpm-1.10-1.s390x.rpm Binary files differnew file mode 100644 index 0000000000..98538293ff --- /dev/null +++ b/spec/functional/assets/zypprepo/chef_rpm-1.10-1.s390x.rpm diff --git a/spec/functional/assets/zypprepo/chef_rpm-1.10-1.src.rpm b/spec/functional/assets/zypprepo/chef_rpm-1.10-1.src.rpm Binary files differnew file mode 100644 index 0000000000..03a92f1cfc --- /dev/null +++ b/spec/functional/assets/zypprepo/chef_rpm-1.10-1.src.rpm diff --git a/spec/functional/assets/zypprepo/chef_rpm-1.10-1.x86_64.rpm b/spec/functional/assets/zypprepo/chef_rpm-1.10-1.x86_64.rpm Binary files differnew file mode 100644 index 0000000000..3533640780 --- /dev/null +++ b/spec/functional/assets/zypprepo/chef_rpm-1.10-1.x86_64.rpm diff --git a/spec/functional/assets/zypprepo/chef_rpm-1.2-1.aarch64.rpm b/spec/functional/assets/zypprepo/chef_rpm-1.2-1.aarch64.rpm Binary files differnew file mode 100644 index 0000000000..73d59bf3e2 --- /dev/null +++ b/spec/functional/assets/zypprepo/chef_rpm-1.2-1.aarch64.rpm diff --git a/spec/functional/assets/zypprepo/chef_rpm-1.2-1.i686.rpm b/spec/functional/assets/zypprepo/chef_rpm-1.2-1.i686.rpm Binary files differnew file mode 100644 index 0000000000..6637756abb --- /dev/null +++ b/spec/functional/assets/zypprepo/chef_rpm-1.2-1.i686.rpm diff --git a/spec/functional/assets/zypprepo/chef_rpm-1.2-1.ppc64.rpm b/spec/functional/assets/zypprepo/chef_rpm-1.2-1.ppc64.rpm Binary files differnew file mode 100644 index 0000000000..677e43f83b --- /dev/null +++ b/spec/functional/assets/zypprepo/chef_rpm-1.2-1.ppc64.rpm diff --git a/spec/functional/assets/zypprepo/chef_rpm-1.2-1.ppc64le.rpm b/spec/functional/assets/zypprepo/chef_rpm-1.2-1.ppc64le.rpm Binary files differnew file mode 100644 index 0000000000..df21a68780 --- /dev/null +++ b/spec/functional/assets/zypprepo/chef_rpm-1.2-1.ppc64le.rpm diff --git a/spec/functional/assets/zypprepo/chef_rpm-1.2-1.s390x.rpm b/spec/functional/assets/zypprepo/chef_rpm-1.2-1.s390x.rpm Binary files differnew file mode 100644 index 0000000000..02a771c6f5 --- /dev/null +++ b/spec/functional/assets/zypprepo/chef_rpm-1.2-1.s390x.rpm diff --git a/spec/functional/assets/zypprepo/chef_rpm-1.2-1.src.rpm b/spec/functional/assets/zypprepo/chef_rpm-1.2-1.src.rpm Binary files differnew file mode 100644 index 0000000000..5d4d13e18a --- /dev/null +++ b/spec/functional/assets/zypprepo/chef_rpm-1.2-1.src.rpm diff --git a/spec/functional/assets/zypprepo/chef_rpm-1.2-1.x86_64.rpm b/spec/functional/assets/zypprepo/chef_rpm-1.2-1.x86_64.rpm Binary files differnew file mode 100644 index 0000000000..314c52f22e --- /dev/null +++ b/spec/functional/assets/zypprepo/chef_rpm-1.2-1.x86_64.rpm diff --git a/spec/functional/resource/zypper_package_spec.rb b/spec/functional/resource/zypper_package_spec.rb new file mode 100644 index 0000000000..16fc4d205c --- /dev/null +++ b/spec/functional/resource/zypper_package_spec.rb @@ -0,0 +1,235 @@ +# +# Author:: Dheeraj Dubey (<dheeraj.dubey@msystechnologies.com>) +# Copyright:: Copyright 2016-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" +require "functional/resource/base" +require "chef/mixin/shell_out" + +# run this test only for following platforms. +exclude_test = !(%w{suse}.include?(ohai[:platform_family]) && !File.exist?("/usr/bin/zypper")) +describe Chef::Resource::ZypperPackage, :requires_root, external: exclude_test do + include Chef::Mixin::ShellOut + + # NOTE: every single test here needs to explicitly call preinstall. + + def preinstall(*rpms) + rpms.each do |rpm| + shell_out!("rpm -ivh #{CHEF_SPEC_ASSETS}/zypprepo/#{rpm}") + end + end + + before(:each) do + File.open("/etc/zypp/repos.d/chef-zypp-localtesting.repo", "w+") do |f| + f.write <<~EOF + [chef-zypp-localtesting] + name=Chef zypper spec testing repo + baseurl=file://#{CHEF_SPEC_ASSETS}/zypprepo + enable=1 + gpgcheck=0 + EOF + end + shell_out!("rpm -qa --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm | xargs -r rpm -e") + # next line is useful cleanup if you happen to have been testing zypper func tests on the same box and + # have some zypper garbage left around + # FileUtils.rm_f "/etc/zypp/repos.d/chef-zypp-localtesting.repo" + end + + after(:all) do + shell_out!("rpm -qa --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm | xargs -r rpm -e") + FileUtils.rm_f "/etc/zypp/repos.d/chef-zypp-localtesting.repo" + end + + let(:package_name) { "chef_rpm" } + let(:zypper_package) do + r = Chef::Resource::ZypperPackage.new(package_name, run_context) + r.global_options("--no-gpg-checks") + r + end + + def pkg_arch + ohai[:kernel][:machine] + end + + context "installing a package" do + after { remove_package } + it "installs the latest version" do + zypper_package.run_action(:install) + expect(zypper_package.updated_by_last_action?).to be true + expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^chef_rpm-1.10-1.#{pkg_arch}$") + end + + it "does not install if the package is installed" do + preinstall("chef_rpm-1.10-1.#{pkg_arch}.rpm") + zypper_package.run_action(:install) + expect(zypper_package.updated_by_last_action?).to be false + expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^chef_rpm-1.10-1.#{pkg_arch}$") + end + + it "does not install twice" do + zypper_package.run_action(:install) + expect(zypper_package.updated_by_last_action?).to be true + expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^chef_rpm-1.10-1.#{pkg_arch}$") + zypper_package.run_action(:install) + expect(zypper_package.updated_by_last_action?).to be false + expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^chef_rpm-1.10-1.#{pkg_arch}$") + end + + it "does not install if the prior version package is installed" do + preinstall("chef_rpm-1.2-1.#{pkg_arch}.rpm") + zypper_package.run_action(:install) + expect(zypper_package.updated_by_last_action?).to be false + expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^chef_rpm-1.2-1.#{pkg_arch}$") + end + end + + context "with versions or globs in the name" do + it "works with a version" do + zypper_package.package_name("chef_rpm") + zypper_package.version("1.10") + zypper_package.run_action(:install) + expect(zypper_package.updated_by_last_action?).to be true + expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^chef_rpm-1.10-1.#{pkg_arch}$") + end + + it "works with an older version" do + zypper_package.package_name("chef_rpm") + zypper_package.version("1.2") + zypper_package.run_action(:install) + expect(zypper_package.updated_by_last_action?).to be true + expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^chef_rpm-1.2-1.#{pkg_arch}$") + end + + it "works with version and release" do + zypper_package.package_name("chef_rpm") + zypper_package.version("1.2-1") + zypper_package.run_action(:install) + expect(zypper_package.updated_by_last_action?).to be true + expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^chef_rpm-1.2-1.#{pkg_arch}$") + end + + it "downgrades when the installed version is higher than the package_name version" do + preinstall("chef_rpm-1.10-1.#{pkg_arch}.rpm") + zypper_package.allow_downgrade true + zypper_package.package_name("chef_rpm") + zypper_package.version("1.2-1") + zypper_package.run_action(:install) + expect(zypper_package.updated_by_last_action?).to be true + expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^chef_rpm-1.2-1.#{pkg_arch}$") + end + end + + describe ":remove" do + context "vanilla use case" do + let(:package_name) { "chef_rpm" } + it "does nothing if the package is not installed" do + zypper_package.run_action(:remove) + expect(zypper_package.updated_by_last_action?).to be false + expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^package chef_rpm is not installed$") + end + + it "removes the package if the package is installed" do + preinstall("chef_rpm-1.10-1.#{pkg_arch}.rpm") + zypper_package.run_action(:remove) + expect(zypper_package.updated_by_last_action?).to be true + expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^package chef_rpm is not installed$") + end + + it "does not remove the package twice" do + preinstall("chef_rpm-1.10-1.#{pkg_arch}.rpm") + zypper_package.run_action(:remove) + expect(zypper_package.updated_by_last_action?).to be true + expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^package chef_rpm is not installed$") + zypper_package.run_action(:remove) + expect(zypper_package.updated_by_last_action?).to be false + expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^package chef_rpm is not installed$") + end + + it "removes the package if the prior version package is installed" do + preinstall("chef_rpm-1.2-1.#{pkg_arch}.rpm") + zypper_package.run_action(:remove) + expect(zypper_package.updated_by_last_action?).to be true + expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^package chef_rpm is not installed$") + end + end + + context "with no available version" do + it "works when a package is installed" do + FileUtils.rm_f "/etc/zypp/repos.d/chef-zypp-localtesting.repo" + preinstall("chef_rpm-1.2-1.#{pkg_arch}.rpm") + zypper_package.run_action(:remove) + expect(zypper_package.updated_by_last_action?).to be true + expect(shell_out("rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' chef_rpm").stdout.chomp).to match("^package chef_rpm is not installed$") + end + end + end + + describe ":lock and :unlock" do + before(:each) do + shell_out("zypper removelock chef_rpm") # will exit with error when nothing is locked, we don't care + end + + it "locks an rpm" do + zypper_package.package_name("chef_rpm") + zypper_package.run_action(:lock) + expect(zypper_package.updated_by_last_action?).to be true + expect(shell_out("zypper locks | grep chef_rpm").stdout.chomp).to match("chef_rpm") + end + + it "does not lock if its already locked" do + shell_out!("zypper addlock chef_rpm") + zypper_package.package_name("chef_rpm") + zypper_package.run_action(:lock) + expect(zypper_package.updated_by_last_action?).to be false + expect(shell_out("zypper locks | grep chef_rpm").stdout.chomp).to match("chef_rpm") + end + + it "unlocks an rpm" do + shell_out!("zypper addlock chef_rpm") + zypper_package.package_name("chef_rpm") + zypper_package.run_action(:unlock) + expect(zypper_package.updated_by_last_action?).to be true + expect(shell_out("zypper locks | grep chef_rpm").stdout.chomp).not_to match("chef_rpm") + end + + it "does not unlock an already locked rpm" do + zypper_package.package_name("chef_rpm") + zypper_package.run_action(:unlock) + expect(zypper_package.updated_by_last_action?).to be false + expect(shell_out("zypper locks | grep chef_rpm").stdout.chomp).not_to match("chef_rpm") + end + + it "check that we can lock based on provides" do + zypper_package.package_name("chef_rpm_provides") + zypper_package.run_action(:lock) + expect(zypper_package.updated_by_last_action?).to be true + expect(shell_out("zypper locks | grep chef_rpm_provides").stdout.chomp).to match("chef_rpm_provides") + end + + it "check that we can unlock based on provides" do + shell_out!("zypper addlock chef_rpm_provides") + zypper_package.package_name("chef_rpm_provides") + zypper_package.run_action(:unlock) + expect(zypper_package.updated_by_last_action?).to be true + expect(shell_out("zypper locks | grep chef_rpm_provides").stdout.chomp).not_to match("chef_rpm_provides") + end + end + def remove_package + pkg_to_remove = Chef::Resource::ZypperPackage.new(package_name, run_context) + pkg_to_remove.run_action(:remove) + end +end diff --git a/spec/unit/provider/package/zypper_spec.rb b/spec/unit/provider/package/zypper_spec.rb index d51c12e8f1..50f2bb0b5f 100644 --- a/spec/unit/provider/package/zypper_spec.rb +++ b/spec/unit/provider/package/zypper_spec.rb @@ -171,6 +171,14 @@ describe Chef::Provider::Package::Zypper do ) provider.install_package(["emacs"], ["1.0"]) end + + it "should add multiple user provided global options" do + new_resource.global_options "--user-provided1 --user-provided2" + shell_out_expectation!( + "zypper", "--user-provided1", "--user-provided2", "--non-interactive", "install", "--auto-agree-with-licenses", "emacs=1.0" + ) + provider.install_package(["emacs"], ["1.0"]) + end end describe "upgrade_package" do @@ -206,7 +214,7 @@ describe Chef::Provider::Package::Zypper do shell_out_expectation!( "zypper", "--user-provided", "--non-interactive", "install", "--auto-agree-with-licenses", "emacs=1.0" ) - provider.install_package(["emacs"], ["1.0"]) + provider.upgrade_package(["emacs"], ["1.0"]) end end |