diff --git a/acceptance/support-skeletons/triggers-advanced/Vagrantfile b/acceptance/support-skeletons/triggers-advanced/Vagrantfile new file mode 100644 index 0000000..9443ed7 --- /dev/null +++ b/acceptance/support-skeletons/triggers-advanced/Vagrantfile @@ -0,0 +1,44 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + + +Vagrant.configure("2") do |config| + config.vm.box = "box" + + config.trigger.before :up do |trigger| + trigger.name = "Failure" + trigger.warn = "I'm going to fail" + trigger.on_error = :continue + trigger.run_remote = {inline: "echo 'hiiiiiiii'"} + end + + config.trigger.before :up do |trigger| + trigger.name = "Failure part 2" + trigger.warn = "Does not exist" + trigger.on_error = :continue + trigger.run = {path: "fail.sh"} + end + + config.trigger.before :all do |trigger| + trigger.name = "ALL" + trigger.info = "Before the action!" + trigger.ignore = :destroy + trigger.run = {path: "script.sh"} + end + + config.trigger.after :up do |trigger| + trigger.name = "Acceptance Advanced" + trigger.only_on = /machine/ + trigger.run_remote = {path: "script.sh"} + end + + config.vm.define "spec-box" do |v| + v.vm.hostname = "vagrant-spec.local" + v.trigger.after :up, + info: "Only spec-box" + end + + config.vm.define "machine-box" do |v| + v.vm.hostname = "machine-box.local" + end +end diff --git a/acceptance/support-skeletons/triggers-advanced/fail.sh b/acceptance/support-skeletons/triggers-advanced/fail.sh new file mode 100755 index 0000000..9dae856 --- /dev/null +++ b/acceptance/support-skeletons/triggers-advanced/fail.sh @@ -0,0 +1 @@ +fail diff --git a/acceptance/support-skeletons/triggers-advanced/script.sh b/acceptance/support-skeletons/triggers-advanced/script.sh new file mode 100755 index 0000000..6c5a821 --- /dev/null +++ b/acceptance/support-skeletons/triggers-advanced/script.sh @@ -0,0 +1 @@ +echo "Hello there from `hostname -f`" diff --git a/acceptance/support-skeletons/triggers-advanced/test.sh b/acceptance/support-skeletons/triggers-advanced/test.sh new file mode 100755 index 0000000..a191dfe --- /dev/null +++ b/acceptance/support-skeletons/triggers-advanced/test.sh @@ -0,0 +1 @@ +echo 'This is a test' diff --git a/acceptance/support-skeletons/triggers-basic/Vagrantfile b/acceptance/support-skeletons/triggers-basic/Vagrantfile new file mode 100644 index 0000000..e178374 --- /dev/null +++ b/acceptance/support-skeletons/triggers-basic/Vagrantfile @@ -0,0 +1,25 @@ +Vagrant.configure("2") do |config| + config.vm.box = "box" + + config.trigger.before :up do |trigger| + trigger.name = "Acceptance" + trigger.info = "Testing 1 2 3..." + trigger.run = {inline: "echo 'Hello before up'"} + end + + config.trigger.after :up do |trigger| + trigger.name = "Acceptance" + trigger.info = "Testing 1 2 3..." + trigger.run = {inline: "echo 'Hello after up'"} + end + + config.trigger.before :destroy, + name: "DESTROY!!", + warn: "Testing 1 2 3...", + run: {inline: "echo 'Hello before destroy'"} + + config.trigger.after :destroy, + name: "Destroyed", + warn: "Testing 1 2 3...", + run: {inline: "echo 'Hello after destroy'"} +end diff --git a/acceptance/triggers/triggers_advanced_spec.rb b/acceptance/triggers/triggers_advanced_spec.rb new file mode 100644 index 0000000..f2097d4 --- /dev/null +++ b/acceptance/triggers/triggers_advanced_spec.rb @@ -0,0 +1,57 @@ +shared_examples "provider/triggers/advanced" do |provider, options| + if !options[:box] + raise ArgumentError, + "box option must be specified for provider: #{provider}" + end + + include_context "acceptance" + + before do + assert_execute("vagrant", "box", "add", "box", options[:box]) + end + + after(:each) do + execute("vagrant", "destroy", "--force", log: false) + end + + context "machine-box" do + before do + environment.skeleton("triggers-advanced") + end + + it "does not fail if a trigger fails but is configured to continue on" do + result = execute("vagrant", "up", "machine-box", "--provider=#{provider}") + expect(result).to exit_with(0) + expect(result.stdout).to match(/I'm going to fail/) + expect(result.stdout).to match(/Does not exist/) + end + + it "runs a remote script" do + result = execute("vagrant", "up", "machine-box", "--provider=#{provider}") + expect(result).to exit_with(0) + expect(result.stdout).to match(/Hello there from machine-box.local/) + end + + it "does not run a trigger on :destroy" do + result = execute("vagrant", "up", "machine-box", "--provider=#{provider}") + destroy_result = execute("vagrant", "destroy", "machine-box", "-f") + expect(destroy_result).to exit_with(0) + expect(destroy_result.stdout).not_to match(/Before the action!/) + end + end + + context "spec-box" do + before do + environment.skeleton("triggers-advanced") + end + + it "only runs the guest trigger for spec-box and not machine-box" do + result = execute("vagrant", "up", "spec-box", "--provider=#{provider}") + machine_result = execute("vagrant", "up", "machine-box", "--provider=#{provider}") + expect(result).to exit_with(0) + expect(machine_result).to exit_with(0) + expect(result.stdout).to match(/Only spec-box/) + expect(machine_result.stdout).not_to match(/Only spec-box/) + end + end +end diff --git a/acceptance/triggers/triggers_basic_spec.rb b/acceptance/triggers/triggers_basic_spec.rb new file mode 100644 index 0000000..296f4a5 --- /dev/null +++ b/acceptance/triggers/triggers_basic_spec.rb @@ -0,0 +1,33 @@ +shared_examples "provider/triggers" do |provider, options| + if !options[:box] + raise ArgumentError, + "box option must be specified for provider: #{provider}" + end + + include_context "acceptance" + + before do + environment.skeleton("triggers-basic") + assert_execute("vagrant", "box", "add", "box", options[:box]) + #assert_execute("vagrant", "up", "--provider=#{provider}") + end + + it "prints a message before and after up" do + result = execute("vagrant", "up", "--provider=#{provider}") + expect(result).to exit_with(0) + expect(result.stdout).to match(/Acceptance/) + expect(result.stdout).to match(/Testing 1 2 3.../) + expect(result.stdout).to match(/Hello before up/) + expect(result.stdout).to match(/Hello after up/) + end + + it "prints a message before and after destroy" do + result = execute("vagrant", "destroy", "-f") + expect(result).to exit_with(0) + expect(result.stdout).to match(/DESTROY!!/) + expect(result.stdout).to match(/Destroyed/) + expect(result.stdout).to match(/Testing 1 2 3.../) + expect(result.stdout).to match(/Hello before destroy/) + expect(result.stdout).to match(/Hello after destroy/) + end +end