Begin to add tests for mixin provisioner

This commit is contained in:
Brian Cain 2019-08-26 12:03:36 -07:00
parent ef82c0a5bc
commit 28ef368881
No known key found for this signature in database
GPG Key ID: 9FC4639B2E4510A0
2 changed files with 220 additions and 11 deletions

View File

@ -41,6 +41,8 @@ module Vagrant
return @_provisioner_instances.compact
end
private
# Sorts provisioners based on order specified with before/after options
#
# TODO: make sure all defined provisioners work here (i.e. even thoughs defined in separate but loaded Vagrantfile)
@ -49,10 +51,6 @@ module Vagrant
def sort_provisioner_instances(pvs)
final_provs = []
root_provs = []
dep_provs = []
each_provs = []
all_provs = []
# extract root provisioners
root_provs = pvs.map { |p,o| [p,o] if o[:before].nil? && o[:after].nil? }.reject(&:nil?)
@ -61,6 +59,10 @@ module Vagrant
return pvs
end
dep_provs = []
each_provs = []
all_provs = []
# extract dependency provisioners
dep_provs = pvs.map { |p,o| [p,o] if (!o[:before].nil? && !o[:before].is_a?(Symbol)) || (!o[:after].nil? && !o[:after].is_a?(Symbol)) }.reject(&:nil?)
# extract each provisioners
@ -73,6 +75,7 @@ module Vagrant
# insert provisioners in order
final_provs = root_provs
dep_provs.each do |p,options|
idx = 0
if options[:before]
idx = final_provs.each_with_index.map { |(p,o), i| i if o[:name].to_s == options[:before] }.reject(&:nil?).first
idx -= 1 unless idx == 0
@ -84,20 +87,23 @@ module Vagrant
end
end
# Add :each and :all provisioners in reverse to preserve order in Vagrantfile
# add each to final array
# TODO: Account for additional tmp_final size after insert for BOTH before/after cases (if both shortcuts are used)
tmp_final_provs = final_provs.dup
extra_index = 0
before_extra_index = 1 # offset for final array size
after_extra_index = 0
each_provs.reverse_each do |p,options|
idx = 0
final_provs.each_with_index.map do |(prv,o), i|
if options[:before]
idx = i-1 unless idx == 0
idx += extra_index
extra_index += 1
idx = (i+before_extra_index)-1 unless i == 0
before_extra_index += 1
tmp_final_provs.insert(idx, [p,options])
elsif options[:after]
idx = i+1
idx += extra_index
extra_index += 1
idx = (i+after_extra_index)+1
after_extra_index += 1
tmp_final_provs.insert(idx, [p,options])
end
end

View File

@ -0,0 +1,203 @@
require File.expand_path("../../../../base", __FILE__)
require Vagrant.source_root.join("plugins/kernel_v2/config/vm")
require "vagrant/action/builtin/mixin_provisioners"
describe Vagrant::Action::Builtin::MixinProvisioners do
include_context "unit"
let(:sandbox) { isolated_environment }
let(:iso_env) do
# We have to create a Vagrantfile so there is a root path
sandbox.vagrantfile("")
sandbox.create_vagrant_env
end
let(:provisioner_config){ {} }
let(:provisioner_one) do
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("spec-test", :shell)
prov.config = provisioner_config
prov
end
let(:provisioner_two) do
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("spec-test", :shell)
prov.config = provisioner_config
prov
end
let(:provisioner_instances) { [provisioner_one,provisioner_two] }
let(:ui) { double("ui") }
let(:vm) { double("vm", provisioners: provisioner_instances) }
let(:config) { double("config", vm: vm) }
let(:machine) { double("machine", ui: ui, config: config) }
let(:env) {{ machine: machine, ui: machine.ui, root_path: Pathname.new(".") }}
subject do
Class.new do
extend Vagrant::Action::Builtin::MixinProvisioners
end
end
after do
sandbox.close
end
describe "#provisioner_instances" do
it "returns all the instances of configured provisioners" do
result = subject.provisioner_instances(env)
expect(result.size).to eq(provisioner_instances.size)
shell_one = result.first
expect(shell_one.first).to be_a(VagrantPlugins::Shell::Provisioner)
shell_two = result[1]
expect(shell_two.first).to be_a(VagrantPlugins::Shell::Provisioner)
end
end
context "#sort_provisioner_instances" do
describe "with no dependency provisioners" do
it "returns the original array" do
result = subject.provisioner_instances(env)
expect(result.size).to eq(provisioner_instances.size)
shell_one = result.first
expect(shell_one.first).to be_a(VagrantPlugins::Shell::Provisioner)
shell_two = result[1]
expect(shell_two.first).to be_a(VagrantPlugins::Shell::Provisioner)
end
end
describe "with before and after dependency provisioners" do
let(:provisioner_config){ {} }
let(:provisioner_root) do
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("root-test", :shell)
prov.config = provisioner_config
prov
end
let(:provisioner_before) do
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("before-test", :shell)
prov.config = provisioner_config
prov.before = "root-test"
prov
end
let(:provisioner_after) do
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("after-test", :shell)
prov.config = provisioner_config
prov.after = "root-test"
prov
end
let(:provisioner_instances) { [provisioner_root,provisioner_before,provisioner_after] }
it "returns the array in the correct order" do
result = subject.provisioner_instances(env)
expect(result[0].last[:name]).to eq("before-test")
expect(result[1].last[:name]).to eq("root-test")
expect(result[2].last[:name]).to eq("after-test")
end
end
describe "with before :each dependency provisioners" do
let(:provisioner_config){ {} }
let(:provisioner_root) do
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("root-test", :shell)
prov.config = provisioner_config
prov
end
let(:provisioner_root2) do
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("root2-test", :shell)
prov.config = provisioner_config
prov
end
let(:provisioner_before) do
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("before-test", :shell)
prov.config = provisioner_config
prov.before = :each
prov
end
let(:provisioner_instances) { [provisioner_root,provisioner_root2,provisioner_before] }
it "puts the each shortcut provisioners in place" do
result = subject.provisioner_instances(env)
expect(result[0].last[:name]).to eq("before-test")
expect(result[1].last[:name]).to eq("root-test")
expect(result[2].last[:name]).to eq("before-test")
expect(result[3].last[:name]).to eq("root2-test")
end
end
describe "with after :each dependency provisioners" do
let(:provisioner_config){ {} }
let(:provisioner_root) do
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("root-test", :shell)
prov.config = provisioner_config
prov
end
let(:provisioner_root2) do
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("root2-test", :shell)
prov.config = provisioner_config
prov
end
let(:provisioner_after) do
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("after-test", :shell)
prov.config = provisioner_config
prov.after = :each
prov
end
let(:provisioner_instances) { [provisioner_root,provisioner_root2,provisioner_after] }
it "puts the each shortcut provisioners in place" do
result = subject.provisioner_instances(env)
expect(result[0].last[:name]).to eq("root-test")
expect(result[1].last[:name]).to eq("after-test")
expect(result[2].last[:name]).to eq("root2-test")
expect(result[3].last[:name]).to eq("after-test")
end
end
describe "with before and after :each dependency provisioners" do
let(:provisioner_config){ {} }
let(:provisioner_root) do
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("root-test", :shell)
prov.config = provisioner_config
prov
end
let(:provisioner_root2) do
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("root2-test", :shell)
prov.config = provisioner_config
prov
end
let(:provisioner_after) do
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("after-test", :shell)
prov.config = provisioner_config
prov.after = :each
prov
end
let(:provisioner_before) do
prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("before-test", :shell)
prov.config = provisioner_config
prov.before = :each
prov
end
let(:provisioner_instances) { [provisioner_root,provisioner_root2,provisioner_before,provisioner_after] }
it "puts the each shortcut provisioners in place" do
result = subject.provisioner_instances(env)
result.each do |p,o|
puts o[:name]
end
expect(result[0].last[:name]).to eq("before-test")
expect(result[1].last[:name]).to eq("root-test")
expect(result[2].last[:name]).to eq("after-test")
expect(result[3].last[:name]).to eq("before-test")
expect(result[4].last[:name]).to eq("root2-test")
expect(result[5].last[:name]).to eq("after-test")
end
end
end
end