31 #include <gtest/gtest.h>
32 #include <system_error>
53 using std::stringstream;
62 struct InetServerStreamTest :
public testing::Test
64 Event startev, quitev;
69 InetServerStreamTest()
80 virtual ~InetServerStreamTest()
84 static void set_all_polls(
Poller& p,
int fd)
86 p.
set(fd, Poller::PollFlag::input|Poller::PollFlag::output|Poller::PollFlag::read_hup|Poller::PollFlag::priority);
88 static std::string str_polls(
int ev)
91 if (ev & Poller::PollFlag::input) s <<
" input";
92 if (ev & Poller::PollFlag::output) s <<
" output";
93 if (ev & Poller::PollFlag::read_hup) s <<
" read_hup";
94 if (ev & Poller::PollFlag::priority) s <<
" priority";
95 if (ev & Poller::PollFlag::hup) s <<
" hup";
96 if (ev & Poller::PollFlag::error) s <<
" error";
112 log <<
"signal start" << endl;
116 p.
set(quit, Poller::PollFlag::input);
117 set_all_polls(p, sock);
122 log <<
"poll before accept" << endl;
123 s <<
"*accept_poll:";
129 log <<
"quit event" << endl;
134 int ev = p.
event(sock);
136 if (ev & ~Poller::PollFlag::output)
138 cout <<
"sock events: " << str_polls(ev) << endl;
142 if (ev & Poller::PollFlag::input)
break;
145 log <<
"calling accept" << endl;
147 auto conn =
sock.accept(from);
148 log <<
"connect from " << from << endl;
151 st.exceptions(ios::failbit);
154 set_all_polls(p, conn);
157 s <<
" *conn_read_poll:";
163 log <<
"quit event" << endl;
168 int ev = p.
event(conn);
169 if (ev & ~Poller::PollFlag::output)
171 cout <<
"conn events: " << str_polls(ev) << endl;
172 s <<
" *conn_ev:" << str_polls(ev);
175 if (ev & Poller::PollFlag::read_hup)
177 log <<
"connection sock peer hung up" << endl;
178 s <<
" *conn_peer_hup";
182 if (ev & Poller::PollFlag::input)
break;
185 log <<
"getline waiting" << endl;
187 if (!std::getline(st, got))
189 log <<
"getline returned failed" << endl;
190 s <<
" *getline_failed";
193 log <<
"got=" << got << endl;
195 s <<
" *conn_write_poll:";
201 log <<
"quit event" << endl;
206 int ev = p.
event(conn);
207 if (ev & ~Poller::PollFlag::input)
209 cout <<
"conn events: " << str_polls(ev) << endl;
210 s <<
" *conn_ev:" << str_polls(ev);
213 if (ev & Poller::PollFlag::read_hup)
215 log <<
"connection sock peer hung up" << endl;
216 s <<
" *conn_peer_hup";
220 if (ev & Poller::PollFlag::output)
break;
226 log <<
"getline stream got quit" << endl;
227 s <<
" *getline_quit";
231 log <<
"returned from stream loop" << endl;
232 s <<
" *stream_loop_returned";
234 catch (
const std::exception& e)
236 log <<
"stream exception: " << e.what() << endl;
240 log <<
"stream eof" << endl;
245 log <<
"stream eof" << endl;
248 if (st.send_fail().size())
250 log <<
"stream send failmsg=" << st.send_fail() << endl;
251 s <<
" *stream_send_fail=" << st.send_fail();
253 if (st.recv_fail().size())
255 log <<
"stream recv failmsg=" << st.recv_fail() << endl;
256 s <<
" *stream_recv_fail=" << st.recv_fail();
261 catch (
const std::exception& e)
263 log <<
"pre-accept ex: " << e.what() << endl;
265 return s.str()+
" ex="+e.what();
273 log <<
"wait for start" << endl;
278 log <<
"connect to " << endl;
283 TEST_F(InetServerStreamTest, send_quit)
285 log.
id(
"send quit and recv");
287 auto fut = async(server, std::ref(ssock), std::ref(startev), std::ref(quitev));
293 st <<
"quit" << endl;
296 log <<
"got=" << got << endl;
298 auto ret = fut.get();
299 log <<
"server response: " << ret << endl;
302 TEST_F(InetServerStreamTest, reset)
304 log.
id(
"send recv and reset");
306 auto fut = async(server, std::ref(ssock), std::ref(startev), std::ref(quitev));
312 auto ret = fut.get();
313 log <<
"server response: " << ret << endl;
316 TEST_F(InetServerStreamTest, send_and_reset_clientsock)
318 log.
id(
"send recv and reset client socket");
320 auto fut = async(server, std::ref(ssock), std::ref(startev), std::ref(quitev));
326 st <<
"don't quit" << endl;
329 log <<
"got=" << got << endl;
333 auto ret = fut.get();
334 log <<
"server response: " << ret << endl;
337 TEST_F(InetServerStreamTest, quit)
339 log.
id(
"send recv and reset");
341 auto fut = async(server, std::ref(ssock), std::ref(startev), std::ref(quitev));
343 log <<
"wait for start" << endl;
348 auto ret = fut.get();
349 log <<
"server response: " << ret << endl;
unsigned port() const
Get the port.
virtual std::string host() const
Get host.
Internet transmission control protocol (tcp) socket.
virtual void reset()
Close the connection and reset the socket.
void bind(const SockaddrBase &)
Bind an address to the socket.
void reuse_addr(bool r=true)
Set address reusable.
void connect(SockaddrBase &)
Connect to a socket address.
Signaling kernel event counter.
uint64_t read()
Read from (decrement) the event counter.
void write(uint64_t)
Write to (increment) the event counter.
Input/output stream wrapper for reader/writer.
Thread-safe stream logger.
void max_line(unsigned int)
Set the maximum line length (default is 256).
void id(const std::string &id="")
Set the id.
void add_cout()
Add std::cout console stream.
Poller which allows polling of generic file descriptors for various events.
void set(int, int)
Add a file desriptor to poller.
int event(int)
Return flags which were polled for this file descriptor.
Signaling kernel event counter.
Internet tcp and udp networking.
Base input/output stream classes.
Linux kernel i/o event notification (poller).