From 5ff176a82ccd8dc9573b23b5308f6b213c83e8f8 Mon Sep 17 00:00:00 2001 From: Evgeny Sinelnikov Date: Mon, 10 Jul 2017 00:52:24 +0300 Subject: [PATCH] guests/alt: capability tests for ALT Platforms --- .../guests/alt/cap/change_host_name_test.rb | 42 ++++ .../guests/alt/cap/configure_networks_test.rb | 214 ++++++++++++++++++ .../plugins/guests/alt/cap/flavor_test.rb | 43 ++++ .../alt/cap/network_scripts_dir_test.rb | 21 ++ .../unit/plugins/guests/alt/cap/rsync_test.rb | 29 +++ 5 files changed, 349 insertions(+) create mode 100644 test/unit/plugins/guests/alt/cap/change_host_name_test.rb create mode 100644 test/unit/plugins/guests/alt/cap/configure_networks_test.rb create mode 100644 test/unit/plugins/guests/alt/cap/flavor_test.rb create mode 100644 test/unit/plugins/guests/alt/cap/network_scripts_dir_test.rb create mode 100644 test/unit/plugins/guests/alt/cap/rsync_test.rb diff --git a/test/unit/plugins/guests/alt/cap/change_host_name_test.rb b/test/unit/plugins/guests/alt/cap/change_host_name_test.rb new file mode 100644 index 000000000..51eb814b6 --- /dev/null +++ b/test/unit/plugins/guests/alt/cap/change_host_name_test.rb @@ -0,0 +1,42 @@ +require_relative "../../../../base" + +describe "VagrantPlugins::GuestALT::Cap::ChangeHostName" do + let(:caps) do + VagrantPlugins::GuestALT::Plugin + .components + .guest_capabilities[:alt] + end + + let(:machine) { double("machine") } + let(:comm) { VagrantTests::DummyCommunicator::Communicator.new(machine) } + + before do + allow(machine).to receive(:communicate).and_return(comm) + end + + after do + comm.verify_expectations! + end + + describe ".change_host_name" do + let(:cap) { caps.get(:change_host_name) } + + let(:name) { "banana-rama.example.com" } + + it "sets the hostname" do + comm.stub_command("hostname -f | grep '^#{name}$'", exit_code: 1) + + cap.change_host_name(machine, name) + expect(comm.received_commands[1]).to match(/\/etc\/sysconfig\/network/) + expect(comm.received_commands[1]).to match(/hostnamectl set-hostname --static '#{name}'/) + expect(comm.received_commands[1]).to match(/hostnamectl set-hostname --transient '#{name}'/) + expect(comm.received_commands[1]).to match(/service network restart/) + end + + it "does not change the hostname if already set" do + comm.stub_command("hostname -f | grep '^#{name}$'", exit_code: 0) + cap.change_host_name(machine, name) + expect(comm.received_commands.size).to eq(1) + end + end +end diff --git a/test/unit/plugins/guests/alt/cap/configure_networks_test.rb b/test/unit/plugins/guests/alt/cap/configure_networks_test.rb new file mode 100644 index 000000000..c736a5f3f --- /dev/null +++ b/test/unit/plugins/guests/alt/cap/configure_networks_test.rb @@ -0,0 +1,214 @@ +require_relative "../../../../base" + +describe "VagrantPlugins::GuestALT::Cap::ConfigureNetworks" do + let(:caps) do + VagrantPlugins::GuestALT::Plugin + .components + .guest_capabilities[:alt] + end + + let(:comm) { VagrantTests::DummyCommunicator::Communicator.new(machine) } + let(:config) { double("config", vm: vm) } + let(:guest) { double("guest") } + let(:machine) { double("machine", guest: guest, config: config) } + let(:networks){ [[{}], [{}]] } + let(:vm){ double("vm", networks: networks) } + + before do + allow(machine).to receive(:communicate).and_return(comm) + end + + after do + comm.verify_expectations! + end + + describe ".configure_networks" do + let(:cap) { caps.get(:configure_networks) } + + before do + allow(guest).to receive(:capability) + .with(:flavor) + .and_return(:alt) + + allow(guest).to receive(:capability) + .with(:network_scripts_dir) + .and_return("/etc/net") + + allow(guest).to receive(:capability) + .with(:network_interfaces) + .and_return(["eth1", "eth2"]) + end + + let(:network_1) do + { + interface: 0, + type: "dhcp", + } + end + + let(:network_2) do + { + interface: 1, + type: "static", + ip: "33.33.33.10", + netmask: "255.255.0.0", + gateway: "33.33.0.1", + } + end + + context "with NetworkManager installed" do + before do + allow(cap).to receive(:nmcli?).and_return true + end + + context "with devices managed by NetworkManager" do + before do + allow(cap).to receive(:nm_controlled?).and_return true + end + + context "with nm_controlled option omitted" do + it "downs networks manually, creates ifaces, starts networks manually and restart NetworksManager" do + cap.configure_networks(machine, [network_1, network_2]) + expect(comm.received_commands[0]).to match(/ifdown/) + expect(comm.received_commands[0]).to match(/mkdir.*\/etc\/net\/ifaces/) + expect(comm.received_commands[0]).to match(/ifup/) + expect(comm.received_commands[0]).to match(/NetworkManager/) + expect(comm.received_commands[0]).to_not match(/nmcli/) + end + end + + context "with nm_controlled option set to true" do + let(:networks){ [[{nm_controlled: true}], [{nm_controlled: true}]] } + + it "downs networks via nmcli, creates ifaces and restart NetworksManager" do + cap.configure_networks(machine, [network_1, network_2]) + expect(comm.received_commands[0]).to match(/nmcli.*disconnect/) + expect(comm.received_commands[0]).to match(/mkdir.*\/etc\/net\/ifaces/) + expect(comm.received_commands[0]).to match(/NetworkManager/) + expect(comm.received_commands[0]).to_not match(/(ifdown|ifup)/) + end + end + + context "with nm_controlled option set to false" do + let(:networks){ [[{nm_controlled: false}], [{nm_controlled: false}]] } + + it "downs networks manually, creates ifaces, starts networks manually and restart NetworksManager" do + cap.configure_networks(machine, [network_1, network_2]) + expect(comm.received_commands[0]).to match(/ifdown/) + expect(comm.received_commands[0]).to match(/mkdir.*\/etc\/net\/ifaces/) + expect(comm.received_commands[0]).to match(/ifup/) + expect(comm.received_commands[0]).to match(/NetworkManager/) + expect(comm.received_commands[0]).to_not match(/nmcli/) + end + end + + context "with nm_controlled option set to false on first device" do + let(:networks){ [[{nm_controlled: false}], [{nm_controlled: true}]] } + + it "downs networks, creates ifaces and starts the networks with one managed manually and one NetworkManager controlled" do + cap.configure_networks(machine, [network_1, network_2]) + expect(comm.received_commands[0]).to match(/ifdown/) + expect(comm.received_commands[0]).to match(/nmcli.*disconnect/) + expect(comm.received_commands[0]).to match(/mkdir.*\/etc\/net\/ifaces/) + expect(comm.received_commands[0]).to match(/ifup/) + expect(comm.received_commands[0]).to match(/NetworkManager/) + end + end + end + + context "with devices not managed by NetworkManager" do + before do + allow(cap).to receive(:nm_controlled?).and_return false + end + + context "with nm_controlled option omitted" do + it "creates and starts the networks manually" do + cap.configure_networks(machine, [network_1, network_2]) + expect(comm.received_commands[0]).to match(/ifdown/) + expect(comm.received_commands[0]).to match(/mkdir.*\/etc\/net\/ifaces/) + expect(comm.received_commands[0]).to match(/ifup/) + expect(comm.received_commands[0]).to match(/NetworkManager/) + expect(comm.received_commands[0]).to_not match(/nmcli/) + end + end + + context "with nm_controlled option set to true" do + let(:networks){ [[{nm_controlled: true}], [{nm_controlled: true}]] } + + it "creates and starts the networks via nmcli" do + cap.configure_networks(machine, [network_1, network_2]) + expect(comm.received_commands[0]).to match(/ifdown/) + expect(comm.received_commands[0]).to match(/mkdir.*\/etc\/net\/ifaces/) + expect(comm.received_commands[0]).to match(/NetworkManager/) + expect(comm.received_commands[0]).to_not match(/ifup/) + end + end + + context "with nm_controlled option set to false" do + let(:networks){ [[{nm_controlled: false}], [{nm_controlled: false}]] } + + it "creates and starts the networks via ifup " do + cap.configure_networks(machine, [network_1, network_2]) + expect(comm.received_commands[0]).to match(/ifdown/) + expect(comm.received_commands[0]).to match(/mkdir.*\/etc\/net\/ifaces/) + expect(comm.received_commands[0]).to match(/ifup/) + expect(comm.received_commands[0]).to match(/NetworkManager/) + expect(comm.received_commands[0]).to_not match(/nmcli/) + end + end + + context "with nm_controlled option set to false on first device" do + let(:networks){ [[{nm_controlled: false}], [{nm_controlled: true}]] } + + it "creates and starts the networks with one managed manually and one NetworkManager controlled" do + cap.configure_networks(machine, [network_1, network_2]) + expect(comm.received_commands[0]).to match(/ifdown/) + expect(comm.received_commands[0]).to match(/mkdir.*\/etc\/net\/ifaces/) + expect(comm.received_commands[0]).to match(/ifup/) + expect(comm.received_commands[0]).to match(/NetworkManager/) + expect(comm.received_commands[0]).to_not match(/nmcli.*disconnect/) + end + end + end + end + + context "without NetworkManager installed" do + before do + allow(cap).to receive(:nmcli?).and_return false + end + + context "with nm_controlled option omitted" do + + it "creates and starts the networks manually" do + cap.configure_networks(machine, [network_1, network_2]) + expect(comm.received_commands[0]).to match(/ifdown/) + expect(comm.received_commands[0]).to match(/mkdir.*\/etc\/net\/ifaces/) + expect(comm.received_commands[0]).to match(/ifup/) + expect(comm.received_commands[0]).to_not match(/nmcli/) + expect(comm.received_commands[0]).to_not match(/NetworkManager/) + end + end + + context "with nm_controlled option omitted" do + let(:networks){ [[{nm_controlled: false}], [{nm_controlled: false}]] } + + it "creates and starts the networks manually" do + cap.configure_networks(machine, [network_1, network_2]) + expect(comm.received_commands[0]).to match(/ifdown/) + expect(comm.received_commands[0]).to match(/mkdir.*\/etc\/net\/ifaces/) + expect(comm.received_commands[0]).to match(/ifup/) + expect(comm.received_commands[0]).to_not match(/nmcli/) + expect(comm.received_commands[0]).to_not match(/NetworkManager/) + end + end + + context "with nm_controlled option set" do + let(:networks){ [[{nm_controlled: false}], [{nm_controlled: true}]] } + + it "raises an error" do + expect{ cap.configure_networks(machine, [network_1, network_2]) }.to raise_error(Vagrant::Errors::NetworkManagerNotInstalled) + end + end + end + end +end diff --git a/test/unit/plugins/guests/alt/cap/flavor_test.rb b/test/unit/plugins/guests/alt/cap/flavor_test.rb new file mode 100644 index 000000000..d7dacd728 --- /dev/null +++ b/test/unit/plugins/guests/alt/cap/flavor_test.rb @@ -0,0 +1,43 @@ +require_relative "../../../../base" + +describe "VagrantPlugins::GuestALT::Cap::Flavor" do + let(:caps) do + VagrantPlugins::GuestALT::Plugin + .components + .guest_capabilities[:alt] + end + + let(:machine) { double("machine") } + let(:comm) { VagrantTests::DummyCommunicator::Communicator.new(machine) } + + before do + allow(machine).to receive(:communicate).and_return(comm) + end + + after do + comm.verify_expectations! + end + + describe ".flavor" do + let(:cap) { caps.get(:flavor) } + + { + "ALT Education 8.1" => :alt, + "ALT Workstation 8.1" => :alt, + "ALT Workstation K 8.1 (Centaurea Ruthenica)" => :alt, + "ALT Linux p8 (Hypericum)" => :alt, + "ALT Sisyphus (unstable) (sisyphus)" => :alt, + + "ALT Linux 6.0.1 Spt (separator)" => :alt, + "ALT Linux 7.0.5 School Master" => :alt, + "ALT starter kit (Hypericum)" => :alt, + + "ALT" => :alt, + }.each do |str, expected| + it "returns #{expected} for #{str}" do + comm.stub_command("cat /etc/altlinux-release", stdout: str) + expect(cap.flavor(machine)).to be(expected) + end + end + end +end diff --git a/test/unit/plugins/guests/alt/cap/network_scripts_dir_test.rb b/test/unit/plugins/guests/alt/cap/network_scripts_dir_test.rb new file mode 100644 index 000000000..4aac58069 --- /dev/null +++ b/test/unit/plugins/guests/alt/cap/network_scripts_dir_test.rb @@ -0,0 +1,21 @@ +require_relative "../../../../base" + +describe "VagrantPlugins::GuestALT::Cap::NetworkScriptsDir" do + let(:caps) do + VagrantPlugins::GuestALT::Plugin + .components + .guest_capabilities[:alt] + end + + let(:machine) { double("machine") } + + describe ".network_scripts_dir" do + let(:cap) { caps.get(:network_scripts_dir) } + + let(:name) { "banana-rama.example.com" } + + it "is /etc/net" do + expect(cap.network_scripts_dir(machine)).to eq("/etc/net") + end + end +end diff --git a/test/unit/plugins/guests/alt/cap/rsync_test.rb b/test/unit/plugins/guests/alt/cap/rsync_test.rb new file mode 100644 index 000000000..126db9963 --- /dev/null +++ b/test/unit/plugins/guests/alt/cap/rsync_test.rb @@ -0,0 +1,29 @@ +require_relative "../../../../base" + +describe "VagrantPlugins::GuestALT::Cap:RSync" do + let(:caps) do + VagrantPlugins::GuestALT::Plugin + .components + .guest_capabilities[:alt] + end + + let(:machine) { double("machine") } + let(:comm) { VagrantTests::DummyCommunicator::Communicator.new(machine) } + + before do + allow(machine).to receive(:communicate).and_return(comm) + end + + after do + comm.verify_expectations! + end + + describe ".rsync_install" do + let(:cap) { caps.get(:rsync_install) } + + it "installs rsync" do + cap.rsync_install(machine) + expect(comm.received_commands[0]).to match(/install rsync/) + end + end +end