diff --git a/spec/unit/util/filetype_spec.rb b/spec/unit/util/filetype_spec.rb index fdb5e7091..7c9685b41 100755 --- a/spec/unit/util/filetype_spec.rb +++ b/spec/unit/util/filetype_spec.rb @@ -1,184 +1,190 @@ #!/usr/bin/env rspec require 'spec_helper' require 'puppet/util/filetype' # XXX Import all of the tests into this file. describe Puppet::Util::FileType do describe "the flat filetype" do - before do - @type = Puppet::Util::FileType.filetype(:flat) - end + let(:path) { '/my/file' } + let(:type) { Puppet::Util::FileType.filetype(:flat) } + let(:file) { type.new(path) } it "should exist" do - @type.should_not be_nil + type.should_not be_nil end describe "when the file already exists" do it "should return the file's contents when asked to read it" do - file = @type.new("/my/file") - File.expects(:exist?).with("/my/file").returns true - File.expects(:read).with("/my/file").returns "my text" + File.expects(:exist?).with(path).returns true + File.expects(:read).with(path).returns "my text" file.read.should == "my text" end it "should unlink the file when asked to remove it" do - file = @type.new("/my/file") - File.expects(:exist?).with("/my/file").returns true - File.expects(:unlink).with("/my/file") + File.expects(:exist?).with(path).returns true + File.expects(:unlink).with(path) file.remove end end describe "when the file does not exist" do it "should return an empty string when asked to read the file" do - file = @type.new("/my/file") - File.expects(:exist?).with("/my/file").returns false + File.expects(:exist?).with(path).returns false file.read.should == "" end end describe "when writing the file" do + let(:tempfile) { stub 'tempfile', :print => nil, :close => nil, :flush => nil, :path => "/other/file" } before do - @file = @type.new("/my/file") FileUtils.stubs(:cp) - - @tempfile = stub 'tempfile', :print => nil, :close => nil, :flush => nil, :path => "/other/file" - Tempfile.stubs(:new).returns @tempfile + Tempfile.stubs(:new).returns tempfile end it "should first create a temp file and copy its contents over to the file location" do - Tempfile.expects(:new).with("puppet").returns @tempfile - @tempfile.expects(:print).with("my text") - @tempfile.expects(:flush) - @tempfile.expects(:close) - FileUtils.expects(:cp).with(@tempfile.path, "/my/file") + Tempfile.expects(:new).with("puppet").returns tempfile + tempfile.expects(:print).with("my text") + tempfile.expects(:flush) + tempfile.expects(:close) + FileUtils.expects(:cp).with(tempfile.path, path) - @file.write "my text" + file.write "my text" end it "should set the selinux default context on the file" do - @file.expects(:set_selinux_default_context).with("/my/file") - @file.write "eh" + file.expects(:set_selinux_default_context).with(path) + file.write "eh" end end describe "when backing up a file" do - before do - @file = @type.new("/my/file") - end - it "should do nothing if the file does not exist" do - File.expects(:exists?).with("/my/file").returns false - @file.expects(:bucket).never - @file.backup + File.expects(:exists?).with(path).returns false + file.expects(:bucket).never + file.backup end it "should use its filebucket to backup the file if it exists" do - File.expects(:exists?).with("/my/file").returns true + File.expects(:exists?).with(path).returns true bucket = mock 'bucket' - bucket.expects(:backup).with("/my/file") + bucket.expects(:backup).with(path) - @file.expects(:bucket).returns bucket - @file.backup + file.expects(:bucket).returns bucket + file.backup end it "should use the default filebucket" do bucket = mock 'bucket' bucket.expects(:bucket).returns "mybucket" Puppet::Type.type(:filebucket).expects(:mkdefaultbucket).returns bucket - @file.bucket.should == "mybucket" + file.bucket.should == "mybucket" end end end - describe "the suntab filetype" do - before :each do - @type = Puppet::Util::FileType.filetype(:suntab) - @cron = @type.new('no_such_user') - end - - let :suntab do - File.read(my_fixture('suntab_output')) - end + shared_examples_for "crontab provider" do + let(:cron) { type.new('no_such_user') } + let(:crontab) { File.read(my_fixture(crontab_output)) } + let(:options) { { :failonfail => true, :combine => true } } + let(:uid) { 'no_such_user' } + let(:user_options) { options.merge({:uid => uid}) } it "should exist" do - @type.should_not be_nil + type.should_not be_nil end describe "#read" do it "should run crontab -l as the target user" do - Puppet::Util.expects(:execute).with(['crontab', '-l'], :failonfail => true, :combine => true, :uid => 'no_such_user').returns suntab - @cron.read.should == suntab + Puppet::Util.expects(:execute).with(['crontab', '-l'], user_options).returns crontab + cron.read.should == crontab end it "should not switch user if current user is the target user" do - Puppet::Util.expects(:uid).with('no_such_user').returns 9000 + Puppet::Util.expects(:uid).with(uid).returns 9000 Puppet::Util::SUIDManager.expects(:uid).returns 9000 - Puppet::Util.expects(:execute).with(['crontab', '-l'], :failonfail => true, :combine => true).returns suntab - @cron.read.should == suntab + Puppet::Util.expects(:execute).with(['crontab', '-l'], options).returns crontab + cron.read.should == crontab end - # possible crontab output was taken from here: - # http://docs.oracle.com/cd/E19082-01/819-2380/sysrescron-60/index.html it "should treat an absent crontab as empty" do - Puppet::Util.expects(:execute).with(['crontab', '-l'], :failonfail => true, :combine => true, :uid => 'no_such_user').raises(Puppet::ExecutionFailure, 'crontab: can\'t open your crontab file') - @cron.read.should == '' + Puppet::Util.expects(:execute).with(['crontab', '-l'], user_options).raises(Puppet::ExecutionFailure, absent_crontab) + cron.read.should == '' end it "should raise an error if the user is not authorized to use cron" do - Puppet::Util.expects(:execute).with(['crontab', '-l'], :failonfail => true, :combine => true, :uid => 'no_such_user').raises(Puppet::ExecutionFailure, 'crontab: you are not authorized to use cron. Sorry.') - expect { @cron.read }.to raise_error Puppet::Error, /User no_such_user not authorized to use cron/ + Puppet::Util.expects(:execute).with(['crontab', '-l'], user_options).raises(Puppet::ExecutionFailure, unauthorized_crontab) + expect { + cron.read + }.to raise_error Puppet::Error, /User #{uid} not authorized to use cron/ end end describe "#remove" do it "should run crontab -r as the target user" do - Puppet::Util.expects(:execute).with(['crontab', '-r'], :failonfail => true, :combine => true, :uid => 'no_such_user') - @cron.remove + Puppet::Util.expects(:execute).with(['crontab', '-r'], user_options) + cron.remove end it "should not switch user if current user is the target user" do - Puppet::Util.expects(:uid).with('no_such_user').returns 9000 + Puppet::Util.expects(:uid).with(uid).returns 9000 Puppet::Util::SUIDManager.expects(:uid).returns 9000 - Puppet::Util.expects(:execute).with(['crontab','-r'], :failonfail => true, :combine => true) - @cron.remove + Puppet::Util.expects(:execute).with(['crontab','-r'], options) + cron.remove end end describe "#write" do before :each do - @tmp_cron = Tempfile.new("puppet_suntab_spec") + @tmp_cron = Tempfile.new("puppet_crontab_spec") @tmp_cron_path = @tmp_cron.path - Puppet::Util.stubs(:uid).with('no_such_user').returns 9000 - Tempfile.expects(:new).with("puppet_suntab").returns @tmp_cron + Puppet::Util.stubs(:uid).with(uid).returns 9000 + Tempfile.expects(:new).with("puppet_#{name}").returns @tmp_cron end after :each do File.should_not be_exist @tmp_cron_path end it "should run crontab as the target user on a temporary file" do File.expects(:chown).with(9000, nil, @tmp_cron_path) - Puppet::Util.expects(:execute).with(["crontab", @tmp_cron_path], :failonfail => true, :combine => true, :uid => 'no_such_user') + Puppet::Util.expects(:execute).with(["crontab", @tmp_cron_path], user_options) @tmp_cron.expects(:print).with("foo\n") - @cron.write "foo\n" + cron.write "foo\n" end it "should not switch user if current user is the target user" do Puppet::Util::SUIDManager.expects(:uid).returns 9000 File.expects(:chown).with(9000, nil, @tmp_cron_path) - Puppet::Util.expects(:execute).with(["crontab", @tmp_cron_path], :failonfail => true, :combine => true) + Puppet::Util.expects(:execute).with(["crontab", @tmp_cron_path], options) + @tmp_cron.expects(:print).with("foo\n") - @cron.write "foo\n" + cron.write "foo\n" end end end + + describe "the suntab filetype" do + let(:type) { Puppet::Util::FileType.filetype(:suntab) } + let(:name) { type.name } + let(:crontab_output) { 'suntab_output' } + + # possible crontab output was taken from here: + # http://docs.oracle.com/cd/E19082-01/819-2380/sysrescron-60/index.html + let(:absent_crontab) do + 'crontab: can\'t open your crontab file' + end + let(:unauthorized_crontab) do + 'crontab: you are not authorized to use cron. Sorry.' + end + + it_should_behave_like "crontab provider" + end end