require "vagrant" require Vagrant.source_root.join("test/unit/base") require Vagrant.source_root.join("plugins/providers/virtualbox/config") require Vagrant.source_root.join("plugins/providers/virtualbox/synced_folder") describe VagrantPlugins::ProviderVirtualBox::SyncedFolder do include_context "unit" let(:machine) do double("machine").tap do |m| allow(m).to receive(:provider_config).and_return(VagrantPlugins::ProviderVirtualBox::Config.new) allow(m).to receive(:provider_name).and_return(:virtualbox) end end subject { described_class.new } before do machine.provider_config.finalize! end describe "#usable?" do it "should be with virtualbox provider" do allow(machine).to receive(:provider_name).and_return(:virtualbox) expect(subject).to be_usable(machine) end it "should not be with another provider" do allow(machine).to receive(:provider_name).and_return(:vmware_fusion) expect(subject).not_to be_usable(machine) end it "should not be usable if not functional vboxsf" do machine.provider_config.functional_vboxsf = false expect(subject).to_not be_usable(machine) end end describe "#prepare" do let(:driver) { double("driver") } let(:provider) { double("driver", driver: driver) } let(:folders) { {"/folder"=> {:SharedFoldersEnableSymlinksCreate=>true, :guestpath=>"/folder", :hostpath=>"/Users/brian/vagrant-folder", :automount=>false, :disabled=>false, :__vagrantfile=>true}} } let(:folders_disabled) { {"/folder"=> {:SharedFoldersEnableSymlinksCreate=>false, :guestpath=>"/folder", :hostpath=>"/Users/brian/vagrant-folder", :automount=>false, :disabled=>false, :__vagrantfile=>true}} } let(:folders_automount) { {"/folder"=> {:SharedFoldersEnableSymlinksCreate=>true, :guestpath=>"/folder", :hostpath=>"/Users/brian/vagrant-folder", :disabled=>false, :automount=>true, :__vagrantfile=>true}} } let(:folders_nosymvar) { {"/folder"=> {:guestpath=>"/folder", :hostpath=>"/Users/brian/vagrant-folder", :automount=>false, :disabled=>false, :__vagrantfile=>true}} } before do allow(machine).to receive(:provider).and_return(provider) allow(machine).to receive(:env) allow(subject).to receive(:display_symlink_create_warning) end it "should prepare and share the folders" do expect(driver).to receive(:share_folders).with([{:name=>"folder", :hostpath=>"/Users/brian/vagrant-folder", :transient=>false, :automount=>false, :SharedFoldersEnableSymlinksCreate=>true}]) subject.prepare(machine, folders, nil) end it "should prepare and share the folders without symlinks enabled" do expect(driver).to receive(:share_folders).with([{:name=>"folder", :hostpath=>"/Users/brian/vagrant-folder", :transient=>false, :automount=>false, :SharedFoldersEnableSymlinksCreate=>false}]) subject.prepare(machine, folders_disabled, nil) end it "should prepare and share the folders without symlinks enabled with env var set" do stub_env('VAGRANT_DISABLE_VBOXSYMLINKCREATE'=>'1') expect(driver).to receive(:share_folders).with([{:name=>"folder", :hostpath=>"/Users/brian/vagrant-folder", :transient=>false, :automount=>false, :SharedFoldersEnableSymlinksCreate=>false}]) subject.prepare(machine, folders_nosymvar, nil) end it "should prepare and share the folders and override symlink setting" do stub_env('VAGRANT_DISABLE_VBOXSYMLINKCREATE'=>'1') expect(driver).to receive(:share_folders).with([{:name=>"folder", :hostpath=>"/Users/brian/vagrant-folder", :transient=>false, :automount=>false, :SharedFoldersEnableSymlinksCreate=>true}]) subject.prepare(machine, folders, nil) end it "should prepare and share the folders with automount enabled" do expect(driver).to receive(:share_folders).with([{:name=>"folder", :hostpath=>"/Users/brian/vagrant-folder", :transient=>false, :SharedFoldersEnableSymlinksCreate=>true, :automount=>true}]) subject.prepare(machine, folders_automount, nil) end end describe "#os_friendly_id" do it "should not replace normal chars" do expect(subject.send(:os_friendly_id, 'perfectly_valid0_name')).to eq('perfectly_valid0_name') end it "should replace spaces" do expect(subject.send(:os_friendly_id, 'Program Files')).to eq('Program_Files') end it "should replace leading underscore" do expect(subject.send(:os_friendly_id, '_vagrant')).to eq('vagrant') end it "should replace slash" do expect(subject.send(:os_friendly_id, 'va/grant')).to eq('va_grant') end it "should replace leading underscore and slash" do expect(subject.send(:os_friendly_id, '/vagrant')).to eq('vagrant') end it "should replace backslash" do expect(subject.send(:os_friendly_id, 'foo\\bar')).to eq('foo_bar') end end describe "#share_folders" do let(:folders){ {'folder1' => {hostpath: '/vagrant', transient: true}, 'folder2' => {hostpath: '/vagrant2', transient: false}} } let(:symlink_create_disable){ nil } let(:driver){ double("driver") } before do allow(subject).to receive(:display_symlink_create_warning) allow(machine).to receive(:env) allow(subject).to receive(:driver).and_return(driver) allow(driver).to receive(:share_folders) allow(ENV).to receive(:[]).with("VAGRANT_DISABLE_VBOXSYMLINKCREATE").and_return(symlink_create_disable) end it "should only add transient folder" do expect(driver).to receive(:share_folders).with(any_args) do |defs| expect(defs.size).to eq(1) end subject.send(:share_folders, machine, folders, true) end it "should display symlink create warning" do expect(subject).to receive(:display_symlink_create_warning) subject.send(:share_folders, machine, folders, true) end context "with create symlink globally disabled" do let(:symlink_create_disable){ "1" } it "should not enable option within definitions" do expect(driver).to receive(:share_folders).with(any_args) do |defs| expect(defs.first[:SharedFoldersEnableSymlinksCreate]).to be(false) end subject.send(:share_folders, machine, folders, true) end it "should not display symlink warning" do expect(subject).not_to receive(:display_symlink_create_warning) subject.send(:share_folders, machine, folders, true) end end end describe "#display_symlink_create_warning" do let(:env){ double("env", ui: double("ui"), data_dir: double("data_dir")) } let(:gate_file){ double("gate") } before{ allow(gate_file).to receive(:to_path).and_return("PATH") } after{ subject.send(:display_symlink_create_warning, env) } context "gate file does not exist" do before do allow(env.data_dir).to receive(:join).and_return(gate_file) allow(gate_file).to receive(:exist?).and_return(false) allow(FileUtils).to receive(:touch) allow(env.ui).to receive(:warn) end it "should create file" do expect(FileUtils).to receive(:touch).with("PATH") end it "should output warning to user" do expect(env.ui).to receive(:warn) end end context "gate file does exist" do before do allow(env.data_dir).to receive(:join).and_return(gate_file) allow(gate_file).to receive(:exist?).and_return(true) allow(FileUtils).to receive(:touch) allow(env.ui).to receive(:warn) end it "should not create/update file" do expect(FileUtils).not_to receive(:touch).with("PATH") end it "should not output warning to user" do expect(env.ui).not_to receive(:warn) end end end end