blob: 87b113567b581800b8489b9f9fb0d3923f644032 [file] [log] [blame]
// 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 <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#include <launchpad/launchpad.h>
#include <mxio/namespace.h>
#include <magenta/compiler.h>
#include <magenta/syscalls.h>
#include <unittest/unittest.h>
typedef struct {
const char* local;
const char* remote;
} nstab_t;
static nstab_t NS[] = {
{ "/bin", "/boot/bin" },
{ "/lib", "/boot/lib" },
{ "/fake", "/tmp/fake-namespace-test" },
{ "/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
mxio_ns_t* ns;
ASSERT_EQ(mxio_ns_create(&ns), MX_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(mxio_ns_bind_fd(ns, NS[n].local, fd), MX_OK, "");
ASSERT_EQ(close(fd), 0, "");
}
ASSERT_EQ(mxio_ns_chdir(ns), MX_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, "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, "tmp"), 0, "");
ASSERT_NONNULL((de = readdir(dir)), "");
ASSERT_EQ(strcmp(de->d_name, "dev"), 0, "");
ASSERT_NONNULL((de = readdir(dir)), "");
ASSERT_EQ(strcmp(de->d_name, "."), 0, "");
ASSERT_EQ(closedir(dir), 0, "");
// Try doing some basic file ops within the namespace
int fd = open("fake/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/newfile"), 0, "");
ASSERT_EQ(mkdir("fake/newdir", 0666), 0, "");
ASSERT_EQ(rename("fake/newdir", "fake/olddir"), 0, "");
ASSERT_EQ(rmdir("fake/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;
}