2011-12-03 15:44:08 -08:00

261 lines
7.8 KiB
Ruby

require "test_helper"
class NFSVMActionTest < Test::Unit::TestCase
setup do
@klass = Vagrant::Action::VM::NFS
@app, @env = action_env
@vm = mock("vm")
@vm.stubs(:system).returns(mock("system"))
@env.env.stubs(:host).returns(Vagrant::Hosts::Base.new(@env))
@env.env.config.vm.network("192.168.55.1")
@env["vm"] = @vm
@internal_vm = mock("internal")
@vm.stubs(:vm).returns(@internal_vm)
end
context "initializing" do
should "not call verify settings if NFS is not enabled" do
@klass.any_instance.expects(:verify_settings).never
@klass.new(@app, @env)
end
should "call verify settings if NFS is enabled" do
@env.env.config.vm.share_folder("v-root", "/vagrant", ".", :nfs => true)
@klass.any_instance.expects(:verify_settings).once
@klass.new(@app, @env)
end
end
context "with an instance" do
setup do
@instance = @klass.new(@app, @env)
end
context "calling" do
setup do
@instance.stubs(:folders).returns([:a])
[:clear_nfs_exports, :extract_folders, :prepare_folders, :export_folders, :mount_folders].each do |meth|
@instance.stubs(meth)
end
end
should "call the proper sequence and succeed" do
seq = sequence('seq')
@instance.expects(:extract_folders).in_sequence(seq)
@instance.expects(:prepare_folders).in_sequence(seq)
@instance.expects(:clear_nfs_exports).with(@env).in_sequence(seq)
@instance.expects(:export_folders).in_sequence(seq)
@app.expects(:call).with(@env).in_sequence(seq)
@instance.expects(:mount_folders).in_sequence(seq)
@instance.call(@env)
end
should "not export folders if folders is empty" do
@instance.stubs(:folders).returns([])
seq = sequence('seq')
@instance.expects(:extract_folders).in_sequence(seq)
@instance.expects(:prepare_folders).never
@instance.expects(:export_folders).never
@instance.expects(:clear_nfs_exports).never
@app.expects(:call).with(@env).in_sequence(seq)
@instance.expects(:mount_folders).never
@instance.call(@env)
end
end
context "recovery" do
setup do
@vm.stubs(:created?).returns(true)
end
should "clear NFS exports" do
@instance.expects(:clear_nfs_exports).with(@env).once
@instance.recover(@env)
end
should "do nothing if VM is not created" do
@vm.stubs(:created?).returns(false)
@instance.expects(:clear_nfs_exports).never
@instance.recover(@env)
end
end
context "extracting folders" do
setup do
@env.env.config.vm.shared_folders.clear
@env.env.config.vm.share_folder("v-foo", "/foo", ".", :nfs => true)
@env.env.config.vm.share_folder("v-bar", "/bar", ".", :nfs => true)
end
should "extract the NFS enabled folders" do
@instance.extract_folders
assert_equal 2, @instance.folders.length
end
should "mark the folders disabled from the original config" do
@instance.extract_folders
%W[v-foo v-bar].each do |key|
assert @env["config"].vm.shared_folders[key][:disabled]
end
end
should "expand the hostpath relative to the env root" do
@instance.extract_folders
%W[v-foo v-bar].each do |key|
opts = @env["config"].vm.shared_folders[key]
assert_equal File.expand_path(opts[:hostpath], @env.env.root_path), @instance.folders[key][:hostpath]
end
end
end
context "preparing UID/GID" do
setup do
@stat = mock("stat")
File.stubs(:stat).returns(@stat)
end
should "return nil if the perm is not set" do
@env.env.config.nfs.map_uid = nil
assert_nil @instance.prepare_permission(:uid, {:gid => 7})
end
should "return nil if the perm explicitly says nil" do
assert_nil @instance.prepare_permission(:uid, {:map_uid => nil})
end
should "return the set value if it is set" do
assert_equal 7, @instance.prepare_permission(:gid, {:map_gid => 7})
end
should "return the global config value if set and not explicitly set on folder" do
@env.env.config.nfs.map_gid = 12
assert_equal 12, @instance.prepare_permission(:gid, {})
end
should "return the stat result of the hostpath if :auto" do
opts = { :hostpath => "foo", :map_uid => :auto }
File.expects(:stat).with(opts[:hostpath]).returns(@stat)
@stat.stubs(:uid).returns(24)
assert_equal 24, @instance.prepare_permission(:uid, opts)
end
end
context "exporting folders" do
setup do
@instance.stubs(:folders).returns({})
@instance.stubs(:guest_ip).returns("192.168.33.10")
end
should "call nfs_export on the host" do
@env["host"].expects(:nfs_export).with(@instance.guest_ip, @instance.folders)
@instance.export_folders
end
end
context "mounting folders" do
setup do
@instance.stubs(:host_ip).returns("foo")
@instance.stubs(:folders).returns({ "v-data" => {:guestpath => "foo"}})
end
should "mount the folders on the system" do
@vm.system.expects(:mount_nfs).with(@instance.host_ip, @instance.folders)
@instance.mount_folders
end
should "not mount folders which have no guest path" do
@instance.stubs(:folders).returns({ "v-data" => {}})
@vm.system.expects(:mount_nfs).with(@instance.host_ip, {})
@instance.mount_folders
end
end
context "getting the host IP" do
setup do
@network_adapters = []
@internal_vm.stubs(:network_adapters).returns(@network_adapters)
end
def stub_interface(ip)
interface = mock("interface")
adapter = mock("adapter")
adapter.stubs(:host_interface_object).returns(interface)
interface.stubs(:ip_address).returns(ip)
@network_adapters << adapter
interface
end
should "return the IP of the first interface" do
ip = "192.168.1.1"
stub_interface(ip)
assert_equal ip, @instance.host_ip
end
should "return nil if no IP is found" do
assert_nil @instance.host_ip
end
end
context "getting the guest IP" do
should "return the first networked IP" do
ip = "192.168.33.10"
@env.env.config.vm.network(ip, :adapter => 1)
@env.env.config.vm.network("192.168.66.10", :adapter => 2)
assert_equal ip, @instance.guest_ip
end
end
context "nfs enabled" do
should "return false if no folders are marked for NFS" do
assert !@instance.nfs_enabled?
end
should "return true if a shared folder is marked for NFS" do
@env.env.config.vm.share_folder("v-foo", "/foo", "/bar", :nfs => true)
assert @instance.nfs_enabled?
end
end
context "verifying settings" do
setup do
@env.env.host.stubs(:nfs?).returns(true)
end
should "error environment if host is nil" do
@env.env.stubs(:host).returns(nil)
assert_raises(Vagrant::Errors::NFSHostRequired) {
@instance.verify_settings
}
end
should "error environment if host does not support NFS" do
@env.env.host.stubs(:nfs?).returns(false)
assert_raises(Vagrant::Errors::NFSNotSupported) {
@instance.verify_settings
}
end
should "error environment if host only networking is not enabled" do
@env.env.config.vm.network_options.clear
assert_raises(Vagrant::Errors::NFSNoHostNetwork) {
@instance.verify_settings
}
end
should "be fine if everything passes" do
@env.env.host.stubs(:nfs?).returns(true)
assert_nothing_raised {
@instance.verify_settings
}
end
end
end
end