From 6bb2a85a2d1bfdf0fd3fb09339c4b98c627610bf Mon Sep 17 00:00:00 2001 From: Paul Boyd Date: Wed, 11 May 2011 21:21:38 -0400 Subject: (#1853) Pacman package provider Adds support for use Archlinux's pacman package manager in Puppet. Originally written by Miah Johnson, with bug fixes from Thomas Hatch and myself. --- spec/unit/provider/package/pacman_spec.rb | 237 ++++++++++++++++++++++++++++++ 1 file changed, 237 insertions(+) create mode 100644 spec/unit/provider/package/pacman_spec.rb (limited to 'spec') diff --git a/spec/unit/provider/package/pacman_spec.rb b/spec/unit/provider/package/pacman_spec.rb new file mode 100644 index 000000000..499ccca6a --- /dev/null +++ b/spec/unit/provider/package/pacman_spec.rb @@ -0,0 +1,237 @@ +#!/usr/bin/env ruby + +Dir.chdir(File.dirname(__FILE__)) { (s = lambda { |f| File.exist?(f) ? require(f) : Dir.chdir("..") { s.call(f) } }).call("spec/spec_helper.rb") } + +provider = Puppet::Type.type(:package).provider(:pacman) + +describe provider do + before do + @resource = stub 'resource' + @resource.stubs(:[]).returns("package") + @resource.stubs(:name).returns("name") + @provider = provider.new(@resource) + end + + describe "when installing" do + before do + @provider.stubs(:query).returns({ + :ensure => '1.0' + }) + end + + it "should call pacman" do + provider. + expects(:execute). + at_least_once. + with { |args| + args[0] == "/usr/bin/pacman" + }. + returns "" + + @provider.install + end + + it "should be quiet" do + provider. + expects(:execute). + with { |args| + args[1,2] == ["--noconfirm", "--noprogressbar"] + }. + returns("") + + @provider.install + end + + it "should install the right package" do + provider. + expects(:execute). + with { |args| + args[3,4] == ["-Sy", @resource[0]] + }. + returns("") + + @provider.install + end + + it "should raise an ExecutionFailure if the installation failed" do + provider.stubs(:execute).returns("") + @provider.expects(:query).returns(nil) + + lambda { @provider.install }.should raise_exception(Puppet::ExecutionFailure) + end + end + + describe "when updating" do + it "should call install" do + @provider.expects(:install).returns("install return value") + @provider.update.should == "install return value" + end + end + + describe "when uninstalling" do + it "should call pacman" do + provider. + expects(:execute). + with { |args| + args[0] == "/usr/bin/pacman" + }. + returns "" + + @provider.uninstall + end + + it "should be quiet" do + provider. + expects(:execute). + with { |args| + args[1,2] == ["--noconfirm", "--noprogressbar"] + }. + returns("") + + @provider.uninstall + end + + it "should remove the right package" do + provider. + expects(:execute). + with { |args| + args[3,4] == ["-R", @resource[0]] + }. + returns("") + + @provider.uninstall + end + end + + describe "when querying" do + it "should query pacman" do + provider. + expects(:execute). + with(["/usr/bin/pacman", "-Qi", @resource[0]]) + @provider.query + end + + it "should return the version" do + query_output = <=2.7.1 libfetch>=2.25 pacman-mirrorlist +Optional Deps : fakeroot: for makepkg usage as normal user + curl: for rankmirrors usage +Required By : None +Conflicts With : None +Replaces : None +Installed Size : 2352.00 K +Packager : Dan McGee +Architecture : i686 +Build Date : Sat 22 Jan 2011 03:56:41 PM EST +Install Date : Thu 27 Jan 2011 06:45:49 AM EST +Install Reason : Explicitly installed +Install Script : Yes +Description : A library-based package manager with dependency support +EOF + + provider.expects(:execute).returns(query_output) + @provider.query.should == {:ensure => "1.01.3-2"} + end + + it "should return a nil if the package isn't found" do + provider.expects(:execute).returns("") + @provider.query.should be_nil + end + + it "should return a hash indicating that the package is missing on error" do + provider.expects(:execute).raises(Puppet::ExecutionFailure.new("ERROR!")) + @provider.query.should == { + :ensure => :purged, + :status => 'missing', + :name => @resource[0], + :error => 'ok', + } + end + end + + describe "when fetching a package list" do + it "should query pacman" do + provider.expects(:execpipe).with(["/usr/bin/pacman", ' -Q']) + provider.instances + end + + it "should return installed packages with their versions" do + provider.expects(:execpipe).yields("package1 1.23-4\npackage2 2.00\n") + packages = provider.instances + + packages.length.should == 2 + + packages[0].properties.should == { + :provider => :pacman, + :ensure => '1.23-4', + :name => 'package1' + } + + packages[1].properties.should == { + :provider => :pacman, + :ensure => '2.00', + :name => 'package2' + } + end + + it "should return nil on error" do + provider.expects(:execpipe).raises(Puppet::ExecutionFailure.new("ERROR!")) + provider.instances.should be_nil + end + + it "should warn on invalid input" do + provider.expects(:execpipe).yields("blah") + provider.expects(:warning).with("Failed to match line blah") + provider.instances.should == [] + end + end + + describe "when determining the latest version" do + it "should refresh package list" do + refreshed = states('refreshed').starts_as('unrefreshed') + provider. + expects(:execute). + when(refreshed.is('unrefreshed')). + with(['/usr/bin/pacman', '-Sy']). + then(refreshed.is('refreshed')) + + provider. + stubs(:execute). + when(refreshed.is('refreshed')). + returns("") + + @provider.latest + end + + it "should get query pacman for the latest version" do + refreshed = states('refreshed').starts_as('unrefreshed') + provider. + stubs(:execute). + when(refreshed.is('unrefreshed')). + then(refreshed.is('refreshed')) + + provider. + expects(:execute). + when(refreshed.is('refreshed')). + with(['/usr/bin/pacman', '-Sp', '--print-format', '%v', @resource[0]]). + returns("") + + @provider.latest + end + + it "should return the version number from pacman" do + provider. + expects(:execute). + at_least_once(). + returns("1.00.2-3\n") + + @provider.latest.should == "1.00.2-3" + end + end +end -- cgit From 1dc662a0988fee83c92d2d46462f0662710ce7ad Mon Sep 17 00:00:00 2001 From: Paul Boyd Date: Sat, 14 May 2011 08:08:47 -0400 Subject: (#1853) Pacman package provider Stub the command method, so it doesn't give an error. --- spec/unit/provider/package/pacman_spec.rb | 1 + 1 file changed, 1 insertion(+) (limited to 'spec') diff --git a/spec/unit/provider/package/pacman_spec.rb b/spec/unit/provider/package/pacman_spec.rb index 499ccca6a..fbe4c446e 100644 --- a/spec/unit/provider/package/pacman_spec.rb +++ b/spec/unit/provider/package/pacman_spec.rb @@ -6,6 +6,7 @@ provider = Puppet::Type.type(:package).provider(:pacman) describe provider do before do + provider.stubs(:command).with(:pacman).returns('/usr/bin/pacman') @resource = stub 'resource' @resource.stubs(:[]).returns("package") @resource.stubs(:name).returns("name") -- cgit From 107b38a94f8b4e4a0fcca4879a167ab4c955fe4d Mon Sep 17 00:00:00 2001 From: Matt Robinson Date: Tue, 24 May 2011 09:31:39 -0700 Subject: maint: Fix pacman provider to work with Ruby 1.9 Ruby 1.9 doesn't allow the lambda to walk up the directory structure to require the spec helper This is the same issue as with commit: f6da3339f59bbd9243a03dc1e417b1fed7955c7e Also, you can't call each on a string in Ruby 1.9 directly since it doesn't implicitly do a split on \n like it did in older Rubies, but each_line works all the way back to 1.8.5 Reviewed-by: Nick Lewis --- spec/unit/provider/package/pacman_spec.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'spec') diff --git a/spec/unit/provider/package/pacman_spec.rb b/spec/unit/provider/package/pacman_spec.rb index fbe4c446e..679172621 100644 --- a/spec/unit/provider/package/pacman_spec.rb +++ b/spec/unit/provider/package/pacman_spec.rb @@ -1,6 +1,5 @@ -#!/usr/bin/env ruby - -Dir.chdir(File.dirname(__FILE__)) { (s = lambda { |f| File.exist?(f) ? require(f) : Dir.chdir("..") { s.call(f) } }).call("spec/spec_helper.rb") } +#!/usr/bin/env rspec +require 'spec_helper' provider = Puppet::Type.type(:package).provider(:pacman) -- cgit From 92a8f4a1cbb4e11a9bacf571b4c9f3d8181392fb Mon Sep 17 00:00:00 2001 From: Jacob Helwig Date: Fri, 17 Jun 2011 11:23:21 -0700 Subject: Remove order dependency from functions integration spec The test in spec/integration/parser/functions_spec.rb would fail when the spec tests were run in the order (among other orderings): spec/unit/parser/functions/tag_spec.rb spec/unit/parser/templatewrapper_spec.rb spec/integration/parser/functions_spec.rb There are tests that would cause the "template" function to be loaded into the root environment. Puppet::Parser::Functions.function("template") would then detect its presence and P::P::F.rmfunction("template") would fail since #function(...) looks in more than just the current environment to see if a function is defined, while #rmfunction(...) only looks in the current environment to see if a function can be removed. In the test ordering specified earlier, tag_spec.rb would load the "template" function, and templatewrapper_spec.rb would create a current environment that would mask the root environment for #rmfunction(...), but not for #function(...) Since #rmfunction(...) only looks in the current environment, we should be using #functions.include?("template") since that matches the check that #rmfunction(...) itself uses. Paired-with: Nick Lewis --- spec/integration/parser/functions_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'spec') diff --git a/spec/integration/parser/functions_spec.rb b/spec/integration/parser/functions_spec.rb index 6791987d7..6a8fbca9c 100755 --- a/spec/integration/parser/functions_spec.rb +++ b/spec/integration/parser/functions_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' describe Puppet::Parser::Functions do before :each do - Puppet::Parser::Functions.rmfunction("template") if Puppet::Parser::Functions.function("template") + Puppet::Parser::Functions.rmfunction("template") if Puppet::Parser::Functions.functions.include?("template") end it "should support multiple threads autoloading the same function" do -- cgit