Chris Roberts c4084a6387 Extract smblist information based on position
Since we are no longer extracting information based on key value due
to localization issues, use start and end locations to extract data.
This prevents errors when extra information is included like Scope.
2018-08-30 10:58:56 -07:00

255 lines
8.2 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
Name : scoped-share
Scope : *
Path : /scoped/path
Description : Scoped Path
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
describe ".get_smbshares" do
before { expect(Vagrant::Util::PowerShell).to receive(:execute_cmd).and_return(smblist) }
it "should return a Hash of share information" do
expect(subject.get_smbshares).to be_a(Hash)
end
it "should provide name and description for share" do
shares = subject.get_smbshares
expect(shares["vgt-CUSTOM_ID-1"]).to be_a(Hash)
expect(shares["vgt-CUSTOM_ID-1"]["Path"]).to eq("/a/path")
expect(shares["vgt-CUSTOM_ID-1"]["Description"]).to eq("vgt-CUSTOM_ID-1")
end
it "should properly handle share with scope information" do
shares = subject.get_smbshares
expect(shares["scoped-share"]).to be_a(Hash)
expect(shares["scoped-share"]["Path"]).to eq("/scoped/path")
expect(shares["scoped-share"]["Description"]).to eq("Scoped Path")
end
end
end