blob: a745c7e938324f284beda3e2983106049262abdd [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 Chavezedec56e2017-09-19 15:43:53 -070013#include <memory>
14
Luis Hector Chavez5381d002017-09-16 12:54:24 -070015#include <base/files/file_path.h>
16
Luis Hector Chavez836d7b22017-09-14 15:11:15 -070017#include "libcontainer/test_harness.h"
Dylan Reid837c74a2016-01-22 17:25:21 -080018
Luis Hector Chavez836d7b22017-09-14 15:11:15 -070019#include "libcontainer/container_cgroup.h"
20#include "libcontainer/libcontainer.h"
Luis Hector Chavez835d39e2017-09-19 15:16:31 -070021#include "libcontainer/libcontainer_util.h"
Luis Hector Chavezedec56e2017-09-19 15:43:53 -070022#include "libcontainer/container.h"
23#include "libcontainer/config.h"
Dylan Reid837c74a2016-01-22 17:25:21 -080024
25static const pid_t INIT_TEST_PID = 5555;
Chinyue Chen4f3fd682016-07-01 14:11:42 +080026static const int TEST_CPU_SHARES = 200;
27static const int TEST_CPU_QUOTA = 20000;
28static const int TEST_CPU_PERIOD = 50000;
Dylan Reid837c74a2016-01-22 17:25:21 -080029
30struct mount_args {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070031 char* source;
32 char* target;
33 char* filesystemtype;
34 unsigned long mountflags;
35 const void* data;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -070036 bool outside_mount;
Dylan Reid837c74a2016-01-22 17:25:21 -080037};
38static struct mount_args mount_call_args[5];
39static int mount_called;
40
41struct mknod_args {
Luis Hector Chavez5381d002017-09-16 12:54:24 -070042 base::FilePath pathname;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070043 mode_t mode;
44 dev_t dev;
Dylan Reid837c74a2016-01-22 17:25:21 -080045};
46static struct mknod_args mknod_call_args;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -070047static bool mknod_called;
Chinyue Chen03c54ae2016-06-29 12:29:10 +080048static dev_t stat_rdev_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -080049
50static int kill_called;
51static int kill_sig;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070052static const char* minijail_alt_syscall_table;
Dylan Reid837c74a2016-01-22 17:25:21 -080053static int minijail_ipc_called;
54static int minijail_vfs_called;
55static int minijail_net_called;
56static int minijail_pids_called;
57static int minijail_run_as_init_called;
58static int minijail_user_called;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -070059static int minijail_cgroups_called;
Dylan Reid837c74a2016-01-22 17:25:21 -080060static int minijail_wait_called;
61static int minijail_reset_signal_mask_called;
62static int mount_ret;
Luis Hector Chavez5381d002017-09-16 12:54:24 -070063static base::FilePath mkdtemp_root;
Dylan Reid837c74a2016-01-22 17:25:21 -080064
65/* global mock cgroup. */
Dylan Reid355d5e42016-04-29 16:53:31 -070066#define MAX_ADD_DEVICE_CALLS 2
Dylan Reid837c74a2016-01-22 17:25:21 -080067struct mock_cgroup {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070068 struct container_cgroup cg;
69 int freeze_ret;
70 int thaw_ret;
71 int deny_all_devs_ret;
72 int add_device_ret;
73 int set_cpu_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -080074
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070075 int init_called_count;
76 int deny_all_devs_called_count;
Dylan Reid837c74a2016-01-22 17:25:21 -080077
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070078 int add_dev_allow[MAX_ADD_DEVICE_CALLS];
79 int add_dev_major[MAX_ADD_DEVICE_CALLS];
80 int add_dev_minor[MAX_ADD_DEVICE_CALLS];
81 int add_dev_read[MAX_ADD_DEVICE_CALLS];
82 int add_dev_write[MAX_ADD_DEVICE_CALLS];
83 int add_dev_modify[MAX_ADD_DEVICE_CALLS];
84 char add_dev_type[MAX_ADD_DEVICE_CALLS];
85 int add_dev_called_count;
Chinyue Chenfac909e2016-06-24 14:17:42 +080086
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070087 int set_cpu_shares_count;
88 int set_cpu_quota_count;
89 int set_cpu_period_count;
90 int set_cpu_rt_runtime_count;
91 int set_cpu_rt_period_count;
Dylan Reid837c74a2016-01-22 17:25:21 -080092};
93
94static struct mock_cgroup gmcg;
95
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070096static int mock_freeze(const struct container_cgroup* cg) {
97 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
98 return mcg->freeze_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -080099}
100
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700101static int mock_thaw(const struct container_cgroup* cg) {
102 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
103 return mcg->thaw_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -0800104}
105
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700106static int mock_deny_all_devices(const struct container_cgroup* cg) {
107 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
108 ++mcg->deny_all_devs_called_count;
109 return mcg->deny_all_devs_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -0800110}
111
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700112static int mock_add_device(const struct container_cgroup* cg,
113 int allow,
114 int major,
115 int minor,
116 int read,
117 int write,
118 int modify,
119 char type) {
120 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
Dylan Reid355d5e42016-04-29 16:53:31 -0700121
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700122 if (mcg->add_dev_called_count >= MAX_ADD_DEVICE_CALLS)
123 return mcg->add_device_ret;
124 mcg->add_dev_allow[mcg->add_dev_called_count] = allow;
125 mcg->add_dev_major[mcg->add_dev_called_count] = major;
126 mcg->add_dev_minor[mcg->add_dev_called_count] = minor;
127 mcg->add_dev_read[mcg->add_dev_called_count] = read;
128 mcg->add_dev_write[mcg->add_dev_called_count] = write;
129 mcg->add_dev_modify[mcg->add_dev_called_count] = modify;
130 mcg->add_dev_type[mcg->add_dev_called_count] = type;
131 mcg->add_dev_called_count++;
132 return mcg->add_device_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -0800133}
134
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700135static int mock_set_cpu_shares(const struct container_cgroup* cg, int shares) {
136 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
137 mcg->set_cpu_shares_count++;
138 return mcg->set_cpu_ret;
Chinyue Chenfac909e2016-06-24 14:17:42 +0800139}
140
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700141static int mock_set_cpu_quota(const struct container_cgroup* cg, int quota) {
142 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
143 mcg->set_cpu_quota_count++;
144 return mcg->set_cpu_ret;
Chinyue Chenfac909e2016-06-24 14:17:42 +0800145}
146
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700147static int mock_set_cpu_period(const struct container_cgroup* cg, int period) {
148 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
149 mcg->set_cpu_period_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_runtime(const struct container_cgroup* cg,
154 int rt_runtime) {
155 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
156 mcg->set_cpu_rt_runtime_count++;
157 return mcg->set_cpu_ret;
Chinyue Chenfac909e2016-06-24 14:17:42 +0800158}
159
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700160static int mock_set_cpu_rt_period(const struct container_cgroup* cg,
161 int rt_period) {
162 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
163 mcg->set_cpu_rt_period_count++;
164 return mcg->set_cpu_ret;
Chinyue Chenfac909e2016-06-24 14:17:42 +0800165}
166
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700167struct container_cgroup* container_cgroup_new(const char* name,
168 const char* cgroup_root,
169 const char* cgroup_parent,
170 uid_t uid,
171 gid_t gid) {
172 gmcg.cg.name = strdup(name);
173 return &gmcg.cg;
Dylan Reid837c74a2016-01-22 17:25:21 -0800174}
175
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700176void container_cgroup_destroy(struct container_cgroup* c) {
177 free(c->name);
Dylan Reid837c74a2016-01-22 17:25:21 -0800178}
179
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700180TEST(premounted_runfs) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700181 char premounted_runfs[] = "/tmp/cgtest_run/root";
182 struct container_config* config = container_config_create();
183 ASSERT_NE(nullptr, config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700184
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700185 container_config_premounted_runfs(config, premounted_runfs);
186 const char* result = container_config_get_premounted_runfs(config);
187 ASSERT_EQ(0, strcmp(result, premounted_runfs));
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700188
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700189 container_config_destroy(config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700190}
191
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700192TEST(pid_file_path) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700193 char pid_file_path[] = "/tmp/cgtest_run/root/container.pid";
194 struct container_config* config = container_config_create();
195 ASSERT_NE(nullptr, config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700196
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700197 container_config_pid_file(config, pid_file_path);
198 const char* result = container_config_get_pid_file(config);
199 ASSERT_EQ(0, strcmp(result, pid_file_path));
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700200
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700201 container_config_destroy(config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700202}
203
Luis Hector Chavez835d39e2017-09-19 15:16:31 -0700204TEST(plog_preserve) {
205 errno = EPERM;
206 PLOG_PRESERVE(ERROR) << "This is an expected error log";
207 ASSERT_EQ(EPERM, errno);
208}
209
Dylan Reid837c74a2016-01-22 17:25:21 -0800210/* Start of tests. */
211FIXTURE(container_test) {
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700212 std::unique_ptr<libcontainer::Config> config;
213 std::unique_ptr<libcontainer::Container> container;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700214 int mount_flags;
215 char* rootfs;
Dylan Reid837c74a2016-01-22 17:25:21 -0800216};
217
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700218FIXTURE_SETUP(container_test) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700219 char temp_template[] = "/tmp/cgtestXXXXXX";
220 char rundir_template[] = "/tmp/cgtest_runXXXXXX";
221 char* rundir;
222 char path[256];
223 const char* pargs[] = {
224 "/sbin/init",
225 };
Dylan Reid837c74a2016-01-22 17:25:21 -0800226
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700227 memset(&mount_call_args, 0, sizeof(mount_call_args));
228 mount_called = 0;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700229 mknod_called = false;
Dylan Reid837c74a2016-01-22 17:25:21 -0800230
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700231 memset(&gmcg, 0, sizeof(gmcg));
232 static const struct cgroup_ops cgops = {
233 .freeze = mock_freeze,
234 .thaw = mock_thaw,
235 .deny_all_devices = mock_deny_all_devices,
236 .add_device = mock_add_device,
237 .set_cpu_shares = mock_set_cpu_shares,
238 .set_cpu_quota = mock_set_cpu_quota,
239 .set_cpu_period = mock_set_cpu_period,
240 .set_cpu_rt_runtime = mock_set_cpu_rt_runtime,
241 .set_cpu_rt_period = mock_set_cpu_rt_period,
242 };
243 gmcg.cg.ops = &cgops;
Dylan Reid837c74a2016-01-22 17:25:21 -0800244
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700245 self->rootfs = strdup(mkdtemp(temp_template));
Dylan Reid837c74a2016-01-22 17:25:21 -0800246
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700247 kill_called = 0;
248 minijail_alt_syscall_table = nullptr;
249 minijail_ipc_called = 0;
250 minijail_vfs_called = 0;
251 minijail_net_called = 0;
252 minijail_pids_called = 0;
253 minijail_run_as_init_called = 0;
254 minijail_user_called = 0;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700255 minijail_cgroups_called = 0;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700256 minijail_wait_called = 0;
257 minijail_reset_signal_mask_called = 0;
258 mount_ret = 0;
259 stat_rdev_ret = makedev(2, 3);
Dylan Reid837c74a2016-01-22 17:25:21 -0800260
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700261 snprintf(path, sizeof(path), "%s/dev", self->rootfs);
Dylan Reid837c74a2016-01-22 17:25:21 -0800262
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700263 self->mount_flags = MS_NOSUID | MS_NODEV | MS_NOEXEC;
Dylan Reid837c74a2016-01-22 17:25:21 -0800264
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700265 self->config.reset(new libcontainer::Config());
266 container_config_uid_map(self->config->get(), "0 0 4294967295");
267 container_config_gid_map(self->config->get(), "0 0 4294967295");
268 container_config_rootfs(self->config->get(), self->rootfs);
269 container_config_program_argv(self->config->get(), pargs, 1);
270 container_config_alt_syscall_table(self->config->get(), "testsyscalltable");
271 container_config_add_mount(self->config->get(),
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700272 "testtmpfs",
273 "tmpfs",
274 "/tmp",
275 "tmpfs",
276 nullptr,
277 nullptr,
278 self->mount_flags,
279 0,
280 1000,
281 1000,
282 0x666,
283 0,
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700284 0);
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700285 container_config_add_device(self->config->get(),
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700286 'c',
287 "/dev/foo",
288 S_IRWXU | S_IRWXG,
289 245,
290 2,
291 0,
292 1000,
293 1001,
294 1,
295 1,
296 0);
297 /* test dynamic minor on /dev/null */
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700298 container_config_add_device(self->config->get(),
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700299 'c',
300 "/dev/null",
301 S_IRWXU | S_IRWXG,
302 1,
303 -1,
304 1,
305 1000,
306 1001,
307 1,
308 1,
309 0);
Dylan Reid837c74a2016-01-22 17:25:21 -0800310
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700311 container_config_set_cpu_shares(self->config->get(), TEST_CPU_SHARES);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700312 container_config_set_cpu_cfs_params(
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700313 self->config->get(), TEST_CPU_QUOTA, TEST_CPU_PERIOD);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700314 /* Invalid params, so this won't be applied. */
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700315 container_config_set_cpu_rt_params(self->config->get(), 20000, 20000);
Chinyue Chenfac909e2016-06-24 14:17:42 +0800316
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700317 rundir = mkdtemp(rundir_template);
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700318 self->container.reset(
319 new libcontainer::Container("containerUT", base::FilePath(rundir)));
320 ASSERT_NE(nullptr, self->container->get());
Dylan Reid837c74a2016-01-22 17:25:21 -0800321}
322
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700323FIXTURE_TEARDOWN(container_test) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700324 char path[256];
325 int i;
Dylan Reid837c74a2016-01-22 17:25:21 -0800326
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700327 self->container.reset();
328 self->config.reset();
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700329 snprintf(path, sizeof(path), "rm -rf %s", self->rootfs);
330 EXPECT_EQ(0, system(path));
331 free(self->rootfs);
Dylan Reid837c74a2016-01-22 17:25:21 -0800332
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700333 for (i = 0; i < mount_called; i++) {
334 free(mount_call_args[i].source);
335 free(mount_call_args[i].target);
336 free(mount_call_args[i].filesystemtype);
337 }
Dylan Reid837c74a2016-01-22 17:25:21 -0800338}
339
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700340TEST_F(container_test, test_mount_tmp_start) {
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700341 ASSERT_EQ(0, container_start(self->container->get(), self->config->get()));
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700342 ASSERT_EQ(2, mount_called);
343 EXPECT_EQ(false, mount_call_args[1].outside_mount);
344 EXPECT_STREQ("tmpfs", mount_call_args[1].source);
345 EXPECT_STREQ("/tmp", mount_call_args[1].target);
346 EXPECT_STREQ("tmpfs", mount_call_args[1].filesystemtype);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700347 EXPECT_EQ(mount_call_args[1].mountflags,
348 static_cast<unsigned long>(self->mount_flags));
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700349 EXPECT_EQ(nullptr, mount_call_args[1].data);
Dylan Reid837c74a2016-01-22 17:25:21 -0800350
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700351 EXPECT_EQ(1, minijail_ipc_called);
352 EXPECT_EQ(1, minijail_vfs_called);
353 EXPECT_EQ(1, minijail_net_called);
354 EXPECT_EQ(1, minijail_pids_called);
355 EXPECT_EQ(1, minijail_user_called);
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700356 EXPECT_EQ(1, minijail_cgroups_called);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700357 EXPECT_EQ(1, minijail_run_as_init_called);
358 EXPECT_EQ(1, gmcg.deny_all_devs_called_count);
Dylan Reid837c74a2016-01-22 17:25:21 -0800359
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700360 ASSERT_EQ(2, gmcg.add_dev_called_count);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700361 EXPECT_EQ(1, gmcg.add_dev_allow[0]);
362 EXPECT_EQ(245, gmcg.add_dev_major[0]);
363 EXPECT_EQ(2, gmcg.add_dev_minor[0]);
364 EXPECT_EQ(1, gmcg.add_dev_read[0]);
365 EXPECT_EQ(1, gmcg.add_dev_write[0]);
366 EXPECT_EQ(0, gmcg.add_dev_modify[0]);
367 EXPECT_EQ('c', gmcg.add_dev_type[0]);
Dylan Reid355d5e42016-04-29 16:53:31 -0700368
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700369 EXPECT_EQ(1, gmcg.add_dev_allow[1]);
370 EXPECT_EQ(1, gmcg.add_dev_major[1]);
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700371 EXPECT_EQ(-1, gmcg.add_dev_minor[1]);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700372 EXPECT_EQ(1, gmcg.add_dev_read[1]);
373 EXPECT_EQ(1, gmcg.add_dev_write[1]);
374 EXPECT_EQ(0, gmcg.add_dev_modify[1]);
375 EXPECT_EQ('c', gmcg.add_dev_type[1]);
Dylan Reid837c74a2016-01-22 17:25:21 -0800376
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700377 ASSERT_EQ(true, mknod_called);
Luis Hector Chavezeac13c82017-09-21 20:53:59 -0700378 base::FilePath node_path = mkdtemp_root.Append("root/dev/null");
379 EXPECT_STREQ(node_path.value().c_str(),
Manoj Guptaea9a50b2017-09-20 21:06:43 -0700380 mknod_call_args.pathname.value().c_str());
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700381 EXPECT_EQ(mknod_call_args.mode,
382 static_cast<mode_t>(S_IRWXU | S_IRWXG | S_IFCHR));
383 EXPECT_EQ(mknod_call_args.dev, makedev(1, 3));
Chinyue Chen03c54ae2016-06-29 12:29:10 +0800384
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700385 EXPECT_EQ(1, gmcg.set_cpu_shares_count);
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700386 EXPECT_EQ(TEST_CPU_SHARES,
387 container_config_get_cpu_shares(self->config->get()));
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700388 EXPECT_EQ(1, gmcg.set_cpu_quota_count);
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700389 EXPECT_EQ(TEST_CPU_QUOTA,
390 container_config_get_cpu_quota(self->config->get()));
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700391 EXPECT_EQ(1, gmcg.set_cpu_period_count);
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700392 EXPECT_EQ(TEST_CPU_PERIOD,
393 container_config_get_cpu_period(self->config->get()));
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700394 EXPECT_EQ(0, gmcg.set_cpu_rt_runtime_count);
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700395 EXPECT_EQ(0, container_config_get_cpu_rt_runtime(self->config->get()));
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700396 EXPECT_EQ(0, gmcg.set_cpu_rt_period_count);
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700397 EXPECT_EQ(0, container_config_get_cpu_rt_period(self->config->get()));
Chinyue Chenfac909e2016-06-24 14:17:42 +0800398
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700399 ASSERT_NE(nullptr, minijail_alt_syscall_table);
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700400 EXPECT_STREQ("testsyscalltable", minijail_alt_syscall_table);
Dylan Reid837c74a2016-01-22 17:25:21 -0800401
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700402 EXPECT_EQ(0, container_wait(self->container->get()));
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700403 EXPECT_EQ(1, minijail_wait_called);
404 EXPECT_EQ(1, minijail_reset_signal_mask_called);
Dylan Reid837c74a2016-01-22 17:25:21 -0800405}
406
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700407TEST_F(container_test, test_kill_container) {
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700408 ASSERT_EQ(0, container_start(self->container->get(), self->config->get()));
409 EXPECT_EQ(0, container_kill(self->container->get()));
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700410 EXPECT_EQ(1, kill_called);
411 EXPECT_EQ(SIGKILL, kill_sig);
412 EXPECT_EQ(1, minijail_wait_called);
Dylan Reid837c74a2016-01-22 17:25:21 -0800413}
414
415/* libc stubs so the UT doesn't need root to call mount, etc. */
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700416extern "C" {
417
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700418int mount(const char* source,
419 const char* target,
420 const char* filesystemtype,
421 unsigned long mountflags,
422 const void* data) {
423 if (mount_called >= 5)
424 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800425
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700426 mount_call_args[mount_called].source = strdup(source);
427 mount_call_args[mount_called].target = strdup(target);
428 mount_call_args[mount_called].filesystemtype = strdup(filesystemtype);
429 mount_call_args[mount_called].mountflags = mountflags;
430 mount_call_args[mount_called].data = data;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700431 mount_call_args[mount_called].outside_mount = true;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700432 ++mount_called;
433 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800434}
435
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700436int umount(const char* target) {
437 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800438}
439
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700440int umount2(const char* target, int flags) {
441 return 0;
442}
443
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700444#ifdef __USE_EXTERN_INLINES
445/* Some environments use an inline version of mknod. */
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700446int __xmknod(int ver, const char* pathname, __mode_t mode, __dev_t* dev)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700447#else
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700448int mknod(const char* pathname, mode_t mode, dev_t dev)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700449#endif
Dylan Reid837c74a2016-01-22 17:25:21 -0800450{
Luis Hector Chavez5381d002017-09-16 12:54:24 -0700451 mknod_call_args.pathname = base::FilePath(pathname);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700452 mknod_call_args.mode = mode;
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700453#ifdef __USE_EXTERN_INLINES
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700454 mknod_call_args.dev = *dev;
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700455#else
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700456 mknod_call_args.dev = dev;
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700457#endif
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700458 mknod_called = true;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700459 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800460}
461
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700462int chown(const char* path, uid_t owner, gid_t group) {
463 return 0;
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700464}
Dylan Reid837c74a2016-01-22 17:25:21 -0800465
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700466int kill(pid_t pid, int sig) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700467 ++kill_called;
468 kill_sig = sig;
469 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800470}
471
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700472#ifdef __USE_EXTERN_INLINES
473/* Some environments use an inline version of stat. */
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700474int __xstat(int ver, const char* path, struct stat* buf)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700475#else
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700476int stat(const char* path, struct stat* buf)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700477#endif
Dylan Reid837c74a2016-01-22 17:25:21 -0800478{
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700479 buf->st_rdev = stat_rdev_ret;
480 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800481}
482
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700483int chmod(const char* path, mode_t mode) {
484 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800485}
486
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700487char* mkdtemp(char* template_string) {
Luis Hector Chavez5381d002017-09-16 12:54:24 -0700488 mkdtemp_root = base::FilePath(template_string);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700489 return template_string;
Dylan Reid837c74a2016-01-22 17:25:21 -0800490}
491
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700492int mkdir(const char* pathname, mode_t mode) {
493 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800494}
495
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700496int rmdir(const char* pathname) {
497 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800498}
499
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700500int unlink(const char* pathname) {
501 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800502}
503
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700504uid_t getuid(void) {
505 return 0;
506}
507
Dylan Reid837c74a2016-01-22 17:25:21 -0800508/* Minijail stubs */
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700509struct minijail* minijail_new(void) {
510 return (struct minijail*)0x55;
Chinyue Chen03c54ae2016-06-29 12:29:10 +0800511}
512
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700513void minijail_destroy(struct minijail* j) {}
514
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700515int minijail_mount_with_data(struct minijail* j,
516 const char* source,
517 const char* target,
518 const char* filesystemtype,
519 unsigned long mountflags,
520 const char* data) {
521 if (mount_called >= 5)
522 return 0;
523
524 mount_call_args[mount_called].source = strdup(source);
525 mount_call_args[mount_called].target = strdup(target);
526 mount_call_args[mount_called].filesystemtype = strdup(filesystemtype);
527 mount_call_args[mount_called].mountflags = mountflags;
528 mount_call_args[mount_called].data = data;
529 mount_call_args[mount_called].outside_mount = false;
530 ++mount_called;
531 return 0;
532}
533
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700534void minijail_namespace_user_disable_setgroups(struct minijail* j) {}
Dylan Reid837c74a2016-01-22 17:25:21 -0800535
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700536void minijail_namespace_vfs(struct minijail* j) {
537 ++minijail_vfs_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800538}
539
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700540void minijail_namespace_ipc(struct minijail* j) {
541 ++minijail_ipc_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800542}
543
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700544void minijail_namespace_net(struct minijail* j) {
545 ++minijail_net_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800546}
547
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700548void minijail_namespace_pids(struct minijail* j) {
549 ++minijail_pids_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800550}
551
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700552void minijail_namespace_user(struct minijail* j) {
553 ++minijail_user_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800554}
555
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700556void minijail_namespace_cgroups(struct minijail* j) {
557 ++minijail_cgroups_called;
558}
559
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700560int minijail_uidmap(struct minijail* j, const char* uidmap) {
561 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800562}
563
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700564int minijail_gidmap(struct minijail* j, const char* gidmap) {
565 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800566}
567
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700568int minijail_enter_pivot_root(struct minijail* j, const char* dir) {
569 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800570}
571
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700572void minijail_run_as_init(struct minijail* j) {
573 ++minijail_run_as_init_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800574}
575
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700576int minijail_run_pid_pipes_no_preload(struct minijail* j,
577 const char* filename,
578 char* const argv[],
579 pid_t* pchild_pid,
580 int* pstdin_fd,
581 int* pstdout_fd,
582 int* pstderr_fd) {
583 *pchild_pid = INIT_TEST_PID;
584 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800585}
586
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700587int minijail_write_pid_file(struct minijail* j, const char* path) {
588 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800589}
590
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700591int minijail_wait(struct minijail* j) {
592 ++minijail_wait_called;
593 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800594}
595
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700596int minijail_use_alt_syscall(struct minijail* j, const char* table) {
597 minijail_alt_syscall_table = table;
598 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800599}
600
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700601int minijail_add_to_cgroup(struct minijail* j, const char* cg_path) {
602 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800603}
604
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700605void minijail_reset_signal_mask(struct minijail* j) {
606 ++minijail_reset_signal_mask_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800607}
608
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700609void minijail_skip_remount_private(struct minijail* j) {}
Dylan Reid837c74a2016-01-22 17:25:21 -0800610
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700611void minijail_close_open_fds(struct minijail* j) {}
612
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700613} // extern "C"
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700614
Dylan Reid837c74a2016-01-22 17:25:21 -0800615TEST_HARNESS_MAIN