Files
vagrant-libvirt/spec/unit/action_spec.rb
Darragh Bailey c8e3e2c805 Mock out synced folders for action tests (#1610)
Allowing synced folders to be validated as part of the action tests can
cause an excessive amount of time to be consumed due to many calls to
systemd and distro packager to check if nfs is available on the host.
2022-09-28 18:17:18 +01:00

275 lines
8.9 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
require 'support/sharedcontext'
require 'vagrant/action/runner'
require 'vagrant-libvirt/action'
describe VagrantPlugins::ProviderLibvirt::Action do
subject { described_class }
include_context 'libvirt'
include_context 'unit'
let(:runner) { Vagrant::Action::Runner.new(env) }
let(:state) { double('state') }
before do
allow(machine).to receive(:id).and_return('test-machine-id')
allow(machine).to receive(:state).and_return(state)
allow(logger).to receive(:info)
allow(logger).to receive(:trace)
allow(logger).to receive(:debug)
allow(logger).to receive(:error)
allow(connection.client).to receive(:libversion).and_return(6_002_000)
# patch out iterating synced_folders by emptying the list returned
# where vagrant us using a Collection, otherwise fallback to using
# the env value to disable the behaviour for older versions.
begin
require 'vagrant/plugin/v2/synced_folder'
synced_folders = Vagrant::Plugin::V2::SyncedFolder::Collection.new
allow(machine).to receive(:synced_folders).and_return(synced_folders)
rescue NameError
env[:synced_folders_disable] = true
end
end
def allow_action_env_result(action, *responses)
results = responses.dup
allow_any_instance_of(action).to receive(:call) do |cls, env|
app = cls.instance_variable_get(:@app)
env[:result] = results[0]
if results.length > 1
results.shift
end
app.call(env)
end
end
describe '#action_halt' do
context 'not created' do
before do
expect(state).to receive(:id).and_return(:not_created)
end
it 'should execute without error' do
expect(ui).to receive(:info).with('Domain is not created. Please run `vagrant up` first.')
expect(runner.run(subject.action_halt)).to match(hash_including({:machine => machine}))
end
end
context 'running' do
before do
allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::IsCreated, true)
allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::IsSuspended, false)
allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::IsRunning, true)
end
context 'when shutdown domain works' do
before do
allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::ShutdownDomain, true)
allow_action_env_result(Vagrant::Action::Builtin::GracefulHalt, true)
allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::IsRunning, true, false)
end
it 'should skip calling HaltDomain' do
expect(ui).to_not receive(:info).with('Domain is not created. Please run `vagrant up` first.')
expect_any_instance_of(VagrantPlugins::ProviderLibvirt::Action::HaltDomain).to_not receive(:call)
expect(runner.run(subject.action_halt)).to match(hash_including({:machine => machine}))
end
end
context 'when shutdown domain fails' do
before do
allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::ShutdownDomain, false)
allow_action_env_result(Vagrant::Action::Builtin::GracefulHalt, false)
end
it 'should call halt' do
expect_any_instance_of(VagrantPlugins::ProviderLibvirt::Action::HaltDomain).to receive(:call)
expect(runner.run(subject.action_halt)).to match(hash_including({:machine => machine}))
end
end
end
end
describe '#action_ssh' do
context 'when not created' do
before do
allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::IsCreated, false)
end
it 'should cause an error' do
expect{ machine.action(:ssh, ssh_opts: {})}.to raise_error(Vagrant::Errors::VMNotCreatedError)
end
end
context 'when created' do
before do
allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::IsCreated, true)
end
context 'when not running' do
before do
allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::IsRunning, false)
end
it 'should cause an error' do
expect{ machine.action(:ssh, ssh_opts: {})}.to raise_error(Vagrant::Errors::VMNotRunningError)
end
end
context 'when running' do
before do
allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::IsRunning, true)
end
it 'should call SSHExec' do
expect_any_instance_of(Vagrant::Action::Builtin::SSHExec).to receive(:call).and_return(0)
expect(machine.action(:ssh, ssh_opts: {})).to match(hash_including({:action_name => :machine_action_ssh}))
end
end
end
end
describe '#action_ssh_run' do
context 'when not created' do
before do
allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::IsCreated, false)
end
it 'should cause an error' do
expect{ machine.action(:ssh_run, ssh_opts: {})}.to raise_error(Vagrant::Errors::VMNotCreatedError)
end
end
context 'when created' do
before do
allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::IsCreated, true)
end
context 'when not running' do
before do
allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::IsRunning, false)
end
it 'should cause an error' do
expect{ machine.action(:ssh_run, ssh_opts: {})}.to raise_error(Vagrant::Errors::VMNotRunningError)
end
end
context 'when running' do
before do
allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::IsRunning, true)
end
it 'should call SSHRun' do
expect_any_instance_of(Vagrant::Action::Builtin::SSHRun).to receive(:call).and_return(0)
expect(machine.action(:ssh_run, ssh_opts: {})).to match(hash_including({:action_name => :machine_action_ssh_run}))
end
end
end
end
describe '#action_snapshot_delete' do
context 'when not created' do
before do
allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::IsCreated, false)
end
it 'should cause an error' do
expect{ machine.action(:snapshot_delete, snapshot_opts: {})}.to raise_error(Vagrant::Errors::VMNotCreatedError)
end
end
context 'when created' do
before do
allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::IsCreated, true)
end
context 'when running' do
before do
allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::IsRunning, true)
end
it 'should call SnapshotDelete' do
expect_any_instance_of(VagrantPlugins::ProviderLibvirt::Action::SnapshotDelete).to receive(:call).and_return(0)
expect(machine.action(:snapshot_delete, snapshot_opts: {})).to match(hash_including({:action_name => :machine_action_snapshot_delete}))
end
end
end
end
describe '#action_snapshot_restore' do
context 'when not created' do
before do
allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::IsCreated, false)
end
it 'should cause an error' do
expect{ machine.action(:snapshot_restore, snapshot_opts: {})}.to raise_error(Vagrant::Errors::VMNotCreatedError)
end
end
context 'when created' do
before do
allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::IsCreated, true)
end
context 'when running' do
before do
allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::IsRunning, true)
end
it 'should call SnapshotRestore' do
expect_any_instance_of(VagrantPlugins::ProviderLibvirt::Action::SnapshotRestore).to receive(:call).and_return(0)
expect(machine.action(:snapshot_restore, snapshot_opts: {})).to match(hash_including({:action_name => :machine_action_snapshot_restore}))
end
end
end
end
describe '#action_snapshot_save' do
context 'when not created' do
before do
allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::IsCreated, false)
end
it 'should cause an error' do
expect{ machine.action(:snapshot_save, snapshot_opts: {})}.to raise_error(Vagrant::Errors::VMNotCreatedError)
end
end
context 'when created' do
before do
allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::IsCreated, true)
end
context 'when running' do
before do
allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::IsRunning, true)
end
it 'should call SnapshotSave' do
expect_any_instance_of(VagrantPlugins::ProviderLibvirt::Action::SnapshotSave).to receive(:call).and_return(0)
expect(machine.action(:snapshot_save, snapshot_opts: {})).to match(hash_including({:action_name => :machine_action_snapshot_save}))
end
end
end
end
end