blob: 0ccf761fbeb11b9d7561720fda7ab2f1c4e2cf7e [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"
Dylan Reid837c74a2016-01-22 17:25:21 -080019
20static const pid_t INIT_TEST_PID = 5555;
Chinyue Chen4f3fd682016-07-01 14:11:42 +080021static const int TEST_CPU_SHARES = 200;
22static const int TEST_CPU_QUOTA = 20000;
23static const int TEST_CPU_PERIOD = 50000;
Dylan Reid837c74a2016-01-22 17:25:21 -080024
25struct mount_args {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070026 char* source;
27 char* target;
28 char* filesystemtype;
29 unsigned long mountflags;
30 const void* data;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -070031 bool outside_mount;
Dylan Reid837c74a2016-01-22 17:25:21 -080032};
33static struct mount_args mount_call_args[5];
34static int mount_called;
35
36struct mknod_args {
Luis Hector Chavez5381d002017-09-16 12:54:24 -070037 base::FilePath pathname;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070038 mode_t mode;
39 dev_t dev;
Dylan Reid837c74a2016-01-22 17:25:21 -080040};
41static struct mknod_args mknod_call_args;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -070042static bool mknod_called;
Chinyue Chen03c54ae2016-06-29 12:29:10 +080043static dev_t stat_rdev_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -080044
45static int kill_called;
46static int kill_sig;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070047static const char* minijail_alt_syscall_table;
Dylan Reid837c74a2016-01-22 17:25:21 -080048static int minijail_ipc_called;
49static int minijail_vfs_called;
50static int minijail_net_called;
51static int minijail_pids_called;
52static int minijail_run_as_init_called;
53static int minijail_user_called;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -070054static int minijail_cgroups_called;
Dylan Reid837c74a2016-01-22 17:25:21 -080055static int minijail_wait_called;
56static int minijail_reset_signal_mask_called;
57static int mount_ret;
Luis Hector Chavez5381d002017-09-16 12:54:24 -070058static base::FilePath mkdtemp_root;
Dylan Reid837c74a2016-01-22 17:25:21 -080059
60/* global mock cgroup. */
Dylan Reid355d5e42016-04-29 16:53:31 -070061#define MAX_ADD_DEVICE_CALLS 2
Dylan Reid837c74a2016-01-22 17:25:21 -080062struct mock_cgroup {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070063 struct container_cgroup cg;
64 int freeze_ret;
65 int thaw_ret;
66 int deny_all_devs_ret;
67 int add_device_ret;
68 int set_cpu_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -080069
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070070 int init_called_count;
71 int deny_all_devs_called_count;
Dylan Reid837c74a2016-01-22 17:25:21 -080072
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070073 int add_dev_allow[MAX_ADD_DEVICE_CALLS];
74 int add_dev_major[MAX_ADD_DEVICE_CALLS];
75 int add_dev_minor[MAX_ADD_DEVICE_CALLS];
76 int add_dev_read[MAX_ADD_DEVICE_CALLS];
77 int add_dev_write[MAX_ADD_DEVICE_CALLS];
78 int add_dev_modify[MAX_ADD_DEVICE_CALLS];
79 char add_dev_type[MAX_ADD_DEVICE_CALLS];
80 int add_dev_called_count;
Chinyue Chenfac909e2016-06-24 14:17:42 +080081
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070082 int set_cpu_shares_count;
83 int set_cpu_quota_count;
84 int set_cpu_period_count;
85 int set_cpu_rt_runtime_count;
86 int set_cpu_rt_period_count;
Dylan Reid837c74a2016-01-22 17:25:21 -080087};
88
89static struct mock_cgroup gmcg;
90
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070091static int mock_freeze(const struct container_cgroup* cg) {
92 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
93 return mcg->freeze_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -080094}
95
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070096static int mock_thaw(const struct container_cgroup* cg) {
97 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
98 return mcg->thaw_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -080099}
100
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700101static int mock_deny_all_devices(const struct container_cgroup* cg) {
102 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
103 ++mcg->deny_all_devs_called_count;
104 return mcg->deny_all_devs_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -0800105}
106
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700107static int mock_add_device(const struct container_cgroup* cg,
108 int allow,
109 int major,
110 int minor,
111 int read,
112 int write,
113 int modify,
114 char type) {
115 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
Dylan Reid355d5e42016-04-29 16:53:31 -0700116
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700117 if (mcg->add_dev_called_count >= MAX_ADD_DEVICE_CALLS)
118 return mcg->add_device_ret;
119 mcg->add_dev_allow[mcg->add_dev_called_count] = allow;
120 mcg->add_dev_major[mcg->add_dev_called_count] = major;
121 mcg->add_dev_minor[mcg->add_dev_called_count] = minor;
122 mcg->add_dev_read[mcg->add_dev_called_count] = read;
123 mcg->add_dev_write[mcg->add_dev_called_count] = write;
124 mcg->add_dev_modify[mcg->add_dev_called_count] = modify;
125 mcg->add_dev_type[mcg->add_dev_called_count] = type;
126 mcg->add_dev_called_count++;
127 return mcg->add_device_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -0800128}
129
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700130static int mock_set_cpu_shares(const struct container_cgroup* cg, int shares) {
131 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
132 mcg->set_cpu_shares_count++;
133 return mcg->set_cpu_ret;
Chinyue Chenfac909e2016-06-24 14:17:42 +0800134}
135
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700136static int mock_set_cpu_quota(const struct container_cgroup* cg, int quota) {
137 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
138 mcg->set_cpu_quota_count++;
139 return mcg->set_cpu_ret;
Chinyue Chenfac909e2016-06-24 14:17:42 +0800140}
141
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700142static int mock_set_cpu_period(const struct container_cgroup* cg, int period) {
143 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
144 mcg->set_cpu_period_count++;
145 return mcg->set_cpu_ret;
Chinyue Chenfac909e2016-06-24 14:17:42 +0800146}
147
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700148static int mock_set_cpu_rt_runtime(const struct container_cgroup* cg,
149 int rt_runtime) {
150 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
151 mcg->set_cpu_rt_runtime_count++;
152 return mcg->set_cpu_ret;
Chinyue Chenfac909e2016-06-24 14:17:42 +0800153}
154
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700155static int mock_set_cpu_rt_period(const struct container_cgroup* cg,
156 int rt_period) {
157 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
158 mcg->set_cpu_rt_period_count++;
159 return mcg->set_cpu_ret;
Chinyue Chenfac909e2016-06-24 14:17:42 +0800160}
161
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700162struct container_cgroup* container_cgroup_new(const char* name,
163 const char* cgroup_root,
164 const char* cgroup_parent,
165 uid_t uid,
166 gid_t gid) {
167 gmcg.cg.name = strdup(name);
168 return &gmcg.cg;
Dylan Reid837c74a2016-01-22 17:25:21 -0800169}
170
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700171void container_cgroup_destroy(struct container_cgroup* c) {
172 free(c->name);
Dylan Reid837c74a2016-01-22 17:25:21 -0800173}
174
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700175TEST(premounted_runfs) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700176 char premounted_runfs[] = "/tmp/cgtest_run/root";
177 struct container_config* config = container_config_create();
178 ASSERT_NE(nullptr, config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700179
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700180 container_config_premounted_runfs(config, premounted_runfs);
181 const char* result = container_config_get_premounted_runfs(config);
182 ASSERT_EQ(0, strcmp(result, premounted_runfs));
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700183
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700184 container_config_destroy(config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700185}
186
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700187TEST(pid_file_path) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700188 char pid_file_path[] = "/tmp/cgtest_run/root/container.pid";
189 struct container_config* config = container_config_create();
190 ASSERT_NE(nullptr, config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700191
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700192 container_config_pid_file(config, pid_file_path);
193 const char* result = container_config_get_pid_file(config);
194 ASSERT_EQ(0, strcmp(result, pid_file_path));
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700195
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700196 container_config_destroy(config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700197}
198
Dylan Reid837c74a2016-01-22 17:25:21 -0800199/* Start of tests. */
200FIXTURE(container_test) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700201 struct container_config* config;
202 struct container* container;
203 int mount_flags;
204 char* rootfs;
Dylan Reid837c74a2016-01-22 17:25:21 -0800205};
206
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700207FIXTURE_SETUP(container_test) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700208 char temp_template[] = "/tmp/cgtestXXXXXX";
209 char rundir_template[] = "/tmp/cgtest_runXXXXXX";
210 char* rundir;
211 char path[256];
212 const char* pargs[] = {
213 "/sbin/init",
214 };
Dylan Reid837c74a2016-01-22 17:25:21 -0800215
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700216 memset(&mount_call_args, 0, sizeof(mount_call_args));
217 mount_called = 0;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700218 mknod_called = false;
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 }
Dylan Reid837c74a2016-01-22 17:25:21 -0800325}
326
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700327TEST_F(container_test, test_mount_tmp_start) {
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700328 ASSERT_EQ(0, container_start(self->container, self->config));
329 ASSERT_EQ(2, mount_called);
330 EXPECT_EQ(false, mount_call_args[1].outside_mount);
331 EXPECT_STREQ("tmpfs", mount_call_args[1].source);
332 EXPECT_STREQ("/tmp", mount_call_args[1].target);
333 EXPECT_STREQ("tmpfs", mount_call_args[1].filesystemtype);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700334 EXPECT_EQ(mount_call_args[1].mountflags,
335 static_cast<unsigned long>(self->mount_flags));
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700336 EXPECT_EQ(nullptr, mount_call_args[1].data);
Dylan Reid837c74a2016-01-22 17:25:21 -0800337
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700338 EXPECT_EQ(1, minijail_ipc_called);
339 EXPECT_EQ(1, minijail_vfs_called);
340 EXPECT_EQ(1, minijail_net_called);
341 EXPECT_EQ(1, minijail_pids_called);
342 EXPECT_EQ(1, minijail_user_called);
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700343 EXPECT_EQ(1, minijail_cgroups_called);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700344 EXPECT_EQ(1, minijail_run_as_init_called);
345 EXPECT_EQ(1, gmcg.deny_all_devs_called_count);
Dylan Reid837c74a2016-01-22 17:25:21 -0800346
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700347 ASSERT_EQ(2, gmcg.add_dev_called_count);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700348 EXPECT_EQ(1, gmcg.add_dev_allow[0]);
349 EXPECT_EQ(245, gmcg.add_dev_major[0]);
350 EXPECT_EQ(2, gmcg.add_dev_minor[0]);
351 EXPECT_EQ(1, gmcg.add_dev_read[0]);
352 EXPECT_EQ(1, gmcg.add_dev_write[0]);
353 EXPECT_EQ(0, gmcg.add_dev_modify[0]);
354 EXPECT_EQ('c', gmcg.add_dev_type[0]);
Dylan Reid355d5e42016-04-29 16:53:31 -0700355
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700356 EXPECT_EQ(1, gmcg.add_dev_allow[1]);
357 EXPECT_EQ(1, gmcg.add_dev_major[1]);
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700358 EXPECT_EQ(-1, gmcg.add_dev_minor[1]);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700359 EXPECT_EQ(1, gmcg.add_dev_read[1]);
360 EXPECT_EQ(1, gmcg.add_dev_write[1]);
361 EXPECT_EQ(0, gmcg.add_dev_modify[1]);
362 EXPECT_EQ('c', gmcg.add_dev_type[1]);
Dylan Reid837c74a2016-01-22 17:25:21 -0800363
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700364 ASSERT_EQ(true, mknod_called);
Manoj Guptaea9a50b2017-09-20 21:06:43 -0700365 EXPECT_STREQ(mkdtemp_root.Append("root/dev/null").value().c_str(),
366 mknod_call_args.pathname.value().c_str());
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700367 EXPECT_EQ(mknod_call_args.mode,
368 static_cast<mode_t>(S_IRWXU | S_IRWXG | S_IFCHR));
369 EXPECT_EQ(mknod_call_args.dev, makedev(1, 3));
Chinyue Chen03c54ae2016-06-29 12:29:10 +0800370
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700371 EXPECT_EQ(1, gmcg.set_cpu_shares_count);
372 EXPECT_EQ(TEST_CPU_SHARES, container_config_get_cpu_shares(self->config));
373 EXPECT_EQ(1, gmcg.set_cpu_quota_count);
374 EXPECT_EQ(TEST_CPU_QUOTA, container_config_get_cpu_quota(self->config));
375 EXPECT_EQ(1, gmcg.set_cpu_period_count);
376 EXPECT_EQ(TEST_CPU_PERIOD, container_config_get_cpu_period(self->config));
377 EXPECT_EQ(0, gmcg.set_cpu_rt_runtime_count);
378 EXPECT_EQ(0, container_config_get_cpu_rt_runtime(self->config));
379 EXPECT_EQ(0, gmcg.set_cpu_rt_period_count);
380 EXPECT_EQ(0, container_config_get_cpu_rt_period(self->config));
Chinyue Chenfac909e2016-06-24 14:17:42 +0800381
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700382 ASSERT_NE(nullptr, minijail_alt_syscall_table);
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700383 EXPECT_STREQ("testsyscalltable", minijail_alt_syscall_table);
Dylan Reid837c74a2016-01-22 17:25:21 -0800384
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700385 EXPECT_EQ(0, container_wait(self->container));
386 EXPECT_EQ(1, minijail_wait_called);
387 EXPECT_EQ(1, minijail_reset_signal_mask_called);
Dylan Reid837c74a2016-01-22 17:25:21 -0800388}
389
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700390TEST_F(container_test, test_kill_container) {
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700391 ASSERT_EQ(0, container_start(self->container, self->config));
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700392 EXPECT_EQ(0, container_kill(self->container));
393 EXPECT_EQ(1, kill_called);
394 EXPECT_EQ(SIGKILL, kill_sig);
395 EXPECT_EQ(1, minijail_wait_called);
Dylan Reid837c74a2016-01-22 17:25:21 -0800396}
397
398/* libc stubs so the UT doesn't need root to call mount, etc. */
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700399extern "C" {
400
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700401int mount(const char* source,
402 const char* target,
403 const char* filesystemtype,
404 unsigned long mountflags,
405 const void* data) {
406 if (mount_called >= 5)
407 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800408
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700409 mount_call_args[mount_called].source = strdup(source);
410 mount_call_args[mount_called].target = strdup(target);
411 mount_call_args[mount_called].filesystemtype = strdup(filesystemtype);
412 mount_call_args[mount_called].mountflags = mountflags;
413 mount_call_args[mount_called].data = data;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700414 mount_call_args[mount_called].outside_mount = true;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700415 ++mount_called;
416 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800417}
418
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700419int umount(const char* target) {
420 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800421}
422
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700423int umount2(const char* target, int flags) {
424 return 0;
425}
426
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700427#ifdef __USE_EXTERN_INLINES
428/* Some environments use an inline version of mknod. */
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700429int __xmknod(int ver, const char* pathname, __mode_t mode, __dev_t* dev)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700430#else
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700431int mknod(const char* pathname, mode_t mode, dev_t dev)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700432#endif
Dylan Reid837c74a2016-01-22 17:25:21 -0800433{
Luis Hector Chavez5381d002017-09-16 12:54:24 -0700434 mknod_call_args.pathname = base::FilePath(pathname);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700435 mknod_call_args.mode = mode;
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700436#ifdef __USE_EXTERN_INLINES
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700437 mknod_call_args.dev = *dev;
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700438#else
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700439 mknod_call_args.dev = dev;
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700440#endif
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700441 mknod_called = true;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700442 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800443}
444
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700445int chown(const char* path, uid_t owner, gid_t group) {
446 return 0;
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700447}
Dylan Reid837c74a2016-01-22 17:25:21 -0800448
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700449int kill(pid_t pid, int sig) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700450 ++kill_called;
451 kill_sig = sig;
452 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800453}
454
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700455#ifdef __USE_EXTERN_INLINES
456/* Some environments use an inline version of stat. */
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700457int __xstat(int ver, const char* path, struct stat* buf)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700458#else
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700459int stat(const char* path, struct stat* buf)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700460#endif
Dylan Reid837c74a2016-01-22 17:25:21 -0800461{
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700462 buf->st_rdev = stat_rdev_ret;
463 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800464}
465
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700466int chmod(const char* path, mode_t mode) {
467 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800468}
469
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700470char* mkdtemp(char* template_string) {
Luis Hector Chavez5381d002017-09-16 12:54:24 -0700471 mkdtemp_root = base::FilePath(template_string);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700472 return template_string;
Dylan Reid837c74a2016-01-22 17:25:21 -0800473}
474
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700475int mkdir(const char* pathname, mode_t mode) {
476 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800477}
478
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700479int rmdir(const char* pathname) {
480 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800481}
482
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700483int unlink(const char* pathname) {
484 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800485}
486
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700487uid_t getuid(void) {
488 return 0;
489}
490
Dylan Reid837c74a2016-01-22 17:25:21 -0800491/* Minijail stubs */
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700492struct minijail* minijail_new(void) {
493 return (struct minijail*)0x55;
Chinyue Chen03c54ae2016-06-29 12:29:10 +0800494}
495
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700496void minijail_destroy(struct minijail* j) {}
497
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700498int minijail_mount_with_data(struct minijail* j,
499 const char* source,
500 const char* target,
501 const char* filesystemtype,
502 unsigned long mountflags,
503 const char* data) {
504 if (mount_called >= 5)
505 return 0;
506
507 mount_call_args[mount_called].source = strdup(source);
508 mount_call_args[mount_called].target = strdup(target);
509 mount_call_args[mount_called].filesystemtype = strdup(filesystemtype);
510 mount_call_args[mount_called].mountflags = mountflags;
511 mount_call_args[mount_called].data = data;
512 mount_call_args[mount_called].outside_mount = false;
513 ++mount_called;
514 return 0;
515}
516
517int minijail_namespace_user_disable_setgroups(struct minijail* j) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700518 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800519}
520
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700521void minijail_namespace_vfs(struct minijail* j) {
522 ++minijail_vfs_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800523}
524
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700525void minijail_namespace_ipc(struct minijail* j) {
526 ++minijail_ipc_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800527}
528
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700529void minijail_namespace_net(struct minijail* j) {
530 ++minijail_net_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800531}
532
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700533void minijail_namespace_pids(struct minijail* j) {
534 ++minijail_pids_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800535}
536
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700537void minijail_namespace_user(struct minijail* j) {
538 ++minijail_user_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800539}
540
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700541void minijail_namespace_cgroups(struct minijail* j) {
542 ++minijail_cgroups_called;
543}
544
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700545int minijail_uidmap(struct minijail* j, const char* uidmap) {
546 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800547}
548
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700549int minijail_gidmap(struct minijail* j, const char* gidmap) {
550 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800551}
552
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700553int minijail_enter_pivot_root(struct minijail* j, const char* dir) {
554 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800555}
556
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700557void minijail_run_as_init(struct minijail* j) {
558 ++minijail_run_as_init_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800559}
560
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700561int minijail_run_pid_pipes_no_preload(struct minijail* j,
562 const char* filename,
563 char* const argv[],
564 pid_t* pchild_pid,
565 int* pstdin_fd,
566 int* pstdout_fd,
567 int* pstderr_fd) {
568 *pchild_pid = INIT_TEST_PID;
569 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800570}
571
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700572int minijail_write_pid_file(struct minijail* j, const char* path) {
573 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800574}
575
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700576int minijail_wait(struct minijail* j) {
577 ++minijail_wait_called;
578 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800579}
580
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700581int minijail_use_alt_syscall(struct minijail* j, const char* table) {
582 minijail_alt_syscall_table = table;
583 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800584}
585
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700586int minijail_add_to_cgroup(struct minijail* j, const char* cg_path) {
587 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800588}
589
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700590void minijail_reset_signal_mask(struct minijail* j) {
591 ++minijail_reset_signal_mask_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800592}
593
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700594void minijail_skip_remount_private(struct minijail* j) {}
Dylan Reid837c74a2016-01-22 17:25:21 -0800595
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700596void minijail_close_open_fds(struct minijail* j) {}
597
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700598} // extern "C"
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700599
Dylan Reid837c74a2016-01-22 17:25:21 -0800600TEST_HARNESS_MAIN