blob: 4bea7f04c793ddc109ab8c11e2e45e662fb96efc [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 Chavez58725a82017-09-19 21:14:17 -070019#include <gtest/gtest.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
Luis Hector Chavez58725a82017-09-19 21:14:17 -070027namespace libcontainer {
28
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -070029namespace {
30
Luis Hector Chavez58725a82017-09-19 21:14:17 -070031constexpr pid_t kInitTestPid = 5555;
32constexpr int kTestCpuShares = 200;
33constexpr int kTestCpuQuota = 20000;
34constexpr int kTestCpuPeriod = 50000;
35
36struct MockPosixState {
37 struct MountArgs {
38 std::string source;
39 base::FilePath target;
40 std::string filesystemtype;
41 unsigned long mountflags;
42 const void* data;
43 bool outside_mount;
44 };
45 std::vector<MountArgs> mount_args;
46
47 dev_t stat_rdev_ret = makedev(2, 3);
48
49 std::vector<int> kill_sigs;
50 base::FilePath mkdtemp_root;
51};
52MockPosixState* g_mock_posix_state = nullptr;
53
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -070054struct MockCgroupState {
55 struct AddedDevice {
56 bool allow;
57 int major;
58 int minor;
59 bool read;
60 bool write;
61 bool modify;
62 char type;
63 };
64
65 int freeze_ret;
66 int thaw_ret;
67 int deny_all_devs_ret;
68 int add_device_ret;
69 int set_cpu_ret;
70
71 int init_called_count;
72 int deny_all_devs_called_count;
73
74 std::vector<AddedDevice> added_devices;
75
76 int set_cpu_shares_count;
77 int set_cpu_quota_count;
78 int set_cpu_period_count;
79 int set_cpu_rt_runtime_count;
80 int set_cpu_rt_period_count;
81};
82MockCgroupState* g_mock_cgroup_state = nullptr;
83
84class MockCgroup : public libcontainer::Cgroup {
85 public:
86 explicit MockCgroup(MockCgroupState* state) : state_(state) {}
87 ~MockCgroup() = default;
88
89 static std::unique_ptr<libcontainer::Cgroup> Create(
90 base::StringPiece name,
91 const base::FilePath& cgroup_root,
92 const base::FilePath& cgroup_parent,
93 uid_t cgroup_owner,
94 gid_t cgroup_group) {
Ben Chanc4929c62017-09-29 23:25:39 -070095 return std::make_unique<MockCgroup>(g_mock_cgroup_state);
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -070096 }
97
98 int Freeze() override { return state_->freeze_ret; }
99
100 int Thaw() override { return state_->thaw_ret; }
101
102 int DenyAllDevices() override {
103 ++state_->deny_all_devs_called_count;
104 return state_->deny_all_devs_ret;
105 }
106
107 int AddDevice(bool allow,
108 int major,
109 int minor,
110 bool read,
111 bool write,
112 bool modify,
113 char type) override {
114 state_->added_devices.emplace_back(MockCgroupState::AddedDevice{
115 allow, major, minor, read, write, modify, type});
116 return state_->add_device_ret;
117 }
118
119 int SetCpuShares(int shares) override {
120 state_->set_cpu_shares_count++;
121 return state_->set_cpu_ret;
122 }
123
124 int SetCpuQuota(int quota) override {
125 state_->set_cpu_quota_count++;
126 return state_->set_cpu_ret;
127 }
128
129 int SetCpuPeriod(int period) override {
130 state_->set_cpu_period_count++;
131 return state_->set_cpu_ret;
132 }
133
134 int SetCpuRtRuntime(int rt_runtime) override {
135 state_->set_cpu_rt_runtime_count++;
136 return state_->set_cpu_ret;
137 }
138
139 int SetCpuRtPeriod(int rt_period) override {
140 state_->set_cpu_rt_period_count++;
141 return state_->set_cpu_ret;
142 }
143
144 private:
145 MockCgroupState* const state_;
146
147 DISALLOW_COPY_AND_ASSIGN(MockCgroup);
148};
149
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700150const char* minijail_alt_syscall_table;
151int minijail_ipc_called;
152int minijail_vfs_called;
153int minijail_net_called;
154int minijail_pids_called;
155int minijail_run_as_init_called;
156int minijail_user_called;
157int minijail_cgroups_called;
158int minijail_wait_called;
159int minijail_reset_signal_mask_called;
160
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700161} // namespace
Dylan Reid837c74a2016-01-22 17:25:21 -0800162
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700163TEST(LibcontainerTest, PremountedRunfs) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700164 char premounted_runfs[] = "/tmp/cgtest_run/root";
165 struct container_config* config = container_config_create();
166 ASSERT_NE(nullptr, config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700167
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700168 container_config_premounted_runfs(config, premounted_runfs);
169 const char* result = container_config_get_premounted_runfs(config);
170 ASSERT_EQ(0, strcmp(result, premounted_runfs));
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700171
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700172 container_config_destroy(config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700173}
174
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700175TEST(LibcontainerTest, PidFilePath) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700176 char pid_file_path[] = "/tmp/cgtest_run/root/container.pid";
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_pid_file(config, pid_file_path);
181 const char* result = container_config_get_pid_file(config);
182 ASSERT_EQ(0, strcmp(result, pid_file_path));
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 Chavez58725a82017-09-19 21:14:17 -0700187TEST(LibcontainerTest, LogPreserve) {
Luis Hector Chavez835d39e2017-09-19 15:16:31 -0700188 errno = EPERM;
189 PLOG_PRESERVE(ERROR) << "This is an expected error log";
190 ASSERT_EQ(EPERM, errno);
191}
192
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700193class ContainerTest : public ::testing::Test {
194 public:
195 ContainerTest() = default;
196 ~ContainerTest() override = default;
Dylan Reid837c74a2016-01-22 17:25:21 -0800197
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700198 void SetUp() override {
199 g_mock_posix_state = new MockPosixState();
200 g_mock_cgroup_state = new MockCgroupState();
201 libcontainer::Cgroup::SetCgroupFactoryForTesting(&MockCgroup::Create);
Dylan Reid837c74a2016-01-22 17:25:21 -0800202
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700203 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700204
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700205 ASSERT_TRUE(base::CreateTemporaryDirInDir(
206 temp_dir_.path(), FILE_PATH_LITERAL("container_test"), &rootfs_));
Dylan Reid837c74a2016-01-22 17:25:21 -0800207
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700208 minijail_alt_syscall_table = nullptr;
209 minijail_ipc_called = 0;
210 minijail_vfs_called = 0;
211 minijail_net_called = 0;
212 minijail_pids_called = 0;
213 minijail_run_as_init_called = 0;
214 minijail_user_called = 0;
215 minijail_cgroups_called = 0;
216 minijail_wait_called = 0;
217 minijail_reset_signal_mask_called = 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800218
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700219 mount_flags_ = MS_NOSUID | MS_NODEV | MS_NOEXEC;
Dylan Reid837c74a2016-01-22 17:25:21 -0800220
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700221 config_.reset(new Config());
222 container_config_uid_map(config_->get(), "0 0 4294967295");
223 container_config_gid_map(config_->get(), "0 0 4294967295");
224 container_config_rootfs(config_->get(), rootfs_.value().c_str());
Dylan Reid837c74a2016-01-22 17:25:21 -0800225
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700226 static const char* kArgv[] = {
227 "/sbin/init",
228 };
229 container_config_program_argv(config_->get(), kArgv, 1);
230 container_config_alt_syscall_table(config_->get(), "testsyscalltable");
231 container_config_add_mount(config_->get(),
232 "testtmpfs",
233 "tmpfs",
234 "/tmp",
235 "tmpfs",
236 nullptr,
237 nullptr,
238 mount_flags_,
239 0,
240 1000,
241 1000,
242 0x666,
243 0,
244 0);
245 container_config_add_device(config_->get(),
246 'c',
247 "/dev/foo",
248 S_IRWXU | S_IRWXG,
249 245,
250 2,
251 0,
252 1000,
253 1001,
254 1,
255 1,
256 0);
257 // test dynamic minor on /dev/null
258 container_config_add_device(config_->get(),
259 'c',
260 "/dev/null",
261 S_IRWXU | S_IRWXG,
262 1,
263 -1,
264 1,
265 1000,
266 1001,
267 1,
268 1,
269 0);
Dylan Reid837c74a2016-01-22 17:25:21 -0800270
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700271 container_config_set_cpu_shares(config_->get(), kTestCpuShares);
272 container_config_set_cpu_cfs_params(
273 config_->get(), kTestCpuQuota, kTestCpuPeriod);
274 /* Invalid params, so this won't be applied. */
275 container_config_set_cpu_rt_params(config_->get(), 20000, 20000);
Dylan Reid837c74a2016-01-22 17:25:21 -0800276
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700277 base::FilePath rundir;
278 ASSERT_TRUE(base::CreateTemporaryDirInDir(
279 temp_dir_.path(), FILE_PATH_LITERAL("container_test_run"), &rundir));
280 container_.reset(new Container("containerUT", rundir));
281 ASSERT_NE(nullptr, container_.get());
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700282 }
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700283
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700284 void TearDown() override {
285 container_.reset();
286 config_.reset();
Dylan Reid837c74a2016-01-22 17:25:21 -0800287
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700288 ASSERT_TRUE(temp_dir_.Delete());
289 delete g_mock_posix_state;
290 g_mock_posix_state = nullptr;
291 libcontainer::Cgroup::SetCgroupFactoryForTesting(nullptr);
292 delete g_mock_cgroup_state;
293 }
294
295 protected:
296 std::unique_ptr<Config> config_;
297 std::unique_ptr<Container> container_;
298 int mount_flags_;
299 base::FilePath rootfs_;
300
301 private:
302 base::ScopedTempDir temp_dir_;
303
304 DISALLOW_COPY_AND_ASSIGN(ContainerTest);
305};
306
307TEST_F(ContainerTest, TestMountTmpStart) {
308 ASSERT_EQ(0, container_start(container_->get(), config_->get()));
309 ASSERT_EQ(2, g_mock_posix_state->mount_args.size());
310 EXPECT_EQ(false, g_mock_posix_state->mount_args[1].outside_mount);
311 EXPECT_STREQ("tmpfs", g_mock_posix_state->mount_args[1].source.c_str());
312 EXPECT_STREQ("/tmp",
313 g_mock_posix_state->mount_args[1].target.value().c_str());
314 EXPECT_STREQ("tmpfs",
315 g_mock_posix_state->mount_args[1].filesystemtype.c_str());
316 EXPECT_EQ(g_mock_posix_state->mount_args[1].mountflags,
317 static_cast<unsigned long>(mount_flags_));
318 EXPECT_EQ(nullptr, g_mock_posix_state->mount_args[1].data);
Dylan Reid837c74a2016-01-22 17:25:21 -0800319
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700320 EXPECT_EQ(1, minijail_ipc_called);
321 EXPECT_EQ(1, minijail_vfs_called);
322 EXPECT_EQ(1, minijail_net_called);
323 EXPECT_EQ(1, minijail_pids_called);
324 EXPECT_EQ(1, minijail_user_called);
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700325 EXPECT_EQ(1, minijail_cgroups_called);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700326 EXPECT_EQ(1, minijail_run_as_init_called);
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700327 EXPECT_EQ(1, g_mock_cgroup_state->deny_all_devs_called_count);
Dylan Reid837c74a2016-01-22 17:25:21 -0800328
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700329 ASSERT_EQ(2, g_mock_cgroup_state->added_devices.size());
330 EXPECT_EQ(1, g_mock_cgroup_state->added_devices[0].allow);
331 EXPECT_EQ(245, g_mock_cgroup_state->added_devices[0].major);
332 EXPECT_EQ(2, g_mock_cgroup_state->added_devices[0].minor);
333 EXPECT_EQ(1, g_mock_cgroup_state->added_devices[0].read);
334 EXPECT_EQ(1, g_mock_cgroup_state->added_devices[0].write);
335 EXPECT_EQ(0, g_mock_cgroup_state->added_devices[0].modify);
336 EXPECT_EQ('c', g_mock_cgroup_state->added_devices[0].type);
Dylan Reid355d5e42016-04-29 16:53:31 -0700337
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700338 EXPECT_EQ(1, g_mock_cgroup_state->added_devices[1].allow);
339 EXPECT_EQ(1, g_mock_cgroup_state->added_devices[1].major);
340 EXPECT_EQ(-1, g_mock_cgroup_state->added_devices[1].minor);
341 EXPECT_EQ(1, g_mock_cgroup_state->added_devices[1].read);
342 EXPECT_EQ(1, g_mock_cgroup_state->added_devices[1].write);
343 EXPECT_EQ(0, g_mock_cgroup_state->added_devices[1].modify);
344 EXPECT_EQ('c', g_mock_cgroup_state->added_devices[1].type);
Dylan Reid837c74a2016-01-22 17:25:21 -0800345
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700346 EXPECT_EQ(1, g_mock_cgroup_state->set_cpu_shares_count);
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700347 EXPECT_EQ(kTestCpuShares, container_config_get_cpu_shares(config_->get()));
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700348 EXPECT_EQ(1, g_mock_cgroup_state->set_cpu_quota_count);
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700349 EXPECT_EQ(kTestCpuQuota, container_config_get_cpu_quota(config_->get()));
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700350 EXPECT_EQ(1, g_mock_cgroup_state->set_cpu_period_count);
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700351 EXPECT_EQ(kTestCpuPeriod, container_config_get_cpu_period(config_->get()));
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700352 EXPECT_EQ(0, g_mock_cgroup_state->set_cpu_rt_runtime_count);
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700353 EXPECT_EQ(0, container_config_get_cpu_rt_runtime(config_->get()));
Luis Hector Chavez76ae9ac2017-09-20 21:13:08 -0700354 EXPECT_EQ(0, g_mock_cgroup_state->set_cpu_rt_period_count);
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700355 EXPECT_EQ(0, container_config_get_cpu_rt_period(config_->get()));
Chinyue Chenfac909e2016-06-24 14:17:42 +0800356
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700357 ASSERT_NE(nullptr, minijail_alt_syscall_table);
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700358 EXPECT_STREQ("testsyscalltable", minijail_alt_syscall_table);
Dylan Reid837c74a2016-01-22 17:25:21 -0800359
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700360 EXPECT_EQ(0, container_wait(container_->get()));
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700361 EXPECT_EQ(1, minijail_wait_called);
362 EXPECT_EQ(1, minijail_reset_signal_mask_called);
Dylan Reid837c74a2016-01-22 17:25:21 -0800363}
364
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700365TEST_F(ContainerTest, TestKillContainer) {
366 ASSERT_EQ(0, container_start(container_->get(), config_->get()));
367 EXPECT_EQ(0, container_kill(container_->get()));
368 EXPECT_EQ(std::vector<int>{SIGKILL}, g_mock_posix_state->kill_sigs);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700369 EXPECT_EQ(1, minijail_wait_called);
Dylan Reid837c74a2016-01-22 17:25:21 -0800370}
371
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700372} // namespace libcontainer
373
374// libc stubs so the UT doesn't need root to call mount, etc.
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700375extern "C" {
376
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700377extern decltype(chmod) __real_chmod;
378int __wrap_chmod(const char* path, mode_t mode) {
379 if (!libcontainer::g_mock_posix_state)
380 return __real_chmod(path, mode);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700381 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800382}
383
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700384extern decltype(chown) __real_chown;
385int __wrap_chown(const char* path, uid_t owner, gid_t group) {
386 if (!libcontainer::g_mock_posix_state)
387 return __real_chown(path, owner, group);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700388 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800389}
390
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700391extern decltype(getuid) __real_getuid;
392uid_t __wrap_getuid(void) {
393 if (!libcontainer::g_mock_posix_state)
394 return __real_getuid();
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700395 return 0;
396}
397
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700398extern decltype(kill) __real_kill;
399int __wrap_kill(pid_t pid, int sig) {
400 if (!libcontainer::g_mock_posix_state)
401 return __real_kill(pid, sig);
402 libcontainer::g_mock_posix_state->kill_sigs.push_back(sig);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700403 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800404}
405
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700406extern decltype(mkdir) __real_mkdir;
407int __wrap_mkdir(const char* pathname, mode_t mode) {
408 if (!libcontainer::g_mock_posix_state)
409 return __real_mkdir(pathname, mode);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700410 return 0;
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700411}
Dylan Reid837c74a2016-01-22 17:25:21 -0800412
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700413extern decltype(mkdtemp) __real_mkdtemp;
414char* __wrap_mkdtemp(char* template_string) {
415 if (!libcontainer::g_mock_posix_state)
416 return __real_mkdtemp(template_string);
417 libcontainer::g_mock_posix_state->mkdtemp_root =
418 base::FilePath(template_string);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700419 return template_string;
Dylan Reid837c74a2016-01-22 17:25:21 -0800420}
421
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700422extern decltype(mount) __real_mount;
423int __wrap_mount(const char* source,
424 const char* target,
425 const char* filesystemtype,
426 unsigned long mountflags,
427 const void* data) {
428 if (!libcontainer::g_mock_posix_state)
429 return __real_mount(source, target, filesystemtype, mountflags, data);
430
431 libcontainer::g_mock_posix_state->mount_args.emplace_back(
432 libcontainer::MockPosixState::MountArgs{source,
433 base::FilePath(target),
434 filesystemtype,
435 mountflags,
436 data,
437 true});
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700438 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800439}
440
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700441extern decltype(rmdir) __real_rmdir;
442int __wrap_rmdir(const char* pathname) {
443 if (!libcontainer::g_mock_posix_state)
444 return __real_rmdir(pathname);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700445 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800446}
447
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700448extern decltype(umount) __real_umount;
449int __wrap_umount(const char* target) {
450 if (!libcontainer::g_mock_posix_state)
451 return __real_umount(target);
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700452 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800453}
454
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700455extern decltype(umount2) __real_umount2;
456int __wrap_umount2(const char* target, int flags) {
457 if (!libcontainer::g_mock_posix_state)
458 return __real_umount2(target, flags);
459 return 0;
460}
461
462extern decltype(unlink) __real_unlink;
463int __wrap_unlink(const char* pathname) {
464 if (!libcontainer::g_mock_posix_state)
465 return __real_unlink(pathname);
466 return 0;
467}
468
469extern decltype(__xmknod) __real___xmknod;
470int __wrap___xmknod(int ver, const char* pathname, mode_t mode, dev_t* dev) {
471 if (!libcontainer::g_mock_posix_state)
472 return __real___xmknod(ver, pathname, mode, dev);
473 return 0;
474}
475
476extern decltype(__xstat) __real___xstat;
477int __wrap___xstat(int ver, const char* path, struct stat* buf) {
478 if (!libcontainer::g_mock_posix_state)
479 return __real___xstat(ver, path, buf);
480 buf->st_rdev = libcontainer::g_mock_posix_state->stat_rdev_ret;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700481 return 0;
482}
483
Dylan Reid837c74a2016-01-22 17:25:21 -0800484/* Minijail stubs */
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700485struct minijail* minijail_new(void) {
486 return (struct minijail*)0x55;
Chinyue Chen03c54ae2016-06-29 12:29:10 +0800487}
488
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700489void minijail_destroy(struct minijail* j) {}
490
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700491int minijail_mount_with_data(struct minijail* j,
492 const char* source,
493 const char* target,
494 const char* filesystemtype,
495 unsigned long mountflags,
496 const char* data) {
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700497 libcontainer::g_mock_posix_state->mount_args.emplace_back(
498 libcontainer::MockPosixState::MountArgs{source,
499 base::FilePath(target),
500 filesystemtype,
501 mountflags,
502 data,
503 false});
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700504 return 0;
505}
506
Luis Hector Chavezedec56e2017-09-19 15:43:53 -0700507void minijail_namespace_user_disable_setgroups(struct minijail* j) {}
Dylan Reid837c74a2016-01-22 17:25:21 -0800508
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700509void minijail_namespace_vfs(struct minijail* j) {
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700510 ++libcontainer::minijail_vfs_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800511}
512
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700513void minijail_namespace_ipc(struct minijail* j) {
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700514 ++libcontainer::minijail_ipc_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800515}
516
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700517void minijail_namespace_net(struct minijail* j) {
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700518 ++libcontainer::minijail_net_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800519}
520
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700521void minijail_namespace_pids(struct minijail* j) {
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700522 ++libcontainer::minijail_pids_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800523}
524
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700525void minijail_namespace_user(struct minijail* j) {
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700526 ++libcontainer::minijail_user_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800527}
528
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700529void minijail_namespace_cgroups(struct minijail* j) {
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700530 ++libcontainer::minijail_cgroups_called;
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700531}
532
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700533int minijail_uidmap(struct minijail* j, const char* uidmap) {
534 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800535}
536
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700537int minijail_gidmap(struct minijail* j, const char* gidmap) {
538 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800539}
540
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700541int minijail_enter_pivot_root(struct minijail* j, const char* dir) {
542 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800543}
544
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700545void minijail_run_as_init(struct minijail* j) {
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700546 ++libcontainer::minijail_run_as_init_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800547}
548
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700549int minijail_run_pid_pipes_no_preload(struct minijail* j,
550 const char* filename,
551 char* const argv[],
552 pid_t* pchild_pid,
553 int* pstdin_fd,
554 int* pstdout_fd,
555 int* pstderr_fd) {
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700556 *pchild_pid = libcontainer::kInitTestPid;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700557 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800558}
559
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700560int minijail_write_pid_file(struct minijail* j, const char* path) {
561 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800562}
563
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700564int minijail_wait(struct minijail* j) {
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700565 ++libcontainer::minijail_wait_called;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700566 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800567}
568
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700569int minijail_use_alt_syscall(struct minijail* j, const char* table) {
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700570 libcontainer::minijail_alt_syscall_table = table;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700571 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800572}
573
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700574int minijail_add_to_cgroup(struct minijail* j, const char* cg_path) {
575 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800576}
577
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700578void minijail_reset_signal_mask(struct minijail* j) {
Luis Hector Chavez58725a82017-09-19 21:14:17 -0700579 ++libcontainer::minijail_reset_signal_mask_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800580}
581
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700582void minijail_skip_remount_private(struct minijail* j) {}
Dylan Reid837c74a2016-01-22 17:25:21 -0800583
Luis Hector Chavez9e03e172017-09-15 11:29:54 -0700584void minijail_close_open_fds(struct minijail* j) {}
585
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700586} // extern "C"