blob: 7eaa11a01fa8af83db5bc75d1ae8023a6ca442e7 [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);
Luis Hector Chavez5381d002017-09-16 12:54:24 -0700365 EXPECT_EQ(mkdtemp_root.Append("root/dev/null"), mknod_call_args.pathname);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700366 EXPECT_EQ(mknod_call_args.mode,
367 static_cast<mode_t>(S_IRWXU | S_IRWXG | S_IFCHR));
368 EXPECT_EQ(mknod_call_args.dev, makedev(1, 3));
Chinyue Chen03c54ae2016-06-29 12:29:10 +0800369
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700370 EXPECT_EQ(1, gmcg.set_cpu_shares_count);
371 EXPECT_EQ(TEST_CPU_SHARES, container_config_get_cpu_shares(self->config));
372 EXPECT_EQ(1, gmcg.set_cpu_quota_count);
373 EXPECT_EQ(TEST_CPU_QUOTA, container_config_get_cpu_quota(self->config));
374 EXPECT_EQ(1, gmcg.set_cpu_period_count);
375 EXPECT_EQ(TEST_CPU_PERIOD, container_config_get_cpu_period(self->config));
376 EXPECT_EQ(0, gmcg.set_cpu_rt_runtime_count);
377 EXPECT_EQ(0, container_config_get_cpu_rt_runtime(self->config));
378 EXPECT_EQ(0, gmcg.set_cpu_rt_period_count);
379 EXPECT_EQ(0, container_config_get_cpu_rt_period(self->config));
Chinyue Chenfac909e2016-06-24 14:17:42 +0800380
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700381 ASSERT_NE(nullptr, minijail_alt_syscall_table);
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700382 EXPECT_STREQ("testsyscalltable", minijail_alt_syscall_table);
Dylan Reid837c74a2016-01-22 17:25:21 -0800383
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700384 EXPECT_EQ(0, container_wait(self->container));
385 EXPECT_EQ(1, minijail_wait_called);
386 EXPECT_EQ(1, minijail_reset_signal_mask_called);
Dylan Reid837c74a2016-01-22 17:25:21 -0800387}
388
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700389TEST_F(container_test, test_kill_container) {
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700390 ASSERT_EQ(0, container_start(self->container, self->config));
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700391 EXPECT_EQ(0, container_kill(self->container));
392 EXPECT_EQ(1, kill_called);
393 EXPECT_EQ(SIGKILL, kill_sig);
394 EXPECT_EQ(1, minijail_wait_called);
Dylan Reid837c74a2016-01-22 17:25:21 -0800395}
396
397/* libc stubs so the UT doesn't need root to call mount, etc. */
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700398extern "C" {
399
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700400int mount(const char* source,
401 const char* target,
402 const char* filesystemtype,
403 unsigned long mountflags,
404 const void* data) {
405 if (mount_called >= 5)
406 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800407
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700408 mount_call_args[mount_called].source = strdup(source);
409 mount_call_args[mount_called].target = strdup(target);
410 mount_call_args[mount_called].filesystemtype = strdup(filesystemtype);
411 mount_call_args[mount_called].mountflags = mountflags;
412 mount_call_args[mount_called].data = data;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700413 mount_call_args[mount_called].outside_mount = true;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700414 ++mount_called;
415 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800416}
417
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700418int umount(const char* target) {
419 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800420}
421
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700422int umount2(const char* target, int flags) {
423 return 0;
424}
425
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700426#ifdef __USE_EXTERN_INLINES
427/* Some environments use an inline version of mknod. */
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700428int __xmknod(int ver, const char* pathname, __mode_t mode, __dev_t* dev)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700429#else
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700430int mknod(const char* pathname, mode_t mode, dev_t dev)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700431#endif
Dylan Reid837c74a2016-01-22 17:25:21 -0800432{
Luis Hector Chavez5381d002017-09-16 12:54:24 -0700433 mknod_call_args.pathname = base::FilePath(pathname);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700434 mknod_call_args.mode = mode;
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700435#ifdef __USE_EXTERN_INLINES
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700436 mknod_call_args.dev = *dev;
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700437#else
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700438 mknod_call_args.dev = dev;
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700439#endif
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700440 mknod_called = true;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700441 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800442}
443
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700444int chown(const char* path, uid_t owner, gid_t group) {
445 return 0;
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700446}
Dylan Reid837c74a2016-01-22 17:25:21 -0800447
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700448int kill(pid_t pid, int sig) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700449 ++kill_called;
450 kill_sig = sig;
451 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800452}
453
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700454#ifdef __USE_EXTERN_INLINES
455/* Some environments use an inline version of stat. */
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700456int __xstat(int ver, const char* path, struct stat* buf)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700457#else
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700458int stat(const char* path, struct stat* buf)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700459#endif
Dylan Reid837c74a2016-01-22 17:25:21 -0800460{
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700461 buf->st_rdev = stat_rdev_ret;
462 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800463}
464
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700465int chmod(const char* path, mode_t mode) {
466 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800467}
468
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700469char* mkdtemp(char* template_string) {
Luis Hector Chavez5381d002017-09-16 12:54:24 -0700470 mkdtemp_root = base::FilePath(template_string);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700471 return template_string;
Dylan Reid837c74a2016-01-22 17:25:21 -0800472}
473
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700474int mkdir(const char* pathname, mode_t mode) {
475 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800476}
477
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700478int rmdir(const char* pathname) {
479 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800480}
481
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700482int unlink(const char* pathname) {
483 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800484}
485
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700486uid_t getuid(void) {
487 return 0;
488}
489
Dylan Reid837c74a2016-01-22 17:25:21 -0800490/* Minijail stubs */
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700491struct minijail* minijail_new(void) {
492 return (struct minijail*)0x55;
Chinyue Chen03c54ae2016-06-29 12:29:10 +0800493}
494
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700495void minijail_destroy(struct minijail* j) {}
496
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700497int minijail_mount_with_data(struct minijail* j,
498 const char* source,
499 const char* target,
500 const char* filesystemtype,
501 unsigned long mountflags,
502 const char* data) {
503 if (mount_called >= 5)
504 return 0;
505
506 mount_call_args[mount_called].source = strdup(source);
507 mount_call_args[mount_called].target = strdup(target);
508 mount_call_args[mount_called].filesystemtype = strdup(filesystemtype);
509 mount_call_args[mount_called].mountflags = mountflags;
510 mount_call_args[mount_called].data = data;
511 mount_call_args[mount_called].outside_mount = false;
512 ++mount_called;
513 return 0;
514}
515
516int minijail_namespace_user_disable_setgroups(struct minijail* j) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700517 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800518}
519
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700520void minijail_namespace_vfs(struct minijail* j) {
521 ++minijail_vfs_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800522}
523
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700524void minijail_namespace_ipc(struct minijail* j) {
525 ++minijail_ipc_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800526}
527
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700528void minijail_namespace_net(struct minijail* j) {
529 ++minijail_net_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800530}
531
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700532void minijail_namespace_pids(struct minijail* j) {
533 ++minijail_pids_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800534}
535
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700536void minijail_namespace_user(struct minijail* j) {
537 ++minijail_user_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800538}
539
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700540void minijail_namespace_cgroups(struct minijail* j) {
541 ++minijail_cgroups_called;
542}
543
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700544int minijail_uidmap(struct minijail* j, const char* uidmap) {
545 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800546}
547
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700548int minijail_gidmap(struct minijail* j, const char* gidmap) {
549 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800550}
551
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700552int minijail_enter_pivot_root(struct minijail* j, const char* dir) {
553 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800554}
555
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700556void minijail_run_as_init(struct minijail* j) {
557 ++minijail_run_as_init_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800558}
559
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700560int minijail_run_pid_pipes_no_preload(struct minijail* j,
561 const char* filename,
562 char* const argv[],
563 pid_t* pchild_pid,
564 int* pstdin_fd,
565 int* pstdout_fd,
566 int* pstderr_fd) {
567 *pchild_pid = INIT_TEST_PID;
568 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800569}
570
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700571int minijail_write_pid_file(struct minijail* j, const char* path) {
572 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800573}
574
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700575int minijail_wait(struct minijail* j) {
576 ++minijail_wait_called;
577 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800578}
579
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700580int minijail_use_alt_syscall(struct minijail* j, const char* table) {
581 minijail_alt_syscall_table = table;
582 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800583}
584
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700585int minijail_add_to_cgroup(struct minijail* j, const char* cg_path) {
586 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800587}
588
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700589void minijail_reset_signal_mask(struct minijail* j) {
590 ++minijail_reset_signal_mask_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800591}
592
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700593void minijail_skip_remount_private(struct minijail* j) {}
Dylan Reid837c74a2016-01-22 17:25:21 -0800594
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700595void minijail_close_open_fds(struct minijail* j) {}
596
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700597} // extern "C"
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700598
Dylan Reid837c74a2016-01-22 17:25:21 -0800599TEST_HARNESS_MAIN