diff options
author | Lamont Granquist <lamont@scriptkiddie.org> | 2014-05-29 11:31:56 -0700 |
---|---|---|
committer | Lamont Granquist <lamont@scriptkiddie.org> | 2014-05-29 11:31:56 -0700 |
commit | c20e9edbf6536fa368b1a9e6329fcfcc40d0c292 (patch) | |
tree | aed9972a86609ebbae5fee6e7d41a27a2ee75e7d | |
parent | 9eb200cf1e9348c52ca4be84498a0594011058b3 (diff) | |
download | chef-c20e9edbf6536fa368b1a9e6329fcfcc40d0c292.tar.gz |
starting on unit spec tests
-rw-r--r-- | spec/unit/provider/mount/solaris_spec.rb | 457 |
1 files changed, 457 insertions, 0 deletions
diff --git a/spec/unit/provider/mount/solaris_spec.rb b/spec/unit/provider/mount/solaris_spec.rb new file mode 100644 index 0000000000..6bbb1a2ed3 --- /dev/null +++ b/spec/unit/provider/mount/solaris_spec.rb @@ -0,0 +1,457 @@ +# +# Author:: Joshua Timberman (<joshua@opscode.com>) +# Copyright:: Copyright (c) 2008 OpsCode, Inc. +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +require 'spec_helper' +require 'ostruct' + +describe Chef::Provider::Mount::Solaris do + let(:node) { Chef::Node.new } + + let(:events) { Chef::EventDispatch::Dispatcher.new } + + let(:run_context) { Chef::RunContext.new(node, {}, events) } + + let(:new_resource) { + new_resource = Chef::Resource::Mount.new("/mnt/foo") + new_resource.device "/dev/dsk/c0t0d0s0" + new_resource.device_type :device + new_resource.fstype "ufs" + + new_resource.supports :remount => false + new_resource + } + + let(:provider) { + Chef::Provider::Mount::Solaris.new(new_resource, run_context) + } + + let(:vfstab_file) { + Tempfile.new("rspec-vfstab") + } + + before do + stub_const("Chef::Provider::Mount::Solaris::VFSTAB", vfstab_file.path ) + end + + describe "#define_resource_requirements" do + end + + describe "#load_current_resource" do + it "should create a current resource with the same mount point and device" do + provider.load_current_resource + provider.current_resource.name.should == '/mnt/foo' + provider.current_resource.mount_point.should == '/mnt/foo' + provider.current_resource.device.should == '/dev/dsk/c0t0d0s0' + end + + describe "when dealing with network mounts" do + { "nfs" => "nfsserver:/vol/path", + "cifs" => "//cifsserver/share" }.each do |type, fs_spec| + it "should detect network fs_spec (#{type})" do + new_resource.device fs_spec + provider.network_device?.should be_true + end + + it "should ignore trailing slash and set mounted to true for network mount (#{type})" do + new_resource.device fs_spec + provider.stub(:shell_out!).and_return(OpenStruct.new(:stdout => "#{fs_spec}/ on /tmp/foo type #{type} (rw)\n")) + provider.load_current_resource + provider.current_resource.mounted.should be_true + end + end + end + + it "should raise an error if the mount device does not exist" do + ::File.stub(:exists?).with("/dev/sdz1").and_return false + lambda { provider.load_current_resource();provider.mountable? }.should raise_error(Chef::Exceptions::Mount) + end + + it "should not call mountable? with load_current_resource - CHEF-1565" do + ::File.stub(:exists?).with("/dev/sdz1").and_return false + provider.should_receive(:mounted?).and_return(true) + provider.should_receive(:enabled?).and_return(true) + provider.should_not_receive(:mountable?) + provider.load_current_resource + end + + it "should raise an error if the mount device (uuid) does not exist" do + new_resource.device_type :uuid + new_resource.device "d21afe51-a0fe-4dc6-9152-ac733763ae0a" + status_findfs = double("Status", :exitstatus => 1) + stdout_findfs = double("STDOUT", :first => nil) + provider.should_receive(:popen4).with("/sbin/findfs UUID=d21afe51-a0fe-4dc6-9152-ac733763ae0a").and_yield(@pid,@stdin,stdout_findfs,@stderr).and_return(status_findfs) + ::File.should_receive(:exists?).with("").and_return(false) + lambda { provider.load_current_resource();provider.mountable? }.should raise_error(Chef::Exceptions::Mount) + end + + it "should raise an error if the mount point does not exist" do + ::File.stub(:exists?).with("/tmp/foo").and_return false + lambda { provider.load_current_resource();provider.mountable? }.should raise_error(Chef::Exceptions::Mount) + end + + it "does not expect the device to exist for tmpfs" do + new_resource.fstype("tmpfs") + new_resource.device("whatever") + lambda { provider.load_current_resource();provider.mountable? }.should_not raise_error + end + + it "does not expect the device to exist for Fuse filesystems" do + new_resource.fstype("fuse") + new_resource.device("nilfs#xxx") + lambda { provider.load_current_resource();provider.mountable? }.should_not raise_error + end + + it "does not expect the device to exist if it's none" do + new_resource.device("none") + lambda { provider.load_current_resource();provider.mountable? }.should_not raise_error + end + + it "should set mounted true if the mount point is found in the mounts list" do + provider.stub(:shell_out!).and_return(OpenStruct.new(:stdout => '/dev/sdz1 on /tmp/foo')) + provider.load_current_resource() + provider.current_resource.mounted.should be_true + end + + it "should set mounted true if the symlink target of the device is found in the mounts list" do + # expand the target path to correct specs on Windows + target = ::File.expand_path('/dev/mapper/target') + + ::File.stub(:symlink?).with("#{new_resource.device}").and_return(true) + ::File.stub(:readlink).with("#{new_resource.device}").and_return(target) + + provider.stub(:shell_out!).and_return(OpenStruct.new(:stdout => "#{target} on /tmp/foo type ext3 (rw)\n")) + provider.load_current_resource() + provider.current_resource.mounted.should be_true + end + + it "should set mounted true if the symlink target of the device is relative and is found in the mounts list - CHEF-4957" do + target = "xsdz1" + + # expand the target path to correct specs on Windows + absolute_target = ::File.expand_path("/dev/xsdz1") + + ::File.stub(:symlink?).with("#{new_resource.device}").and_return(true) + ::File.stub(:readlink).with("#{new_resource.device}").and_return(target) + + provider.stub(:shell_out!).and_return(OpenStruct.new(:stdout => "#{absolute_target} on /tmp/foo type ext3 (rw)\n")) + provider.load_current_resource() + provider.current_resource.mounted.should be_true + end + + it "should set mounted true if the mount point is found last in the mounts list" do + mount = "/dev/sdy1 on #{new_resource.mount_point} type ext3 (rw)\n" + mount << "#{new_resource.device} on #{new_resource.mount_point} type ext3 (rw)\n" + + provider.stub(:shell_out!).and_return(OpenStruct.new(:stdout => mount)) + provider.load_current_resource() + provider.current_resource.mounted.should be_true + end + + it "should set mounted false if the mount point is not last in the mounts list" do + mount = "#{new_resource.device} on #{new_resource.mount_point} type ext3 (rw)\n" + mount << "/dev/sdy1 on #{new_resource.mount_point} type ext3 (rw)\n" + + provider.stub(:shell_out!).and_return(OpenStruct.new(:stdout => mount)) + provider.load_current_resource() + provider.current_resource.mounted.should be_false + end + + it "mounted should be false if the mount point is not found in the mounts list" do + provider.stub(:shell_out!).and_return(OpenStruct.new(:stdout => "/dev/sdy1 on /tmp/foo type ext3 (rw)\n")) + provider.load_current_resource() + provider.current_resource.mounted.should be_false + end + + it "should set enabled to true if the mount point is last in fstab" do + fstab1 = "/dev/sdy1 /tmp/foo ext3 defaults 1 2\n" + fstab2 = "#{new_resource.device} #{new_resource.mount_point} ext3 defaults 1 2\n" + + ::File.stub(:foreach).with("/etc/fstab").and_yield(fstab1).and_yield(fstab2) + + provider.load_current_resource + provider.current_resource.enabled.should be_true + end + + it "should set enabled to true if the mount point is not last in fstab and mount_point is a substring of another mount" do + fstab1 = "#{new_resource.device} #{new_resource.mount_point} ext3 defaults 1 2\n" + fstab2 = "/dev/sdy1 /tmp/foo/bar ext3 defaults 1 2\n" + + ::File.stub(:foreach).with("/etc/fstab").and_yield(fstab1).and_yield(fstab2) + + provider.load_current_resource + provider.current_resource.enabled.should be_true + end + + it "should set enabled to true if the symlink target is in fstab" do + target = "/dev/mapper/target" + + ::File.stub(:symlink?).with("#{new_resource.device}").and_return(true) + ::File.stub(:readlink).with("#{new_resource.device}").and_return(target) + + fstab = "/dev/sdz1 /tmp/foo ext3 defaults 1 2\n" + + ::File.stub(:foreach).with("/etc/fstab").and_yield fstab + + provider.load_current_resource + provider.current_resource.enabled.should be_true + end + + it "should set enabled to true if the symlink target is relative and is in fstab - CHEF-4957" do + target = "xsdz1" + + ::File.stub(:symlink?).with("#{new_resource.device}").and_return(true) + ::File.stub(:readlink).with("#{new_resource.device}").and_return(target) + + fstab = "/dev/sdz1 /tmp/foo ext3 defaults 1 2\n" + + ::File.stub(:foreach).with("/etc/fstab").and_yield fstab + + provider.load_current_resource + provider.current_resource.enabled.should be_true + end + + it "should set enabled to false if the mount point is not in fstab" do + fstab = "/dev/sdy1 #{new_resource.mount_point} ext3 defaults 1 2\n" + ::File.stub(:foreach).with("/etc/fstab").and_yield fstab + + provider.load_current_resource + provider.current_resource.enabled.should be_false + end + + it "should ignore commented lines in fstab " do + fstab = "\# #{new_resource.device} #{new_resource.mount_point} ext3 defaults 1 2\n" + ::File.stub(:foreach).with("/etc/fstab").and_yield fstab + + provider.load_current_resource + provider.current_resource.enabled.should be_false + end + + it "should set enabled to false if the mount point is not last in fstab" do + line_1 = "#{new_resource.device} #{new_resource.mount_point} ext3 defaults 1 2\n" + line_2 = "/dev/sdy1 #{new_resource.mount_point} ext3 defaults 1 2\n" + ::File.stub(:foreach).with("/etc/fstab").and_yield(line_1).and_yield(line_2) + + provider.load_current_resource + provider.current_resource.enabled.should be_false + end + + it "should not mangle the mount options if the device in fstab is a symlink" do + # expand the target path to correct specs on Windows + target = "/dev/mapper/target" + options = "rw,noexec,noauto" + + ::File.stub(:symlink?).with(new_resource.device).and_return(true) + ::File.stub(:readlink).with(new_resource.device).and_return(target) + + fstab = "#{new_resource.device} #{new_resource.mount_point} #{new_resource.fstype} #{options} 1 2\n" + ::File.stub(:foreach).with("/etc/fstab").and_yield fstab + provider.load_current_resource + provider.current_resource.options.should eq(options.split(',')) + end + + it "should not mangle the mount options if the symlink target is in fstab" do + target = ::File.expand_path("/dev/mapper/target") + options = "rw,noexec,noauto" + + ::File.stub(:symlink?).with(new_resource.device).and_return(true) + ::File.stub(:readlink).with(new_resource.device).and_return(target) + + fstab = "#{target} #{new_resource.mount_point} #{new_resource.fstype} #{options} 1 2\n" + ::File.stub(:foreach).with("/etc/fstab").and_yield fstab + provider.load_current_resource + provider.current_resource.options.should eq(options.split(',')) + end + end + + context "after the mount's state has been discovered" do + before do + @current_resource = Chef::Resource::Mount.new("/tmp/foo") + @current_resource.device "/dev/sdz1" + @current_resource.device_type :device + @current_resource.fstype "ext3" + + provider.current_resource = @current_resource + end + + describe "mount_fs" do + it "should mount the filesystem if it is not mounted" do + provider.should_receive(:shell_out!).with("mount -t ext3 -o defaults /dev/sdz1 /tmp/foo") + provider.mount_fs() + end + + it "should mount the filesystem with options if options were passed" do + options = "rw,noexec,noauto" + new_resource.options(%w{rw noexec noauto}) + provider.should_receive(:shell_out!).with("mount -t ext3 -o rw,noexec,noauto /dev/sdz1 /tmp/foo") + provider.mount_fs() + end + + it "should mount the filesystem specified by uuid" do + new_resource.device "d21afe51-a0fe-4dc6-9152-ac733763ae0a" + new_resource.device_type :uuid + @stdout_findfs = double("STDOUT", :first => "/dev/sdz1") + provider.stub(:popen4).with("/sbin/findfs UUID=d21afe51-a0fe-4dc6-9152-ac733763ae0a").and_yield(@pid,@stdin,@stdout_findfs,@stderr).and_return(@status) + @stdout_mock = double('stdout mock') + @stdout_mock.stub(:each).and_yield("#{new_resource.device} on #{new_resource.mount_point}") + provider.should_receive(:shell_out!).with("mount -t #{new_resource.fstype} -o defaults -U #{new_resource.device} #{new_resource.mount_point}").and_return(@stdout_mock) + provider.mount_fs() + end + + it "should not mount the filesystem if it is mounted" do + @current_resource.stub(:mounted).and_return(true) + provider.should_not_receive(:shell_out!) + provider.mount_fs() + end + + end + + describe "umount_fs" do + it "should umount the filesystem if it is mounted" do + @current_resource.mounted(true) + provider.should_receive(:shell_out!).with("umount /tmp/foo") + provider.umount_fs() + end + + it "should not umount the filesystem if it is not mounted" do + @current_resource.mounted(false) + provider.should_not_receive(:shell_out!) + provider.umount_fs() + end + end + + describe "remount_fs" do + it "should use mount -o remount if remount is supported" do + new_resource.supports({:remount => true}) + @current_resource.mounted(true) + provider.should_receive(:shell_out!).with("mount -o remount #{new_resource.mount_point}") + provider.remount_fs + end + + it "should umount and mount if remount is not supported" do + new_resource.supports({:remount => false}) + @current_resource.mounted(true) + provider.should_receive(:umount_fs) + provider.should_receive(:sleep).with(1) + provider.should_receive(:mount_fs) + provider.remount_fs() + end + + it "should not try to remount at all if mounted is false" do + @current_resource.mounted(false) + provider.should_not_receive(:shell_out!) + provider.should_not_receive(:umount_fs) + provider.should_not_receive(:mount_fs) + provider.remount_fs() + end + end + + describe "when enabling the fs" do + it "should enable if enabled isn't true" do + @current_resource.enabled(false) + + @fstab = StringIO.new + ::File.stub(:open).with("/etc/fstab", "a").and_yield(@fstab) + provider.enable_fs + @fstab.string.should match(%r{^/dev/sdz1\s+/tmp/foo\s+ext3\s+defaults\s+0\s+2\s*$}) + end + + it "should not enable if enabled is true and resources match" do + @current_resource.enabled(true) + @current_resource.fstype("ext3") + @current_resource.options(["defaults"]) + @current_resource.dump(0) + @current_resource.pass(2) + ::File.should_not_receive(:open).with("/etc/fstab", "a") + + provider.enable_fs + end + + it "should enable if enabled is true and resources do not match" do + @current_resource.enabled(true) + @current_resource.fstype("auto") + @current_resource.options(["defaults"]) + @current_resource.dump(0) + @current_resource.pass(2) + @fstab = StringIO.new + ::File.stub(:readlines).and_return([]) + ::File.should_receive(:open).once.with("/etc/fstab", "w").and_yield(@fstab) + ::File.should_receive(:open).once.with("/etc/fstab", "a").and_yield(@fstab) + + provider.enable_fs + end + end + + describe "when disabling the fs" do + it "should disable if enabled is true" do + @current_resource.enabled(true) + + other_mount = "/dev/sdy1 /tmp/foo ext3 defaults 1 2\n" + this_mount = "/dev/sdz1 /tmp/foo ext3 defaults 1 2\n" + + @fstab_read = [this_mount, other_mount] + ::File.stub(:readlines).with("/etc/fstab").and_return(@fstab_read) + @fstab_write = StringIO.new + ::File.stub(:open).with("/etc/fstab", "w").and_yield(@fstab_write) + + provider.disable_fs + @fstab_write.string.should match(Regexp.escape(other_mount)) + @fstab_write.string.should_not match(Regexp.escape(this_mount)) + end + + it "should disable if enabled is true and ignore commented lines" do + @current_resource.enabled(true) + + fstab_read = [%q{/dev/sdy1 /tmp/foo ext3 defaults 1 2}, + %q{/dev/sdz1 /tmp/foo ext3 defaults 1 2}, + %q{#/dev/sdz1 /tmp/foo ext3 defaults 1 2}] + fstab_write = StringIO.new + + ::File.stub(:readlines).with("/etc/fstab").and_return(fstab_read) + ::File.stub(:open).with("/etc/fstab", "w").and_yield(fstab_write) + + provider.disable_fs + fstab_write.string.should match(%r{^/dev/sdy1 /tmp/foo ext3 defaults 1 2$}) + fstab_write.string.should match(%r{^#/dev/sdz1 /tmp/foo ext3 defaults 1 2$}) + fstab_write.string.should_not match(%r{^/dev/sdz1 /tmp/foo ext3 defaults 1 2$}) + end + + it "should disable only the last entry if enabled is true" do + @current_resource.stub(:enabled).and_return(true) + fstab_read = ["/dev/sdz1 /tmp/foo ext3 defaults 1 2\n", + "/dev/sdy1 /tmp/foo ext3 defaults 1 2\n", + "/dev/sdz1 /tmp/foo ext3 defaults 1 2\n"] + + fstab_write = StringIO.new + ::File.stub(:readlines).with("/etc/fstab").and_return(fstab_read) + ::File.stub(:open).with("/etc/fstab", "w").and_yield(fstab_write) + + provider.disable_fs + fstab_write.string.should == "/dev/sdz1 /tmp/foo ext3 defaults 1 2\n/dev/sdy1 /tmp/foo ext3 defaults 1 2\n" + end + + it "should not disable if enabled is false" do + @current_resource.stub(:enabled).and_return(false) + + ::File.stub(:readlines).with("/etc/fstab").and_return([]) + ::File.should_not_receive(:open).and_yield(@fstab) + + provider.disable_fs + end + end + end +end |