blob: 0a7638fc71ee019046ce7a354bdba4b1cf6c6a72 [file] [log] [blame]
William A. Kennington III93ae9702023-12-22 16:41:17 -08001#include "util.hpp"
2
3#include <stdplus/exception.hpp>
4#include <stdplus/fd/gmock.hpp>
William A. Kennington IIIeac9d472020-08-03 13:57:14 -07005#include <stdplus/fd/ops.hpp>
William A. Kennington III93ae9702023-12-22 16:41:17 -08006#include <stdplus/numeric/endian.hpp>
William A. Kennington IIIeac9d472020-08-03 13:57:14 -07007
Patrick Williamsd1984dd2023-05-10 16:12:44 -05008#include <gtest/gtest.h>
9
William A. Kennington III93ae9702023-12-22 16:41:17 -080010namespace stdplus::fd
William A. Kennington IIIeac9d472020-08-03 13:57:14 -070011{
William A. Kennington III93ae9702023-12-22 16:41:17 -080012
13using testing::_;
14using testing::Ge;
15using testing::SizeIs;
16using std::literals::string_view_literals::operator""sv;
William A. Kennington IIIeac9d472020-08-03 13:57:14 -070017
18TEST(Flags, Flags)
19{
20 FdFlags f = FdFlags(0).set(FdFlag::CloseOnExec).unset(FdFlag::CloseOnExec);
21 f.set(FdFlag::CloseOnExec).unset(FdFlag::CloseOnExec);
22 EXPECT_EQ(0, static_cast<int>(f));
23}
24
William A. Kennington III93ae9702023-12-22 16:41:17 -080025TEST(ReadExact, Success)
26{
27 testing::StrictMock<FdMock> fd;
28 {
29 testing::InSequence seq;
30 EXPECT_CALL(fd, read(SizeIs(Ge(4)))).WillOnce(readSv("alph"));
31 EXPECT_CALL(fd, read(SizeIs(Ge(2)))).WillOnce(readSv("a "));
32 EXPECT_CALL(fd, read(SizeIs(Ge(3)))).WillOnce(readSv("one"));
33 }
34 char buf[9];
35 readExact(fd, buf);
36 EXPECT_EQ(std::string_view(buf, sizeof(buf)), "alpha one");
37}
38
39TEST(ReadExact, NotEnoughEof)
40{
41 testing::StrictMock<FdMock> fd;
42 {
43 testing::InSequence seq;
44 EXPECT_CALL(fd, read(_)).WillOnce(readSv("alph"));
45 EXPECT_CALL(fd, read(_)).WillOnce(readSv("a "));
46 EXPECT_CALL(fd, read(_))
47 .WillRepeatedly(testing::Throw(exception::Eof("test")));
48 }
49 char buf[9];
50 EXPECT_THROW(readExact(fd, buf), exception::Incomplete);
51 EXPECT_THROW(readExact(fd, buf), exception::Eof);
52}
53
54TEST(ReadExact, NotEnoughBlock)
55{
56 testing::StrictMock<FdMock> fd;
57 {
58 testing::InSequence seq;
59 EXPECT_CALL(fd, read(_)).WillOnce(readSv("alph"));
60 EXPECT_CALL(fd, read(_)).WillOnce(readSv("a "));
61 EXPECT_CALL(fd, read(_)).WillRepeatedly(readSv(""));
62 }
63 char buf[9];
64 EXPECT_THROW(readExact(fd, buf), exception::Incomplete);
65 EXPECT_THROW(readExact(fd, buf), exception::WouldBlock);
66}
67
68TEST(ReadExact, NotEnoughBlockInt)
69{
70 testing::StrictMock<FdMock> fd;
71 {
72 testing::InSequence seq;
73 EXPECT_CALL(fd, read(_)).WillOnce(readSv("\0\0\0"sv));
74 EXPECT_CALL(fd, read(_)).WillRepeatedly(readSv(""));
75 }
76 int32_t i;
77 EXPECT_THROW(readExact(fd, i), exception::Incomplete);
78 EXPECT_THROW(readExact(fd, i), exception::WouldBlock);
79}
80
81TEST(ReadExact, EnoughInt)
82{
83 testing::StrictMock<FdMock> fd;
84 {
85 testing::InSequence seq;
86 EXPECT_CALL(fd, read(_)).WillOnce(readSv("\0\0\0\0"sv));
87 EXPECT_CALL(fd, read(_)).WillOnce(readSv("\x01\x02"sv));
88 EXPECT_CALL(fd, read(_)).WillOnce(readSv("\x03\x04"sv));
89 }
90 int32_t i;
91 readExact(fd, i);
92 EXPECT_EQ(i, 0);
93 readExact(fd, i);
94 EXPECT_EQ(ntoh(i), 0x01020304);
95}
96
William A. Kennington IIIb88c4572023-12-22 16:43:42 -080097TEST(Read, Success)
98{
99 testing::StrictMock<FdMock> fd;
100 {
101 testing::InSequence seq;
102 EXPECT_CALL(fd, read(_)).WillOnce(readSv("alph"));
103 EXPECT_CALL(fd, read(_)).WillOnce(readSv("one"));
104 EXPECT_CALL(fd, read(_)).WillOnce(readSv(""));
105 }
106 char buf[15];
107 auto res = read(fd, buf);
108 EXPECT_EQ(std::string_view(res.begin(), res.end()), "alph");
109 res = read(fd, buf);
110 EXPECT_EQ(std::string_view(res.begin(), res.end()), "one");
111 EXPECT_TRUE(read(fd, buf).empty());
112}
113
114TEST(Read, NotEnoughInt)
115{
116 testing::StrictMock<FdMock> fd;
117 {
118 testing::InSequence seq;
119 EXPECT_CALL(fd, read(_)).WillOnce(readSv("\0\0\0"sv));
120 EXPECT_CALL(fd, read(_)).WillRepeatedly(readSv(""));
121 }
122 std::array<int32_t, 1> i;
123 EXPECT_THROW(read(fd, i), exception::Incomplete);
124 EXPECT_TRUE(read(fd, i).empty());
125}
126
127TEST(Read, NotEnoughEofInt)
128{
129 testing::StrictMock<FdMock> fd;
130 {
131 testing::InSequence seq;
132 EXPECT_CALL(fd, read(_)).WillOnce(readSv("\0\0\0"sv));
133 EXPECT_CALL(fd, read(_))
134 .WillRepeatedly(testing::Throw(exception::Eof("test")));
135 }
136 std::array<int32_t, 1> i;
137 EXPECT_THROW(read(fd, i), exception::Incomplete);
138 EXPECT_THROW(read(fd, i), exception::Eof);
139}
140
141TEST(Read, EnoughInt)
142{
143 testing::StrictMock<FdMock> fd;
144 {
145 testing::InSequence seq;
146 EXPECT_CALL(fd, read(_)).WillOnce(readSv("\0\0\0\0"sv));
147 EXPECT_CALL(fd, read(_)).WillOnce(readSv("\x01\x02"sv));
148 EXPECT_CALL(fd, read(_)).WillOnce(readSv("\x03\x04"sv));
149 }
150 std::array<int32_t, 1> i;
151 read(fd, i);
152 EXPECT_EQ(i[0], 0);
153 read(fd, i);
154 EXPECT_EQ(stdplus::ntoh(i[0]), 0x01020304);
155}
156
William A. Kennington III93ae9702023-12-22 16:41:17 -0800157} // namespace stdplus::fd