summaryrefslogtreecommitdiffstats
path: root/spec/unit/ral/provider
diff options
context:
space:
mode:
authorLuke Kanies <luke@madstop.com>2007-11-08 16:30:51 -0600
committerLuke Kanies <luke@madstop.com>2007-11-08 16:30:51 -0600
commit8f04446c9473cf80328dd9cbc9a1d15b6057409a (patch)
treeb3bbcc5745aca496a5c071310b00633a9d19d35d /spec/unit/ral/provider
parentdfe774f55e98db085d8f5729a4b1229513c6c2b0 (diff)
downloadpuppet-8f04446c9473cf80328dd9cbc9a1d15b6057409a.tar.gz
puppet-8f04446c9473cf80328dd9cbc9a1d15b6057409a.tar.xz
puppet-8f04446c9473cf80328dd9cbc9a1d15b6057409a.zip
Fixing the 'mount' tests so that they no longer
modify the local system and they run fine as non-root users.
Diffstat (limited to 'spec/unit/ral/provider')
-rwxr-xr-xspec/unit/ral/provider/mount/parsed.rb182
1 files changed, 182 insertions, 0 deletions
diff --git a/spec/unit/ral/provider/mount/parsed.rb b/spec/unit/ral/provider/mount/parsed.rb
new file mode 100755
index 000000000..89928891a
--- /dev/null
+++ b/spec/unit/ral/provider/mount/parsed.rb
@@ -0,0 +1,182 @@
+#!/usr/bin/env ruby
+#
+# Created by Luke Kanies on 2007-9-12.
+# Copyright (c) 2006. All rights reserved.
+
+require File.dirname(__FILE__) + '/../../../../spec_helper'
+
+require 'puppettest/support/utils'
+require 'puppettest/fileparsing'
+
+module ParsedMountTesting
+ include PuppetTest::Support::Utils
+ include PuppetTest::FileParsing
+
+ def setup
+ @mount_class = Puppet.type(:mount)
+ @provider_class = @mount_class.provider(:parsed)
+ end
+
+ def fake_fstab
+ os = Facter['operatingsystem']
+ if os == "Solaris"
+ name = "solaris.fstab"
+ elsif os == "FreeBSD"
+ name = "freebsd.fstab"
+ else
+ # Catchall for other fstabs
+ name = "linux.fstab"
+ end
+ oldpath = @provider_class.default_target
+ return fakefile(File::join("data/types/mount", name))
+ end
+
+ def mkmountargs
+ mount = nil
+
+ if defined? @pcount
+ @pcount += 1
+ else
+ @pcount = 1
+ end
+ args = {
+ :name => "/fspuppet%s" % @pcount,
+ :device => "/dev/dsk%s" % @pcount,
+ }
+
+ @provider_class.fields(:parsed).each do |field|
+ unless args.include? field
+ args[field] = "fake%s%s" % [field, @pcount]
+ end
+ end
+
+ return args
+ end
+
+ def mkmount
+ hash = mkmountargs()
+ #hash[:provider] = @provider_class.name
+
+ fakeresource = stub :type => :mount, :name => hash[:name]
+ fakeresource.stubs(:[]).with(:name).returns(hash[:name])
+ fakeresource.stubs(:should).with(:target).returns(nil)
+
+ mount = @provider_class.new(fakeresource)
+ hash[:record_type] = :parsed
+ hash[:ensure] = :present
+ mount.property_hash = hash
+
+ return mount
+ end
+
+ # Here we just create a fake host type that answers to all of the methods
+ # but does not modify our actual system.
+ def mkfaketype
+ @provider.stubs(:filetype).returns(Puppet::Util::FileType.filetype(:ram))
+ end
+end
+
+provider_class = Puppet::Type.type(:mount).provider(:parsed)
+
+describe provider_class do
+ include ParsedMountTesting
+
+ it "should be able to parse all of the example mount tabs" do
+ tab = fake_fstab
+ @provider = @provider_class
+
+ # LAK:FIXME Again, a relatively bad test, but I don't know how to rspec-ify this.
+ # I suppose this is more of an integration test? I dunno.
+ fakedataparse(tab) do
+ # Now just make we've got some mounts we know will be there
+ hashes = @provider_class.target_records(tab).find_all { |i| i.is_a? Hash }
+ (hashes.length > 0).should be_true
+ root = hashes.find { |i| i[:name] == "/" }
+
+ proc { @provider_class.to_file(hashes) }.should_not raise_error
+ end
+ end
+
+ # LAK:FIXME I can't mock Facter because this test happens at parse-time.
+ it "should default to /etc/vfstab on Solaris and /etc/fstab everywhere else" do
+ should = case Facter.value(:operatingsystem)
+ when "Solaris": "/etc/vfstab"
+ else
+ "/etc/fstab"
+ end
+ Puppet::Type.type(:mount).provider(:parsed).default_target.should == should
+ end
+end
+
+describe provider_class, " when mounting an absent filesystem" do
+ include ParsedMountTesting
+
+ # #730 - Make sure 'flush' is called when a mount is moving from absent to mounted
+ it "should flush the fstab to disk" do
+ mount = mkmount
+
+ # Mark the mount as absent
+ mount.property_hash[:ensure] = :absent
+
+ mount.stubs(:mountcmd) # just so we don't actually try to mount anything
+
+ mount.expects(:flush)
+ mount.mount
+ end
+end
+
+describe provider_class, " when modifying the filesystem tab" do
+ include ParsedMountTesting
+ before do
+ @mount = mkmount
+ @target = @provider_class.default_target
+
+ # Never write to disk, only to RAM.
+ @provider_class.stubs(:filetype).returns(Puppet::Util::FileType.filetype(:ram))
+ end
+
+ it "should write the mount to disk when :flush is called" do
+ @mount.flush
+
+ text = @provider_class.target_object(@provider_class.default_target).read
+ text.should == @mount.class.to_line(@mount.property_hash) + "\n"
+ end
+end
+
+describe provider_class, " when parsing information about the root filesystem" do
+ confine "Mount type not tested on Darwin" => Facter["operatingsystem"].value != "Darwin"
+ include ParsedMountTesting
+
+ before do
+ @mount = @mount_class.create :name => "/"
+ @provider = @mount.provider
+ end
+
+ it "should have a filesystem tab" do
+ FileTest.should be_exist(@provider_class.default_target)
+ end
+
+ it "should find the root filesystem" do
+ @provider_class.prefetch("/" => @mount)
+ @mount.provider.property_hash[:ensure].should == :present
+ end
+
+ it "should determine that the root fs is mounted" do
+ @provider_class.prefetch("/" => @mount)
+ @mount.provider.should be_mounted
+ end
+
+ after do
+ Puppet::Type.allclear
+ end
+end
+
+describe provider_class, " when mounting and unmounting" do
+ include ParsedMountTesting
+
+ it "should call the 'mount' command to mount the filesystem"
+
+ it "should call the 'unmount' command to unmount the filesystem"
+
+ it "should specify the filesystem when remounting a filesystem"
+end