mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-06-10 01:51:03 +09:00
Tests: Add test for LibC mkdir()
This commit is contained in:
parent
e8f491b01d
commit
f3cf1b33d7
Notes:
sideshowbarker
2024-07-17 18:54:28 +09:00
Author: https://github.com/MaxWipfli
Commit: f3cf1b33d7
Pull-request: https://github.com/SerenityOS/serenity/pull/12462
Reviewed-by: https://github.com/IdanHo ✅
Reviewed-by: https://github.com/bgianfo
2 changed files with 106 additions and 0 deletions
|
@ -11,6 +11,7 @@ set(TEST_SOURCES
|
|||
TestLibCTime.cpp
|
||||
TestMalloc.cpp
|
||||
TestMemmem.cpp
|
||||
TestMkDir.cpp
|
||||
TestQsort.cpp
|
||||
TestRaise.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