10
10
#include " src/stdio/fdopen.h"
11
11
12
12
#include " src/errno/libc_errno.h"
13
- #include " src/fcntl/fcntl.h"
14
13
#include " src/fcntl/open.h"
15
14
#include " src/stdio/fclose.h"
15
+ #include " src/stdio/fgets.h"
16
+ #include " src/stdio/fputs.h"
16
17
#include " src/unistd/close.h"
17
18
#include " test/UnitTest/ErrnoSetterMatcher.h"
18
19
#include " test/UnitTest/LibcTest.h"
19
20
#include " test/UnitTest/Test.h"
20
21
21
22
#include < sys/stat.h> // For S_IRWXU
22
23
23
- TEST (LlvmLibcStdioFdopenTest, InvalidInput ) {
24
+ TEST (LlvmLibcStdioFdopenTest, WriteAppendRead ) {
24
25
using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
25
26
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" ;
27
28
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) {
33
56
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" );
35
63
ASSERT_ERRNO_EQ (EBADF);
36
64
ASSERT_TRUE (nullptr == fp);
37
65
}
38
66
39
67
TEST (LlvmLibcStdioFdopenTest, InvalidMode) {
40
- using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
41
68
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" ;
43
70
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 );
45
72
ASSERT_ERRNO_SUCCESS ();
46
73
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
+
51
80
// If the mode argument is invalid, then `fdopen` returns a nullptr and sets
52
81
// the `errno` to EINVAL. In this case the `mode` param can only be "r" or
53
82
// "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" );
58
84
ASSERT_ERRNO_EQ (EINVAL);
59
85
ASSERT_TRUE (nullptr == fp2);
86
+ LIBC_NAMESPACE::libc_errno = 0 ;
87
+ LIBC_NAMESPACE::close (fd);
88
+ ASSERT_ERRNO_SUCCESS ();
60
89
}
61
-
62
- TEST (LlvmLibcStdioFdopenTest, WriteRead) {
63
-
64
- }
65
-
66
- TEST (LlvmLibcStdioFdopenTest, Append) {}
67
-
68
- TEST (LlvmLibcStdioFdopenTest, AppendPlus) {}
0 commit comments