Skip to content

Commit 7eee9b3

Browse files
committed
Update unit test
1 parent 15834c5 commit 7eee9b3

File tree

3 files changed

+51
-29
lines changed

3 files changed

+51
-29
lines changed

libc/src/stdio/linux/fdopen.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ LLVM_LIBC_FUNCTION(::FILE *, fdopen, (int fd, const char *mode)) {
4646
!(fd_flags & O_APPEND)) {
4747
do_seek = true;
4848
if (LIBC_NAMESPACE::fcntl(fd, F_SETFL, fd_flags | O_APPEND) == -1) {
49-
libc_errno = EBADF;
5049
return nullptr;
5150
}
5251
}

libc/test/src/stdio/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,8 @@ if(${LIBC_TARGET_OS} STREQUAL "linux")
380380
libc.src.fcntl.open
381381
libc.src.stdio.fclose
382382
libc.src.stdio.fdopen
383+
libc.src.stdio.fgets
384+
libc.src.stdio.fputs
383385
libc.src.unistd.close
384386
libc.test.UnitTest.ErrnoSetterMatcher
385387
)

libc/test/src/stdio/fdopen_test.cpp

Lines changed: 49 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -10,59 +10,80 @@
1010
#include "src/stdio/fdopen.h"
1111

1212
#include "src/errno/libc_errno.h"
13-
#include "src/fcntl/fcntl.h"
1413
#include "src/fcntl/open.h"
1514
#include "src/stdio/fclose.h"
15+
#include "src/stdio/fgets.h"
16+
#include "src/stdio/fputs.h"
1617
#include "src/unistd/close.h"
1718
#include "test/UnitTest/ErrnoSetterMatcher.h"
1819
#include "test/UnitTest/LibcTest.h"
1920
#include "test/UnitTest/Test.h"
2021

2122
#include <sys/stat.h> // For S_IRWXU
2223

23-
TEST(LlvmLibcStdioFdopenTest, InvalidInput) {
24+
TEST(LlvmLibcStdioFdopenTest, WriteAppendRead) {
2425
using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
2526
LIBC_NAMESPACE::libc_errno = 0;
26-
constexpr const char *TEST_FILE_NAME = "testdata/fdopen_invalid_inputs.test";
27+
constexpr const char *TEST_FILE_NAME = "testdata/write_read_append.test";
2728
auto TEST_FILE = libc_make_test_file_path(TEST_FILE_NAME);
28-
int fd = LIBC_NAMESPACE::open(TEST_FILE, O_CREAT | O_TRUNC | O_RDONLY);
29-
auto *fp = LIBC_NAMESPACE::fdopen(fd, "m+");
30-
ASSERT_ERRNO_EQ(EINVAL);
31-
ASSERT_TRUE(nullptr == fp);
32-
LIBC_NAMESPACE::close(fd);
29+
int fd = LIBC_NAMESPACE::open(TEST_FILE, O_CREAT | O_TRUNC | O_RDWR, S_IRWXU);
30+
auto *fp = LIBC_NAMESPACE::fdopen(fd, "w");
31+
ASSERT_ERRNO_SUCCESS();
32+
ASSERT_TRUE(nullptr != fp);
33+
constexpr const char HELLO[] = "Hello";
34+
LIBC_NAMESPACE::fputs(HELLO, fp);
35+
LIBC_NAMESPACE::fclose(fp);
36+
ASSERT_ERRNO_SUCCESS();
37+
38+
constexpr const char LLVM[] = "LLVM";
39+
int fd2 = LIBC_NAMESPACE::open(TEST_FILE, O_CREAT | O_RDWR);
40+
auto *fp2 = LIBC_NAMESPACE::fdopen(fd2, "a");
41+
LIBC_NAMESPACE::fputs(LLVM, fp2);
42+
LIBC_NAMESPACE::fclose(fp2);
43+
ASSERT_ERRNO_SUCCESS();
44+
45+
int fd3 = LIBC_NAMESPACE::open(TEST_FILE, O_CREAT | O_RDWR);
46+
auto *fp3 = LIBC_NAMESPACE::fdopen(fd3, "r");
47+
char buffer[10];
48+
LIBC_NAMESPACE::fgets(buffer, sizeof(buffer), fp3);
49+
EXPECT_EQ('H', buffer[0]);
50+
EXPECT_EQ('M', buffer[8]);
51+
LIBC_NAMESPACE::fclose(fp3);
52+
ASSERT_ERRNO_SUCCESS();
53+
}
54+
55+
TEST(LlvmLibcStdioFdopenTest, InvalidFd) {
3356
LIBC_NAMESPACE::libc_errno = 0;
34-
fp = LIBC_NAMESPACE::fdopen(fd, "r");
57+
constexpr const char *TEST_FILE_NAME = "testdata/invalid_fd.test";
58+
auto TEST_FILE = libc_make_test_file_path(TEST_FILE_NAME);
59+
int fd = LIBC_NAMESPACE::open(TEST_FILE, O_CREAT | O_TRUNC);
60+
LIBC_NAMESPACE::close(fd);
61+
// With `fd` already closed, `fdopen` should fail and set the `errno` to EBADF
62+
auto *fp = LIBC_NAMESPACE::fdopen(fd, "r");
3563
ASSERT_ERRNO_EQ(EBADF);
3664
ASSERT_TRUE(nullptr == fp);
3765
}
3866

3967
TEST(LlvmLibcStdioFdopenTest, InvalidMode) {
40-
using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
4168
LIBC_NAMESPACE::libc_errno = 0;
42-
constexpr const char *TEST_FILE_NAME = "testdata/fdopen_invid_mode.test";
69+
constexpr const char *TEST_FILE_NAME = "testdata/invalid_mode.test";
4370
auto TEST_FILE = libc_make_test_file_path(TEST_FILE_NAME);
44-
int fd = LIBC_NAMESPACE::open(TEST_FILE, O_CREAT | O_TRUNC | O_RDONLY);
71+
int fd = LIBC_NAMESPACE::open(TEST_FILE, O_CREAT | O_RDONLY, S_IRWXU);
4572
ASSERT_ERRNO_SUCCESS();
4673
ASSERT_GT(fd, 0);
47-
auto *fp = LIBC_NAMESPACE::fdopen(fd, "r+");
48-
ASSERT_ERRNO_SUCCESS();
49-
ASSERT_TRUE(nullptr != fp);
50-
ASSERT_THAT(LIBC_NAMESPACE::fclose(fp), Succeeds(0));
74+
75+
// `Mode` must be one of "r", "w" or "a"
76+
auto *fp = LIBC_NAMESPACE::fdopen(fd, "m+");
77+
ASSERT_ERRNO_EQ(EINVAL);
78+
ASSERT_TRUE(nullptr == fp);
79+
5180
// If the mode argument is invalid, then `fdopen` returns a nullptr and sets
5281
// the `errno` to EINVAL. In this case the `mode` param can only be "r" or
5382
// "r+"
54-
int fd2 = LIBC_NAMESPACE::open(TEST_FILE, O_CREAT | O_TRUNC | O_RDONLY);
55-
ASSERT_ERRNO_SUCCESS();
56-
ASSERT_GT(fd2, 0);
57-
auto *fp2 = LIBC_NAMESPACE::fdopen(fd2, "w");
83+
auto *fp2 = LIBC_NAMESPACE::fdopen(fd, "w");
5884
ASSERT_ERRNO_EQ(EINVAL);
5985
ASSERT_TRUE(nullptr == fp2);
86+
LIBC_NAMESPACE::libc_errno = 0;
87+
LIBC_NAMESPACE::close(fd);
88+
ASSERT_ERRNO_SUCCESS();
6089
}
61-
62-
TEST(LlvmLibcStdioFdopenTest, WriteRead) {
63-
64-
}
65-
66-
TEST(LlvmLibcStdioFdopenTest, Append) {}
67-
68-
TEST(LlvmLibcStdioFdopenTest, AppendPlus) {}

0 commit comments

Comments
 (0)