Brian Cain 01528689fd (#8716) Dup string if frozen for line endings
Prior to this commit, if a user passed in a script that was frozen,
the shell provisioner would fail to modify the script to replace line
endings for windows because the string was immutable. This commit fixes
that by dup'ing the string so that it can have its line endings replaced
2017-08-15 08:38:30 -07:00

140 lines
4.2 KiB
Ruby

require File.expand_path("../../../../base", __FILE__)
require Vagrant.source_root.join("plugins/provisioners/shell/provisioner")
describe "Vagrant::Shell::Provisioner" do
include_context "unit"
let(:env){ isolated_environment }
let(:machine) {
double(:machine, env: env, id: "ID").tap { |machine|
allow(machine).to receive_message_chain(:config, :vm, :communicator).and_return(:not_winrm)
allow(machine).to receive_message_chain(:communicate, :tap) {}
}
}
before do
allow(env).to receive(:tmp_path).and_return(Pathname.new("/dev/null"))
end
context "with a script that contains invalid us-ascii byte sequences" do
let(:config) {
double(
:config,
:args => "doesn't matter",
:env => {},
:upload_path => "arbitrary",
:remote? => false,
:path => nil,
:inline => script_that_is_incorrectly_us_ascii_encoded,
:binary => false,
)
}
let(:script_that_is_incorrectly_us_ascii_encoded) {
[207].pack("c*").force_encoding("US-ASCII")
}
it "does not raise an exception when normalizing newlines" do
vsp = VagrantPlugins::Shell::Provisioner.new(machine, config)
expect {
vsp.provision
}.not_to raise_error
end
end
context "with a script that was set to freeze the string" do
TEST_CONSTANT_VARIABLE = <<-TEST_CONSTANT_VARIABLE.freeze
echo test
TEST_CONSTANT_VARIABLE
let(:script) { TEST_CONSTANT_VARIABLE }
let(:config) {
double(
:config,
:args => "doesn't matter",
:env => {},
:upload_path => "arbitrary",
:remote? => false,
:path => nil,
:inline => script,
:binary => false,
)
}
it "does not raise an exception" do
vsp = VagrantPlugins::Shell::Provisioner.new(machine, config)
RSpec::Expectations.configuration.on_potential_false_positives = :nothing
# This test should be fine, since we are specifically looking for the
# string 'freeze' when RuntimeError is raised
expect {
vsp.provision
}.not_to raise_error(RuntimeError)
end
end
context "with remote script" do
context "that does not have matching sha1 checksum" do
let(:config) {
double(
:config,
:args => "doesn't matter",
:env => {},
:upload_path => "arbitrary",
:remote? => true,
:path => "http://example.com/script.sh",
:binary => false,
:md5 => nil,
:sha1 => 'EXPECTED_VALUE'
)
}
let(:digest){ double("digest") }
before do
allow_any_instance_of(Vagrant::Util::Downloader).to receive(:execute_curl).and_return(true)
allow(digest).to receive(:file).and_return(digest)
expect(Digest::SHA1).to receive(:new).and_return(digest)
expect(digest).to receive(:hexdigest).and_return('INVALID_VALUE')
end
it "should raise an exception" do
vsp = VagrantPlugins::Shell::Provisioner.new(machine, config)
expect{ vsp.provision }.to raise_error(Vagrant::Errors::DownloaderChecksumError)
end
end
context "that does not have matching md5 checksum" do
let(:config) {
double(
:config,
:args => "doesn't matter",
:env => {},
:upload_path => "arbitrary",
:remote? => true,
:path => "http://example.com/script.sh",
:binary => false,
:md5 => 'EXPECTED_VALUE',
:sha1 => nil
)
}
let(:digest){ double("digest") }
before do
allow_any_instance_of(Vagrant::Util::Downloader).to receive(:execute_curl).and_return(true)
allow(digest).to receive(:file).and_return(digest)
expect(Digest::MD5).to receive(:new).and_return(digest)
expect(digest).to receive(:hexdigest).and_return('INVALID_VALUE')
end
it "should raise an exception" do
vsp = VagrantPlugins::Shell::Provisioner.new(machine, config)
expect{ vsp.provision }.to raise_error(Vagrant::Errors::DownloaderChecksumError)
end
end
end
end