// Copyright 2017 The Fuchsia Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include #include #include #include #include #include #include #include #include #include #include #include #include typedef struct { const char* local; const char* remote; } nstab_t; static nstab_t NS[] = { { "/bin", "/boot/bin" }, { "/lib", "/boot/lib" }, { "/fake/dev", "/tmp/fake-namespace-test/dev" }, { "/fake/tmp", "/tmp/fake-namespace-test-tmp" }, }; static bool namespace_create_test(void) { BEGIN_TEST; ASSERT_TRUE(mkdir("/tmp/fake-namespace-test", 066) == 0 || errno == EEXIST, ""); ASSERT_TRUE(mkdir("/tmp/fake-namespace-test/dev", 066) == 0 || errno == EEXIST, ""); ASSERT_TRUE(mkdir("/tmp/fake-namespace-test-tmp", 066) == 0 || errno == EEXIST, ""); // Create new ns fdio_ns_t* ns; ASSERT_EQ(fdio_ns_create(&ns), ZX_OK, ""); for (unsigned n = 0; n < countof(NS); n++) { int fd = open(NS[n].remote, O_RDONLY | O_DIRECTORY); ASSERT_GT(fd, 0, ""); ASSERT_EQ(fdio_ns_bind_fd(ns, NS[n].local, fd), ZX_OK, ""); ASSERT_EQ(close(fd), 0, ""); } ASSERT_EQ(fdio_ns_chdir(ns), ZX_OK, ""); DIR* dir; struct dirent* de; // should show "bin", "lib", "fake" -- our rootdir ASSERT_NONNULL((dir = opendir(".")), ""); ASSERT_NONNULL((de = readdir(dir)), ""); ASSERT_EQ(strcmp(de->d_name, "."), 0, ""); ASSERT_NONNULL((de = readdir(dir)), ""); ASSERT_EQ(strcmp(de->d_name, "fake"), 0, ""); ASSERT_NONNULL((de = readdir(dir)), ""); ASSERT_EQ(strcmp(de->d_name, "lib"), 0, ""); ASSERT_NONNULL((de = readdir(dir)), ""); ASSERT_EQ(strcmp(de->d_name, "bin"), 0, ""); ASSERT_EQ(closedir(dir), 0, ""); // should show "fake" directory, containing parent's pre-allocated tmp dir. ASSERT_NONNULL((dir = opendir("fake")), ""); ASSERT_NONNULL((de = readdir(dir)), ""); ASSERT_EQ(strcmp(de->d_name, "."), 0, ""); ASSERT_NONNULL((de = readdir(dir)), ""); ASSERT_EQ(strcmp(de->d_name, "tmp"), 0, ""); ASSERT_NONNULL((de = readdir(dir)), ""); ASSERT_EQ(strcmp(de->d_name, "dev"), 0, ""); ASSERT_EQ(closedir(dir), 0, ""); // Try doing some basic file ops within the namespace int fd = open("fake/tmp/newfile", O_CREAT | O_RDWR | O_EXCL); ASSERT_GT(fd, 0, ""); ASSERT_GT(write(fd, "hello", strlen("hello")), 0, ""); ASSERT_EQ(close(fd), 0, ""); ASSERT_EQ(unlink("fake/tmp/newfile"), 0, ""); ASSERT_EQ(mkdir("fake/tmp/newdir", 0666), 0, ""); ASSERT_EQ(rename("fake/tmp/newdir", "fake/tmp/olddir"), 0, ""); ASSERT_EQ(rmdir("fake/tmp/olddir"), 0, ""); END_TEST; } BEGIN_TEST_CASE(namespace_tests) RUN_TEST_MEDIUM(namespace_create_test) END_TEST_CASE(namespace_tests) int main(int argc, char** argv) { return unittest_run_all_tests(argc, argv) ? 0 : -1; }