From a444f5148d22d4b2986515f58d47838b6a30914c Mon Sep 17 00:00:00 2001 From: Andrei Toterman Date: Thu, 23 Jan 2025 17:21:03 +0100 Subject: [PATCH 01/12] [tests] Make and use stub az classes --- tests/mock_virtual_machine_factory.h | 8 ++++++-- tests/stub_availability_zone.h | 6 ++++++ tests/stub_virtual_machine.h | 2 +- tests/stub_virtual_machine_factory.h | 3 ++- tests/test_alias_dict.cpp | 3 +++ tests/test_base_snapshot.cpp | 4 +++- tests/test_base_virtual_machine.cpp | 1 + tests/test_daemon_authenticate.cpp | 3 +++ tests/test_daemon_find.cpp | 3 +++ tests/test_daemon_snapshot_restore.cpp | 6 +++++- tests/test_daemon_start.cpp | 17 +++++++++++------ tests/test_daemon_suspend.cpp | 6 +++++- tests/test_daemon_umount.cpp | 12 ++++++++---- tests/test_delayed_shutdown.cpp | 5 +++-- tests/test_instance_settings_handler.cpp | 4 +++- tests/unix/test_daemon_rpc.cpp | 2 ++ 16 files changed, 65 insertions(+), 20 deletions(-) diff --git a/tests/mock_virtual_machine_factory.h b/tests/mock_virtual_machine_factory.h index 974fdb58445..99cd14d4db5 100644 --- a/tests/mock_virtual_machine_factory.h +++ b/tests/mock_virtual_machine_factory.h @@ -32,7 +32,10 @@ struct MockVirtualMachineFactory : public VirtualMachineFactory { MOCK_METHOD(VirtualMachine::UPtr, create_virtual_machine, - (const VirtualMachineDescription&, const SSHKeyProvider&, VMStatusMonitor&), + (const VirtualMachineDescription&, + const SSHKeyProvider&, + VMStatusMonitor&, + AvailabilityZoneManager& az_manager), (override)); MOCK_METHOD(VirtualMachine::UPtr, clone_bare_vm, @@ -42,7 +45,8 @@ struct MockVirtualMachineFactory : public VirtualMachineFactory const std::string&, const VMImage&, const SSHKeyProvider&, - VMStatusMonitor&), + VMStatusMonitor&, + AvailabilityZoneManager& az_manager), (override)); MOCK_METHOD(void, remove_resources_for, (const std::string&), (override)); diff --git a/tests/stub_availability_zone.h b/tests/stub_availability_zone.h index d779d1c8f3e..4aedac1bd81 100644 --- a/tests/stub_availability_zone.h +++ b/tests/stub_availability_zone.h @@ -26,6 +26,12 @@ namespace test { struct StubAvailabilityZone final : public AvailabilityZone { + static AvailabilityZone& instance() + { + static StubAvailabilityZone zone{}; + return zone; + } + StubAvailabilityZone() { } diff --git a/tests/stub_virtual_machine.h b/tests/stub_virtual_machine.h index b538a125f2b..777df8e19f0 100644 --- a/tests/stub_virtual_machine.h +++ b/tests/stub_virtual_machine.h @@ -40,7 +40,7 @@ struct StubVirtualMachine final : public multipass::VirtualMachine } StubVirtualMachine(const std::string& name, std::unique_ptr tmp_dir) - : VirtualMachine{name, tmp_dir->path()}, tmp_dir{std::move(tmp_dir)} + : VirtualMachine{name, StubAvailabilityZone::instance(), tmp_dir->path()}, tmp_dir{std::move(tmp_dir)} { } diff --git a/tests/stub_virtual_machine_factory.h b/tests/stub_virtual_machine_factory.h index 7e546bb4b50..3a12ab8d3e6 100644 --- a/tests/stub_virtual_machine_factory.h +++ b/tests/stub_virtual_machine_factory.h @@ -42,7 +42,8 @@ struct StubVirtualMachineFactory : public multipass::BaseVirtualMachineFactory VirtualMachine::UPtr create_virtual_machine(const VirtualMachineDescription&, const SSHKeyProvider&, - VMStatusMonitor&) override + VMStatusMonitor&, + AvailabilityZoneManager& az_manager) override { return std::make_unique(); } diff --git a/tests/test_alias_dict.cpp b/tests/test_alias_dict.cpp index 8d1f96ffca1..9cd79d82f82 100644 --- a/tests/test_alias_dict.cpp +++ b/tests/test_alias_dict.cpp @@ -34,6 +34,7 @@ #include "mock_settings.h" #include "mock_utils.h" #include "mock_vm_image_vault.h" +#include "stub_availability_zone_manager.h" #include "stub_terminal.h" #include "src/daemon/daemon.h" @@ -624,6 +625,8 @@ struct DaemonAliasTestsuite EXPECT_CALL(mock_settings, register_handler).WillRepeatedly(Return(nullptr)); EXPECT_CALL(mock_settings, unregister_handler).Times(AnyNumber()); EXPECT_CALL(mock_settings, get(Eq(mp::winterm_key))).WillRepeatedly(Return("none")); + + config_builder.az_manager = std::make_unique(); } mpt::MockSettings::GuardedMock mock_settings_injection = diff --git a/tests/test_base_snapshot.cpp b/tests/test_base_snapshot.cpp index 6eb972360ba..8424a6b0f70 100644 --- a/tests/test_base_snapshot.cpp +++ b/tests/test_base_snapshot.cpp @@ -22,6 +22,7 @@ #include "mock_json_utils.h" #include "mock_virtual_machine.h" #include "path.h" +#include "stub_availability_zone.h" #include #include @@ -138,7 +139,8 @@ struct TestBaseSnapshot : public Test static constexpr auto* test_json_filename = "test_snapshot.json"; mp::VMSpecs specs = stub_specs(); mp::VirtualMachineDescription desc = stub_desc(); - NiceMock vm{"a-vm"}; + mpt::StubAvailabilityZone zone{}; + NiceMock vm{"a-vm", zone}; const mpt::MockCloudInitFileOps::GuardedMock mock_cloud_init_file_ops_injection = mpt::MockCloudInitFileOps::inject(); const mpt::MockJsonUtils::GuardedMock mock_json_utils_injection = diff --git a/tests/test_base_virtual_machine.cpp b/tests/test_base_virtual_machine.cpp index 6d3136a68ab..db896e078de 100644 --- a/tests/test_base_virtual_machine.cpp +++ b/tests/test_base_virtual_machine.cpp @@ -258,6 +258,7 @@ struct BaseVM : public Test mpt::MockSSHTestFixture mock_ssh_test_fixture; const mpt::DummyKeyProvider key_provider{"keeper of the seven keys"}; NiceMock vm{"mock-vm", key_provider, zone}; + mpt::StubAvailabilityZone zone{}; std::vector> snapshot_album; QString head_path = vm.tmp_dir->filePath(head_filename); QString count_path = vm.tmp_dir->filePath(count_filename); diff --git a/tests/test_daemon_authenticate.cpp b/tests/test_daemon_authenticate.cpp index c2623bfd575..c3aebe91e45 100644 --- a/tests/test_daemon_authenticate.cpp +++ b/tests/test_daemon_authenticate.cpp @@ -22,6 +22,7 @@ #include "mock_server_reader_writer.h" #include "mock_settings.h" #include "mock_utils.h" +#include "stub_availability_zone_manager.h" #include @@ -42,6 +43,8 @@ struct TestDaemonAuthenticate : public mpt::DaemonTestFixture { EXPECT_CALL(mock_settings, register_handler(_)).WillRepeatedly(Return(nullptr)); EXPECT_CALL(mock_settings, unregister_handler).Times(AnyNumber()); + + config_builder.az_manager = std::make_unique(); } mpt::MockUtils::GuardedMock utils_attr{mpt::MockUtils::inject()}; diff --git a/tests/test_daemon_find.cpp b/tests/test_daemon_find.cpp index e963fb3e1c7..08bd109d92f 100644 --- a/tests/test_daemon_find.cpp +++ b/tests/test_daemon_find.cpp @@ -24,6 +24,7 @@ #include "mock_settings.h" #include "mock_utils.h" #include "mock_vm_image_vault.h" +#include "stub_availability_zone_manager.h" #include @@ -43,6 +44,8 @@ struct DaemonFind : public mpt::DaemonTestFixture EXPECT_CALL(mock_settings, unregister_handler).Times(AnyNumber()); EXPECT_CALL(mock_settings, get(Eq(mp::winterm_key))).WillRepeatedly(Return("none")); ON_CALL(mock_utils, contents_of(_)).WillByDefault(Return(mpt::root_cert)); + + config_builder.az_manager = std::make_unique(); } mpt::MockPlatform::GuardedMock attr{mpt::MockPlatform::inject()}; diff --git a/tests/test_daemon_snapshot_restore.cpp b/tests/test_daemon_snapshot_restore.cpp index 0e176c7e826..da8c1146de0 100644 --- a/tests/test_daemon_snapshot_restore.cpp +++ b/tests/test_daemon_snapshot_restore.cpp @@ -25,6 +25,8 @@ #include "mock_virtual_machine.h" #include "mock_vm_image_vault.h" #include "multipass/exceptions/snapshot_exceptions.h" +#include "stub_availability_zone.h" +#include "stub_availability_zone_manager.h" #include @@ -42,6 +44,7 @@ struct TestDaemonSnapshotRestoreBase : public mpt::DaemonTestFixture EXPECT_CALL(mock_settings, register_handler).WillRepeatedly(Return(nullptr)); EXPECT_CALL(mock_settings, unregister_handler).Times(AnyNumber()); config_builder.vault = std::make_unique>(); + config_builder.az_manager = std::make_unique(); } auto build_daemon_with_mock_instance() @@ -49,7 +52,7 @@ struct TestDaemonSnapshotRestoreBase : public mpt::DaemonTestFixture const auto [temp_dir, filename] = plant_instance_json(fake_json_contents(mac_addr, extra_interfaces)); - auto instance_ptr = std::make_unique>(mock_instance_name); + auto instance_ptr = std::make_unique>(mock_instance_name, zone); auto* ret_instance = instance_ptr.get(); EXPECT_CALL(*instance_ptr, current_state) @@ -78,6 +81,7 @@ struct TestDaemonSnapshotRestoreBase : public mpt::DaemonTestFixture std::vector extra_interfaces; const std::string mac_addr{"52:54:00:73:76:28"}; const std::string mock_instance_name{"real-zebraphant"}; + mpt::StubAvailabilityZone zone{}; }; struct TestDaemonSnapshot : public TestDaemonSnapshotRestoreBase diff --git a/tests/test_daemon_start.cpp b/tests/test_daemon_start.cpp index e2faec58ab4..eacce4a9704 100644 --- a/tests/test_daemon_start.cpp +++ b/tests/test_daemon_start.cpp @@ -27,6 +27,8 @@ #include "mock_settings.h" #include "mock_virtual_machine.h" #include "mock_vm_image_vault.h" +#include "stub_availability_zone.h" +#include "stub_availability_zone_manager.h" #include @@ -44,6 +46,8 @@ struct TestDaemonStart : public mpt::DaemonTestFixture EXPECT_CALL(mock_settings, register_handler).WillRepeatedly(Return(nullptr)); EXPECT_CALL(mock_settings, unregister_handler).Times(AnyNumber()); EXPECT_CALL(mock_settings, get(Eq(mp::mounts_key))).WillRepeatedly(Return("true")); + + config_builder.az_manager = std::make_unique(); } const std::string mock_instance_name{"real-zebraphant"}; @@ -60,6 +64,7 @@ struct TestDaemonStart : public mpt::DaemonTestFixture const mpt::MockPermissionUtils::GuardedMock mock_permission_utils_injection = mpt::MockPermissionUtils::inject(); mpt::MockPermissionUtils& mock_permission_utils = *mock_permission_utils_injection.first; + mpt::StubAvailabilityZone zone{}; }; TEST_F(TestDaemonStart, successfulStartOkStatus) @@ -68,7 +73,7 @@ TEST_F(TestDaemonStart, successfulStartOkStatus) const auto [temp_dir, filename] = plant_instance_json(fake_json_contents(mac_addr, extra_interfaces)); - auto instance_ptr = std::make_unique>(mock_instance_name); + auto instance_ptr = std::make_unique>(mock_instance_name, zone); EXPECT_CALL(*mock_factory, create_virtual_machine).WillOnce([&instance_ptr](auto&&...) { return std::move(instance_ptr); }); @@ -104,7 +109,7 @@ TEST_F(TestDaemonStart, exitlessSshProcessExceptionDoesNotShowMessage) const auto [temp_dir, filename] = plant_instance_json(fake_json_contents(mac_addr, extra_interfaces)); - auto instance_ptr = std::make_unique>(mock_instance_name); + auto instance_ptr = std::make_unique>(mock_instance_name, zone); EXPECT_CALL(*mock_factory, create_virtual_machine).WillOnce([&instance_ptr](auto&&...) { return std::move(instance_ptr); }); @@ -140,7 +145,7 @@ TEST_F(TestDaemonStart, unknownStateDoesNotStart) const auto [temp_dir, filename] = plant_instance_json(fake_json_contents(mac_addr, extra_interfaces)); - auto instance_ptr = std::make_unique>(mock_instance_name); + auto instance_ptr = std::make_unique>(mock_instance_name, zone); EXPECT_CALL(*mock_factory, create_virtual_machine).WillOnce([&instance_ptr](auto&&...) { return std::move(instance_ptr); }); @@ -171,7 +176,7 @@ TEST_F(TestDaemonStart, suspendingStateDoesNotStartHasError) const auto [temp_dir, filename] = plant_instance_json(fake_json_contents(mac_addr, extra_interfaces)); - auto instance_ptr = std::make_unique>(mock_instance_name); + auto instance_ptr = std::make_unique>(mock_instance_name, zone); EXPECT_CALL(*mock_factory, create_virtual_machine).WillOnce([&instance_ptr](auto&&...) { return std::move(instance_ptr); }); @@ -217,7 +222,7 @@ TEST_F(TestDaemonStart, definedMountsInitializedDuringStart) auto mock_mount_handler = std::make_unique(); EXPECT_CALL(*mock_mount_handler, activate_impl).Times(1); - auto mock_vm = std::make_unique>(mock_instance_name); + auto mock_vm = std::make_unique>(mock_instance_name, zone); EXPECT_CALL(*mock_vm, wait_until_ssh_up).WillRepeatedly(Return()); EXPECT_CALL(*mock_vm, current_state).WillRepeatedly(Return(mp::VirtualMachine::State::off)); EXPECT_CALL(*mock_vm, start).Times(1); @@ -260,7 +265,7 @@ TEST_F(TestDaemonStart, removingMountOnFailedStart) auto mock_mount_handler = std::make_unique(); EXPECT_CALL(*mock_mount_handler, activate_impl).WillOnce(Throw(std::runtime_error{error})); - auto mock_vm = std::make_unique>(mock_instance_name); + auto mock_vm = std::make_unique>(mock_instance_name, zone); EXPECT_CALL(*mock_vm, wait_until_ssh_up).WillRepeatedly(Return()); EXPECT_CALL(*mock_vm, current_state).WillRepeatedly(Return(mp::VirtualMachine::State::off)); EXPECT_CALL(*mock_vm, start).Times(1); diff --git a/tests/test_daemon_suspend.cpp b/tests/test_daemon_suspend.cpp index 2ea248ce92e..fe321623b87 100644 --- a/tests/test_daemon_suspend.cpp +++ b/tests/test_daemon_suspend.cpp @@ -24,6 +24,8 @@ #include "mock_settings.h" #include "mock_virtual_machine.h" #include "mock_vm_image_vault.h" +#include "stub_availability_zone.h" +#include "stub_availability_zone_manager.h" #include @@ -42,6 +44,7 @@ struct TestDaemonSuspend : public mpt::DaemonTestFixture EXPECT_CALL(mock_settings, unregister_handler).Times(AnyNumber()); config_builder.vault = std::make_unique>(); + config_builder.az_manager = std::make_unique(); } const std::string mock_instance_name{"real-zebraphant"}; @@ -59,6 +62,7 @@ struct TestDaemonSuspend : public mpt::DaemonTestFixture const mpt::MockPermissionUtils::GuardedMock mock_permission_utils_injection = mpt::MockPermissionUtils::inject(); mpt::MockPermissionUtils& mock_permission_utils = *mock_permission_utils_injection.first; + mpt::StubAvailabilityZone zone{}; }; } // namespace @@ -76,7 +80,7 @@ TEST_F(TestDaemonSuspend, suspendStopsMounts) EXPECT_CALL(*mock_mount_handler, is_active).WillOnce(Return(true)); EXPECT_CALL(*mock_mount_handler, deactivate_impl); - auto mock_vm = std::make_unique>(mock_instance_name); + auto mock_vm = std::make_unique>(mock_instance_name, zone); EXPECT_CALL(*mock_vm, make_native_mount_handler(fake_target_path, _)) .WillOnce(Return(std::move(mock_mount_handler))); diff --git a/tests/test_daemon_umount.cpp b/tests/test_daemon_umount.cpp index dbc7607aee9..da3c80e2e41 100644 --- a/tests/test_daemon_umount.cpp +++ b/tests/test_daemon_umount.cpp @@ -25,6 +25,8 @@ #include "mock_settings.h" #include "mock_virtual_machine.h" #include "mock_vm_image_vault.h" +#include "stub_availability_zone.h" +#include "stub_availability_zone_manager.h" namespace mp = multipass; namespace mpt = multipass::test; @@ -41,6 +43,7 @@ struct TestDaemonUmount : public mpt::DaemonTestFixture EXPECT_CALL(mock_settings, unregister_handler).Times(AnyNumber()); config_builder.vault = std::make_unique>(); + config_builder.az_manager = std::make_unique(); mock_factory = use_a_mock_vm_factory(); } @@ -62,6 +65,7 @@ struct TestDaemonUmount : public mpt::DaemonTestFixture const mpt::MockPermissionUtils::GuardedMock mock_permission_utils_injection = mpt::MockPermissionUtils::inject(); mpt::MockPermissionUtils& mock_permission_utils = *mock_permission_utils_injection.first; + mpt::StubAvailabilityZone zone{}; }; } // namespace @@ -102,7 +106,7 @@ TEST_F(TestDaemonUmount, noTargetsUnmountsAll) EXPECT_CALL(*mock_mount_handler, deactivate_impl(false)); EXPECT_CALL(*mock_mount_handler2, deactivate_impl(false)); - auto mock_vm = std::make_unique>(mock_instance_name); + auto mock_vm = std::make_unique>(mock_instance_name, zone); EXPECT_CALL(*mock_vm, make_native_mount_handler(fake_target_path, _)) .WillOnce(Return(std::move(mock_mount_handler))); EXPECT_CALL(*mock_vm, make_native_mount_handler(fake_target_path + "2", _)) @@ -146,7 +150,7 @@ TEST_F(TestDaemonUmount, umountWithTargetOnlyStopsItsHandlers) EXPECT_CALL(*mock_mount_handler2, deactivate_impl(false)).Times(0); EXPECT_CALL(*mock_mount_handler3, deactivate_impl(false)); - auto mock_vm = std::make_unique>(mock_instance_name); + auto mock_vm = std::make_unique>(mock_instance_name, zone); EXPECT_CALL(*mock_vm, make_native_mount_handler(fake_target_path, _)) .WillOnce(Return(std::move(mock_mount_handler))); EXPECT_CALL(*mock_vm, make_native_mount_handler(fake_target_path + "2", _)) @@ -182,7 +186,7 @@ TEST_F(TestDaemonUmount, mountNotFound) config_builder.data_directory = temp_dir->path(); EXPECT_CALL(*mock_factory, create_virtual_machine) - .WillOnce(Return(std::make_unique>(mock_instance_name))); + .WillOnce(Return(std::make_unique>(mock_instance_name, zone))); mp::Daemon daemon{config_builder.build()}; @@ -219,7 +223,7 @@ TEST_F(TestDaemonUmount, stoppingMountFails) EXPECT_CALL(*mock_mount_handler, deactivate_impl(false)) .WillOnce(Throw(std::runtime_error{error})); - auto mock_vm = std::make_unique>(mock_instance_name); + auto mock_vm = std::make_unique>(mock_instance_name, zone); EXPECT_CALL(*mock_vm, make_native_mount_handler(fake_target_path, _)) .WillOnce(Return(std::move(mock_mount_handler))); diff --git a/tests/test_delayed_shutdown.cpp b/tests/test_delayed_shutdown.cpp index ca2359b38d1..972f5d29aea 100644 --- a/tests/test_delayed_shutdown.cpp +++ b/tests/test_delayed_shutdown.cpp @@ -45,6 +45,7 @@ struct DelayedShutdown : public Test mp::VirtualMachine::UPtr vm; QEventLoop loop; ssh_channel_callbacks callbacks{nullptr}; + mpt::StubAvailabilityZone zone{}; }; TEST_F(DelayedShutdown, emitsFinishedAfterTimerExpires) @@ -73,7 +74,7 @@ TEST_F(DelayedShutdown, wallsImpendingShutdown) static const auto upcoming_cmd_matcher = AllOf(HasSubstr("wall"), HasSubstr(msg_upcoming)); static const auto now_cmd_matcher = AllOf(HasSubstr("wall"), HasSubstr(msg_now)); - mpt::MockVirtualMachine vm{mp::VirtualMachine::State::running, "mock"}; + mpt::MockVirtualMachine vm{mp::VirtualMachine::State::running, "mock", zone}; mp::DelayedShutdownTimer delayed_shutdown_timer{&vm, [](const std::string&) {}}; EXPECT_CALL(vm, ssh_exec(upcoming_cmd_matcher, _)).Times(1); // as we start @@ -89,7 +90,7 @@ TEST_F(DelayedShutdown, wallsImpendingShutdown) TEST_F(DelayedShutdown, handlesExceptionWhenAttemptingToWall) { - mpt::MockVirtualMachine vm{mp::VirtualMachine::State::running, "mock"}; + mpt::MockVirtualMachine vm{mp::VirtualMachine::State::running, "mock", zone}; mp::DelayedShutdownTimer delayed_shutdown_timer{&vm, [](const std::string&) {}}; EXPECT_CALL(vm, ssh_exec(HasSubstr("wall"), _)) diff --git a/tests/test_instance_settings_handler.cpp b/tests/test_instance_settings_handler.cpp index 42d2d9aa43c..4741ae965c3 100644 --- a/tests/test_instance_settings_handler.cpp +++ b/tests/test_instance_settings_handler.cpp @@ -17,6 +17,7 @@ #include "common.h" #include "mock_virtual_machine.h" +#include "stub_availability_zone.h" #include #include @@ -124,7 +125,8 @@ struct TestInstanceSettingsHandler : public Test template