145 lines
4.2 KiB
Ruby
145 lines
4.2 KiB
Ruby
require "test_helper"
|
|
|
|
class ShareFoldersVMActionTest < Test::Unit::TestCase
|
|
setup do
|
|
@klass = Vagrant::Action::VM::ShareFolders
|
|
@app, @env = action_env
|
|
|
|
@vm = mock("vm")
|
|
@vm.stubs(:name).returns("foo")
|
|
@vm.stubs(:ssh).returns(mock("ssh"))
|
|
@vm.stubs(:system).returns(mock("system"))
|
|
@env["vm"] = @vm
|
|
@env["vm.modify"] = mock("proc")
|
|
|
|
@internal_vm = mock("internal")
|
|
@vm.stubs(:vm).returns(@internal_vm)
|
|
|
|
# No validation for this test since its a nightmare due to all the
|
|
# nonexistent shared folders.
|
|
Vagrant::Config::Top.any_instance.stubs(:validate!)
|
|
|
|
@instance = @klass.new(@app, @env)
|
|
end
|
|
|
|
def stub_shared_folders(contents)
|
|
env = vagrant_env(vagrantfile(<<-vf))
|
|
config.vm.shared_folders.clear
|
|
#{contents}
|
|
vf
|
|
|
|
@env.stubs(:env).returns(env)
|
|
env.config.vm.shared_folders
|
|
end
|
|
|
|
context "calling" do
|
|
should "run the methods in the proper order" do
|
|
before_seq = sequence("before")
|
|
@instance.expects(:create_metadata).once.in_sequence(before_seq)
|
|
@app.expects(:call).with(@env).in_sequence(before_seq)
|
|
@instance.expects(:mount_shared_folders).once.in_sequence(before_seq)
|
|
|
|
@instance.call(@env)
|
|
end
|
|
end
|
|
|
|
context "collecting shared folders" do
|
|
should "return a hash of the shared folders" do
|
|
data = {
|
|
"foo" => %W[bar baz],
|
|
"bar" => %W[foo baz]
|
|
}
|
|
|
|
stub_shared_folders(<<-sf)
|
|
config.vm.share_folder("foo", "bar", "baz")
|
|
config.vm.share_folder("bar", "foo", "baz")
|
|
sf
|
|
|
|
result = @instance.shared_folders
|
|
assert_equal data.length, result.length
|
|
data.each do |name, value|
|
|
guest, host = value
|
|
assert_equal guest, result[name][:guestpath]
|
|
assert_equal host, result[name][:hostpath]
|
|
end
|
|
end
|
|
|
|
should "ignore disabled shared folders" do
|
|
stub_shared_folders(<<-sf)
|
|
config.vm.share_folder("v-foo", "/foo", "/foo")
|
|
config.vm.share_folder("v-root", "/vagrant", ".", :disabled => true)
|
|
config.vm.share_folder("v-bar", "/bar", "/bar")
|
|
sf
|
|
|
|
assert_equal 2, @instance.shared_folders.length
|
|
assert_equal %W[v-bar v-foo], @instance.shared_folders.keys.sort
|
|
end
|
|
|
|
should "not destroy original hash" do
|
|
@folders = stub_shared_folders(<<-sf)
|
|
config.vm.share_folder("foo", "bar", "baz", :sync => true)
|
|
sf
|
|
|
|
folder = @folders["foo"].dup
|
|
|
|
@instance.shared_folders
|
|
assert_equal folder, @env.env.config.vm.shared_folders["foo"]
|
|
end
|
|
end
|
|
|
|
context "setting up shared folder metadata" do
|
|
setup do
|
|
stub_shared_folders(<<-sf)
|
|
config.vm.share_folder("foo", "fooguest", "foohost")
|
|
config.vm.share_folder("bar", "barguest", "barhost")
|
|
sf
|
|
end
|
|
|
|
should "add all shared folders to the VM" do
|
|
shared_folders = []
|
|
data = %W[foo bar]
|
|
shared_folders.expects(:<<).times(data.length).with() do |sf|
|
|
hostpath = File.expand_path("#{sf.name}host", @env.env.root_path)
|
|
assert data.include?(sf.name)
|
|
assert_equal hostpath, sf.host_path
|
|
true
|
|
end
|
|
|
|
@internal_vm.stubs(:shared_folders).returns(shared_folders)
|
|
|
|
@env["vm.modify"].expects(:call).with() do |proc|
|
|
proc.call(@internal_vm)
|
|
true
|
|
end
|
|
|
|
@instance.create_metadata
|
|
end
|
|
end
|
|
|
|
context "mounting the shared folders" do
|
|
setup do
|
|
@folders = stub_shared_folders(<<-sf)
|
|
config.vm.share_folder("foo", "fooguest", "foohost", :owner => "yo", :group => "fo")
|
|
config.vm.share_folder("bar", "fooguest/foo", "barhost", :owner => "foo", :group => "bar")
|
|
config.vm.share_folder("foo_no_mount", nil, "foohost2")
|
|
sf
|
|
@ssh = mock("ssh")
|
|
@vm.ssh.stubs(:execute).yields(@ssh)
|
|
@vm.system.stubs(:mount_shared_folder)
|
|
end
|
|
|
|
should "mount all shared folders to the VM" do
|
|
mount_seq = sequence("mount_seq")
|
|
@folders.each do |name, data|
|
|
if data[:guestpath]
|
|
@vm.system.expects(:mount_shared_folder).with(@ssh, name, data[:guestpath], data[:owner], data[:group]).in_sequence(mount_seq)
|
|
else
|
|
@vm.system.expects(:mount_shared_folder).with(@ssh, name, anything, anything, anything).never
|
|
end
|
|
end
|
|
|
|
@instance.mount_shared_folders
|
|
end
|
|
end
|
|
end
|