vaguerent/test/unit/plugins/provisioners/file/provisioner_test.rb
Chris Roberts 6b105d704d Update communicator upload behavior to handle /. path directives
This update was prompted by updates in openssh to the scp behavior
making source directory paths suffixed with `.` no longer valid
resulting in errors on upload. The upload implementation within
the ssh communicator has been updated to retain the existing
behavior.

Included in this update is modifications to the winrm communicator
so the upload functionality matches that of the ssh communicator
respecting the trailing `.` behavior on source paths. With the
communicators updated to properly handle the paths, the file
provisioner was also updated to simply apply previously defined
path update rules only.

Fixes #10675
2019-02-26 08:02:09 -08:00

113 lines
3.7 KiB
Ruby

require_relative "../../../base"
require Vagrant.source_root.join("plugins/provisioners/file/provisioner")
describe VagrantPlugins::FileUpload::Provisioner do
include_context "unit"
subject { described_class.new(machine, config) }
let(:iso_env) do
# We have to create a Vagrantfile so there is a root path
env = isolated_environment
env.vagrantfile("")
env.create_vagrant_env
end
let(:machine) { iso_env.machine(iso_env.machine_names[0], :dummy) }
let(:config) { double("config") }
let(:communicator) { double("comm") }
let(:guest) { double("guest") }
before do
allow(machine).to receive(:communicate).and_return(communicator)
allow(machine).to receive(:guest).and_return(guest)
allow(communicator).to receive(:execute).and_return(true)
allow(communicator).to receive(:upload).and_return(true)
allow(guest).to receive(:capability?).and_return(false)
end
describe "#provision" do
it "creates the destination directory" do
allow(config).to receive(:source).and_return("/source")
allow(config).to receive(:destination).and_return("/foo/bar")
subject.provision
end
it "creates the destination directory with a space" do
allow(config).to receive(:source).and_return("/source")
allow(config).to receive(:destination).and_return("/foo bar/bar")
subject.provision
end
it "creates the destination directory above file" do
allow(config).to receive(:source).and_return("/source/file.sh")
allow(config).to receive(:destination).and_return("/foo/bar/file.sh")
subject.provision
end
it "uploads the file" do
allow(config).to receive(:source).and_return("/source")
allow(config).to receive(:destination).and_return("/foo/bar")
expect(communicator).to receive(:upload).with("/source", "/foo/bar")
subject.provision
end
it "expands the source file path" do
allow(config).to receive(:source).and_return("source")
allow(config).to receive(:destination).and_return("/foo/bar")
expect(communicator).to receive(:upload).with(
File.expand_path("source"), "/foo/bar")
subject.provision
end
it "expands the destination file path if capable" do
allow(config).to receive(:source).and_return("/source")
allow(config).to receive(:destination).and_return("$HOME/foo")
expect(guest).to receive(:capability?).
with(:shell_expand_guest_path).and_return(true)
expect(guest).to receive(:capability).
with(:shell_expand_guest_path, "$HOME/foo").and_return("/home/foo")
expect(communicator).to receive(:upload).with("/source", "/home/foo")
subject.provision
end
it "appends a '/.' if the destination doesnt end with a file separator" do
allow(config).to receive(:source).and_return("/source")
allow(config).to receive(:destination).and_return("/foo/bar")
allow(File).to receive(:directory?).with("/source").and_return(true)
expect(guest).to receive(:capability?).
with(:shell_expand_guest_path).and_return(true)
expect(guest).to receive(:capability).
with(:shell_expand_guest_path, "/foo/bar").and_return("/foo/bar")
expect(communicator).to receive(:upload).with("/source/.", "/foo/bar")
subject.provision
end
it "appends a '/.' to expanded source if defined in original source" do
allow(config).to receive(:source).and_return("/source/.")
allow(File).to receive(:directory?).with("/source").and_return(true)
allow(config).to receive(:destination).and_return("/foo/bar")
expect(communicator).to receive(:upload).with("/source/.", "/foo/bar")
subject.provision
end
end
end