blob: 71845bbab1aa79decb23194ce1794c372a89a895 [file] [log] [blame]
Dylan Reid837c74a2016-01-22 17:25:21 -08001/* Copyright 2016 The Chromium OS Authors. All rights reserved.
2 * Use of this source code is governed by a BSD-style license that can be
3 * found in the LICENSE file.
4 */
5
Dylan Reid837c74a2016-01-22 17:25:21 -08006#include <errno.h>
7#include <signal.h>
8#include <sys/mount.h>
9#include <sys/stat.h>
10#include <sys/types.h>
11#include <unistd.h>
12
Luis Hector Chavez836d7b22017-09-14 15:11:15 -070013#include "libcontainer/test_harness.h"
Dylan Reid837c74a2016-01-22 17:25:21 -080014
Luis Hector Chavez836d7b22017-09-14 15:11:15 -070015#include "libcontainer/container_cgroup.h"
16#include "libcontainer/libcontainer.h"
Dylan Reid837c74a2016-01-22 17:25:21 -080017
18static const pid_t INIT_TEST_PID = 5555;
Chinyue Chen4f3fd682016-07-01 14:11:42 +080019static const int TEST_CPU_SHARES = 200;
20static const int TEST_CPU_QUOTA = 20000;
21static const int TEST_CPU_PERIOD = 50000;
Dylan Reid837c74a2016-01-22 17:25:21 -080022
23struct mount_args {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070024 char* source;
25 char* target;
26 char* filesystemtype;
27 unsigned long mountflags;
28 const void* data;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -070029 bool outside_mount;
Dylan Reid837c74a2016-01-22 17:25:21 -080030};
31static struct mount_args mount_call_args[5];
32static int mount_called;
33
34struct mknod_args {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070035 char* pathname;
36 mode_t mode;
37 dev_t dev;
Dylan Reid837c74a2016-01-22 17:25:21 -080038};
39static struct mknod_args mknod_call_args;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -070040static bool mknod_called;
Chinyue Chen03c54ae2016-06-29 12:29:10 +080041static dev_t stat_rdev_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -080042
43static int kill_called;
44static int kill_sig;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070045static const char* minijail_alt_syscall_table;
Dylan Reid837c74a2016-01-22 17:25:21 -080046static int minijail_ipc_called;
47static int minijail_vfs_called;
48static int minijail_net_called;
49static int minijail_pids_called;
50static int minijail_run_as_init_called;
51static int minijail_user_called;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -070052static int minijail_cgroups_called;
Dylan Reid837c74a2016-01-22 17:25:21 -080053static int minijail_wait_called;
54static int minijail_reset_signal_mask_called;
55static int mount_ret;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070056static char* mkdtemp_root;
Dylan Reid837c74a2016-01-22 17:25:21 -080057
58/* global mock cgroup. */
Dylan Reid355d5e42016-04-29 16:53:31 -070059#define MAX_ADD_DEVICE_CALLS 2
Dylan Reid837c74a2016-01-22 17:25:21 -080060struct mock_cgroup {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070061 struct container_cgroup cg;
62 int freeze_ret;
63 int thaw_ret;
64 int deny_all_devs_ret;
65 int add_device_ret;
66 int set_cpu_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -080067
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070068 int init_called_count;
69 int deny_all_devs_called_count;
Dylan Reid837c74a2016-01-22 17:25:21 -080070
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070071 int add_dev_allow[MAX_ADD_DEVICE_CALLS];
72 int add_dev_major[MAX_ADD_DEVICE_CALLS];
73 int add_dev_minor[MAX_ADD_DEVICE_CALLS];
74 int add_dev_read[MAX_ADD_DEVICE_CALLS];
75 int add_dev_write[MAX_ADD_DEVICE_CALLS];
76 int add_dev_modify[MAX_ADD_DEVICE_CALLS];
77 char add_dev_type[MAX_ADD_DEVICE_CALLS];
78 int add_dev_called_count;
Chinyue Chenfac909e2016-06-24 14:17:42 +080079
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070080 int set_cpu_shares_count;
81 int set_cpu_quota_count;
82 int set_cpu_period_count;
83 int set_cpu_rt_runtime_count;
84 int set_cpu_rt_period_count;
Dylan Reid837c74a2016-01-22 17:25:21 -080085};
86
87static struct mock_cgroup gmcg;
88
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070089static int mock_freeze(const struct container_cgroup* cg) {
90 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
91 return mcg->freeze_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -080092}
93
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070094static int mock_thaw(const struct container_cgroup* cg) {
95 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
96 return mcg->thaw_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -080097}
98
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070099static int mock_deny_all_devices(const struct container_cgroup* cg) {
100 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
101 ++mcg->deny_all_devs_called_count;
102 return mcg->deny_all_devs_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -0800103}
104
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700105static int mock_add_device(const struct container_cgroup* cg,
106 int allow,
107 int major,
108 int minor,
109 int read,
110 int write,
111 int modify,
112 char type) {
113 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
Dylan Reid355d5e42016-04-29 16:53:31 -0700114
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700115 if (mcg->add_dev_called_count >= MAX_ADD_DEVICE_CALLS)
116 return mcg->add_device_ret;
117 mcg->add_dev_allow[mcg->add_dev_called_count] = allow;
118 mcg->add_dev_major[mcg->add_dev_called_count] = major;
119 mcg->add_dev_minor[mcg->add_dev_called_count] = minor;
120 mcg->add_dev_read[mcg->add_dev_called_count] = read;
121 mcg->add_dev_write[mcg->add_dev_called_count] = write;
122 mcg->add_dev_modify[mcg->add_dev_called_count] = modify;
123 mcg->add_dev_type[mcg->add_dev_called_count] = type;
124 mcg->add_dev_called_count++;
125 return mcg->add_device_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -0800126}
127
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700128static int mock_set_cpu_shares(const struct container_cgroup* cg, int shares) {
129 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
130 mcg->set_cpu_shares_count++;
131 return mcg->set_cpu_ret;
Chinyue Chenfac909e2016-06-24 14:17:42 +0800132}
133
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700134static int mock_set_cpu_quota(const struct container_cgroup* cg, int quota) {
135 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
136 mcg->set_cpu_quota_count++;
137 return mcg->set_cpu_ret;
Chinyue Chenfac909e2016-06-24 14:17:42 +0800138}
139
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700140static int mock_set_cpu_period(const struct container_cgroup* cg, int period) {
141 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
142 mcg->set_cpu_period_count++;
143 return mcg->set_cpu_ret;
Chinyue Chenfac909e2016-06-24 14:17:42 +0800144}
145
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700146static int mock_set_cpu_rt_runtime(const struct container_cgroup* cg,
147 int rt_runtime) {
148 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
149 mcg->set_cpu_rt_runtime_count++;
150 return mcg->set_cpu_ret;
Chinyue Chenfac909e2016-06-24 14:17:42 +0800151}
152
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700153static int mock_set_cpu_rt_period(const struct container_cgroup* cg,
154 int rt_period) {
155 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
156 mcg->set_cpu_rt_period_count++;
157 return mcg->set_cpu_ret;
Chinyue Chenfac909e2016-06-24 14:17:42 +0800158}
159
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700160struct container_cgroup* container_cgroup_new(const char* name,
161 const char* cgroup_root,
162 const char* cgroup_parent,
163 uid_t uid,
164 gid_t gid) {
165 gmcg.cg.name = strdup(name);
166 return &gmcg.cg;
Dylan Reid837c74a2016-01-22 17:25:21 -0800167}
168
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700169void container_cgroup_destroy(struct container_cgroup* c) {
170 free(c->name);
Dylan Reid837c74a2016-01-22 17:25:21 -0800171}
172
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700173TEST(premounted_runfs) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700174 char premounted_runfs[] = "/tmp/cgtest_run/root";
175 struct container_config* config = container_config_create();
176 ASSERT_NE(nullptr, config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700177
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700178 container_config_premounted_runfs(config, premounted_runfs);
179 const char* result = container_config_get_premounted_runfs(config);
180 ASSERT_EQ(0, strcmp(result, premounted_runfs));
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700181
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700182 container_config_destroy(config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700183}
184
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700185TEST(pid_file_path) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700186 char pid_file_path[] = "/tmp/cgtest_run/root/container.pid";
187 struct container_config* config = container_config_create();
188 ASSERT_NE(nullptr, config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700189
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700190 container_config_pid_file(config, pid_file_path);
191 const char* result = container_config_get_pid_file(config);
192 ASSERT_EQ(0, strcmp(result, pid_file_path));
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700193
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700194 container_config_destroy(config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700195}
196
Dylan Reid837c74a2016-01-22 17:25:21 -0800197/* Start of tests. */
198FIXTURE(container_test) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700199 struct container_config* config;
200 struct container* container;
201 int mount_flags;
202 char* rootfs;
Dylan Reid837c74a2016-01-22 17:25:21 -0800203};
204
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700205FIXTURE_SETUP(container_test) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700206 char temp_template[] = "/tmp/cgtestXXXXXX";
207 char rundir_template[] = "/tmp/cgtest_runXXXXXX";
208 char* rundir;
209 char path[256];
210 const char* pargs[] = {
211 "/sbin/init",
212 };
Dylan Reid837c74a2016-01-22 17:25:21 -0800213
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700214 memset(&mount_call_args, 0, sizeof(mount_call_args));
215 mount_called = 0;
216 memset(&mknod_call_args, 0, sizeof(mknod_call_args));
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700217 mknod_called = false;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700218 mkdtemp_root = nullptr;
Dylan Reid837c74a2016-01-22 17:25:21 -0800219
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700220 memset(&gmcg, 0, sizeof(gmcg));
221 static const struct cgroup_ops cgops = {
222 .freeze = mock_freeze,
223 .thaw = mock_thaw,
224 .deny_all_devices = mock_deny_all_devices,
225 .add_device = mock_add_device,
226 .set_cpu_shares = mock_set_cpu_shares,
227 .set_cpu_quota = mock_set_cpu_quota,
228 .set_cpu_period = mock_set_cpu_period,
229 .set_cpu_rt_runtime = mock_set_cpu_rt_runtime,
230 .set_cpu_rt_period = mock_set_cpu_rt_period,
231 };
232 gmcg.cg.ops = &cgops;
Dylan Reid837c74a2016-01-22 17:25:21 -0800233
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700234 self->rootfs = strdup(mkdtemp(temp_template));
Dylan Reid837c74a2016-01-22 17:25:21 -0800235
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700236 kill_called = 0;
237 minijail_alt_syscall_table = nullptr;
238 minijail_ipc_called = 0;
239 minijail_vfs_called = 0;
240 minijail_net_called = 0;
241 minijail_pids_called = 0;
242 minijail_run_as_init_called = 0;
243 minijail_user_called = 0;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700244 minijail_cgroups_called = 0;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700245 minijail_wait_called = 0;
246 minijail_reset_signal_mask_called = 0;
247 mount_ret = 0;
248 stat_rdev_ret = makedev(2, 3);
Dylan Reid837c74a2016-01-22 17:25:21 -0800249
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700250 snprintf(path, sizeof(path), "%s/dev", self->rootfs);
Dylan Reid837c74a2016-01-22 17:25:21 -0800251
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700252 self->mount_flags = MS_NOSUID | MS_NODEV | MS_NOEXEC;
Dylan Reid837c74a2016-01-22 17:25:21 -0800253
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700254 self->config = container_config_create();
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700255 container_config_uid_map(self->config, "0 0 4294967295");
256 container_config_gid_map(self->config, "0 0 4294967295");
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700257 container_config_rootfs(self->config, self->rootfs);
258 container_config_program_argv(self->config, pargs, 1);
259 container_config_alt_syscall_table(self->config, "testsyscalltable");
260 container_config_add_mount(self->config,
261 "testtmpfs",
262 "tmpfs",
263 "/tmp",
264 "tmpfs",
265 nullptr,
266 nullptr,
267 self->mount_flags,
268 0,
269 1000,
270 1000,
271 0x666,
272 0,
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700273 0);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700274 container_config_add_device(self->config,
275 'c',
276 "/dev/foo",
277 S_IRWXU | S_IRWXG,
278 245,
279 2,
280 0,
281 1000,
282 1001,
283 1,
284 1,
285 0);
286 /* test dynamic minor on /dev/null */
287 container_config_add_device(self->config,
288 'c',
289 "/dev/null",
290 S_IRWXU | S_IRWXG,
291 1,
292 -1,
293 1,
294 1000,
295 1001,
296 1,
297 1,
298 0);
Dylan Reid837c74a2016-01-22 17:25:21 -0800299
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700300 container_config_set_cpu_shares(self->config, TEST_CPU_SHARES);
301 container_config_set_cpu_cfs_params(
302 self->config, TEST_CPU_QUOTA, TEST_CPU_PERIOD);
303 /* Invalid params, so this won't be applied. */
304 container_config_set_cpu_rt_params(self->config, 20000, 20000);
Chinyue Chenfac909e2016-06-24 14:17:42 +0800305
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700306 rundir = mkdtemp(rundir_template);
307 self->container = container_new("containerUT", rundir);
308 ASSERT_NE(nullptr, self->container);
Dylan Reid837c74a2016-01-22 17:25:21 -0800309}
310
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700311FIXTURE_TEARDOWN(container_test) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700312 char path[256];
313 int i;
Dylan Reid837c74a2016-01-22 17:25:21 -0800314
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700315 container_destroy(self->container);
316 snprintf(path, sizeof(path), "rm -rf %s", self->rootfs);
317 EXPECT_EQ(0, system(path));
318 free(self->rootfs);
Dylan Reid837c74a2016-01-22 17:25:21 -0800319
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700320 for (i = 0; i < mount_called; i++) {
321 free(mount_call_args[i].source);
322 free(mount_call_args[i].target);
323 free(mount_call_args[i].filesystemtype);
324 }
325 free(mknod_call_args.pathname);
326 free(mkdtemp_root);
Dylan Reid837c74a2016-01-22 17:25:21 -0800327}
328
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700329TEST_F(container_test, test_mount_tmp_start) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700330 char* path;
Dylan Reid837c74a2016-01-22 17:25:21 -0800331
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700332 ASSERT_EQ(0, container_start(self->container, self->config));
333 ASSERT_EQ(2, mount_called);
334 EXPECT_EQ(false, mount_call_args[1].outside_mount);
335 EXPECT_STREQ("tmpfs", mount_call_args[1].source);
336 EXPECT_STREQ("/tmp", mount_call_args[1].target);
337 EXPECT_STREQ("tmpfs", mount_call_args[1].filesystemtype);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700338 EXPECT_EQ(mount_call_args[1].mountflags,
339 static_cast<unsigned long>(self->mount_flags));
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700340 EXPECT_EQ(nullptr, mount_call_args[1].data);
Dylan Reid837c74a2016-01-22 17:25:21 -0800341
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700342 EXPECT_EQ(1, minijail_ipc_called);
343 EXPECT_EQ(1, minijail_vfs_called);
344 EXPECT_EQ(1, minijail_net_called);
345 EXPECT_EQ(1, minijail_pids_called);
346 EXPECT_EQ(1, minijail_user_called);
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700347 EXPECT_EQ(1, minijail_cgroups_called);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700348 EXPECT_EQ(1, minijail_run_as_init_called);
349 EXPECT_EQ(1, gmcg.deny_all_devs_called_count);
Dylan Reid837c74a2016-01-22 17:25:21 -0800350
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700351 ASSERT_EQ(2, gmcg.add_dev_called_count);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700352 EXPECT_EQ(1, gmcg.add_dev_allow[0]);
353 EXPECT_EQ(245, gmcg.add_dev_major[0]);
354 EXPECT_EQ(2, gmcg.add_dev_minor[0]);
355 EXPECT_EQ(1, gmcg.add_dev_read[0]);
356 EXPECT_EQ(1, gmcg.add_dev_write[0]);
357 EXPECT_EQ(0, gmcg.add_dev_modify[0]);
358 EXPECT_EQ('c', gmcg.add_dev_type[0]);
Dylan Reid355d5e42016-04-29 16:53:31 -0700359
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700360 EXPECT_EQ(1, gmcg.add_dev_allow[1]);
361 EXPECT_EQ(1, gmcg.add_dev_major[1]);
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700362 EXPECT_EQ(-1, gmcg.add_dev_minor[1]);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700363 EXPECT_EQ(1, gmcg.add_dev_read[1]);
364 EXPECT_EQ(1, gmcg.add_dev_write[1]);
365 EXPECT_EQ(0, gmcg.add_dev_modify[1]);
366 EXPECT_EQ('c', gmcg.add_dev_type[1]);
Dylan Reid837c74a2016-01-22 17:25:21 -0800367
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700368 ASSERT_EQ(true, mknod_called);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700369 EXPECT_LT(0, asprintf(&path, "%s/root/dev/null", mkdtemp_root));
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700370 EXPECT_STREQ(path, mknod_call_args.pathname);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700371 free(path);
372 EXPECT_EQ(mknod_call_args.mode,
373 static_cast<mode_t>(S_IRWXU | S_IRWXG | S_IFCHR));
374 EXPECT_EQ(mknod_call_args.dev, makedev(1, 3));
Chinyue Chen03c54ae2016-06-29 12:29:10 +0800375
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700376 EXPECT_EQ(1, gmcg.set_cpu_shares_count);
377 EXPECT_EQ(TEST_CPU_SHARES, container_config_get_cpu_shares(self->config));
378 EXPECT_EQ(1, gmcg.set_cpu_quota_count);
379 EXPECT_EQ(TEST_CPU_QUOTA, container_config_get_cpu_quota(self->config));
380 EXPECT_EQ(1, gmcg.set_cpu_period_count);
381 EXPECT_EQ(TEST_CPU_PERIOD, container_config_get_cpu_period(self->config));
382 EXPECT_EQ(0, gmcg.set_cpu_rt_runtime_count);
383 EXPECT_EQ(0, container_config_get_cpu_rt_runtime(self->config));
384 EXPECT_EQ(0, gmcg.set_cpu_rt_period_count);
385 EXPECT_EQ(0, container_config_get_cpu_rt_period(self->config));
Chinyue Chenfac909e2016-06-24 14:17:42 +0800386
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700387 ASSERT_NE(nullptr, minijail_alt_syscall_table);
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700388 EXPECT_STREQ("testsyscalltable", minijail_alt_syscall_table);
Dylan Reid837c74a2016-01-22 17:25:21 -0800389
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700390 EXPECT_EQ(0, container_wait(self->container));
391 EXPECT_EQ(1, minijail_wait_called);
392 EXPECT_EQ(1, minijail_reset_signal_mask_called);
Dylan Reid837c74a2016-01-22 17:25:21 -0800393}
394
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700395TEST_F(container_test, test_kill_container) {
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700396 ASSERT_EQ(0, container_start(self->container, self->config));
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700397 EXPECT_EQ(0, container_kill(self->container));
398 EXPECT_EQ(1, kill_called);
399 EXPECT_EQ(SIGKILL, kill_sig);
400 EXPECT_EQ(1, minijail_wait_called);
Dylan Reid837c74a2016-01-22 17:25:21 -0800401}
402
403/* libc stubs so the UT doesn't need root to call mount, etc. */
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700404extern "C" {
405
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700406int mount(const char* source,
407 const char* target,
408 const char* filesystemtype,
409 unsigned long mountflags,
410 const void* data) {
411 if (mount_called >= 5)
412 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800413
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700414 mount_call_args[mount_called].source = strdup(source);
415 mount_call_args[mount_called].target = strdup(target);
416 mount_call_args[mount_called].filesystemtype = strdup(filesystemtype);
417 mount_call_args[mount_called].mountflags = mountflags;
418 mount_call_args[mount_called].data = data;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700419 mount_call_args[mount_called].outside_mount = true;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700420 ++mount_called;
421 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800422}
423
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700424int umount(const char* target) {
425 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800426}
427
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700428int umount2(const char* target, int flags) {
429 return 0;
430}
431
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700432#ifdef __USE_EXTERN_INLINES
433/* Some environments use an inline version of mknod. */
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700434int __xmknod(int ver, const char* pathname, __mode_t mode, __dev_t* dev)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700435#else
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700436int mknod(const char* pathname, mode_t mode, dev_t dev)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700437#endif
Dylan Reid837c74a2016-01-22 17:25:21 -0800438{
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700439 mknod_call_args.pathname = strdup(pathname);
440 mknod_call_args.mode = mode;
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700441#ifdef __USE_EXTERN_INLINES
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700442 mknod_call_args.dev = *dev;
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700443#else
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700444 mknod_call_args.dev = dev;
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700445#endif
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700446 mknod_called = true;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700447 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800448}
449
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700450int chown(const char* path, uid_t owner, gid_t group) {
451 return 0;
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700452}
Dylan Reid837c74a2016-01-22 17:25:21 -0800453
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700454int kill(pid_t pid, int sig) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700455 ++kill_called;
456 kill_sig = sig;
457 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800458}
459
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700460#ifdef __USE_EXTERN_INLINES
461/* Some environments use an inline version of stat. */
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700462int __xstat(int ver, const char* path, struct stat* buf)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700463#else
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700464int stat(const char* path, struct stat* buf)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700465#endif
Dylan Reid837c74a2016-01-22 17:25:21 -0800466{
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700467 buf->st_rdev = stat_rdev_ret;
468 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800469}
470
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700471int chmod(const char* path, mode_t mode) {
472 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800473}
474
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700475char* mkdtemp(char* template_string) {
476 mkdtemp_root = strdup(template_string);
477 return template_string;
Dylan Reid837c74a2016-01-22 17:25:21 -0800478}
479
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700480int mkdir(const char* pathname, mode_t mode) {
481 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800482}
483
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700484int rmdir(const char* pathname) {
485 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800486}
487
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700488int unlink(const char* pathname) {
489 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800490}
491
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700492uid_t getuid(void) {
493 return 0;
494}
495
Dylan Reid837c74a2016-01-22 17:25:21 -0800496/* Minijail stubs */
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700497struct minijail* minijail_new(void) {
498 return (struct minijail*)0x55;
Chinyue Chen03c54ae2016-06-29 12:29:10 +0800499}
500
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700501void minijail_destroy(struct minijail* j) {}
502
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700503int minijail_mount_with_data(struct minijail* j,
504 const char* source,
505 const char* target,
506 const char* filesystemtype,
507 unsigned long mountflags,
508 const char* data) {
509 if (mount_called >= 5)
510 return 0;
511
512 mount_call_args[mount_called].source = strdup(source);
513 mount_call_args[mount_called].target = strdup(target);
514 mount_call_args[mount_called].filesystemtype = strdup(filesystemtype);
515 mount_call_args[mount_called].mountflags = mountflags;
516 mount_call_args[mount_called].data = data;
517 mount_call_args[mount_called].outside_mount = false;
518 ++mount_called;
519 return 0;
520}
521
522int minijail_namespace_user_disable_setgroups(struct minijail* j) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700523 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800524}
525
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700526void minijail_namespace_vfs(struct minijail* j) {
527 ++minijail_vfs_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800528}
529
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700530void minijail_namespace_ipc(struct minijail* j) {
531 ++minijail_ipc_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800532}
533
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700534void minijail_namespace_net(struct minijail* j) {
535 ++minijail_net_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800536}
537
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700538void minijail_namespace_pids(struct minijail* j) {
539 ++minijail_pids_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800540}
541
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700542void minijail_namespace_user(struct minijail* j) {
543 ++minijail_user_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800544}
545
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700546void minijail_namespace_cgroups(struct minijail* j) {
547 ++minijail_cgroups_called;
548}
549
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700550int minijail_uidmap(struct minijail* j, const char* uidmap) {
551 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800552}
553
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700554int minijail_gidmap(struct minijail* j, const char* gidmap) {
555 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800556}
557
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700558int minijail_enter_pivot_root(struct minijail* j, const char* dir) {
559 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800560}
561
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700562void minijail_run_as_init(struct minijail* j) {
563 ++minijail_run_as_init_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800564}
565
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700566int minijail_run_pid_pipes_no_preload(struct minijail* j,
567 const char* filename,
568 char* const argv[],
569 pid_t* pchild_pid,
570 int* pstdin_fd,
571 int* pstdout_fd,
572 int* pstderr_fd) {
573 *pchild_pid = INIT_TEST_PID;
574 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800575}
576
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700577int minijail_write_pid_file(struct minijail* j, const char* path) {
578 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800579}
580
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700581int minijail_wait(struct minijail* j) {
582 ++minijail_wait_called;
583 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800584}
585
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700586int minijail_use_alt_syscall(struct minijail* j, const char* table) {
587 minijail_alt_syscall_table = table;
588 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800589}
590
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700591int minijail_add_to_cgroup(struct minijail* j, const char* cg_path) {
592 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800593}
594
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700595void minijail_reset_signal_mask(struct minijail* j) {
596 ++minijail_reset_signal_mask_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800597}
598
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700599void minijail_skip_remount_private(struct minijail* j) {}
Dylan Reid837c74a2016-01-22 17:25:21 -0800600
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700601void minijail_close_open_fds(struct minijail* j) {}
602
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700603} // extern "C"
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700604
Dylan Reid837c74a2016-01-22 17:25:21 -0800605TEST_HARNESS_MAIN