diff --git a/lib/vagrant/ui.rb b/lib/vagrant/ui.rb index f1230f37e..ac1b309ad 100644 --- a/lib/vagrant/ui.rb +++ b/lib/vagrant/ui.rb @@ -80,8 +80,7 @@ module Vagrant # Prepare the data by replacing characters that aren't outputted data.each_index do |i| - data[i] = data[i].to_s - data[i] = data[i].dup if data[i].frozen? + data[i] = data[i].to_s.dup data[i].gsub!(",", "%!(VAGRANT_COMMA)") data[i].gsub!("\n", "\\n") data[i].gsub!("\r", "\\r") diff --git a/test/unit/vagrant/ui_test.rb b/test/unit/vagrant/ui_test.rb index 340cb26ea..c30935715 100644 --- a/test/unit/vagrant/ui_test.rb +++ b/test/unit/vagrant/ui_test.rb @@ -142,6 +142,66 @@ describe Vagrant::UI::Colored do end end +describe Vagrant::UI::MachineReadable do + describe "#ask" do + it "raises an exception" do + expect { subject.ask("foo") }. + to raise_error(Vagrant::Errors::UIExpectsTTY) + end + end + + describe "#machine" do + it "is formatted properly" do + subject.should_receive(:safe_puts).with do |message| + parts = message.split(",") + expect(parts.length).to eq(5) + expect(parts[1]).to eq("") + expect(parts[2]).to eq("type") + expect(parts[3]).to eq("data") + expect(parts[4]).to eq("another") + true + end + + subject.machine(:type, "data", "another") + end + + it "includes a target if given" do + subject.should_receive(:safe_puts).with do |message| + parts = message.split(",") + expect(parts.length).to eq(4) + expect(parts[1]).to eq("boom") + expect(parts[2]).to eq("type") + expect(parts[3]).to eq("data") + true + end + + subject.machine(:type, "data", target: "boom") + end + + it "replaces commas" do + subject.should_receive(:safe_puts).with do |message| + parts = message.split(",") + expect(parts.length).to eq(4) + expect(parts[3]).to eq("foo%!(VAGRANT_COMMA)bar") + true + end + + subject.machine(:type, "foo,bar") + end + + it "replaces newlines" do + subject.should_receive(:safe_puts).with do |message| + parts = message.split(",") + expect(parts.length).to eq(4) + expect(parts[3]).to eq("foo\\nbar\\r") + true + end + + subject.machine(:type, "foo\nbar\r") + end + end +end + describe Vagrant::UI::Prefixed do let(:prefix) { "foo" } let(:ui) { Vagrant::UI::Basic.new }