blob: ef1d489cd878adbf997ff01d67f5846fb8ac7fdc [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
97} // namespace stdplus::fd