blob: 7dcc2a662b96b01f074386c9cfa41d5fdcfb7f75 [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>
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -070014#include <vector>
Luis Hector Chavezedec56e2017-09-19 15:43:53 -070015
Luis Hector Chavez5381d002017-09-16 12:54:24 -070016#include <base/files/file_path.h>
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -070017#include <base/memory/ptr_util.h>
Luis Hector Chavez5381d002017-09-16 12:54:24 -070018
Luis Hector Chavez836d7b22017-09-14 15:11:15 -070019#include "libcontainer/test_harness.h"
Dylan Reid837c74a2016-01-22 17:25:21 -080020
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -070021#include "libcontainer/cgroup.h"
22#include "libcontainer/config.h"
23#include "libcontainer/container.h"
Luis Hector Chavez836d7b22017-09-14 15:11:15 -070024#include "libcontainer/libcontainer.h"
Luis Hector Chavez835d39e2017-09-19 15:16:31 -070025#include "libcontainer/libcontainer_util.h"
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -070026
27namespace {
28
29struct MockCgroupState {
30 struct AddedDevice {
31 bool allow;
32 int major;
33 int minor;
34 bool read;
35 bool write;
36 bool modify;
37 char type;
38 };
39
40 int freeze_ret;
41 int thaw_ret;
42 int deny_all_devs_ret;
43 int add_device_ret;
44 int set_cpu_ret;
45
46 int init_called_count;
47 int deny_all_devs_called_count;
48
49 std::vector<AddedDevice> added_devices;
50
51 int set_cpu_shares_count;
52 int set_cpu_quota_count;
53 int set_cpu_period_count;
54 int set_cpu_rt_runtime_count;
55 int set_cpu_rt_period_count;
56};
57MockCgroupState* g_mock_cgroup_state = nullptr;
58
59class MockCgroup : public libcontainer::Cgroup {
60 public:
61 explicit MockCgroup(MockCgroupState* state) : state_(state) {}
62 ~MockCgroup() = default;
63
64 static std::unique_ptr<libcontainer::Cgroup> Create(
65 base::StringPiece name,
66 const base::FilePath& cgroup_root,
67 const base::FilePath& cgroup_parent,
68 uid_t cgroup_owner,
69 gid_t cgroup_group) {
70 return base::MakeUnique<MockCgroup>(g_mock_cgroup_state);
71 }
72
73 int Freeze() override { return state_->freeze_ret; }
74
75 int Thaw() override { return state_->thaw_ret; }
76
77 int DenyAllDevices() override {
78 ++state_->deny_all_devs_called_count;
79 return state_->deny_all_devs_ret;
80 }
81
82 int AddDevice(bool allow,
83 int major,
84 int minor,
85 bool read,
86 bool write,
87 bool modify,
88 char type) override {
89 state_->added_devices.emplace_back(MockCgroupState::AddedDevice{
90 allow, major, minor, read, write, modify, type});
91 return state_->add_device_ret;
92 }
93
94 int SetCpuShares(int shares) override {
95 state_->set_cpu_shares_count++;
96 return state_->set_cpu_ret;
97 }
98
99 int SetCpuQuota(int quota) override {
100 state_->set_cpu_quota_count++;
101 return state_->set_cpu_ret;
102 }
103
104 int SetCpuPeriod(int period) override {
105 state_->set_cpu_period_count++;
106 return state_->set_cpu_ret;
107 }
108
109 int SetCpuRtRuntime(int rt_runtime) override {
110 state_->set_cpu_rt_runtime_count++;
111 return state_->set_cpu_ret;
112 }
113
114 int SetCpuRtPeriod(int rt_period) override {
115 state_->set_cpu_rt_period_count++;
116 return state_->set_cpu_ret;
117 }
118
119 private:
120 MockCgroupState* const state_;
121
122 DISALLOW_COPY_AND_ASSIGN(MockCgroup);
123};
124
125} // namespace
Dylan Reid837c74a2016-01-22 17:25:21 -0800126
127static const pid_t INIT_TEST_PID = 5555;
Chinyue Chen4f3fd682016-07-01 14:11:42 +0800128static const int TEST_CPU_SHARES = 200;
129static const int TEST_CPU_QUOTA = 20000;
130static const int TEST_CPU_PERIOD = 50000;
Dylan Reid837c74a2016-01-22 17:25:21 -0800131
132struct mount_args {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700133 char* source;
134 char* target;
135 char* filesystemtype;
136 unsigned long mountflags;
137 const void* data;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700138 bool outside_mount;
Dylan Reid837c74a2016-01-22 17:25:21 -0800139};
140static struct mount_args mount_call_args[5];
141static int mount_called;
142
143struct mknod_args {
Luis Hector Chavez5381d002017-09-16 12:54:24 -0700144 base::FilePath pathname;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700145 mode_t mode;
146 dev_t dev;
Dylan Reid837c74a2016-01-22 17:25:21 -0800147};
148static struct mknod_args mknod_call_args;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700149static bool mknod_called;
Chinyue Chen03c54ae2016-06-29 12:29:10 +0800150static dev_t stat_rdev_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -0800151
152static int kill_called;
153static int kill_sig;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700154static const char* minijail_alt_syscall_table;
Dylan Reid837c74a2016-01-22 17:25:21 -0800155static int minijail_ipc_called;
156static int minijail_vfs_called;
157static int minijail_net_called;
158static int minijail_pids_called;
159static int minijail_run_as_init_called;
160static int minijail_user_called;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700161static int minijail_cgroups_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800162static int minijail_wait_called;
163static int minijail_reset_signal_mask_called;
164static int mount_ret;
Luis Hector Chavez5381d002017-09-16 12:54:24 -0700165static base::FilePath mkdtemp_root;
Dylan Reid837c74a2016-01-22 17:25:21 -0800166
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700167TEST(premounted_runfs) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700168 char premounted_runfs[] = "/tmp/cgtest_run/root";
169 struct container_config* config = container_config_create();
170 ASSERT_NE(nullptr, config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700171
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700172 container_config_premounted_runfs(config, premounted_runfs);
173 const char* result = container_config_get_premounted_runfs(config);
174 ASSERT_EQ(0, strcmp(result, premounted_runfs));
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700175
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700176 container_config_destroy(config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700177}
178
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700179TEST(pid_file_path) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700180 char pid_file_path[] = "/tmp/cgtest_run/root/container.pid";
181 struct container_config* config = container_config_create();
182 ASSERT_NE(nullptr, config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700183
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700184 container_config_pid_file(config, pid_file_path);
185 const char* result = container_config_get_pid_file(config);
186 ASSERT_EQ(0, strcmp(result, pid_file_path));
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700187
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700188 container_config_destroy(config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700189}
190
Luis Hector Chavez835d39e2017-09-19 15:16:31 -0700191TEST(plog_preserve) {
192 errno = EPERM;
193 PLOG_PRESERVE(ERROR) << "This is an expected error log";
194 ASSERT_EQ(EPERM, errno);
195}
196
Dylan Reid837c74a2016-01-22 17:25:21 -0800197/* Start of tests. */
198FIXTURE(container_test) {
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700199 std::unique_ptr<libcontainer::Config> config;
200 std::unique_ptr<libcontainer::Container> container;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700201 int mount_flags;
202 char* rootfs;
Dylan Reid837c74a2016-01-22 17:25:21 -0800203};
204
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700205FIXTURE_SETUP(container_test) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700206 char temp_template[] = "/tmp/cgtestXXXXXX";
207 char rundir_template[] = "/tmp/cgtest_runXXXXXX";
208 char* rundir;
209 char path[256];
210 const char* pargs[] = {
211 "/sbin/init",
212 };
Dylan Reid837c74a2016-01-22 17:25:21 -0800213
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700214 g_mock_cgroup_state = new MockCgroupState();
215 libcontainer::Cgroup::SetCgroupFactoryForTesting(&MockCgroup::Create);
216
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700217 memset(&mount_call_args, 0, sizeof(mount_call_args));
218 mount_called = 0;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700219 mknod_called = false;
Dylan Reid837c74a2016-01-22 17:25:21 -0800220
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700221 self->rootfs = strdup(mkdtemp(temp_template));
Dylan Reid837c74a2016-01-22 17:25:21 -0800222
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700223 kill_called = 0;
224 minijail_alt_syscall_table = nullptr;
225 minijail_ipc_called = 0;
226 minijail_vfs_called = 0;
227 minijail_net_called = 0;
228 minijail_pids_called = 0;
229 minijail_run_as_init_called = 0;
230 minijail_user_called = 0;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700231 minijail_cgroups_called = 0;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700232 minijail_wait_called = 0;
233 minijail_reset_signal_mask_called = 0;
234 mount_ret = 0;
235 stat_rdev_ret = makedev(2, 3);
Dylan Reid837c74a2016-01-22 17:25:21 -0800236
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700237 snprintf(path, sizeof(path), "%s/dev", self->rootfs);
Dylan Reid837c74a2016-01-22 17:25:21 -0800238
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700239 self->mount_flags = MS_NOSUID | MS_NODEV | MS_NOEXEC;
Dylan Reid837c74a2016-01-22 17:25:21 -0800240
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700241 self->config.reset(new libcontainer::Config());
242 container_config_uid_map(self->config->get(), "0 0 4294967295");
243 container_config_gid_map(self->config->get(), "0 0 4294967295");
244 container_config_rootfs(self->config->get(), self->rootfs);
245 container_config_program_argv(self->config->get(), pargs, 1);
246 container_config_alt_syscall_table(self->config->get(), "testsyscalltable");
247 container_config_add_mount(self->config->get(),
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700248 "testtmpfs",
249 "tmpfs",
250 "/tmp",
251 "tmpfs",
252 nullptr,
253 nullptr,
254 self->mount_flags,
255 0,
256 1000,
257 1000,
258 0x666,
259 0,
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700260 0);
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700261 container_config_add_device(self->config->get(),
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700262 'c',
263 "/dev/foo",
264 S_IRWXU | S_IRWXG,
265 245,
266 2,
267 0,
268 1000,
269 1001,
270 1,
271 1,
272 0);
273 /* test dynamic minor on /dev/null */
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700274 container_config_add_device(self->config->get(),
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700275 'c',
276 "/dev/null",
277 S_IRWXU | S_IRWXG,
278 1,
279 -1,
280 1,
281 1000,
282 1001,
283 1,
284 1,
285 0);
Dylan Reid837c74a2016-01-22 17:25:21 -0800286
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700287 container_config_set_cpu_shares(self->config->get(), TEST_CPU_SHARES);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700288 container_config_set_cpu_cfs_params(
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700289 self->config->get(), TEST_CPU_QUOTA, TEST_CPU_PERIOD);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700290 /* Invalid params, so this won't be applied. */
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700291 container_config_set_cpu_rt_params(self->config->get(), 20000, 20000);
Chinyue Chenfac909e2016-06-24 14:17:42 +0800292
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700293 rundir = mkdtemp(rundir_template);
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700294 self->container.reset(
295 new libcontainer::Container("containerUT", base::FilePath(rundir)));
296 ASSERT_NE(nullptr, self->container->get());
Dylan Reid837c74a2016-01-22 17:25:21 -0800297}
298
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700299FIXTURE_TEARDOWN(container_test) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700300 char path[256];
301 int i;
Dylan Reid837c74a2016-01-22 17:25:21 -0800302
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700303 self->container.reset();
304 self->config.reset();
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700305 snprintf(path, sizeof(path), "rm -rf %s", self->rootfs);
306 EXPECT_EQ(0, system(path));
307 free(self->rootfs);
Dylan Reid837c74a2016-01-22 17:25:21 -0800308
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700309 for (i = 0; i < mount_called; i++) {
310 free(mount_call_args[i].source);
311 free(mount_call_args[i].target);
312 free(mount_call_args[i].filesystemtype);
313 }
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700314
315 libcontainer::Cgroup::SetCgroupFactoryForTesting(nullptr);
316 delete g_mock_cgroup_state;
Dylan Reid837c74a2016-01-22 17:25:21 -0800317}
318
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700319TEST_F(container_test, test_mount_tmp_start) {
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700320 ASSERT_EQ(0, container_start(self->container->get(), self->config->get()));
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700321 ASSERT_EQ(2, mount_called);
322 EXPECT_EQ(false, mount_call_args[1].outside_mount);
323 EXPECT_STREQ("tmpfs", mount_call_args[1].source);
324 EXPECT_STREQ("/tmp", mount_call_args[1].target);
325 EXPECT_STREQ("tmpfs", mount_call_args[1].filesystemtype);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700326 EXPECT_EQ(mount_call_args[1].mountflags,
327 static_cast<unsigned long>(self->mount_flags));
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700328 EXPECT_EQ(nullptr, mount_call_args[1].data);
Dylan Reid837c74a2016-01-22 17:25:21 -0800329
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700330 EXPECT_EQ(1, minijail_ipc_called);
331 EXPECT_EQ(1, minijail_vfs_called);
332 EXPECT_EQ(1, minijail_net_called);
333 EXPECT_EQ(1, minijail_pids_called);
334 EXPECT_EQ(1, minijail_user_called);
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700335 EXPECT_EQ(1, minijail_cgroups_called);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700336 EXPECT_EQ(1, minijail_run_as_init_called);
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700337 EXPECT_EQ(1, g_mock_cgroup_state->deny_all_devs_called_count);
Dylan Reid837c74a2016-01-22 17:25:21 -0800338
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700339 ASSERT_EQ(2, g_mock_cgroup_state->added_devices.size());
340 EXPECT_EQ(1, g_mock_cgroup_state->added_devices[0].allow);
341 EXPECT_EQ(245, g_mock_cgroup_state->added_devices[0].major);
342 EXPECT_EQ(2, g_mock_cgroup_state->added_devices[0].minor);
343 EXPECT_EQ(1, g_mock_cgroup_state->added_devices[0].read);
344 EXPECT_EQ(1, g_mock_cgroup_state->added_devices[0].write);
345 EXPECT_EQ(0, g_mock_cgroup_state->added_devices[0].modify);
346 EXPECT_EQ('c', g_mock_cgroup_state->added_devices[0].type);
Dylan Reid355d5e42016-04-29 16:53:31 -0700347
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700348 EXPECT_EQ(1, g_mock_cgroup_state->added_devices[1].allow);
349 EXPECT_EQ(1, g_mock_cgroup_state->added_devices[1].major);
350 EXPECT_EQ(-1, g_mock_cgroup_state->added_devices[1].minor);
351 EXPECT_EQ(1, g_mock_cgroup_state->added_devices[1].read);
352 EXPECT_EQ(1, g_mock_cgroup_state->added_devices[1].write);
353 EXPECT_EQ(0, g_mock_cgroup_state->added_devices[1].modify);
354 EXPECT_EQ('c', g_mock_cgroup_state->added_devices[1].type);
Dylan Reid837c74a2016-01-22 17:25:21 -0800355
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700356 ASSERT_EQ(true, mknod_called);
Luis Hector Chavezeac13c82017-09-21 20:53:59 -0700357 base::FilePath node_path = mkdtemp_root.Append("root/dev/null");
358 EXPECT_STREQ(node_path.value().c_str(),
Manoj Guptaea9a50b2017-09-20 21:06:43 -0700359 mknod_call_args.pathname.value().c_str());
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700360 EXPECT_EQ(mknod_call_args.mode,
361 static_cast<mode_t>(S_IRWXU | S_IRWXG | S_IFCHR));
362 EXPECT_EQ(mknod_call_args.dev, makedev(1, 3));
Chinyue Chen03c54ae2016-06-29 12:29:10 +0800363
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700364 EXPECT_EQ(1, g_mock_cgroup_state->set_cpu_shares_count);
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700365 EXPECT_EQ(TEST_CPU_SHARES,
366 container_config_get_cpu_shares(self->config->get()));
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700367 EXPECT_EQ(1, g_mock_cgroup_state->set_cpu_quota_count);
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700368 EXPECT_EQ(TEST_CPU_QUOTA,
369 container_config_get_cpu_quota(self->config->get()));
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700370 EXPECT_EQ(1, g_mock_cgroup_state->set_cpu_period_count);
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700371 EXPECT_EQ(TEST_CPU_PERIOD,
372 container_config_get_cpu_period(self->config->get()));
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700373 EXPECT_EQ(0, g_mock_cgroup_state->set_cpu_rt_runtime_count);
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700374 EXPECT_EQ(0, container_config_get_cpu_rt_runtime(self->config->get()));
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700375 EXPECT_EQ(0, g_mock_cgroup_state->set_cpu_rt_period_count);
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700376 EXPECT_EQ(0, container_config_get_cpu_rt_period(self->config->get()));
Chinyue Chenfac909e2016-06-24 14:17:42 +0800377
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700378 ASSERT_NE(nullptr, minijail_alt_syscall_table);
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700379 EXPECT_STREQ("testsyscalltable", minijail_alt_syscall_table);
Dylan Reid837c74a2016-01-22 17:25:21 -0800380
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700381 EXPECT_EQ(0, container_wait(self->container->get()));
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700382 EXPECT_EQ(1, minijail_wait_called);
383 EXPECT_EQ(1, minijail_reset_signal_mask_called);
Dylan Reid837c74a2016-01-22 17:25:21 -0800384}
385
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700386TEST_F(container_test, test_kill_container) {
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700387 ASSERT_EQ(0, container_start(self->container->get(), self->config->get()));
388 EXPECT_EQ(0, container_kill(self->container->get()));
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700389 EXPECT_EQ(1, kill_called);
390 EXPECT_EQ(SIGKILL, kill_sig);
391 EXPECT_EQ(1, minijail_wait_called);
Dylan Reid837c74a2016-01-22 17:25:21 -0800392}
393
394/* libc stubs so the UT doesn't need root to call mount, etc. */
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700395extern "C" {
396
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700397int mount(const char* source,
398 const char* target,
399 const char* filesystemtype,
400 unsigned long mountflags,
401 const void* data) {
402 if (mount_called >= 5)
403 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800404
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700405 mount_call_args[mount_called].source = strdup(source);
406 mount_call_args[mount_called].target = strdup(target);
407 mount_call_args[mount_called].filesystemtype = strdup(filesystemtype);
408 mount_call_args[mount_called].mountflags = mountflags;
409 mount_call_args[mount_called].data = data;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700410 mount_call_args[mount_called].outside_mount = true;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700411 ++mount_called;
412 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800413}
414
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700415int umount(const char* target) {
416 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800417}
418
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700419int umount2(const char* target, int flags) {
420 return 0;
421}
422
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700423#ifdef __USE_EXTERN_INLINES
424/* Some environments use an inline version of mknod. */
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700425int __xmknod(int ver, const char* pathname, __mode_t mode, __dev_t* dev)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700426#else
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700427int mknod(const char* pathname, mode_t mode, dev_t dev)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700428#endif
Dylan Reid837c74a2016-01-22 17:25:21 -0800429{
Luis Hector Chavez5381d002017-09-16 12:54:24 -0700430 mknod_call_args.pathname = base::FilePath(pathname);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700431 mknod_call_args.mode = mode;
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700432#ifdef __USE_EXTERN_INLINES
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700433 mknod_call_args.dev = *dev;
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700434#else
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700435 mknod_call_args.dev = dev;
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700436#endif
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700437 mknod_called = true;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700438 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800439}
440
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700441int chown(const char* path, uid_t owner, gid_t group) {
442 return 0;
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700443}
Dylan Reid837c74a2016-01-22 17:25:21 -0800444
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700445int kill(pid_t pid, int sig) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700446 ++kill_called;
447 kill_sig = sig;
448 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800449}
450
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700451#ifdef __USE_EXTERN_INLINES
452/* Some environments use an inline version of stat. */
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700453int __xstat(int ver, const char* path, struct stat* buf)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700454#else
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700455int stat(const char* path, struct stat* buf)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700456#endif
Dylan Reid837c74a2016-01-22 17:25:21 -0800457{
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700458 buf->st_rdev = stat_rdev_ret;
459 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800460}
461
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700462int chmod(const char* path, mode_t mode) {
463 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800464}
465
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700466char* mkdtemp(char* template_string) {
Luis Hector Chavez5381d002017-09-16 12:54:24 -0700467 mkdtemp_root = base::FilePath(template_string);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700468 return template_string;
Dylan Reid837c74a2016-01-22 17:25:21 -0800469}
470
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700471int mkdir(const char* pathname, mode_t mode) {
472 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800473}
474
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700475int rmdir(const char* pathname) {
476 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800477}
478
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700479int unlink(const char* pathname) {
480 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800481}
482
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700483uid_t getuid(void) {
484 return 0;
485}
486
Dylan Reid837c74a2016-01-22 17:25:21 -0800487/* Minijail stubs */
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700488struct minijail* minijail_new(void) {
489 return (struct minijail*)0x55;
Chinyue Chen03c54ae2016-06-29 12:29:10 +0800490}
491
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700492void minijail_destroy(struct minijail* j) {}
493
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700494int minijail_mount_with_data(struct minijail* j,
495 const char* source,
496 const char* target,
497 const char* filesystemtype,
498 unsigned long mountflags,
499 const char* data) {
500 if (mount_called >= 5)
501 return 0;
502
503 mount_call_args[mount_called].source = strdup(source);
504 mount_call_args[mount_called].target = strdup(target);
505 mount_call_args[mount_called].filesystemtype = strdup(filesystemtype);
506 mount_call_args[mount_called].mountflags = mountflags;
507 mount_call_args[mount_called].data = data;
508 mount_call_args[mount_called].outside_mount = false;
509 ++mount_called;
510 return 0;
511}
512
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700513void minijail_namespace_user_disable_setgroups(struct minijail* j) {}
Dylan Reid837c74a2016-01-22 17:25:21 -0800514
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700515void minijail_namespace_vfs(struct minijail* j) {
516 ++minijail_vfs_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800517}
518
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700519void minijail_namespace_ipc(struct minijail* j) {
520 ++minijail_ipc_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800521}
522
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700523void minijail_namespace_net(struct minijail* j) {
524 ++minijail_net_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800525}
526
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700527void minijail_namespace_pids(struct minijail* j) {
528 ++minijail_pids_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800529}
530
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700531void minijail_namespace_user(struct minijail* j) {
532 ++minijail_user_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800533}
534
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700535void minijail_namespace_cgroups(struct minijail* j) {
536 ++minijail_cgroups_called;
537}
538
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700539int minijail_uidmap(struct minijail* j, const char* uidmap) {
540 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800541}
542
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700543int minijail_gidmap(struct minijail* j, const char* gidmap) {
544 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800545}
546
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700547int minijail_enter_pivot_root(struct minijail* j, const char* dir) {
548 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800549}
550
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700551void minijail_run_as_init(struct minijail* j) {
552 ++minijail_run_as_init_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800553}
554
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700555int minijail_run_pid_pipes_no_preload(struct minijail* j,
556 const char* filename,
557 char* const argv[],
558 pid_t* pchild_pid,
559 int* pstdin_fd,
560 int* pstdout_fd,
561 int* pstderr_fd) {
562 *pchild_pid = INIT_TEST_PID;
563 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800564}
565
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700566int minijail_write_pid_file(struct minijail* j, const char* path) {
567 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800568}
569
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700570int minijail_wait(struct minijail* j) {
571 ++minijail_wait_called;
572 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800573}
574
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700575int minijail_use_alt_syscall(struct minijail* j, const char* table) {
576 minijail_alt_syscall_table = table;
577 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800578}
579
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700580int minijail_add_to_cgroup(struct minijail* j, const char* cg_path) {
581 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800582}
583
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700584void minijail_reset_signal_mask(struct minijail* j) {
585 ++minijail_reset_signal_mask_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800586}
587
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700588void minijail_skip_remount_private(struct minijail* j) {}
Dylan Reid837c74a2016-01-22 17:25:21 -0800589
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700590void minijail_close_open_fds(struct minijail* j) {}
591
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700592} // extern "C"
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700593
Dylan Reid837c74a2016-01-22 17:25:21 -0800594TEST_HARNESS_MAIN