blob: c315d76ab816a48d068e0620ce99215136917f59 [file] [log] [blame]
Luis Hector Chavez58725a82017-09-19 21:14:17 -07001// 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.
Dylan Reid837c74a2016-01-22 17:25:21 -08004
Dylan Reid837c74a2016-01-22 17:25:21 -08005#include <errno.h>
6#include <signal.h>
7#include <sys/mount.h>
8#include <sys/stat.h>
9#include <sys/types.h>
10#include <unistd.h>
11
Luis Hector Chavezedec56e2017-09-19 15:43:53 -070012#include <memory>
Luis Hector Chavez58725a82017-09-19 21:14:17 -070013#include <string>
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 Chavez58725a82017-09-19 21:14:17 -070017#include <base/files/file_util.h>
18#include <base/files/scoped_temp_dir.h>
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -070019#include <base/memory/ptr_util.h>
Luis Hector Chavez58725a82017-09-19 21:14:17 -070020#include <gtest/gtest.h>
Dylan Reid837c74a2016-01-22 17:25:21 -080021
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -070022#include "libcontainer/cgroup.h"
23#include "libcontainer/config.h"
24#include "libcontainer/container.h"
Luis Hector Chavez836d7b22017-09-14 15:11:15 -070025#include "libcontainer/libcontainer.h"
Luis Hector Chavez835d39e2017-09-19 15:16:31 -070026#include "libcontainer/libcontainer_util.h"
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -070027
Luis Hector Chavez58725a82017-09-19 21:14:17 -070028namespace libcontainer {
29
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -070030namespace {
31
Luis Hector Chavez58725a82017-09-19 21:14:17 -070032constexpr pid_t kInitTestPid = 5555;
33constexpr int kTestCpuShares = 200;
34constexpr int kTestCpuQuota = 20000;
35constexpr int kTestCpuPeriod = 50000;
36
37struct MockPosixState {
38 struct MountArgs {
39 std::string source;
40 base::FilePath target;
41 std::string filesystemtype;
42 unsigned long mountflags;
43 const void* data;
44 bool outside_mount;
45 };
46 std::vector<MountArgs> mount_args;
47
48 dev_t stat_rdev_ret = makedev(2, 3);
49
50 std::vector<int> kill_sigs;
51 base::FilePath mkdtemp_root;
52};
53MockPosixState* g_mock_posix_state = nullptr;
54
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -070055struct MockCgroupState {
56 struct AddedDevice {
57 bool allow;
58 int major;
59 int minor;
60 bool read;
61 bool write;
62 bool modify;
63 char type;
64 };
65
66 int freeze_ret;
67 int thaw_ret;
68 int deny_all_devs_ret;
69 int add_device_ret;
70 int set_cpu_ret;
71
72 int init_called_count;
73 int deny_all_devs_called_count;
74
75 std::vector<AddedDevice> added_devices;
76
77 int set_cpu_shares_count;
78 int set_cpu_quota_count;
79 int set_cpu_period_count;
80 int set_cpu_rt_runtime_count;
81 int set_cpu_rt_period_count;
82};
83MockCgroupState* g_mock_cgroup_state = nullptr;
84
85class MockCgroup : public libcontainer::Cgroup {
86 public:
87 explicit MockCgroup(MockCgroupState* state) : state_(state) {}
88 ~MockCgroup() = default;
89
90 static std::unique_ptr<libcontainer::Cgroup> Create(
91 base::StringPiece name,
92 const base::FilePath& cgroup_root,
93 const base::FilePath& cgroup_parent,
94 uid_t cgroup_owner,
95 gid_t cgroup_group) {
96 return base::MakeUnique<MockCgroup>(g_mock_cgroup_state);
97 }
98
99 int Freeze() override { return state_->freeze_ret; }
100
101 int Thaw() override { return state_->thaw_ret; }
102
103 int DenyAllDevices() override {
104 ++state_->deny_all_devs_called_count;
105 return state_->deny_all_devs_ret;
106 }
107
108 int AddDevice(bool allow,
109 int major,
110 int minor,
111 bool read,
112 bool write,
113 bool modify,
114 char type) override {
115 state_->added_devices.emplace_back(MockCgroupState::AddedDevice{
116 allow, major, minor, read, write, modify, type});
117 return state_->add_device_ret;
118 }
119
120 int SetCpuShares(int shares) override {
121 state_->set_cpu_shares_count++;
122 return state_->set_cpu_ret;
123 }
124
125 int SetCpuQuota(int quota) override {
126 state_->set_cpu_quota_count++;
127 return state_->set_cpu_ret;
128 }
129
130 int SetCpuPeriod(int period) override {
131 state_->set_cpu_period_count++;
132 return state_->set_cpu_ret;
133 }
134
135 int SetCpuRtRuntime(int rt_runtime) override {
136 state_->set_cpu_rt_runtime_count++;
137 return state_->set_cpu_ret;
138 }
139
140 int SetCpuRtPeriod(int rt_period) override {
141 state_->set_cpu_rt_period_count++;
142 return state_->set_cpu_ret;
143 }
144
145 private:
146 MockCgroupState* const state_;
147
148 DISALLOW_COPY_AND_ASSIGN(MockCgroup);
149};
150
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700151const char* minijail_alt_syscall_table;
152int minijail_ipc_called;
153int minijail_vfs_called;
154int minijail_net_called;
155int minijail_pids_called;
156int minijail_run_as_init_called;
157int minijail_user_called;
158int minijail_cgroups_called;
159int minijail_wait_called;
160int minijail_reset_signal_mask_called;
161
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700162} // namespace
Dylan Reid837c74a2016-01-22 17:25:21 -0800163
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700164TEST(LibcontainerTest, PremountedRunfs) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700165 char premounted_runfs[] = "/tmp/cgtest_run/root";
166 struct container_config* config = container_config_create();
167 ASSERT_NE(nullptr, config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700168
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700169 container_config_premounted_runfs(config, premounted_runfs);
170 const char* result = container_config_get_premounted_runfs(config);
171 ASSERT_EQ(0, strcmp(result, premounted_runfs));
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700172
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700173 container_config_destroy(config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700174}
175
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700176TEST(LibcontainerTest, PidFilePath) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700177 char pid_file_path[] = "/tmp/cgtest_run/root/container.pid";
178 struct container_config* config = container_config_create();
179 ASSERT_NE(nullptr, config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700180
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700181 container_config_pid_file(config, pid_file_path);
182 const char* result = container_config_get_pid_file(config);
183 ASSERT_EQ(0, strcmp(result, pid_file_path));
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700184
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700185 container_config_destroy(config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700186}
187
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700188TEST(LibcontainerTest, LogPreserve) {
Luis Hector Chavez835d39e2017-09-19 15:16:31 -0700189 errno = EPERM;
190 PLOG_PRESERVE(ERROR) << "This is an expected error log";
191 ASSERT_EQ(EPERM, errno);
192}
193
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700194class ContainerTest : public ::testing::Test {
195 public:
196 ContainerTest() = default;
197 ~ContainerTest() override = default;
Dylan Reid837c74a2016-01-22 17:25:21 -0800198
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700199 void SetUp() override {
200 g_mock_posix_state = new MockPosixState();
201 g_mock_cgroup_state = new MockCgroupState();
202 libcontainer::Cgroup::SetCgroupFactoryForTesting(&MockCgroup::Create);
Dylan Reid837c74a2016-01-22 17:25:21 -0800203
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700204 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700205
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700206 ASSERT_TRUE(base::CreateTemporaryDirInDir(
207 temp_dir_.path(), FILE_PATH_LITERAL("container_test"), &rootfs_));
Dylan Reid837c74a2016-01-22 17:25:21 -0800208
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700209 minijail_alt_syscall_table = nullptr;
210 minijail_ipc_called = 0;
211 minijail_vfs_called = 0;
212 minijail_net_called = 0;
213 minijail_pids_called = 0;
214 minijail_run_as_init_called = 0;
215 minijail_user_called = 0;
216 minijail_cgroups_called = 0;
217 minijail_wait_called = 0;
218 minijail_reset_signal_mask_called = 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800219
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700220 mount_flags_ = MS_NOSUID | MS_NODEV | MS_NOEXEC;
Dylan Reid837c74a2016-01-22 17:25:21 -0800221
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700222 config_.reset(new Config());
223 container_config_uid_map(config_->get(), "0 0 4294967295");
224 container_config_gid_map(config_->get(), "0 0 4294967295");
225 container_config_rootfs(config_->get(), rootfs_.value().c_str());
Dylan Reid837c74a2016-01-22 17:25:21 -0800226
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700227 static const char* kArgv[] = {
228 "/sbin/init",
229 };
230 container_config_program_argv(config_->get(), kArgv, 1);
231 container_config_alt_syscall_table(config_->get(), "testsyscalltable");
232 container_config_add_mount(config_->get(),
233 "testtmpfs",
234 "tmpfs",
235 "/tmp",
236 "tmpfs",
237 nullptr,
238 nullptr,
239 mount_flags_,
240 0,
241 1000,
242 1000,
243 0x666,
244 0,
245 0);
246 container_config_add_device(config_->get(),
247 'c',
248 "/dev/foo",
249 S_IRWXU | S_IRWXG,
250 245,
251 2,
252 0,
253 1000,
254 1001,
255 1,
256 1,
257 0);
258 // test dynamic minor on /dev/null
259 container_config_add_device(config_->get(),
260 'c',
261 "/dev/null",
262 S_IRWXU | S_IRWXG,
263 1,
264 -1,
265 1,
266 1000,
267 1001,
268 1,
269 1,
270 0);
Dylan Reid837c74a2016-01-22 17:25:21 -0800271
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700272 container_config_set_cpu_shares(config_->get(), kTestCpuShares);
273 container_config_set_cpu_cfs_params(
274 config_->get(), kTestCpuQuota, kTestCpuPeriod);
275 /* Invalid params, so this won't be applied. */
276 container_config_set_cpu_rt_params(config_->get(), 20000, 20000);
Dylan Reid837c74a2016-01-22 17:25:21 -0800277
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700278 base::FilePath rundir;
279 ASSERT_TRUE(base::CreateTemporaryDirInDir(
280 temp_dir_.path(), FILE_PATH_LITERAL("container_test_run"), &rundir));
281 container_.reset(new Container("containerUT", rundir));
282 ASSERT_NE(nullptr, container_.get());
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700283 }
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700284
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700285 void TearDown() override {
286 container_.reset();
287 config_.reset();
Dylan Reid837c74a2016-01-22 17:25:21 -0800288
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700289 ASSERT_TRUE(temp_dir_.Delete());
290 delete g_mock_posix_state;
291 g_mock_posix_state = nullptr;
292 libcontainer::Cgroup::SetCgroupFactoryForTesting(nullptr);
293 delete g_mock_cgroup_state;
294 }
295
296 protected:
297 std::unique_ptr<Config> config_;
298 std::unique_ptr<Container> container_;
299 int mount_flags_;
300 base::FilePath rootfs_;
301
302 private:
303 base::ScopedTempDir temp_dir_;
304
305 DISALLOW_COPY_AND_ASSIGN(ContainerTest);
306};
307
308TEST_F(ContainerTest, TestMountTmpStart) {
309 ASSERT_EQ(0, container_start(container_->get(), config_->get()));
310 ASSERT_EQ(2, g_mock_posix_state->mount_args.size());
311 EXPECT_EQ(false, g_mock_posix_state->mount_args[1].outside_mount);
312 EXPECT_STREQ("tmpfs", g_mock_posix_state->mount_args[1].source.c_str());
313 EXPECT_STREQ("/tmp",
314 g_mock_posix_state->mount_args[1].target.value().c_str());
315 EXPECT_STREQ("tmpfs",
316 g_mock_posix_state->mount_args[1].filesystemtype.c_str());
317 EXPECT_EQ(g_mock_posix_state->mount_args[1].mountflags,
318 static_cast<unsigned long>(mount_flags_));
319 EXPECT_EQ(nullptr, g_mock_posix_state->mount_args[1].data);
Dylan Reid837c74a2016-01-22 17:25:21 -0800320
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700321 EXPECT_EQ(1, minijail_ipc_called);
322 EXPECT_EQ(1, minijail_vfs_called);
323 EXPECT_EQ(1, minijail_net_called);
324 EXPECT_EQ(1, minijail_pids_called);
325 EXPECT_EQ(1, minijail_user_called);
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700326 EXPECT_EQ(1, minijail_cgroups_called);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700327 EXPECT_EQ(1, minijail_run_as_init_called);
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700328 EXPECT_EQ(1, g_mock_cgroup_state->deny_all_devs_called_count);
Dylan Reid837c74a2016-01-22 17:25:21 -0800329
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700330 ASSERT_EQ(2, g_mock_cgroup_state->added_devices.size());
331 EXPECT_EQ(1, g_mock_cgroup_state->added_devices[0].allow);
332 EXPECT_EQ(245, g_mock_cgroup_state->added_devices[0].major);
333 EXPECT_EQ(2, g_mock_cgroup_state->added_devices[0].minor);
334 EXPECT_EQ(1, g_mock_cgroup_state->added_devices[0].read);
335 EXPECT_EQ(1, g_mock_cgroup_state->added_devices[0].write);
336 EXPECT_EQ(0, g_mock_cgroup_state->added_devices[0].modify);
337 EXPECT_EQ('c', g_mock_cgroup_state->added_devices[0].type);
Dylan Reid355d5e42016-04-29 16:53:31 -0700338
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700339 EXPECT_EQ(1, g_mock_cgroup_state->added_devices[1].allow);
340 EXPECT_EQ(1, g_mock_cgroup_state->added_devices[1].major);
341 EXPECT_EQ(-1, g_mock_cgroup_state->added_devices[1].minor);
342 EXPECT_EQ(1, g_mock_cgroup_state->added_devices[1].read);
343 EXPECT_EQ(1, g_mock_cgroup_state->added_devices[1].write);
344 EXPECT_EQ(0, g_mock_cgroup_state->added_devices[1].modify);
345 EXPECT_EQ('c', g_mock_cgroup_state->added_devices[1].type);
Dylan Reid837c74a2016-01-22 17:25:21 -0800346
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700347 EXPECT_EQ(1, g_mock_cgroup_state->set_cpu_shares_count);
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700348 EXPECT_EQ(kTestCpuShares, container_config_get_cpu_shares(config_->get()));
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700349 EXPECT_EQ(1, g_mock_cgroup_state->set_cpu_quota_count);
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700350 EXPECT_EQ(kTestCpuQuota, container_config_get_cpu_quota(config_->get()));
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700351 EXPECT_EQ(1, g_mock_cgroup_state->set_cpu_period_count);
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700352 EXPECT_EQ(kTestCpuPeriod, container_config_get_cpu_period(config_->get()));
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700353 EXPECT_EQ(0, g_mock_cgroup_state->set_cpu_rt_runtime_count);
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700354 EXPECT_EQ(0, container_config_get_cpu_rt_runtime(config_->get()));
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700355 EXPECT_EQ(0, g_mock_cgroup_state->set_cpu_rt_period_count);
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700356 EXPECT_EQ(0, container_config_get_cpu_rt_period(config_->get()));
Chinyue Chenfac909e2016-06-24 14:17:42 +0800357
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700358 ASSERT_NE(nullptr, minijail_alt_syscall_table);
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700359 EXPECT_STREQ("testsyscalltable", minijail_alt_syscall_table);
Dylan Reid837c74a2016-01-22 17:25:21 -0800360
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700361 EXPECT_EQ(0, container_wait(container_->get()));
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700362 EXPECT_EQ(1, minijail_wait_called);
363 EXPECT_EQ(1, minijail_reset_signal_mask_called);
Dylan Reid837c74a2016-01-22 17:25:21 -0800364}
365
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700366TEST_F(ContainerTest, TestKillContainer) {
367 ASSERT_EQ(0, container_start(container_->get(), config_->get()));
368 EXPECT_EQ(0, container_kill(container_->get()));
369 EXPECT_EQ(std::vector<int>{SIGKILL}, g_mock_posix_state->kill_sigs);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700370 EXPECT_EQ(1, minijail_wait_called);
Dylan Reid837c74a2016-01-22 17:25:21 -0800371}
372
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700373} // namespace libcontainer
374
375// libc stubs so the UT doesn't need root to call mount, etc.
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700376extern "C" {
377
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700378extern decltype(chmod) __real_chmod;
379int __wrap_chmod(const char* path, mode_t mode) {
380 if (!libcontainer::g_mock_posix_state)
381 return __real_chmod(path, mode);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700382 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800383}
384
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700385extern decltype(chown) __real_chown;
386int __wrap_chown(const char* path, uid_t owner, gid_t group) {
387 if (!libcontainer::g_mock_posix_state)
388 return __real_chown(path, owner, group);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700389 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800390}
391
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700392extern decltype(getuid) __real_getuid;
393uid_t __wrap_getuid(void) {
394 if (!libcontainer::g_mock_posix_state)
395 return __real_getuid();
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700396 return 0;
397}
398
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700399extern decltype(kill) __real_kill;
400int __wrap_kill(pid_t pid, int sig) {
401 if (!libcontainer::g_mock_posix_state)
402 return __real_kill(pid, sig);
403 libcontainer::g_mock_posix_state->kill_sigs.push_back(sig);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700404 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800405}
406
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700407extern decltype(mkdir) __real_mkdir;
408int __wrap_mkdir(const char* pathname, mode_t mode) {
409 if (!libcontainer::g_mock_posix_state)
410 return __real_mkdir(pathname, mode);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700411 return 0;
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700412}
Dylan Reid837c74a2016-01-22 17:25:21 -0800413
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700414extern decltype(mkdtemp) __real_mkdtemp;
415char* __wrap_mkdtemp(char* template_string) {
416 if (!libcontainer::g_mock_posix_state)
417 return __real_mkdtemp(template_string);
418 libcontainer::g_mock_posix_state->mkdtemp_root =
419 base::FilePath(template_string);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700420 return template_string;
Dylan Reid837c74a2016-01-22 17:25:21 -0800421}
422
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700423extern decltype(mount) __real_mount;
424int __wrap_mount(const char* source,
425 const char* target,
426 const char* filesystemtype,
427 unsigned long mountflags,
428 const void* data) {
429 if (!libcontainer::g_mock_posix_state)
430 return __real_mount(source, target, filesystemtype, mountflags, data);
431
432 libcontainer::g_mock_posix_state->mount_args.emplace_back(
433 libcontainer::MockPosixState::MountArgs{source,
434 base::FilePath(target),
435 filesystemtype,
436 mountflags,
437 data,
438 true});
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700439 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800440}
441
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700442extern decltype(rmdir) __real_rmdir;
443int __wrap_rmdir(const char* pathname) {
444 if (!libcontainer::g_mock_posix_state)
445 return __real_rmdir(pathname);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700446 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800447}
448
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700449extern decltype(umount) __real_umount;
450int __wrap_umount(const char* target) {
451 if (!libcontainer::g_mock_posix_state)
452 return __real_umount(target);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700453 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800454}
455
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700456extern decltype(umount2) __real_umount2;
457int __wrap_umount2(const char* target, int flags) {
458 if (!libcontainer::g_mock_posix_state)
459 return __real_umount2(target, flags);
460 return 0;
461}
462
463extern decltype(unlink) __real_unlink;
464int __wrap_unlink(const char* pathname) {
465 if (!libcontainer::g_mock_posix_state)
466 return __real_unlink(pathname);
467 return 0;
468}
469
470extern decltype(__xmknod) __real___xmknod;
471int __wrap___xmknod(int ver, const char* pathname, mode_t mode, dev_t* dev) {
472 if (!libcontainer::g_mock_posix_state)
473 return __real___xmknod(ver, pathname, mode, dev);
474 return 0;
475}
476
477extern decltype(__xstat) __real___xstat;
478int __wrap___xstat(int ver, const char* path, struct stat* buf) {
479 if (!libcontainer::g_mock_posix_state)
480 return __real___xstat(ver, path, buf);
481 buf->st_rdev = libcontainer::g_mock_posix_state->stat_rdev_ret;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700482 return 0;
483}
484
Dylan Reid837c74a2016-01-22 17:25:21 -0800485/* Minijail stubs */
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700486struct minijail* minijail_new(void) {
487 return (struct minijail*)0x55;
Chinyue Chen03c54ae2016-06-29 12:29:10 +0800488}
489
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700490void minijail_destroy(struct minijail* j) {}
491
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700492int minijail_mount_with_data(struct minijail* j,
493 const char* source,
494 const char* target,
495 const char* filesystemtype,
496 unsigned long mountflags,
497 const char* data) {
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700498 libcontainer::g_mock_posix_state->mount_args.emplace_back(
499 libcontainer::MockPosixState::MountArgs{source,
500 base::FilePath(target),
501 filesystemtype,
502 mountflags,
503 data,
504 false});
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700505 return 0;
506}
507
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700508void minijail_namespace_user_disable_setgroups(struct minijail* j) {}
Dylan Reid837c74a2016-01-22 17:25:21 -0800509
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700510void minijail_namespace_vfs(struct minijail* j) {
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700511 ++libcontainer::minijail_vfs_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800512}
513
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700514void minijail_namespace_ipc(struct minijail* j) {
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700515 ++libcontainer::minijail_ipc_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800516}
517
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700518void minijail_namespace_net(struct minijail* j) {
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700519 ++libcontainer::minijail_net_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800520}
521
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700522void minijail_namespace_pids(struct minijail* j) {
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700523 ++libcontainer::minijail_pids_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800524}
525
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700526void minijail_namespace_user(struct minijail* j) {
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700527 ++libcontainer::minijail_user_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800528}
529
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700530void minijail_namespace_cgroups(struct minijail* j) {
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700531 ++libcontainer::minijail_cgroups_called;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700532}
533
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700534int minijail_uidmap(struct minijail* j, const char* uidmap) {
535 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800536}
537
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700538int minijail_gidmap(struct minijail* j, const char* gidmap) {
539 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800540}
541
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700542int minijail_enter_pivot_root(struct minijail* j, const char* dir) {
543 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800544}
545
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700546void minijail_run_as_init(struct minijail* j) {
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700547 ++libcontainer::minijail_run_as_init_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800548}
549
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700550int minijail_run_pid_pipes_no_preload(struct minijail* j,
551 const char* filename,
552 char* const argv[],
553 pid_t* pchild_pid,
554 int* pstdin_fd,
555 int* pstdout_fd,
556 int* pstderr_fd) {
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700557 *pchild_pid = libcontainer::kInitTestPid;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700558 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800559}
560
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700561int minijail_write_pid_file(struct minijail* j, const char* path) {
562 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800563}
564
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700565int minijail_wait(struct minijail* j) {
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700566 ++libcontainer::minijail_wait_called;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700567 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800568}
569
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700570int minijail_use_alt_syscall(struct minijail* j, const char* table) {
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700571 libcontainer::minijail_alt_syscall_table = table;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700572 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800573}
574
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700575int minijail_add_to_cgroup(struct minijail* j, const char* cg_path) {
576 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800577}
578
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700579void minijail_reset_signal_mask(struct minijail* j) {
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700580 ++libcontainer::minijail_reset_signal_mask_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800581}
582
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700583void minijail_skip_remount_private(struct minijail* j) {}
Dylan Reid837c74a2016-01-22 17:25:21 -0800584
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700585void minijail_close_open_fds(struct minijail* j) {}
586
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700587} // extern "C"