261 lines
7.8 KiB
Ruby
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
|