Updated mcollective.init according to OSCI-658
[packages/precise/mcollective.git] / spec / unit / plugins / mcollective / packagers / debpackage_packager_spec.rb
diff --git a/spec/unit/plugins/mcollective/packagers/debpackage_packager_spec.rb b/spec/unit/plugins/mcollective/packagers/debpackage_packager_spec.rb
new file mode 100644 (file)
index 0000000..74755d8
--- /dev/null
@@ -0,0 +1,311 @@
+#!/usr/bin/env rspec
+require 'spec_helper'
+require File.dirname(__FILE__) + '/../../../../../plugins/mcollective/pluginpackager/debpackage_packager.rb'
+
+module MCollective
+  module PluginPackager
+    describe DebpackagePackager do
+
+      let(:maketmpdir) do
+        tmpdir = Dir.mktmpdir("mc-test")
+        @tmpdirs << tmpdir
+        tmpdir
+      end
+
+      before :all do
+        @tmpdirs = []
+      end
+
+      before :each do
+        PluginPackager.stubs(:build_tool?).with("debuild").returns(true)
+        @plugin = mock()
+        @plugin.stubs(:mcname).returns("mcollective")
+      end
+
+      after :all do
+        @tmpdirs.each{|tmpdir| FileUtils.rm_rf tmpdir if File.directory? tmpdir}
+      end
+
+      describe "#initialize" do
+        it "should raise an exception if debuild isn't present" do
+          PluginPackager.expects(:build_tool?).with("debuild").returns(false)
+          expect{
+            DebpackagePackager.new("plugin")
+          }.to raise_error(RuntimeError, "package 'debuild' is not installed")
+        end
+
+        it "should set the correct libdir and verbose value" do
+          PluginPackager.expects(:build_tool?).with("debuild").returns(true)
+          packager = DebpackagePackager.new("plugin", nil, nil, true)
+          packager.libdir.should == "/usr/share/mcollective/plugins/mcollective/"
+          packager.verbose.should == true
+        end
+      end
+
+      describe "#create_packages" do
+        before :each do
+          @packager = DebpackagePackager.new(@plugin)
+          @plugin.stubs(:packagedata).returns({:test => {:files => ["test.rb"]}})
+          @plugin.stubs(:metadata).returns({:name => "test_plugin", :version => "1"})
+          @plugin.stubs(:iteration).returns("1")
+          @packager.stubs(:prepare_tmpdirs)
+          @packager.stubs(:create_package)
+          @packager.stubs(:move_packages)
+          @packager.stubs(:cleanup_tmpdirs)
+          Dir.stubs(:mktmpdir).with("mcollective_packager").returns("/tmp")
+          Dir.stubs(:mkdir)
+        end
+
+        it "should set the package instance variables" do
+          @packager.create_packages
+          @packager.current_package_type.should == :test
+          @packager.current_package_data.should == {:files => ["test.rb"]}
+          @packager.current_package_shortname.should == "mcollective-test_plugin-test"
+          @packager.current_package_fullname.should == "mcollective-test_plugin-test_1-1"
+        end
+
+        it "Should create the build dir" do
+          Dir.expects(:mkdir).with("/tmp/mcollective-test_plugin-test_1")
+          @packager.create_packages
+        end
+
+        it "should create packages" do
+          @packager.expects(:create_package)
+          @packager.create_packages
+        end
+      end
+
+      describe "#create_package" do
+        it "should raise an exception if the package cannot be created" do
+          packager = DebpackagePackager.new(@plugin)
+          packager.stubs(:create_file).raises("test exception")
+          expect{
+            packager.create_package
+          }.to raise_error(RuntimeError, "Could not build package - test exception")
+        end
+
+        it "should correctly create a package" do
+          packager = DebpackagePackager.new(@plugin, nil, nil, true)
+
+          packager.expects(:create_file).with("control")
+          packager.expects(:create_file).with("Makefile")
+          packager.expects(:create_file).with("compat")
+          packager.expects(:create_file).with("rules")
+          packager.expects(:create_file).with("copyright")
+          packager.expects(:create_file).with("changelog")
+          packager.expects(:create_tar)
+          packager.expects(:create_install)
+          packager.expects(:create_preandpost_install)
+
+          packager.build_dir = "/tmp"
+          packager.tmpdir = "/tmp"
+          packager.current_package_fullname = "test"
+          PluginPackager.expects(:safe_system).with("debuild -i -us -uc")
+          packager.expects(:puts).with("Created package test")
+
+          packager.create_package
+        end
+
+        it "should add a signature if one is given" do
+          packager = DebpackagePackager.new(@plugin, nil, "test", true)
+
+          packager.expects(:create_file).with("control")
+          packager.expects(:create_file).with("Makefile")
+          packager.expects(:create_file).with("compat")
+          packager.expects(:create_file).with("rules")
+          packager.expects(:create_file).with("copyright")
+          packager.expects(:create_file).with("changelog")
+          packager.expects(:create_tar)
+          packager.expects(:create_install)
+          packager.expects(:create_preandpost_install)
+
+          packager.build_dir = "/tmp"
+          packager.tmpdir = "/tmp"
+          packager.current_package_fullname = "test"
+          PluginPackager.expects(:safe_system).with("debuild -i -ktest")
+          packager.expects(:puts).with("Created package test")
+
+          packager.create_package
+        end
+      end
+
+      describe "#create_preandpost_install" do
+        before :each do
+          @packager = DebpackagePackager.new(@plugin)
+        end
+
+        it "should raise an exception if preinstall is not null and preinstall script isn't present" do
+          @plugin.stubs(:preinstall).returns("myscript")
+          File.expects(:exists?).with("myscript").returns(false)
+          expect{
+            @packager.create_preandpost_install
+          }.to raise_error(RuntimeError, "pre-install script 'myscript' not found")
+        end
+
+        it "should raise an exception if postinstall is not null and postinstall script isn't present" do
+          @plugin.stubs(:preinstall).returns(nil)
+          @plugin.stubs(:postinstall).returns("myscript")
+          File.expects(:exists?).with("myscript").returns(false)
+          expect{
+            @packager.create_preandpost_install
+          }.to raise_error(RuntimeError, "post-install script 'myscript' not found")
+        end
+
+        it "should copy the preinstall and postinstall scripts to the correct directory with the correct name" do
+          @plugin.stubs(:postinstall).returns("myscript")
+          @plugin.stubs(:preinstall).returns("myscript")
+          @packager.build_dir = "/tmp/"
+          @packager.current_package_shortname = "test"
+          File.expects(:exists?).with("myscript").twice.returns(true)
+          FileUtils.expects(:cp).with("myscript", "/tmp/debian/test.preinst")
+          FileUtils.expects(:cp).with("myscript", "/tmp/debian/test.postinst")
+          @packager.create_preandpost_install
+        end
+      end
+
+      describe "#create_install" do
+        before :each do
+          @packager = DebpackagePackager.new(@plugin)
+          @plugin.stubs(:path).returns("")
+        end
+
+        it "should raise an exception if the install file can't be created" do
+          File.expects(:join).raises("test error")
+          expect{
+            @packager.create_install
+          }.to raise_error(RuntimeError, "Could not create install file - test error")
+        end
+
+        it "should copy the package install file to the correct location" do
+          tmpdir = maketmpdir
+          Dir.mkdir(File.join(tmpdir, "debian"))
+          @packager.build_dir = tmpdir
+          @packager.current_package_shortname = "test"
+          @packager.current_package_data = {:files => ["foo.rb"]}
+          @packager.create_install
+          install_file = File.read("#{tmpdir}/debian/test.install")
+          install_file.should == "/usr/share/mcollective/plugins/mcollective/foo.rb /usr/share/mcollective/plugins/mcollective\n"
+        end
+      end
+
+      describe "#move_packages" do
+        before :each do
+          @plugin = mock()
+        end
+
+        it "should move the packages to the working directory" do
+          Dir.expects(:glob)
+          File.expects(:join)
+          FileUtils.expects(:cp)
+          @packager = DebpackagePackager.new(@plugin)
+          @packager.move_packages
+        end
+
+        it "should raise an error if the packages could not be moved" do
+          @packager = DebpackagePackager.new(@plugin)
+          File.expects(:join).raises("error")
+          expect{
+            @packager.move_packages
+          }.to raise_error(RuntimeError, "Could not copy packages to working directory: 'error'")
+        end
+      end
+
+      describe "#create_tar" do
+        before :each do
+          @packager = DebpackagePackager.new(@plugin, nil, true)
+        end
+
+        it "should raise an exception if the tarball can't be built" do
+          PluginPackager.expects(:do_quietly?).raises("test error")
+          expect{
+            @packager.create_tar
+          }.to raise_error(RuntimeError, "Could not create tarball - test error")
+        end
+
+        it "should create a tarball containing the package files" do
+          @packager.tmpdir = "/tmp"
+          @packager.build_dir = "/build_dir"
+          @packager.current_package_shortname = "test"
+          @plugin.stubs(:metadata).returns(@plugin)
+          @plugin.stubs(:[]).with(:version).returns("1")
+          @plugin.stubs(:iteration).returns("1")
+          PluginPackager.expects(:safe_system).with("tar -Pcvzf /tmp/test_1.orig.tar.gz test_1")
+          @packager.create_tar
+        end
+      end
+
+      describe "#create_file" do
+        before :each do
+          @packager = DebpackagePackager.new(@plugin)
+        end
+
+        it "should raise an exception if the file can't be created" do
+          File.expects(:dirname).raises("test error")
+          expect{
+            @packager.create_file("test")
+          }.to raise_error(RuntimeError, "could not create test file - test error")
+        end
+
+        it "should place a build file in the debian directory" do
+          tmpdir = maketmpdir
+          Dir.mkdir(File.join(tmpdir, "debian"))
+          @packager.build_dir = tmpdir
+          File.expects(:read).returns("testfile")
+          @packager.create_file("testfile")
+          File.unstub(:read)
+          result = File.read(File.join(tmpdir, "debian", "testfile"))
+          result.stubs(:result)
+          result.should == "testfile\n"
+        end
+      end
+
+      describe "#prepare_tmpdirs" do
+        before :each do
+          @tmpfile = Tempfile.new("mc-file").path
+        end
+
+        after :each do
+          begin
+            FileUtils.rm(@tmpfile)
+          rescue Exception
+          end
+        end
+
+        it "should create the correct tmp dirs and copy package contents to correct dir" do
+          packager = DebpackagePackager.new(@plugin)
+          tmpdir = maketmpdir
+          packager.build_dir = tmpdir
+          @plugin.stubs(:target_path).returns("")
+
+          packager.prepare_tmpdirs({:files => [@tmpfile]})
+          File.directory?(tmpdir).should == true
+          File.directory?(File.join(tmpdir, "debian")).should == true
+          File.exists?(File.join(tmpdir, packager.libdir, "tmp", File.basename(@tmpfile))).should == true
+        end
+      end
+
+      describe "#cleanup_tmpdirs" do
+        before :all do
+          @tmpdir = maketmpdir
+        end
+
+        before :each do
+          @packager = DebpackagePackager.new(@plugin)
+        end
+
+        it "should cleanup temp directories" do
+          @packager.tmpdir = @tmpdir
+          @packager.cleanup_tmpdirs
+          File.directory?(@tmpdir).should == false
+        end
+
+        it "should not delete any directories if @tmpdir isn't present" do
+          @packager = DebpackagePackager.new(@plugin)
+          @packager.tmpdir = rand.to_s
+          FileUtils.expects(:rm_r).never
+          @packager.cleanup_tmpdirs
+        end
+      end
+    end
+  end
+end