blob: e7767e52b3b5d9b2073cb2651b29905d2bb501fb [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 Chavez5381d002017-09-16 12:54:24 -070013#include <base/files/file_path.h>
14
Luis Hector Chavez836d7b22017-09-14 15:11:15 -070015#include "libcontainer/test_harness.h"
Dylan Reid837c74a2016-01-22 17:25:21 -080016
Luis Hector Chavez836d7b22017-09-14 15:11:15 -070017#include "libcontainer/container_cgroup.h"
18#include "libcontainer/libcontainer.h"
Luis Hector Chavez835d39e2017-09-19 15:16:31 -070019#include "libcontainer/libcontainer_util.h"
Dylan Reid837c74a2016-01-22 17:25:21 -080020
21static const pid_t INIT_TEST_PID = 5555;
Chinyue Chen4f3fd682016-07-01 14:11:42 +080022static const int TEST_CPU_SHARES = 200;
23static const int TEST_CPU_QUOTA = 20000;
24static const int TEST_CPU_PERIOD = 50000;
Dylan Reid837c74a2016-01-22 17:25:21 -080025
26struct mount_args {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070027 char* source;
28 char* target;
29 char* filesystemtype;
30 unsigned long mountflags;
31 const void* data;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -070032 bool outside_mount;
Dylan Reid837c74a2016-01-22 17:25:21 -080033};
34static struct mount_args mount_call_args[5];
35static int mount_called;
36
37struct mknod_args {
Luis Hector Chavez5381d002017-09-16 12:54:24 -070038 base::FilePath pathname;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070039 mode_t mode;
40 dev_t dev;
Dylan Reid837c74a2016-01-22 17:25:21 -080041};
42static struct mknod_args mknod_call_args;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -070043static bool mknod_called;
Chinyue Chen03c54ae2016-06-29 12:29:10 +080044static dev_t stat_rdev_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -080045
46static int kill_called;
47static int kill_sig;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070048static const char* minijail_alt_syscall_table;
Dylan Reid837c74a2016-01-22 17:25:21 -080049static int minijail_ipc_called;
50static int minijail_vfs_called;
51static int minijail_net_called;
52static int minijail_pids_called;
53static int minijail_run_as_init_called;
54static int minijail_user_called;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -070055static int minijail_cgroups_called;
Dylan Reid837c74a2016-01-22 17:25:21 -080056static int minijail_wait_called;
57static int minijail_reset_signal_mask_called;
58static int mount_ret;
Luis Hector Chavez5381d002017-09-16 12:54:24 -070059static base::FilePath mkdtemp_root;
Dylan Reid837c74a2016-01-22 17:25:21 -080060
61/* global mock cgroup. */
Dylan Reid355d5e42016-04-29 16:53:31 -070062#define MAX_ADD_DEVICE_CALLS 2
Dylan Reid837c74a2016-01-22 17:25:21 -080063struct mock_cgroup {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070064 struct container_cgroup cg;
65 int freeze_ret;
66 int thaw_ret;
67 int deny_all_devs_ret;
68 int add_device_ret;
69 int set_cpu_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -080070
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070071 int init_called_count;
72 int deny_all_devs_called_count;
Dylan Reid837c74a2016-01-22 17:25:21 -080073
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070074 int add_dev_allow[MAX_ADD_DEVICE_CALLS];
75 int add_dev_major[MAX_ADD_DEVICE_CALLS];
76 int add_dev_minor[MAX_ADD_DEVICE_CALLS];
77 int add_dev_read[MAX_ADD_DEVICE_CALLS];
78 int add_dev_write[MAX_ADD_DEVICE_CALLS];
79 int add_dev_modify[MAX_ADD_DEVICE_CALLS];
80 char add_dev_type[MAX_ADD_DEVICE_CALLS];
81 int add_dev_called_count;
Chinyue Chenfac909e2016-06-24 14:17:42 +080082
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070083 int set_cpu_shares_count;
84 int set_cpu_quota_count;
85 int set_cpu_period_count;
86 int set_cpu_rt_runtime_count;
87 int set_cpu_rt_period_count;
Dylan Reid837c74a2016-01-22 17:25:21 -080088};
89
90static struct mock_cgroup gmcg;
91
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070092static int mock_freeze(const struct container_cgroup* cg) {
93 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
94 return mcg->freeze_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -080095}
96
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070097static int mock_thaw(const struct container_cgroup* cg) {
98 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
99 return mcg->thaw_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -0800100}
101
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700102static int mock_deny_all_devices(const struct container_cgroup* cg) {
103 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
104 ++mcg->deny_all_devs_called_count;
105 return mcg->deny_all_devs_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -0800106}
107
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700108static int mock_add_device(const struct container_cgroup* cg,
109 int allow,
110 int major,
111 int minor,
112 int read,
113 int write,
114 int modify,
115 char type) {
116 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
Dylan Reid355d5e42016-04-29 16:53:31 -0700117
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700118 if (mcg->add_dev_called_count >= MAX_ADD_DEVICE_CALLS)
119 return mcg->add_device_ret;
120 mcg->add_dev_allow[mcg->add_dev_called_count] = allow;
121 mcg->add_dev_major[mcg->add_dev_called_count] = major;
122 mcg->add_dev_minor[mcg->add_dev_called_count] = minor;
123 mcg->add_dev_read[mcg->add_dev_called_count] = read;
124 mcg->add_dev_write[mcg->add_dev_called_count] = write;
125 mcg->add_dev_modify[mcg->add_dev_called_count] = modify;
126 mcg->add_dev_type[mcg->add_dev_called_count] = type;
127 mcg->add_dev_called_count++;
128 return mcg->add_device_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -0800129}
130
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700131static int mock_set_cpu_shares(const struct container_cgroup* cg, int shares) {
132 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
133 mcg->set_cpu_shares_count++;
134 return mcg->set_cpu_ret;
Chinyue Chenfac909e2016-06-24 14:17:42 +0800135}
136
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700137static int mock_set_cpu_quota(const struct container_cgroup* cg, int quota) {
138 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
139 mcg->set_cpu_quota_count++;
140 return mcg->set_cpu_ret;
Chinyue Chenfac909e2016-06-24 14:17:42 +0800141}
142
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700143static int mock_set_cpu_period(const struct container_cgroup* cg, int period) {
144 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
145 mcg->set_cpu_period_count++;
146 return mcg->set_cpu_ret;
Chinyue Chenfac909e2016-06-24 14:17:42 +0800147}
148
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700149static int mock_set_cpu_rt_runtime(const struct container_cgroup* cg,
150 int rt_runtime) {
151 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
152 mcg->set_cpu_rt_runtime_count++;
153 return mcg->set_cpu_ret;
Chinyue Chenfac909e2016-06-24 14:17:42 +0800154}
155
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700156static int mock_set_cpu_rt_period(const struct container_cgroup* cg,
157 int rt_period) {
158 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
159 mcg->set_cpu_rt_period_count++;
160 return mcg->set_cpu_ret;
Chinyue Chenfac909e2016-06-24 14:17:42 +0800161}
162
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700163struct container_cgroup* container_cgroup_new(const char* name,
164 const char* cgroup_root,
165 const char* cgroup_parent,
166 uid_t uid,
167 gid_t gid) {
168 gmcg.cg.name = strdup(name);
169 return &gmcg.cg;
Dylan Reid837c74a2016-01-22 17:25:21 -0800170}
171
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700172void container_cgroup_destroy(struct container_cgroup* c) {
173 free(c->name);
Dylan Reid837c74a2016-01-22 17:25:21 -0800174}
175
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700176TEST(premounted_runfs) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700177 char premounted_runfs[] = "/tmp/cgtest_run/root";
178 struct container_config* config = container_config_create();
179 ASSERT_NE(nullptr, config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700180
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700181 container_config_premounted_runfs(config, premounted_runfs);
182 const char* result = container_config_get_premounted_runfs(config);
183 ASSERT_EQ(0, strcmp(result, premounted_runfs));
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700184
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700185 container_config_destroy(config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700186}
187
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700188TEST(pid_file_path) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700189 char pid_file_path[] = "/tmp/cgtest_run/root/container.pid";
190 struct container_config* config = container_config_create();
191 ASSERT_NE(nullptr, config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700192
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700193 container_config_pid_file(config, pid_file_path);
194 const char* result = container_config_get_pid_file(config);
195 ASSERT_EQ(0, strcmp(result, pid_file_path));
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700196
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700197 container_config_destroy(config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700198}
199
Luis Hector Chavez835d39e2017-09-19 15:16:31 -0700200TEST(plog_preserve) {
201 errno = EPERM;
202 PLOG_PRESERVE(ERROR) << "This is an expected error log";
203 ASSERT_EQ(EPERM, errno);
204}
205
Dylan Reid837c74a2016-01-22 17:25:21 -0800206/* Start of tests. */
207FIXTURE(container_test) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700208 struct container_config* config;
209 struct container* container;
210 int mount_flags;
211 char* rootfs;
Dylan Reid837c74a2016-01-22 17:25:21 -0800212};
213
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700214FIXTURE_SETUP(container_test) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700215 char temp_template[] = "/tmp/cgtestXXXXXX";
216 char rundir_template[] = "/tmp/cgtest_runXXXXXX";
217 char* rundir;
218 char path[256];
219 const char* pargs[] = {
220 "/sbin/init",
221 };
Dylan Reid837c74a2016-01-22 17:25:21 -0800222
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700223 memset(&mount_call_args, 0, sizeof(mount_call_args));
224 mount_called = 0;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700225 mknod_called = false;
Dylan Reid837c74a2016-01-22 17:25:21 -0800226
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700227 memset(&gmcg, 0, sizeof(gmcg));
228 static const struct cgroup_ops cgops = {
229 .freeze = mock_freeze,
230 .thaw = mock_thaw,
231 .deny_all_devices = mock_deny_all_devices,
232 .add_device = mock_add_device,
233 .set_cpu_shares = mock_set_cpu_shares,
234 .set_cpu_quota = mock_set_cpu_quota,
235 .set_cpu_period = mock_set_cpu_period,
236 .set_cpu_rt_runtime = mock_set_cpu_rt_runtime,
237 .set_cpu_rt_period = mock_set_cpu_rt_period,
238 };
239 gmcg.cg.ops = &cgops;
Dylan Reid837c74a2016-01-22 17:25:21 -0800240
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700241 self->rootfs = strdup(mkdtemp(temp_template));
Dylan Reid837c74a2016-01-22 17:25:21 -0800242
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700243 kill_called = 0;
244 minijail_alt_syscall_table = nullptr;
245 minijail_ipc_called = 0;
246 minijail_vfs_called = 0;
247 minijail_net_called = 0;
248 minijail_pids_called = 0;
249 minijail_run_as_init_called = 0;
250 minijail_user_called = 0;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700251 minijail_cgroups_called = 0;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700252 minijail_wait_called = 0;
253 minijail_reset_signal_mask_called = 0;
254 mount_ret = 0;
255 stat_rdev_ret = makedev(2, 3);
Dylan Reid837c74a2016-01-22 17:25:21 -0800256
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700257 snprintf(path, sizeof(path), "%s/dev", self->rootfs);
Dylan Reid837c74a2016-01-22 17:25:21 -0800258
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700259 self->mount_flags = MS_NOSUID | MS_NODEV | MS_NOEXEC;
Dylan Reid837c74a2016-01-22 17:25:21 -0800260
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700261 self->config = container_config_create();
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700262 container_config_uid_map(self->config, "0 0 4294967295");
263 container_config_gid_map(self->config, "0 0 4294967295");
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700264 container_config_rootfs(self->config, self->rootfs);
265 container_config_program_argv(self->config, pargs, 1);
266 container_config_alt_syscall_table(self->config, "testsyscalltable");
267 container_config_add_mount(self->config,
268 "testtmpfs",
269 "tmpfs",
270 "/tmp",
271 "tmpfs",
272 nullptr,
273 nullptr,
274 self->mount_flags,
275 0,
276 1000,
277 1000,
278 0x666,
279 0,
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700280 0);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700281 container_config_add_device(self->config,
282 'c',
283 "/dev/foo",
284 S_IRWXU | S_IRWXG,
285 245,
286 2,
287 0,
288 1000,
289 1001,
290 1,
291 1,
292 0);
293 /* test dynamic minor on /dev/null */
294 container_config_add_device(self->config,
295 'c',
296 "/dev/null",
297 S_IRWXU | S_IRWXG,
298 1,
299 -1,
300 1,
301 1000,
302 1001,
303 1,
304 1,
305 0);
Dylan Reid837c74a2016-01-22 17:25:21 -0800306
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700307 container_config_set_cpu_shares(self->config, TEST_CPU_SHARES);
308 container_config_set_cpu_cfs_params(
309 self->config, TEST_CPU_QUOTA, TEST_CPU_PERIOD);
310 /* Invalid params, so this won't be applied. */
311 container_config_set_cpu_rt_params(self->config, 20000, 20000);
Chinyue Chenfac909e2016-06-24 14:17:42 +0800312
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700313 rundir = mkdtemp(rundir_template);
314 self->container = container_new("containerUT", rundir);
315 ASSERT_NE(nullptr, self->container);
Dylan Reid837c74a2016-01-22 17:25:21 -0800316}
317
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700318FIXTURE_TEARDOWN(container_test) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700319 char path[256];
320 int i;
Dylan Reid837c74a2016-01-22 17:25:21 -0800321
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700322 container_destroy(self->container);
323 snprintf(path, sizeof(path), "rm -rf %s", self->rootfs);
324 EXPECT_EQ(0, system(path));
325 free(self->rootfs);
Dylan Reid837c74a2016-01-22 17:25:21 -0800326
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700327 for (i = 0; i < mount_called; i++) {
328 free(mount_call_args[i].source);
329 free(mount_call_args[i].target);
330 free(mount_call_args[i].filesystemtype);
331 }
Dylan Reid837c74a2016-01-22 17:25:21 -0800332}
333
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700334TEST_F(container_test, test_mount_tmp_start) {
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700335 ASSERT_EQ(0, container_start(self->container, self->config));
336 ASSERT_EQ(2, mount_called);
337 EXPECT_EQ(false, mount_call_args[1].outside_mount);
338 EXPECT_STREQ("tmpfs", mount_call_args[1].source);
339 EXPECT_STREQ("/tmp", mount_call_args[1].target);
340 EXPECT_STREQ("tmpfs", mount_call_args[1].filesystemtype);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700341 EXPECT_EQ(mount_call_args[1].mountflags,
342 static_cast<unsigned long>(self->mount_flags));
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700343 EXPECT_EQ(nullptr, mount_call_args[1].data);
Dylan Reid837c74a2016-01-22 17:25:21 -0800344
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700345 EXPECT_EQ(1, minijail_ipc_called);
346 EXPECT_EQ(1, minijail_vfs_called);
347 EXPECT_EQ(1, minijail_net_called);
348 EXPECT_EQ(1, minijail_pids_called);
349 EXPECT_EQ(1, minijail_user_called);
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700350 EXPECT_EQ(1, minijail_cgroups_called);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700351 EXPECT_EQ(1, minijail_run_as_init_called);
352 EXPECT_EQ(1, gmcg.deny_all_devs_called_count);
Dylan Reid837c74a2016-01-22 17:25:21 -0800353
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700354 ASSERT_EQ(2, gmcg.add_dev_called_count);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700355 EXPECT_EQ(1, gmcg.add_dev_allow[0]);
356 EXPECT_EQ(245, gmcg.add_dev_major[0]);
357 EXPECT_EQ(2, gmcg.add_dev_minor[0]);
358 EXPECT_EQ(1, gmcg.add_dev_read[0]);
359 EXPECT_EQ(1, gmcg.add_dev_write[0]);
360 EXPECT_EQ(0, gmcg.add_dev_modify[0]);
361 EXPECT_EQ('c', gmcg.add_dev_type[0]);
Dylan Reid355d5e42016-04-29 16:53:31 -0700362
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700363 EXPECT_EQ(1, gmcg.add_dev_allow[1]);
364 EXPECT_EQ(1, gmcg.add_dev_major[1]);
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700365 EXPECT_EQ(-1, gmcg.add_dev_minor[1]);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700366 EXPECT_EQ(1, gmcg.add_dev_read[1]);
367 EXPECT_EQ(1, gmcg.add_dev_write[1]);
368 EXPECT_EQ(0, gmcg.add_dev_modify[1]);
369 EXPECT_EQ('c', gmcg.add_dev_type[1]);
Dylan Reid837c74a2016-01-22 17:25:21 -0800370
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700371 ASSERT_EQ(true, mknod_called);
Manoj Guptaea9a50b2017-09-20 21:06:43 -0700372 EXPECT_STREQ(mkdtemp_root.Append("root/dev/null").value().c_str(),
373 mknod_call_args.pathname.value().c_str());
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700374 EXPECT_EQ(mknod_call_args.mode,
375 static_cast<mode_t>(S_IRWXU | S_IRWXG | S_IFCHR));
376 EXPECT_EQ(mknod_call_args.dev, makedev(1, 3));
Chinyue Chen03c54ae2016-06-29 12:29:10 +0800377
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700378 EXPECT_EQ(1, gmcg.set_cpu_shares_count);
379 EXPECT_EQ(TEST_CPU_SHARES, container_config_get_cpu_shares(self->config));
380 EXPECT_EQ(1, gmcg.set_cpu_quota_count);
381 EXPECT_EQ(TEST_CPU_QUOTA, container_config_get_cpu_quota(self->config));
382 EXPECT_EQ(1, gmcg.set_cpu_period_count);
383 EXPECT_EQ(TEST_CPU_PERIOD, container_config_get_cpu_period(self->config));
384 EXPECT_EQ(0, gmcg.set_cpu_rt_runtime_count);
385 EXPECT_EQ(0, container_config_get_cpu_rt_runtime(self->config));
386 EXPECT_EQ(0, gmcg.set_cpu_rt_period_count);
387 EXPECT_EQ(0, container_config_get_cpu_rt_period(self->config));
Chinyue Chenfac909e2016-06-24 14:17:42 +0800388
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700389 ASSERT_NE(nullptr, minijail_alt_syscall_table);
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700390 EXPECT_STREQ("testsyscalltable", minijail_alt_syscall_table);
Dylan Reid837c74a2016-01-22 17:25:21 -0800391
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700392 EXPECT_EQ(0, container_wait(self->container));
393 EXPECT_EQ(1, minijail_wait_called);
394 EXPECT_EQ(1, minijail_reset_signal_mask_called);
Dylan Reid837c74a2016-01-22 17:25:21 -0800395}
396
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700397TEST_F(container_test, test_kill_container) {
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700398 ASSERT_EQ(0, container_start(self->container, self->config));
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700399 EXPECT_EQ(0, container_kill(self->container));
400 EXPECT_EQ(1, kill_called);
401 EXPECT_EQ(SIGKILL, kill_sig);
402 EXPECT_EQ(1, minijail_wait_called);
Dylan Reid837c74a2016-01-22 17:25:21 -0800403}
404
405/* libc stubs so the UT doesn't need root to call mount, etc. */
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700406extern "C" {
407
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700408int mount(const char* source,
409 const char* target,
410 const char* filesystemtype,
411 unsigned long mountflags,
412 const void* data) {
413 if (mount_called >= 5)
414 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800415
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700416 mount_call_args[mount_called].source = strdup(source);
417 mount_call_args[mount_called].target = strdup(target);
418 mount_call_args[mount_called].filesystemtype = strdup(filesystemtype);
419 mount_call_args[mount_called].mountflags = mountflags;
420 mount_call_args[mount_called].data = data;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700421 mount_call_args[mount_called].outside_mount = true;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700422 ++mount_called;
423 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800424}
425
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700426int umount(const char* target) {
427 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800428}
429
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700430int umount2(const char* target, int flags) {
431 return 0;
432}
433
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700434#ifdef __USE_EXTERN_INLINES
435/* Some environments use an inline version of mknod. */
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700436int __xmknod(int ver, const char* pathname, __mode_t mode, __dev_t* dev)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700437#else
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700438int mknod(const char* pathname, mode_t mode, dev_t dev)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700439#endif
Dylan Reid837c74a2016-01-22 17:25:21 -0800440{
Luis Hector Chavez5381d002017-09-16 12:54:24 -0700441 mknod_call_args.pathname = base::FilePath(pathname);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700442 mknod_call_args.mode = mode;
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700443#ifdef __USE_EXTERN_INLINES
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700444 mknod_call_args.dev = *dev;
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700445#else
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700446 mknod_call_args.dev = dev;
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700447#endif
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700448 mknod_called = true;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700449 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800450}
451
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700452int chown(const char* path, uid_t owner, gid_t group) {
453 return 0;
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700454}
Dylan Reid837c74a2016-01-22 17:25:21 -0800455
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700456int kill(pid_t pid, int sig) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700457 ++kill_called;
458 kill_sig = sig;
459 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800460}
461
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700462#ifdef __USE_EXTERN_INLINES
463/* Some environments use an inline version of stat. */
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700464int __xstat(int ver, const char* path, struct stat* buf)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700465#else
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700466int stat(const char* path, struct stat* buf)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700467#endif
Dylan Reid837c74a2016-01-22 17:25:21 -0800468{
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700469 buf->st_rdev = stat_rdev_ret;
470 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800471}
472
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700473int chmod(const char* path, mode_t mode) {
474 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800475}
476
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700477char* mkdtemp(char* template_string) {
Luis Hector Chavez5381d002017-09-16 12:54:24 -0700478 mkdtemp_root = base::FilePath(template_string);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700479 return template_string;
Dylan Reid837c74a2016-01-22 17:25:21 -0800480}
481
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700482int mkdir(const char* pathname, mode_t mode) {
483 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800484}
485
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700486int rmdir(const char* pathname) {
487 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800488}
489
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700490int unlink(const char* pathname) {
491 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800492}
493
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700494uid_t getuid(void) {
495 return 0;
496}
497
Dylan Reid837c74a2016-01-22 17:25:21 -0800498/* Minijail stubs */
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700499struct minijail* minijail_new(void) {
500 return (struct minijail*)0x55;
Chinyue Chen03c54ae2016-06-29 12:29:10 +0800501}
502
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700503void minijail_destroy(struct minijail* j) {}
504
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700505int minijail_mount_with_data(struct minijail* j,
506 const char* source,
507 const char* target,
508 const char* filesystemtype,
509 unsigned long mountflags,
510 const char* data) {
511 if (mount_called >= 5)
512 return 0;
513
514 mount_call_args[mount_called].source = strdup(source);
515 mount_call_args[mount_called].target = strdup(target);
516 mount_call_args[mount_called].filesystemtype = strdup(filesystemtype);
517 mount_call_args[mount_called].mountflags = mountflags;
518 mount_call_args[mount_called].data = data;
519 mount_call_args[mount_called].outside_mount = false;
520 ++mount_called;
521 return 0;
522}
523
524int minijail_namespace_user_disable_setgroups(struct minijail* j) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700525 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800526}
527
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700528void minijail_namespace_vfs(struct minijail* j) {
529 ++minijail_vfs_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800530}
531
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700532void minijail_namespace_ipc(struct minijail* j) {
533 ++minijail_ipc_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800534}
535
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700536void minijail_namespace_net(struct minijail* j) {
537 ++minijail_net_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800538}
539
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700540void minijail_namespace_pids(struct minijail* j) {
541 ++minijail_pids_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800542}
543
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700544void minijail_namespace_user(struct minijail* j) {
545 ++minijail_user_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800546}
547
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700548void minijail_namespace_cgroups(struct minijail* j) {
549 ++minijail_cgroups_called;
550}
551
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700552int minijail_uidmap(struct minijail* j, const char* uidmap) {
553 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800554}
555
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700556int minijail_gidmap(struct minijail* j, const char* gidmap) {
557 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800558}
559
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700560int minijail_enter_pivot_root(struct minijail* j, const char* dir) {
561 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800562}
563
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700564void minijail_run_as_init(struct minijail* j) {
565 ++minijail_run_as_init_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800566}
567
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700568int minijail_run_pid_pipes_no_preload(struct minijail* j,
569 const char* filename,
570 char* const argv[],
571 pid_t* pchild_pid,
572 int* pstdin_fd,
573 int* pstdout_fd,
574 int* pstderr_fd) {
575 *pchild_pid = INIT_TEST_PID;
576 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800577}
578
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700579int minijail_write_pid_file(struct minijail* j, const char* path) {
580 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800581}
582
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700583int minijail_wait(struct minijail* j) {
584 ++minijail_wait_called;
585 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800586}
587
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700588int minijail_use_alt_syscall(struct minijail* j, const char* table) {
589 minijail_alt_syscall_table = table;
590 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800591}
592
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700593int minijail_add_to_cgroup(struct minijail* j, const char* cg_path) {
594 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800595}
596
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700597void minijail_reset_signal_mask(struct minijail* j) {
598 ++minijail_reset_signal_mask_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800599}
600
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700601void minijail_skip_remount_private(struct minijail* j) {}
Dylan Reid837c74a2016-01-22 17:25:21 -0800602
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700603void minijail_close_open_fds(struct minijail* j) {}
604
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700605} // extern "C"
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700606
Dylan Reid837c74a2016-01-22 17:25:21 -0800607TEST_HARNESS_MAIN