mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-22 23:50:19 +00:00
5e1499d104
This commit un-deprecates DeprecatedString, and repurposes it as a byte string. As the null state has already been removed, there are no other particularly hairy blockers in repurposing this type as a byte string (what it _really_ is). This commit is auto-generated: $ xs=$(ack -l \bDeprecatedString\b\|deprecated_string AK Userland \ Meta Ports Ladybird Tests Kernel) $ perl -pie 's/\bDeprecatedString\b/ByteString/g; s/deprecated_string/byte_string/g' $xs $ clang-format --style=file -i \ $(git diff --name-only | grep \.cpp\|\.h) $ gn format $(git ls-files '*.gn' '*.gni')
105 lines
2.3 KiB
C++
105 lines
2.3 KiB
C++
/*
|
|
* 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 ByteString random_dirname()
|
|
{
|
|
return ByteString::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 = ByteString::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);
|
|
}
|