X-Git-Url: https://review.fuel-infra.org/gitweb?a=blobdiff_plain;f=spec%2Funit%2Fplugins%2Fmcollective%2Fpackagers%2Fdebpackage_packager_spec.rb;fp=spec%2Funit%2Fplugins%2Fmcollective%2Fpackagers%2Fdebpackage_packager_spec.rb;h=74755d800c7deb906039172ebd08ac6da2d14da2;hb=b87d2f4e68281062df1913440ca5753ae63314a9;hp=0000000000000000000000000000000000000000;hpb=ab0ea530b8ac956091f17b104ab2311336cfc250;p=packages%2Fprecise%2Fmcollective.git 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 index 0000000..74755d8 --- /dev/null +++ b/spec/unit/plugins/mcollective/packagers/debpackage_packager_spec.rb @@ -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