diff --git a/src/daemon/daemon.cpp b/src/daemon/daemon.cpp index 31db2a571a..9d322861da 100644 --- a/src/daemon/daemon.cpp +++ b/src/daemon/daemon.cpp @@ -1927,6 +1927,9 @@ void mp::Daemon::create_vm(const CreateRequest* request, grpc::ServerWriterset_value(grpc::Status(grpc::StatusCode::FAILED_PRECONDITION, e.what(), "")); } diff --git a/tests/test_daemon.cpp b/tests/test_daemon.cpp index 40ca77d95c..d8f8a1a624 100644 --- a/tests/test_daemon.cpp +++ b/tests/test_daemon.cpp @@ -50,6 +50,7 @@ #include #include #include +#include #include namespace mp = multipass; @@ -127,7 +128,7 @@ class TestCreate final : public mp::cmd::Command create_error.ParseFromString(status.error_details()); const auto errors = create_error.error_codes(); - cerr << "fail: "; + cerr << "failed: " << status.error_message(); if (errors.size() == 1) { const auto& error = errors[0]; @@ -398,6 +399,21 @@ TEST_P(DaemonCreateLaunchTestSuite, on_creation_hooks_up_platform_prepare_instan send_command({GetParam()}); } +TEST_P(DaemonCreateLaunchTestSuite, on_creation_handles_instance_image_preparation_failure) +{ + auto mock_factory = use_a_mock_vm_factory(); + mp::Daemon daemon{config_builder.build()}; + + std::string cause = "motive"; + EXPECT_CALL(*mock_factory, prepare_instance_image(_, _)).WillOnce(Throw(std::runtime_error{cause})); + EXPECT_CALL(*mock_factory, remove_resources_for(_)); + + std::stringstream err_stream; + send_command({GetParam()}, trash_stream, err_stream); + + EXPECT_THAT(err_stream.str(), AllOf(HasSubstr("failed"), HasSubstr(cause))); +} + TEST_P(DaemonCreateLaunchTestSuite, generates_name_on_creation_when_client_does_not_provide_one) { const std::string expected_name{"pied-piper-valley"};