Chris Roberts ef5eca16d2 Fix SMB information generation when using net share
Adds the final line of output to tests and properly simulates
failure. Fix with type casting to prevent calling methods on
nil and drop the final entry as it's not valid.

Fixes #9806
2018-06-11 12:58:35 -07:00

229 lines
7.3 KiB
Ruby

require_relative "../../../../base"
require_relative "../../../../../../plugins/hosts/windows/cap/smb"
describe VagrantPlugins::HostWindows::Cap::SMB do
let(:subject){ VagrantPlugins::HostWindows::Cap::SMB }
let(:machine){ double(:machine, env: double(:machine_env, ui: double(:ui))) }
let(:env){ double(:env) }
let(:options){ {} }
let(:result){ Vagrant::Util::Subprocess::Result }
let(:powershell_version){ "3" }
let(:smblist){ <<-EOF
Name : vgt-CUSTOM_ID-1
Path : /a/path
Description : vgt-CUSTOM_ID-1
Name : vgt-CUSTOM_ID-2
Path : /other/path
Description : vgt-CUSTOM_ID-2
Name : my-share
Path : /my/path
Description : Not Vagrant Owned
EOF
}
let(:netsharelist){ <<-EOF
Share name Resource Remark
-----------------------------------------------
vgt-CUSTOM_ID-1 /a/path vgt-CUSTOM_ID-1
vgt-CUSTOM_ID-2 /other/path vgt-CUSTOM_ID-2
my-share /my/path Not Vagran...
The command completed successfully.
EOF
}
let(:netshare1){ <<-EOF
Share name vgt-CUSTOM_ID-1
Path /a/path
Remark vgt-CUSTOM_ID-1
EOF
}
let(:netshare2){ <<-EOF
Share name vgt-CUSTOM_ID-2
Path /other/path
Remark vgt-CUSTOM_ID-2
EOF
}
let(:netshare_my){ <<-EOF
Share name my-share
Path /my/path
Remark Not Vagrant Owned
EOF
}
before do
allow(subject).to receive(:machine_id).and_return("CUSTOM_ID")
allow(Vagrant::Util::PowerShell).to receive(:version).and_return(powershell_version)
allow(Vagrant::Util::PowerShell).to receive(:execute_cmd).and_return("")
allow(machine.env.ui).to receive(:warn)
allow(subject).to receive(:sleep)
end
describe ".smb_mount_options" do
it "should provide smb version of at least 2" do
result = subject.smb_mount_options(nil)
ver = result.detect{|i| i.start_with?("vers") }.to_s.split("=", 2).last.to_s.to_i
expect(ver).to be >= 2
end
end
describe ".smb_installed" do
context "when powershell version is greater than 2" do
it "is valid installation" do
expect(subject.smb_installed(nil)).to eq(true)
end
end
context "when powershell version is less than 3" do
let(:powershell_version){ "2" }
it "is not a valid installation" do
expect(subject.smb_installed(nil)).to eq(false)
end
end
end
describe ".smb_cleanup" do
before do
allow(Vagrant::Util::PowerShell).to receive(:execute_cmd).with(/Get-SmbShare/).
and_return(smblist)
allow(Vagrant::Util::PowerShell).to receive(:execute_cmd).with(/net share/).and_return(netsharelist)
allow(Vagrant::Util::PowerShell).to receive(:execute_cmd).with(/net share vgt-CUSTOM_ID-1/).and_return(netshare1)
allow(Vagrant::Util::PowerShell).to receive(:execute_cmd).with(/net share vgt-CUSTOM_ID-2/).and_return(netshare2)
allow(Vagrant::Util::PowerShell).to receive(:execute_cmd).with(/net share my/).and_return(netshare_my)
allow(Vagrant::Util::PowerShell).to receive(:execute).and_return(result.new(0, "", ""))
end
after{ subject.smb_cleanup(env, machine, options) }
it "should pause after warning user" do
expect(machine.env.ui).to receive(:warn)
expect(subject).to receive(:sleep)
end
it "should remove owned shares" do
expect(Vagrant::Util::PowerShell).to receive(:execute) do |*args|
expect(args).to include("vgt-CUSTOM_ID-1")
expect(args).to include("vgt-CUSTOM_ID-2")
result.new(0, "", "")
end
end
it "should not remove owned shares" do
expect(Vagrant::Util::PowerShell).to receive(:execute) do |*args|
expect(args).not_to include("my-share")
result.new(0, "", "")
end
end
it "should remove all shares in single call" do
expect(Vagrant::Util::PowerShell).to receive(:execute).with(any_args, sudo: true).once
end
context "when no shares are defined" do
before do
expect(Vagrant::Util::PowerShell).to receive(:execute_cmd).with(/Get-SmbShare/).
and_return("")
end
it "should not attempt to remove shares" do
expect(Vagrant::Util::PowerShell).not_to receive(:execute).with(any_args, sudo: true)
end
it "should not warn user" do
expect(machine.env.ui).not_to receive(:warn)
end
end
context "when Get-SmbShare is not available" do
before do
expect(Vagrant::Util::PowerShell).to receive(:execute_cmd).with(/Get-SmbShare/).and_return(nil)
end
it "should fetch list using net.exe" do
expect(Vagrant::Util::PowerShell).to receive(:execute_cmd).with(/net share/).and_return("")
end
it "should remove owned shares" do
expect(Vagrant::Util::PowerShell).to receive(:execute) do |*args|
expect(args).to include("vgt-CUSTOM_ID-1")
expect(args).to include("vgt-CUSTOM_ID-2")
result.new(0, "", "")
end
end
it "should not remove owned shares" do
expect(Vagrant::Util::PowerShell).to receive(:execute) do |*args|
expect(args).not_to include("my-share")
result.new(0, "", "")
end
end
end
end
describe ".smb_prepare" do
let(:folders){ {"/first/path" => {hostpath: "/host/1"}, "/second/path" => {hostpath: "/host/2", smb_id: "ID1"}} }
let(:options){ {} }
before{ allow(Vagrant::Util::PowerShell).to receive(:execute).and_return(result.new(0, "", "")) }
it "should add ID when not defined" do
subject.smb_prepare(env, machine, folders, options)
expect(folders["/first/path"][:smb_id]).to start_with("vgt-")
end
it "should not modify ID when defined" do
subject.smb_prepare(env, machine, folders, options)
expect(folders["/second/path"][:smb_id]).to eq("ID1")
end
it "should pause after warning user" do
expect(machine.env.ui).to receive(:warn)
expect(subject).to receive(:sleep)
subject.smb_prepare(env, machine, folders, options)
end
it "should add all shares in single call" do
expect(Vagrant::Util::PowerShell).to receive(:execute).with(any_args, sudo: true).once
subject.smb_prepare(env, machine, folders, options)
end
context "when share already exists" do
let(:shares){ {"ID1" => {"Path" => "/host/2"}} }
before do
allow(File).to receive(:expand_path).and_call_original
expect(subject).to receive(:existing_shares).and_return(shares)
end
it "should expand paths when comparing existing to requested" do
expect(File).to receive(:expand_path).at_least(2).with("/host/2").and_return("expanded_path")
subject.smb_prepare(env, machine, folders, options)
end
context "with different path" do
let(:shares){ {"ID1" => {"Path" => "/host/3"}} }
it "should raise an error" do
expect{
subject.smb_prepare(env, machine, folders, options)
}.to raise_error(VagrantPlugins::SyncedFolderSMB::Errors::SMBNameError)
end
end
end
context "when no shared are defined" do
after{ subject.smb_prepare(env, machine, {}, options) }
it "should not attempt to add shares" do
expect(Vagrant::Util::PowerShell).not_to receive(:execute).with(any_args, sudo: true)
end
it "should not warn user" do
expect(machine.env.ui).not_to receive(:warn)
end
end
end
end