176 lines
4.7 KiB
Ruby
176 lines
4.7 KiB
Ruby
# Copyright (c) HashiCorp, Inc.
|
|
# SPDX-License-Identifier: BUSL-1.1
|
|
|
|
require File.expand_path("../../../../../base", __FILE__)
|
|
|
|
require Vagrant.source_root.join("plugins/commands/serve/command")
|
|
require Vagrant.source_root.join("plugins/commands/serve/broker").to_s
|
|
|
|
class DummyContext
|
|
attr_reader :metadata
|
|
def initialize(plugin_name)
|
|
@metadata = {"plugin_name" => plugin_name}
|
|
end
|
|
end
|
|
|
|
describe VagrantPlugins::CommandServe::Service::GuestService do
|
|
include_context "unit"
|
|
|
|
let(:broker){
|
|
VagrantPlugins::CommandServe::Broker.new(bind: "bind_addr", ports: ["1234"])
|
|
}
|
|
|
|
let(:machine){ double("machine") }
|
|
|
|
let(:machine_arg){
|
|
Hashicorp::Vagrant::Sdk::FuncSpec::Args.new(
|
|
args: [
|
|
Hashicorp::Vagrant::Sdk::FuncSpec::Value.new(
|
|
name: "",
|
|
type: "hashicorp.vagrant.sdk.Args.Target",
|
|
value: Google::Protobuf::Any.pack(
|
|
Hashicorp::Vagrant::Sdk::Args::Target.new(stream_id: 1, network: "here:101", addr: "unix://here"
|
|
)))
|
|
]
|
|
)
|
|
}
|
|
|
|
subject { described_class.new(broker: broker) }
|
|
|
|
before(:each) do
|
|
parent_test_guest = Class.new(Vagrant.plugin("2", :guest)) do
|
|
def detect?(machine)
|
|
true
|
|
end
|
|
end
|
|
|
|
test_guest = Class.new(Vagrant.plugin("2", :guest)) do
|
|
def detect?(machine)
|
|
true
|
|
end
|
|
end
|
|
|
|
register_plugin do |p|
|
|
p.guest(:parent_test) { parent_test_guest }
|
|
p.guest(:test, :parent_test) { test_guest }
|
|
end
|
|
end
|
|
|
|
context "requesting parent" do
|
|
it "generates a spec" do
|
|
spec = subject.parent_spec
|
|
expect(spec).not_to be_nil
|
|
end
|
|
|
|
it "raises an error for unknown plugins" do
|
|
ctx = DummyContext.new("idontexisthahaha")
|
|
expect { subject.parent("", ctx) }.to raise_error(/Failed to locate guest plugin/)
|
|
end
|
|
|
|
it "requests parent from plugins" do
|
|
ctx = DummyContext.new("test")
|
|
parent = subject.parent("", ctx)
|
|
expect(parent).not_to be_nil
|
|
expect(parent.parent).to eq("parent_test")
|
|
end
|
|
end
|
|
|
|
context "requesting detect" do
|
|
before do
|
|
test_false_guest = Class.new(Vagrant.plugin("2", :guest)) do
|
|
def detect?(machine)
|
|
false
|
|
end
|
|
end
|
|
|
|
register_plugin do |p|
|
|
p.guest(:test_false) { test_false_guest }
|
|
end
|
|
|
|
allow_any_instance_of(VagrantPlugins::CommandServe::Mappers).to receive(:funcspec_map).and_return(machine)
|
|
end
|
|
|
|
after do
|
|
VagrantPlugins::CommandServe.cache.clear
|
|
end
|
|
|
|
it "generates a spec" do
|
|
spec = subject.detect_spec
|
|
expect(spec).not_to be_nil
|
|
end
|
|
|
|
it "raises an error for unknown plugins" do
|
|
ctx = DummyContext.new("idontexisthahaha")
|
|
expect { subject.detect("", ctx) }.to raise_error(/Failed to locate plugin/)
|
|
end
|
|
|
|
it "detects true plugins" do
|
|
ctx = DummyContext.new("test")
|
|
d = subject.detect(machine_arg, ctx)
|
|
expect(d.detected).to be true
|
|
end
|
|
|
|
it "detects false plugins" do
|
|
ctx = DummyContext.new("test_false")
|
|
d = subject.detect(machine_arg, ctx)
|
|
expect(d.detected).to be false
|
|
end
|
|
end
|
|
|
|
context "requesting has capability" do
|
|
before do
|
|
cap_guest = Class.new(Vagrant.plugin("2", :guest)) do
|
|
def detect?(machine)
|
|
true
|
|
end
|
|
end
|
|
|
|
register_plugin do |p|
|
|
p.guest(:cap_guest) { cap_guest }
|
|
p.guest_capability(:cap_guest, :mycap) do
|
|
"this is a capability"
|
|
end
|
|
end
|
|
end
|
|
|
|
let(:named_cap_request){
|
|
Hashicorp::Vagrant::Sdk::FuncSpec::Args.new(
|
|
args: [
|
|
Hashicorp::Vagrant::Sdk::FuncSpec::Value.new(
|
|
name: "",
|
|
type: "hashicorp.vagrant.sdk.Args.NamedCapability",
|
|
value: Google::Protobuf::Any.pack(Hashicorp::Vagrant::Sdk::Args::NamedCapability.new(capability:"mycap")))
|
|
]
|
|
)
|
|
}
|
|
|
|
let(:named_cap_bad_request){
|
|
Hashicorp::Vagrant::Sdk::FuncSpec::Args.new(
|
|
args: [
|
|
Hashicorp::Vagrant::Sdk::FuncSpec::Value.new(
|
|
name: "",
|
|
type: "hashicorp.vagrant.sdk.Args.NamedCapability",
|
|
value: Google::Protobuf::Any.pack(Hashicorp::Vagrant::Sdk::Args::NamedCapability.new(capability:"notacapability")))
|
|
]
|
|
)
|
|
}
|
|
|
|
it "generates a spec" do
|
|
spec = subject.has_capability_spec
|
|
expect(spec).not_to be_nil
|
|
end
|
|
|
|
it "returns true for plugin with capability" do
|
|
ctx = DummyContext.new("cap_guest")
|
|
d = subject.has_capability(named_cap_request, ctx)
|
|
expect(d.has_capability).to be true
|
|
end
|
|
|
|
it "returns false for plugin without capability" do
|
|
ctx = DummyContext.new("cap_guest")
|
|
d = subject.has_capability(named_cap_bad_request, ctx)
|
|
expect(d.has_capability).to be false
|
|
end
|
|
end
|
|
end
|