summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordheerajd-msys <dheeraj.dubey@msystechnologies.com>2018-08-28 17:44:16 +0530
committerdheerajd-msys <dheeraj.dubey@msystechnologies.com>2018-09-25 11:36:10 +0530
commitbf03eadf0ed4533932d026a1aaa2cced7b77d743 (patch)
treea71aa26d6165411a60fcd29c4c879efe93a81c5f
parent7b0adfc8f0b6507919f201f5314b4be5b794a1ba (diff)
downloadchef-bf03eadf0ed4533932d026a1aaa2cced7b77d743.tar.gz
functional test added
Signed-off-by: dheerajd-msys <dheeraj.dubey@msystechnologies.com>
-rw-r--r--spec/functional/assets/zypprepo/chef_rpm-1.10-1.aarch64.rpmbin0 -> 2096 bytes
-rw-r--r--spec/functional/assets/zypprepo/chef_rpm-1.10-1.i686.rpmbin0 -> 2148 bytes
-rw-r--r--spec/functional/assets/zypprepo/chef_rpm-1.10-1.ppc64.rpmbin0 -> 2118 bytes
-rw-r--r--spec/functional/assets/zypprepo/chef_rpm-1.10-1.ppc64le.rpmbin0 -> 2098 bytes
-rw-r--r--spec/functional/assets/zypprepo/chef_rpm-1.10-1.s390x.rpmbin0 -> 2102 bytes
-rw-r--r--spec/functional/assets/zypprepo/chef_rpm-1.10-1.src.rpmbin0 -> 2132 bytes
-rw-r--r--spec/functional/assets/zypprepo/chef_rpm-1.10-1.x86_64.rpmbin0 -> 2110 bytes
-rw-r--r--spec/functional/assets/zypprepo/chef_rpm-1.2-1.aarch64.rpmbin0 -> 2096 bytes
-rw-r--r--spec/functional/assets/zypprepo/chef_rpm-1.2-1.i686.rpmbin0 -> 2149 bytes
-rw-r--r--spec/functional/assets/zypprepo/chef_rpm-1.2-1.ppc64.rpmbin0 -> 2119 bytes
-rw-r--r--spec/functional/assets/zypprepo/chef_rpm-1.2-1.ppc64le.rpmbin0 -> 2098 bytes
-rw-r--r--spec/functional/assets/zypprepo/chef_rpm-1.2-1.s390x.rpmbin0 -> 2102 bytes
-rw-r--r--spec/functional/assets/zypprepo/chef_rpm-1.2-1.src.rpmbin0 -> 2133 bytes
-rw-r--r--spec/functional/assets/zypprepo/chef_rpm-1.2-1.x86_64.rpmbin0 -> 2113 bytes
-rw-r--r--spec/functional/resource/zypper_package_spec.rb235
-rw-r--r--spec/unit/provider/package/zypper_spec.rb10
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
new file mode 100644
index 0000000000..808e5c64c9
--- /dev/null
+++ b/spec/functional/assets/zypprepo/chef_rpm-1.10-1.aarch64.rpm
Binary files differ
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
new file mode 100644
index 0000000000..ed7b6ddc8e
--- /dev/null
+++ b/spec/functional/assets/zypprepo/chef_rpm-1.10-1.i686.rpm
Binary files differ
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
new file mode 100644
index 0000000000..f3683b3c89
--- /dev/null
+++ b/spec/functional/assets/zypprepo/chef_rpm-1.10-1.ppc64.rpm
Binary files differ
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
new file mode 100644
index 0000000000..4f8de433d9
--- /dev/null
+++ b/spec/functional/assets/zypprepo/chef_rpm-1.10-1.ppc64le.rpm
Binary files differ
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
new file mode 100644
index 0000000000..98538293ff
--- /dev/null
+++ b/spec/functional/assets/zypprepo/chef_rpm-1.10-1.s390x.rpm
Binary files differ
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
new file mode 100644
index 0000000000..03a92f1cfc
--- /dev/null
+++ b/spec/functional/assets/zypprepo/chef_rpm-1.10-1.src.rpm
Binary files differ
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
new file mode 100644
index 0000000000..3533640780
--- /dev/null
+++ b/spec/functional/assets/zypprepo/chef_rpm-1.10-1.x86_64.rpm
Binary files differ
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
new file mode 100644
index 0000000000..73d59bf3e2
--- /dev/null
+++ b/spec/functional/assets/zypprepo/chef_rpm-1.2-1.aarch64.rpm
Binary files differ
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
new file mode 100644
index 0000000000..6637756abb
--- /dev/null
+++ b/spec/functional/assets/zypprepo/chef_rpm-1.2-1.i686.rpm
Binary files differ
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
new file mode 100644
index 0000000000..677e43f83b
--- /dev/null
+++ b/spec/functional/assets/zypprepo/chef_rpm-1.2-1.ppc64.rpm
Binary files differ
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
new file mode 100644
index 0000000000..df21a68780
--- /dev/null
+++ b/spec/functional/assets/zypprepo/chef_rpm-1.2-1.ppc64le.rpm
Binary files differ
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
new file mode 100644
index 0000000000..02a771c6f5
--- /dev/null
+++ b/spec/functional/assets/zypprepo/chef_rpm-1.2-1.s390x.rpm
Binary files differ
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
new file mode 100644
index 0000000000..5d4d13e18a
--- /dev/null
+++ b/spec/functional/assets/zypprepo/chef_rpm-1.2-1.src.rpm
Binary files differ
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
new file mode 100644
index 0000000000..314c52f22e
--- /dev/null
+++ b/spec/functional/assets/zypprepo/chef_rpm-1.2-1.x86_64.rpm
Binary files differ
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