15
15
*
16
16
*/
17
17
18
+ #include " mock_environment_helpers.h"
18
19
#include " mock_settings.h"
19
20
#include " mock_stdcin.h"
20
21
#include " path.h"
35
36
#include < gmock/gmock.h>
36
37
#include < gtest/gtest.h>
37
38
39
+ #include < QtCore/QTemporaryDir>
38
40
#include < sstream>
39
41
40
42
namespace mp = multipass;
@@ -136,6 +138,20 @@ struct Client : public Test
136
138
return ret;
137
139
}
138
140
141
+ auto make_automount_matcher (const QTemporaryDir& fake_home) const
142
+ {
143
+ const auto automount_source_matcher =
144
+ Property (&mp::MountRequest::source_path, StrEq (fake_home.path ().toStdString ()));
145
+
146
+ const auto target_instance_matcher = Property (&mp::TargetPathInfo::instance_name, StrEq (petenv_name ()));
147
+ const auto target_path_matcher = Property (&mp::TargetPathInfo::target_path, StrEq (mp::home_automount_dir));
148
+ const auto target_info_matcher = AllOf (target_instance_matcher, target_path_matcher);
149
+ const auto automount_target_matcher =
150
+ Property (&mp::MountRequest::target_paths, AllOf (Contains (target_info_matcher), SizeIs (1 )));
151
+
152
+ return AllOf (automount_source_matcher, automount_target_matcher);
153
+ }
154
+
139
155
auto make_launch_instance_matcher (const std::string& instance_name)
140
156
{
141
157
return Property (&mp::LaunchRequest::instance_name, StrEq (instance_name));
@@ -349,6 +365,8 @@ TEST_F(Client, shell_cmd_launches_petenv_if_absent)
349
365
const auto petenv_launch_matcher = Property (&mp::LaunchRequest::instance_name, StrEq (petenv_name ()));
350
366
const grpc::Status ok{}, notfound{grpc::StatusCode::NOT_FOUND, " msg" };
351
367
368
+ EXPECT_CALL (mock_daemon, mount).WillRepeatedly (Return (ok)); // 0 or more times
369
+
352
370
InSequence seq;
353
371
EXPECT_CALL (mock_daemon, ssh_info (_, petenv_ssh_info_matcher, _)).WillOnce (Return (notfound));
354
372
EXPECT_CALL (mock_daemon, launch (_, petenv_launch_matcher, _)).WillOnce (Return (ok));
@@ -357,6 +375,31 @@ TEST_F(Client, shell_cmd_launches_petenv_if_absent)
357
375
EXPECT_THAT (send_command ({" shell" , petenv_name ()}), Eq (mp::ReturnCode::Ok));
358
376
}
359
377
378
+ TEST_F (Client, shell_cmd_automounts_when_launching_petenv)
379
+ {
380
+ const grpc::Status ok{}, notfound{grpc::StatusCode::NOT_FOUND, " msg" };
381
+
382
+ InSequence seq;
383
+ EXPECT_CALL (mock_daemon, ssh_info (_, _, _)).WillOnce (Return (notfound));
384
+ EXPECT_CALL (mock_daemon, launch (_, _, _)).WillOnce (Return (ok));
385
+ EXPECT_CALL (mock_daemon, mount (_, _, _)).WillOnce (Return (ok));
386
+ EXPECT_CALL (mock_daemon, ssh_info (_, _, _)).WillOnce (Return (ok));
387
+ EXPECT_THAT (send_command ({" shell" , petenv_name ()}), Eq (mp::ReturnCode::Ok));
388
+ }
389
+
390
+ TEST_F (Client, shell_cmd_fails_when_automounting_in_petenv_fails)
391
+ {
392
+ const auto ok = grpc::Status{};
393
+ const auto notfound = grpc::Status{grpc::StatusCode::NOT_FOUND, " msg" };
394
+ const auto mount_failure = grpc::Status{grpc::StatusCode::INVALID_ARGUMENT, " msg" };
395
+
396
+ InSequence seq;
397
+ EXPECT_CALL (mock_daemon, ssh_info (_, _, _)).WillOnce (Return (notfound));
398
+ EXPECT_CALL (mock_daemon, launch (_, _, _)).WillOnce (Return (ok));
399
+ EXPECT_CALL (mock_daemon, mount (_, _, _)).WillOnce (Return (mount_failure));
400
+ EXPECT_THAT (send_command ({" shell" , petenv_name ()}), Eq (mp::ReturnCode::CommandFail));
401
+ }
402
+
360
403
TEST_F (Client, shell_cmd_starts_instance_if_stopped_or_suspended)
361
404
{
362
405
const auto instance = " ordinary" ;
@@ -512,6 +555,39 @@ TEST_F(Client, launch_cmd_cloudinit_option_reads_stdin_ok)
512
555
EXPECT_THAT (send_command ({" launch" , " --cloud-init" , " -" }, trash_stream, trash_stream, ss), Eq (mp::ReturnCode::Ok));
513
556
}
514
557
558
+ #ifndef WIN32 // TODO make home mocking work for windows
559
+ TEST_F (Client, launch_cmd_automounts_home_in_petenv)
560
+ {
561
+ const auto fake_home = QTemporaryDir{}; // the client checks the mount source exists
562
+ const auto env_scope = mpt::SetEnvScope{" HOME" , fake_home.path ().toUtf8 ()};
563
+ const auto home_automount_matcher = make_automount_matcher (fake_home);
564
+ const auto petenv_launch_matcher = make_launch_instance_matcher (petenv_name ());
565
+ const auto ok = grpc::Status{};
566
+
567
+ InSequence seq;
568
+ EXPECT_CALL (mock_daemon, launch (_, petenv_launch_matcher, _)).WillOnce (Return (ok));
569
+ EXPECT_CALL (mock_daemon, mount (_, home_automount_matcher, _)).WillOnce (Return (ok));
570
+ EXPECT_THAT (send_command ({" launch" , " --name" , petenv_name ()}), Eq (mp::ReturnCode::Ok));
571
+ }
572
+ #endif
573
+
574
+ TEST_F (Client, launch_cmd_fails_when_automounting_in_petenv_fails)
575
+ {
576
+ const grpc::Status ok{}, mount_failure{grpc::StatusCode::INVALID_ARGUMENT, " msg" };
577
+
578
+ InSequence seq;
579
+ EXPECT_CALL (mock_daemon, launch (_, _, _)).WillOnce (Return (ok));
580
+ EXPECT_CALL (mock_daemon, mount (_, _, _)).WillOnce (Return (mount_failure));
581
+ EXPECT_THAT (send_command ({" launch" , " --name" , petenv_name ()}), Eq (mp::ReturnCode::CommandFail));
582
+ }
583
+
584
+ TEST_F (Client, launch_cmd_does_not_automount_in_normal_instances)
585
+ {
586
+ EXPECT_CALL (mock_daemon, launch (_, _, _));
587
+ EXPECT_CALL (mock_daemon, mount (_, _, _)).Times (0 ); // because we may want to move from a Strict mock in the future
588
+ EXPECT_THAT (send_command ({" launch" }), Eq (mp::ReturnCode::Ok));
589
+ }
590
+
515
591
// purge cli tests
516
592
TEST_F (Client, purge_cmd_ok_no_args)
517
593
{
@@ -845,13 +921,40 @@ TEST_F(Client, start_cmd_launches_petenv_if_absent)
845
921
const auto petenv_launch_matcher = make_launch_instance_matcher (petenv_name ());
846
922
const grpc::Status ok{}, aborted = aborted_start_status ({petenv_name ()});
847
923
924
+ EXPECT_CALL (mock_daemon, mount).WillRepeatedly (Return (ok)); // 0 or more times
925
+
848
926
InSequence seq;
849
927
EXPECT_CALL (mock_daemon, start (_, petenv_start_matcher, _)).WillOnce (Return (aborted));
850
928
EXPECT_CALL (mock_daemon, launch (_, petenv_launch_matcher, _)).WillOnce (Return (ok));
851
929
EXPECT_CALL (mock_daemon, start (_, petenv_start_matcher, _)).WillOnce (Return (ok));
852
930
EXPECT_THAT (send_command ({" start" , petenv_name ()}), Eq (mp::ReturnCode::Ok));
853
931
}
854
932
933
+ TEST_F (Client, start_cmd_automounts_when_launching_petenv)
934
+ {
935
+ const grpc::Status ok{}, aborted = aborted_start_status ({petenv_name ()});
936
+
937
+ InSequence seq;
938
+ EXPECT_CALL (mock_daemon, start (_, _, _)).WillOnce (Return (aborted));
939
+ EXPECT_CALL (mock_daemon, launch (_, _, _)).WillOnce (Return (ok));
940
+ EXPECT_CALL (mock_daemon, mount (_, _, _)).WillOnce (Return (ok));
941
+ EXPECT_CALL (mock_daemon, start (_, _, _)).WillOnce (Return (ok));
942
+ EXPECT_THAT (send_command ({" start" , petenv_name ()}), Eq (mp::ReturnCode::Ok));
943
+ }
944
+
945
+ TEST_F (Client, start_cmd_fails_when_automounting_in_petenv_fails)
946
+ {
947
+ const auto ok = grpc::Status{};
948
+ const auto aborted = aborted_start_status ({petenv_name ()});
949
+ const auto mount_failure = grpc::Status{grpc::StatusCode::INVALID_ARGUMENT, " msg" };
950
+
951
+ InSequence seq;
952
+ EXPECT_CALL (mock_daemon, start (_, _, _)).WillOnce (Return (aborted));
953
+ EXPECT_CALL (mock_daemon, launch (_, _, _)).WillOnce (Return (ok));
954
+ EXPECT_CALL (mock_daemon, mount (_, _, _)).WillOnce (Return (mount_failure));
955
+ EXPECT_THAT (send_command ({" start" , petenv_name ()}), Eq (mp::ReturnCode::CommandFail));
956
+ }
957
+
855
958
TEST_F (Client, start_cmd_launches_petenv_if_absent_among_others_present)
856
959
{
857
960
std::vector<std::string> instances{" a" , " b" , petenv_name (), " c" }, cmd = concat ({" start" }, instances);
@@ -860,6 +963,8 @@ TEST_F(Client, start_cmd_launches_petenv_if_absent_among_others_present)
860
963
const auto petenv_launch_matcher = make_launch_instance_matcher (petenv_name ());
861
964
const grpc::Status ok{}, aborted = aborted_start_status ({petenv_name ()});
862
965
966
+ EXPECT_CALL (mock_daemon, mount).WillRepeatedly (Return (ok)); // 0 or more times
967
+
863
968
InSequence seq;
864
969
EXPECT_CALL (mock_daemon, start (_, instance_start_matcher, _)).WillOnce (Return (aborted));
865
970
EXPECT_CALL (mock_daemon, launch (_, petenv_launch_matcher, _)).WillOnce (Return (ok));
0 commit comments