394 lines
9.4 KiB
Ruby
394 lines
9.4 KiB
Ruby
require_relative "../../../base"
|
|
|
|
require "vagrant/util/platform"
|
|
|
|
require Vagrant.source_root.join("plugins/providers/docker/config")
|
|
|
|
describe VagrantPlugins::DockerProvider::Config do
|
|
include_context "unit"
|
|
|
|
let(:machine) { double("machine") }
|
|
|
|
let(:build_dir) do
|
|
Dir.mktmpdir("vagrant-test-docker-provider-build-dir").tap do |dir|
|
|
File.open(File.join(dir, "Dockerfile"), "wb+") do |f|
|
|
f.write("Hello")
|
|
end
|
|
end
|
|
end
|
|
|
|
after do
|
|
FileUtils.rm_rf(build_dir)
|
|
end
|
|
|
|
def assert_invalid
|
|
errors = subject.validate(machine)
|
|
if !errors.values.any? { |v| !v.empty? }
|
|
raise "No errors: #{errors.inspect}"
|
|
end
|
|
end
|
|
|
|
def assert_valid
|
|
errors = subject.validate(machine)
|
|
if !errors.values.all? { |v| v.empty? }
|
|
raise "Errors: #{errors.inspect}"
|
|
end
|
|
end
|
|
|
|
def valid_defaults
|
|
subject.image = "foo"
|
|
end
|
|
|
|
describe "defaults" do
|
|
before { subject.finalize! }
|
|
|
|
its(:build_dir) { should be_nil }
|
|
its(:git_repo) { should be_nil }
|
|
its(:expose) { should eq([]) }
|
|
its(:cmd) { should eq([]) }
|
|
its(:env) { should eq({}) }
|
|
its(:force_host_vm) { should be(false) }
|
|
its(:host_vm_build_dir_options) { should be_nil }
|
|
its(:image) { should be_nil }
|
|
its(:name) { should be_nil }
|
|
its(:privileged) { should be(false) }
|
|
its(:stop_timeout) { should eq(1) }
|
|
its(:vagrant_machine) { should be_nil }
|
|
its(:vagrant_vagrantfile) { should be_nil }
|
|
|
|
its(:auth_server) { should be_nil }
|
|
its(:email) { should eq("") }
|
|
its(:username) { should eq("") }
|
|
its(:password) { should eq("") }
|
|
end
|
|
|
|
before do
|
|
# By default lets be Linux for validations
|
|
allow(Vagrant::Util::Platform).to receive(:linux).and_return(true)
|
|
allow(Vagrant::Util::Platform).to receive(:linux?).and_return(true)
|
|
end
|
|
|
|
describe "should be invalid if any two or more of build dir, git repo and image are set" do
|
|
it "build dir and image" do
|
|
subject.build_dir = build_dir
|
|
subject.image = "foo"
|
|
subject.git_repo = nil
|
|
subject.finalize!
|
|
assert_invalid
|
|
end
|
|
|
|
it "build dir and git repo" do
|
|
subject.build_dir = build_dir
|
|
subject.git_repo = "http://someone.com/something.git#branch:dir"
|
|
subject.image = nil
|
|
subject.finalize!
|
|
assert_invalid
|
|
end
|
|
|
|
it "git repo dir and image" do
|
|
subject.build_dir = nil
|
|
subject.git_repo = "http://someone.com/something.git#branch:dir"
|
|
subject.image = "foo"
|
|
subject.finalize!
|
|
assert_invalid
|
|
end
|
|
|
|
it "build dir, git repo and image" do
|
|
subject.build_dir = build_dir
|
|
subject.git_repo = "http://someone.com/something.git#branch:dir"
|
|
subject.image = "foo"
|
|
subject.finalize!
|
|
assert_invalid
|
|
end
|
|
end
|
|
|
|
describe "#build_dir" do
|
|
it "should be valid if not set with image or git repo" do
|
|
subject.build_dir = nil
|
|
subject.git_repo = nil
|
|
subject.image = "foo"
|
|
subject.finalize!
|
|
assert_valid
|
|
end
|
|
|
|
it "should be valid with a valid directory" do
|
|
subject.build_dir = build_dir
|
|
subject.finalize!
|
|
assert_valid
|
|
end
|
|
end
|
|
|
|
describe "#git_repo" do
|
|
it "should be valid if not set with image or build dir" do
|
|
subject.build_dir = nil
|
|
subject.git_repo = "http://someone.com/something.git#branch:dir"
|
|
subject.image = nil
|
|
subject.finalize!
|
|
assert_valid
|
|
end
|
|
|
|
it "should be valid with a http git url" do
|
|
subject.git_repo = "http://someone.com/something.git#branch:dir"
|
|
subject.finalize!
|
|
assert_valid
|
|
end
|
|
|
|
it "should be valid with a git@ url" do
|
|
subject.git_repo = "git@someone.com:somebody/something"
|
|
subject.finalize!
|
|
assert_valid
|
|
end
|
|
|
|
it "should be valid with a git:// url" do
|
|
subject.git_repo = "git://someone.com/something"
|
|
subject.finalize!
|
|
assert_valid
|
|
end
|
|
|
|
it "should be valid with a short url beginning with github.com url" do
|
|
subject.git_repo = "github.com/somebody/something"
|
|
subject.finalize!
|
|
assert_valid
|
|
end
|
|
|
|
it "should be invalid with an non-git url" do
|
|
subject.git_repo = "http://foo.bar.com"
|
|
subject.finalize!
|
|
assert_invalid
|
|
end
|
|
|
|
it "should be invalid with an non url" do
|
|
subject.git_repo = "http||://foo.bar.com sdfs"
|
|
subject.finalize!
|
|
assert_invalid
|
|
end
|
|
end
|
|
|
|
describe "#compose" do
|
|
before do
|
|
valid_defaults
|
|
end
|
|
|
|
it "should be valid when enabled" do
|
|
subject.compose = true
|
|
subject.finalize!
|
|
assert_valid
|
|
end
|
|
|
|
it "should be invalid when force_host_vm is enabled" do
|
|
subject.compose = true
|
|
subject.force_host_vm = true
|
|
subject.finalize!
|
|
assert_invalid
|
|
end
|
|
end
|
|
|
|
describe "#create_args" do
|
|
before do
|
|
valid_defaults
|
|
end
|
|
|
|
it "is invalid if it isn't an array" do
|
|
subject.create_args = "foo"
|
|
subject.finalize!
|
|
assert_invalid
|
|
end
|
|
end
|
|
|
|
describe "#expose" do
|
|
before do
|
|
valid_defaults
|
|
end
|
|
|
|
it "uniqs the ports" do
|
|
subject.expose = [1, 1, 4, 5]
|
|
subject.finalize!
|
|
assert_valid
|
|
|
|
expect(subject.expose).to eq([1, 4, 5])
|
|
end
|
|
end
|
|
|
|
describe "#image" do
|
|
it "should be valid if set" do
|
|
subject.image = "foo"
|
|
subject.finalize!
|
|
assert_valid
|
|
end
|
|
|
|
it "should be invalid if not set" do
|
|
subject.image = nil
|
|
subject.finalize!
|
|
assert_invalid
|
|
end
|
|
end
|
|
|
|
describe "#link" do
|
|
before do
|
|
valid_defaults
|
|
end
|
|
|
|
it "should be valid with good links" do
|
|
subject.link "foo:bar"
|
|
subject.link "db:blah"
|
|
subject.finalize!
|
|
assert_valid
|
|
end
|
|
|
|
it "should be invalid if not name:alias" do
|
|
subject.link "foo"
|
|
subject.finalize!
|
|
assert_invalid
|
|
end
|
|
|
|
it "should be invalid if too many colons" do
|
|
subject.link "foo:bar:baz"
|
|
subject.finalize!
|
|
assert_invalid
|
|
end
|
|
end
|
|
|
|
describe "#merge" do
|
|
let(:one) { described_class.new }
|
|
let(:two) { described_class.new }
|
|
|
|
subject { one.merge(two) }
|
|
|
|
context "#build_dir, #git_repo and #image" do
|
|
it "overrides image if build_dir is set previously" do
|
|
one.build_dir = "foo"
|
|
two.image = "bar"
|
|
|
|
expect(subject.build_dir).to be_nil
|
|
expect(subject.image).to eq("bar")
|
|
end
|
|
|
|
it "overrides image if git_repo is set previously" do
|
|
one.git_repo = "foo"
|
|
two.image = "bar"
|
|
|
|
expect(subject.image).to eq("bar")
|
|
expect(subject.git_repo).to be_nil
|
|
end
|
|
|
|
it "overrides build_dir if image is set previously" do
|
|
one.image = "foo"
|
|
two.build_dir = "bar"
|
|
|
|
expect(subject.build_dir).to eq("bar")
|
|
expect(subject.image).to be_nil
|
|
end
|
|
|
|
it "overrides build_dir if git_repo is set previously" do
|
|
one.git_repo = "foo"
|
|
two.build_dir = "bar"
|
|
|
|
expect(subject.build_dir).to eq("bar")
|
|
expect(subject.git_repo).to be_nil
|
|
end
|
|
|
|
it "overrides git_repo if build_dir is set previously" do
|
|
one.build_dir = "foo"
|
|
two.git_repo = "bar"
|
|
|
|
expect(subject.build_dir).to be_nil
|
|
expect(subject.git_repo).to eq("bar")
|
|
end
|
|
|
|
it "overrides git_repo if image is set previously" do
|
|
one.image = "foo"
|
|
two.git_repo = "bar"
|
|
|
|
expect(subject.image).to be_nil
|
|
expect(subject.git_repo).to eq("bar")
|
|
end
|
|
|
|
it "preserves if both image and build_dir are set" do
|
|
one.image = "foo"
|
|
two.image = "baz"
|
|
two.build_dir = "bar"
|
|
|
|
expect(subject.build_dir).to eq("bar")
|
|
expect(subject.image).to eq("baz")
|
|
end
|
|
|
|
it "preserves if both image and git_repo are set" do
|
|
one.image = "foo"
|
|
two.image = "baz"
|
|
two.git_repo = "bar"
|
|
|
|
expect(subject.image).to eq("baz")
|
|
expect(subject.git_repo).to eq("bar")
|
|
end
|
|
|
|
it "preserves if both build_dir and git_repo are set" do
|
|
one.build_dir = "foo"
|
|
two.build_dir = "baz"
|
|
two.git_repo = "bar"
|
|
|
|
expect(subject.build_dir).to eq("baz")
|
|
expect(subject.git_repo).to eq("bar")
|
|
end
|
|
end
|
|
|
|
context "env vars" do
|
|
it "should merge the values" do
|
|
one.env["foo"] = "bar"
|
|
two.env["bar"] = "baz"
|
|
|
|
expect(subject.env).to eq({
|
|
"foo" => "bar",
|
|
"bar" => "baz",
|
|
})
|
|
end
|
|
end
|
|
|
|
context "exposed ports" do
|
|
it "merges the exposed ports" do
|
|
one.expose << 1234
|
|
two.expose = [42, 54]
|
|
|
|
expect(subject.expose).to eq([
|
|
1234, 42, 54])
|
|
end
|
|
end
|
|
|
|
context "links" do
|
|
it "should merge the links" do
|
|
one.link "foo"
|
|
two.link "bar"
|
|
|
|
expect(subject._links).to eq([
|
|
"foo", "bar"])
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "#vagrant_machine" do
|
|
before { valid_defaults }
|
|
|
|
it "should convert to a symbol" do
|
|
subject.vagrant_machine = "foo"
|
|
subject.finalize!
|
|
assert_valid
|
|
expect(subject.vagrant_machine).to eq(:foo)
|
|
end
|
|
end
|
|
|
|
describe "#vagrant_vagrantfile" do
|
|
before { valid_defaults }
|
|
|
|
it "should be valid if set to a file" do
|
|
subject.vagrant_vagrantfile = temporary_file.to_s
|
|
subject.finalize!
|
|
assert_valid
|
|
end
|
|
|
|
it "should not be valid if set to a non-existent place" do
|
|
subject.vagrant_vagrantfile = "/i/shouldnt/exist"
|
|
subject.finalize!
|
|
assert_invalid
|
|
end
|
|
end
|
|
end
|