mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 06:37:44 +00:00
Tests: Add test for LibC mkdir()
This commit is contained in:
parent
e8f491b01d
commit
f3cf1b33d7
2 changed files with 106 additions and 0 deletions
|
@ -11,6 +11,7 @@ set(TEST_SOURCES
|
||||||
TestLibCTime.cpp
|
TestLibCTime.cpp
|
||||||
TestMalloc.cpp
|
TestMalloc.cpp
|
||||||
TestMemmem.cpp
|
TestMemmem.cpp
|
||||||
|
TestMkDir.cpp
|
||||||
TestQsort.cpp
|
TestQsort.cpp
|
||||||
TestRaise.cpp
|
TestRaise.cpp
|
||||||
TestRealpath.cpp
|
TestRealpath.cpp
|
||||||
|
|
105
Tests/LibC/TestMkDir.cpp
Normal file
105
Tests/LibC/TestMkDir.cpp
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021, Max Wipfli <max.wipfli@serenityos.org>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <LibTest/TestCase.h>
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
static String random_dirname()
|
||||||
|
{
|
||||||
|
return String::formatted("/tmp/test_mkdir_{:04x}", (u16)rand());
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SETUP
|
||||||
|
{
|
||||||
|
srand(time(NULL));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE(basic)
|
||||||
|
{
|
||||||
|
auto dirname = random_dirname();
|
||||||
|
int res = mkdir(dirname.characters(), 0755);
|
||||||
|
EXPECT(res == 0);
|
||||||
|
|
||||||
|
res = mkdir(dirname.characters(), 0755);
|
||||||
|
int cached_errno = errno;
|
||||||
|
EXPECT(res < 0);
|
||||||
|
EXPECT_EQ(cached_errno, EEXIST);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE(insufficient_permissions)
|
||||||
|
{
|
||||||
|
VERIFY(getuid() != 0);
|
||||||
|
int res = mkdir("/root/foo", 0755);
|
||||||
|
int cached_errno = errno;
|
||||||
|
EXPECT(res < 0);
|
||||||
|
EXPECT_EQ(cached_errno, EACCES);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE(nonexistent_parent)
|
||||||
|
{
|
||||||
|
auto parent = random_dirname();
|
||||||
|
auto child = String::formatted("{}/foo", parent);
|
||||||
|
int res = mkdir(child.characters(), 0755);
|
||||||
|
int cached_errno = errno;
|
||||||
|
EXPECT(res < 0);
|
||||||
|
EXPECT_EQ(cached_errno, ENOENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE(parent_is_file)
|
||||||
|
{
|
||||||
|
int res = mkdir("/etc/passwd/foo", 0755);
|
||||||
|
int cached_errno = errno;
|
||||||
|
EXPECT(res < 0);
|
||||||
|
EXPECT_EQ(cached_errno, ENOTDIR);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE(pledge)
|
||||||
|
{
|
||||||
|
int res = pledge("stdio cpath", nullptr);
|
||||||
|
EXPECT(res == 0);
|
||||||
|
|
||||||
|
auto dirname = random_dirname();
|
||||||
|
res = mkdir(dirname.characters(), 0755);
|
||||||
|
EXPECT(res == 0);
|
||||||
|
// FIXME: Somehow also check that mkdir() stops working when removing the cpath promise. This is currently
|
||||||
|
// not possible because this would prevent the unveil test case from properly working.
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE(unveil)
|
||||||
|
{
|
||||||
|
int res = unveil("/tmp", "rwc");
|
||||||
|
EXPECT(res == 0);
|
||||||
|
|
||||||
|
auto dirname = random_dirname();
|
||||||
|
res = mkdir(dirname.characters(), 0755);
|
||||||
|
EXPECT(res == 0);
|
||||||
|
|
||||||
|
res = unveil("/tmp", "rw");
|
||||||
|
EXPECT(res == 0);
|
||||||
|
|
||||||
|
dirname = random_dirname();
|
||||||
|
res = mkdir(dirname.characters(), 0755);
|
||||||
|
int cached_errno = errno;
|
||||||
|
EXPECT(res < 0);
|
||||||
|
EXPECT_EQ(cached_errno, EACCES);
|
||||||
|
|
||||||
|
res = unveil("/tmp", "");
|
||||||
|
EXPECT(res == 0);
|
||||||
|
|
||||||
|
dirname = random_dirname();
|
||||||
|
res = mkdir(dirname.characters(), 0755);
|
||||||
|
cached_errno = errno;
|
||||||
|
EXPECT(res < 0);
|
||||||
|
EXPECT_EQ(cached_errno, ENOENT);
|
||||||
|
|
||||||
|
res = unveil(nullptr, nullptr);
|
||||||
|
EXPECT(res == 0);
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue