annotate C++/tests/Socket/main.cpp @ 389:e292f0fa5395

Socket: resurrect SSL
author David Demelier <markand@malikania.fr>
date Tue, 30 Jun 2015 15:17:01 +0200
parents 743b3a1c71c8
children d7e6d7d1e102
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1 /*
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
2 * main.cpp -- test sockets
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
3 *
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
4 * Copyright (c) 2013, 2014 David Demelier <markand@malikania.fr>
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
5 *
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
8 * copyright notice and this permission notice appear in all copies.
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
9 *
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
17 */
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
18
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <chrono>
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
20 #include <iostream>
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <sstream>
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <string>
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include <thread>
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
24
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #include <gtest/gtest.h>
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
26
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
27 #include <Socket.h>
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
28 #include <SocketAddress.h>
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
29 #include <SocketListener.h>
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
30 #include <SocketSsl.h>
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
31
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
32 using namespace address;
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
33 using namespace std::literals::chrono_literals;
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
34
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
35 /* --------------------------------------------------------
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
36 * TCP tests
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
37 * -------------------------------------------------------- */
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
38
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
39 class TcpServerTest : public testing::Test {
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
40 protected:
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
41 SocketTcp<Ipv4> m_server{AF_INET, 0};
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
42 SocketTcp<Ipv4> m_client{AF_INET, 0};
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
43
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
44 std::thread m_tserver;
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
45 std::thread m_tclient;
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
46
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
47 public:
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
48 TcpServerTest()
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
49 {
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
50 m_server.set(SOL_SOCKET, SO_REUSEADDR, 1);
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
51 }
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
52
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
53 ~TcpServerTest()
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
54 {
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
55 if (m_tserver.joinable())
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
56 m_tserver.join();
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
57 if (m_tclient.joinable())
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
58 m_tclient.join();
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
59 }
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
60 };
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
61
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
62 TEST_F(TcpServerTest, connect)
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
63 {
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
64 m_tserver = std::thread([this] () {
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
65 m_server.bind(Ipv4{"*", 16000});
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
66
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
67 ASSERT_EQ(SocketState::Bound, m_server.state());
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
68
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
69 m_server.listen();
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
70 m_server.accept();
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
71 m_server.close();
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
72 });
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
73
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
74 std::this_thread::sleep_for(100ms);
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
75
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
76 m_tclient = std::thread([this] () {
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
77 m_client.connect(Ipv4{"127.0.0.1", 16000});
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
78
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
79 ASSERT_EQ(SocketState::Connected, m_client.state());
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
80
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
81 m_client.close();
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
82 });
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
83 }
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
84
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
85 TEST_F(TcpServerTest, io)
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
86 {
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
87 m_tserver = std::thread([this] () {
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
88 m_server.bind(Ipv4{"*", 16000});
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
89 m_server.listen();
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
90
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
91 auto client = m_server.accept();
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
92 auto msg = client.recv(512);
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
93
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
94 ASSERT_EQ("hello world", msg);
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
95
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
96 client.send(msg);
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
97 });
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
98
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
99 std::this_thread::sleep_for(100ms);
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
100
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
101 m_tclient = std::thread([this] () {
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
102 m_client.connect(Ipv4{"127.0.0.1", 16000});
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
103 m_client.send("hello world");
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
104
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
105 ASSERT_EQ("hello world", m_client.recv(512));
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
106 });
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
107 }
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
108
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
109 /* --------------------------------------------------------
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
110 * UDP tests
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
111 * -------------------------------------------------------- */
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
112
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
113 class UdpServerTest : public testing::Test {
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
114 protected:
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
115 SocketUdp<Ipv4> m_server{AF_INET, 0};
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
116 SocketUdp<Ipv4> m_client{AF_INET, 0};
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
117
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
118 std::thread m_tserver;
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
119 std::thread m_tclient;
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
120
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
121 public:
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
122 UdpServerTest()
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
123 {
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
124 m_server.set(SOL_SOCKET, SO_REUSEADDR, 1);
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
125 }
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
126
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
127 ~UdpServerTest()
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
128 {
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
129 if (m_tserver.joinable())
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
130 m_tserver.join();
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
131 if (m_tclient.joinable())
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
132 m_tclient.join();
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
133 }
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
134 };
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
135
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
136 TEST_F(UdpServerTest, io)
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
137 {
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
138 m_tserver = std::thread([this] () {
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
139 Ipv4 info{"*", 16000};
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
140
380
06b0f405c58f Socket: initial support for object-oriented addresses
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
141 m_server.bind(info);
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
142 auto msg = m_server.recvfrom(512, info);
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
143
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
144 ASSERT_EQ("hello world", msg);
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
145
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
146 m_server.sendto(msg, info);
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
147 m_server.close();
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
148 });
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
149
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
150 std::this_thread::sleep_for(100ms);
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
151
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
152 m_tclient = std::thread([this] () {
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
153 Ipv4 info{"127.0.0.1", 16000};
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
154
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
155 m_client.sendto("hello world", info);
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
156
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
157 ASSERT_EQ("hello world", m_client.recvfrom(512, info));
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
158
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
159 m_client.close();
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
160 });
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
161 }
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
162
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
163 /* --------------------------------------------------------
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
164 * Listener: set function
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
165 * -------------------------------------------------------- */
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
166
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
167 class TestBackendSet {
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
168 public:
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
169 int m_callcount{0};
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
170 bool m_added{false};
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
171 int m_flags{0};
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
172
386
743b3a1c71c8 Socket: improve doxygen documentation
David Demelier <markand@malikania.fr>
parents: 383
diff changeset
173 inline void set(const SocketTable &, SocketAbstract &, int flags, bool add) noexcept
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
174 {
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
175 m_callcount ++;
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
176 m_added = add;
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
177 m_flags |= flags;
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
178 }
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
179
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
180 inline void unset(const SocketTable &, SocketAbstract &, int, bool) noexcept
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
181 {
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
182 }
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
183
386
743b3a1c71c8 Socket: improve doxygen documentation
David Demelier <markand@malikania.fr>
parents: 383
diff changeset
184 std::vector<SocketStatus> wait(const SocketTable &, int)
743b3a1c71c8 Socket: improve doxygen documentation
David Demelier <markand@malikania.fr>
parents: 383
diff changeset
185 {
743b3a1c71c8 Socket: improve doxygen documentation
David Demelier <markand@malikania.fr>
parents: 383
diff changeset
186 return {};
743b3a1c71c8 Socket: improve doxygen documentation
David Demelier <markand@malikania.fr>
parents: 383
diff changeset
187 }
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
188 };
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
189
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
190 class TestBackendSetFail {
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
191 public:
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
192 inline void set(const SocketTable &, SocketAbstract &, int, bool)
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
193 {
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
194 throw "fail";
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
195 }
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
196
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
197 inline void unset(const SocketTable &, const SocketAbstract &, int, bool) noexcept
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
198 {
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
199 }
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
200
386
743b3a1c71c8 Socket: improve doxygen documentation
David Demelier <markand@malikania.fr>
parents: 383
diff changeset
201 std::vector<SocketStatus> wait(const SocketTable &, int)
743b3a1c71c8 Socket: improve doxygen documentation
David Demelier <markand@malikania.fr>
parents: 383
diff changeset
202 {
743b3a1c71c8 Socket: improve doxygen documentation
David Demelier <markand@malikania.fr>
parents: 383
diff changeset
203 return {};
743b3a1c71c8 Socket: improve doxygen documentation
David Demelier <markand@malikania.fr>
parents: 383
diff changeset
204 }
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
205 };
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
206
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
207 TEST(ListenerSet, initialAdd)
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
208 {
382
4b08afed634d Socket:
David Demelier <markand@malikania.fr>
parents: 381
diff changeset
209 SocketListenerAbstract<TestBackendSet> listener;
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
210 SocketAbstract s{0};
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
211
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
212 listener.set(s, SocketListener::Read);
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
213
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
214 ASSERT_EQ(1U, listener.size());
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
215 ASSERT_EQ(1, listener.backend().m_callcount);
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
216 ASSERT_TRUE(listener.backend().m_added);
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
217 ASSERT_TRUE(listener.backend().m_flags == SocketListener::Read);
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
218 }
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
219
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
220 TEST(ListenerSet, readThenWrite)
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
221 {
382
4b08afed634d Socket:
David Demelier <markand@malikania.fr>
parents: 381
diff changeset
222 SocketListenerAbstract<TestBackendSet> listener;
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
223 SocketAbstract s{0};
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
224
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
225 listener.set(s, SocketListener::Read);
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
226 listener.set(s, SocketListener::Write);
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
227
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
228 ASSERT_EQ(1U, listener.size());
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
229 ASSERT_EQ(2, listener.backend().m_callcount);
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
230 ASSERT_FALSE(listener.backend().m_added);
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
231 ASSERT_TRUE(listener.backend().m_flags == 0x3);
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
232 }
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
233
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
234 TEST(ListenerSet, allOneShot)
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
235 {
382
4b08afed634d Socket:
David Demelier <markand@malikania.fr>
parents: 381
diff changeset
236 SocketListenerAbstract<TestBackendSet> listener;
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
237 SocketAbstract s{0};
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
238
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
239 listener.set(s, SocketListener::Read | SocketListener::Write);
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
240
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
241 ASSERT_EQ(1U, listener.size());
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
242 ASSERT_EQ(1, listener.backend().m_callcount);
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
243 ASSERT_TRUE(listener.backend().m_added);
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
244 ASSERT_TRUE(listener.backend().m_flags == 0x3);
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
245 }
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
246
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
247 TEST(ListenerSet, readTwice)
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
248 {
382
4b08afed634d Socket:
David Demelier <markand@malikania.fr>
parents: 381
diff changeset
249 SocketListenerAbstract<TestBackendSet> listener;
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
250 SocketAbstract s{0};
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
251
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
252 listener.set(s, SocketListener::Read);
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
253 listener.set(s, SocketListener::Read);
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
254
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
255 ASSERT_EQ(1U, listener.size());
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
256 ASSERT_EQ(1, listener.backend().m_callcount);
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
257 ASSERT_TRUE(listener.backend().m_added);
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
258 ASSERT_TRUE(listener.backend().m_flags == SocketListener::Read);
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
259 }
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
260
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
261 TEST(ListenerSet, failure)
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
262 {
382
4b08afed634d Socket:
David Demelier <markand@malikania.fr>
parents: 381
diff changeset
263 SocketListenerAbstract<TestBackendSetFail> listener;
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
264 SocketAbstract s{0};
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
265
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
266 try {
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
267 listener.set(s, SocketListener::Read);
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
268 FAIL() << "exception expected";
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
269 } catch (...) {
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
270 }
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
271
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
272 ASSERT_EQ(0U, listener.size());
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
273 }
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
274
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
275 /* --------------------------------------------------------
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
276 * Listener: unset / remove functions
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
277 * -------------------------------------------------------- */
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
278
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
279 class TestBackendUnset {
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
280 public:
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
281 bool m_isset{false};
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
282 bool m_isunset{false};
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
283 int m_flags{0};
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
284 bool m_removal{false};
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
285
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
286 inline void set(const SocketTable &, SocketAbstract &, int flags, bool) noexcept
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
287 {
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
288 m_isset = true;
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
289 m_flags |= flags;
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
290 }
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
291
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
292 inline void unset(const SocketTable &, SocketAbstract &, int flags, bool remove) noexcept
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
293 {
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
294 m_isunset = true;
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
295 m_flags &= ~(flags);
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
296 m_removal = remove;
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
297 }
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
298
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
299 std::vector<SocketStatus> wait(const SocketTable &, int) noexcept
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
300 {
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
301 return {};
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
302 }
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
303 };
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
304
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
305 class TestBackendUnsetFail {
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
306 public:
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
307 inline void set(const SocketTable &, SocketAbstract &, int, bool) noexcept
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
308 {
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
309 }
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
310
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
311 inline void unset(const SocketTable &, SocketAbstract &, int, bool)
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
312 {
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
313 throw "fail";
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
314 }
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
315
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
316 std::vector<SocketStatus> wait(const SocketTable &, int)
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
317 {
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
318 return {};
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
319 }
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
320 };
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
321
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
322 TEST(ListenerUnsetRemove, unset)
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
323 {
382
4b08afed634d Socket:
David Demelier <markand@malikania.fr>
parents: 381
diff changeset
324 SocketListenerAbstract<TestBackendUnset> listener;
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
325 SocketAbstract s{0};
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
326
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
327 listener.set(s, SocketListener::Read);
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
328 listener.unset(s, SocketListener::Read);
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
329
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
330 ASSERT_EQ(0U, listener.size());
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
331 ASSERT_TRUE(listener.backend().m_isset);
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
332 ASSERT_TRUE(listener.backend().m_isunset);
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
333 ASSERT_TRUE(listener.backend().m_flags == 0);
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
334 ASSERT_TRUE(listener.backend().m_removal);
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
335 }
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
336
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
337 TEST(ListenerUnsetRemove, unsetOne)
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
338 {
382
4b08afed634d Socket:
David Demelier <markand@malikania.fr>
parents: 381
diff changeset
339 SocketListenerAbstract<TestBackendUnset> listener;
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
340 SocketAbstract s{0};
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
341
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
342 listener.set(s, SocketListener::Read | SocketListener::Write);
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
343 listener.unset(s, SocketListener::Read);
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
344
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
345 ASSERT_EQ(1U, listener.size());
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
346 ASSERT_TRUE(listener.backend().m_isset);
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
347 ASSERT_TRUE(listener.backend().m_isunset);
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
348 ASSERT_TRUE(listener.backend().m_flags == SocketListener::Write);
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
349 ASSERT_FALSE(listener.backend().m_removal);
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
350 }
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
351
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
352 TEST(ListenerUnsetRemove, unsetAll)
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
353 {
382
4b08afed634d Socket:
David Demelier <markand@malikania.fr>
parents: 381
diff changeset
354 SocketListenerAbstract<TestBackendUnset> listener;
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
355 SocketAbstract s{0};
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
356
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
357 listener.set(s, SocketListener::Read | SocketListener::Write);
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
358 listener.unset(s, SocketListener::Read);
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
359 listener.unset(s, SocketListener::Write);
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
360
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
361 ASSERT_EQ(0U, listener.size());
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
362 ASSERT_TRUE(listener.backend().m_isset);
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
363 ASSERT_TRUE(listener.backend().m_isunset);
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
364 ASSERT_TRUE(listener.backend().m_flags == 0);
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
365 ASSERT_TRUE(listener.backend().m_removal);
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
366 }
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
367
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
368 TEST(ListenerUnsetRemove, remove)
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
369 {
382
4b08afed634d Socket:
David Demelier <markand@malikania.fr>
parents: 381
diff changeset
370 SocketListenerAbstract<TestBackendUnset> listener;
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
371 SocketAbstract s{0};
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
372
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
373 listener.set(s, SocketListener::Read | SocketListener::Write);
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
374 listener.remove(s);
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
375
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
376 ASSERT_EQ(0U, listener.size());
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
377 ASSERT_TRUE(listener.backend().m_isset);
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
378 ASSERT_TRUE(listener.backend().m_isunset);
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
379 ASSERT_TRUE(listener.backend().m_flags == 0);
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
380 ASSERT_TRUE(listener.backend().m_removal);
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
381 }
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
382
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
383 TEST(ListenerUnsetRemove, failure)
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
384 {
382
4b08afed634d Socket:
David Demelier <markand@malikania.fr>
parents: 381
diff changeset
385 SocketListenerAbstract<TestBackendUnsetFail> listener;
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
386 SocketAbstract s{0};
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
387
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
388 listener.set(s, SocketListener::Read | SocketListener::Write);
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
389
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
390 try {
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
391 listener.remove(s);
368
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
392 FAIL() << "exception expected";
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
393 } catch (...) {
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
394 }
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
395
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
396 /* If fail, kept into the table */
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
397 ASSERT_EQ(1U, listener.size());
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
398 }
6c0015524ca9 Socket: fallback to Select until we update backends
David Demelier <markand@malikania.fr>
parents: 350
diff changeset
399
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
400 /* --------------------------------------------------------
369
f3c762579073 Socket: add more docs into SocketListener
David Demelier <markand@malikania.fr>
parents: 368
diff changeset
401 * Listener: system
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
402 * -------------------------------------------------------- */
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
403
369
f3c762579073 Socket: add more docs into SocketListener
David Demelier <markand@malikania.fr>
parents: 368
diff changeset
404 class ListenerTest : public testing::Test {
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
405 protected:
382
4b08afed634d Socket:
David Demelier <markand@malikania.fr>
parents: 381
diff changeset
406 SocketListenerAbstract<backend::Select> m_listener;
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
407 SocketTcp<Ipv4> m_masterTcp;
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
408 SocketTcp<Ipv4> m_clientTcp;
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
409
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
410 std::thread m_tserver;
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
411 std::thread m_tclient;
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
412
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
413 public:
369
f3c762579073 Socket: add more docs into SocketListener
David Demelier <markand@malikania.fr>
parents: 368
diff changeset
414 ListenerTest()
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
415 : m_masterTcp{AF_INET, 0}
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
416 , m_clientTcp{AF_INET, 0}
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
417 {
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
418 m_masterTcp.set(SOL_SOCKET, SO_REUSEADDR, 1);
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
419 m_masterTcp.bind(Ipv4{"*", 16000});
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
420 m_masterTcp.listen();
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
421 }
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
422
369
f3c762579073 Socket: add more docs into SocketListener
David Demelier <markand@malikania.fr>
parents: 368
diff changeset
423 ~ListenerTest()
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
424 {
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
425 if (m_tserver.joinable()) {
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
426 m_tserver.join();
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
427 }
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
428 if (m_tclient.joinable()) {
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
429 m_tclient.join();
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
430 }
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
431 }
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
432 };
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
433
369
f3c762579073 Socket: add more docs into SocketListener
David Demelier <markand@malikania.fr>
parents: 368
diff changeset
434 TEST_F(ListenerTest, accept)
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
435 {
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
436 m_tserver = std::thread([this] () {
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
437 try {
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
438 m_listener.set(m_masterTcp, SocketListener::Read);
346
d235553e47a9 Socket:
David Demelier <markand@malikania.fr>
parents: 334
diff changeset
439 m_listener.wait();
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
440 m_masterTcp.accept();
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
441 m_masterTcp.close();
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
442 } catch (const std::exception &ex) {
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
443 FAIL() << ex.what();
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
444 }
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
445 });
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
446
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
447 std::this_thread::sleep_for(100ms);
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
448
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
449 m_tclient = std::thread([this] () {
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
450 m_clientTcp.connect(Ipv4{"127.0.0.1", 16000});
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
451 });
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
452 }
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
453
369
f3c762579073 Socket: add more docs into SocketListener
David Demelier <markand@malikania.fr>
parents: 368
diff changeset
454 TEST_F(ListenerTest, recv)
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
455 {
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
456 m_tserver = std::thread([this] () {
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
457 try {
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
458 m_listener.set(m_masterTcp, SocketListener::Read);
346
d235553e47a9 Socket:
David Demelier <markand@malikania.fr>
parents: 334
diff changeset
459 m_listener.wait();
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
460
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
461 auto sc = m_masterTcp.accept();
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
462
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
463 ASSERT_EQ("hello", sc.recv(512));
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
464 } catch (const std::exception &ex) {
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
465 FAIL() << ex.what();
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
466 }
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
467 });
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
468
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
469 std::this_thread::sleep_for(100ms);
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
470
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
471 m_tclient = std::thread([this] () {
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
472 m_clientTcp.connect(Ipv4{"127.0.0.1", 16000});
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
473 m_clientTcp.send("hello");
316
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
474 });
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
475 }
4c0af1143fc4 Add wait operation (no tests yet)
David Demelier <markand@malikania.fr>
parents: 315
diff changeset
476
350
5a1ec6603230 Socket: add new kqueue backend
David Demelier <markand@malikania.fr>
parents: 347
diff changeset
477 /* --------------------------------------------------------
318
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
478 * Non-blocking connect
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
479 * -------------------------------------------------------- */
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
480
318
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
481 class NonBlockingConnectTest : public testing::Test {
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
482 protected:
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
483 SocketTcp<Ipv4> m_server{AF_INET, 0};
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
484 SocketTcp<Ipv4> m_client{AF_INET, 0};
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
485
318
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
486 std::thread m_tserver;
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
487 std::thread m_tclient;
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
488
318
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
489 public:
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
490 NonBlockingConnectTest()
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
491 {
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
492 m_client.setBlockMode(false);
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
493 }
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
494
318
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
495 ~NonBlockingConnectTest()
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
496 {
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
497 if (m_tserver.joinable())
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
498 m_tserver.join();
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
499 if (m_tclient.joinable())
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
500 m_tclient.join();
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
501 }
318
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
502 };
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
503
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
504 /* --------------------------------------------------------
318
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
505 * TCP accept
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
506 * -------------------------------------------------------- */
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
507
318
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
508 class TcpAcceptTest : public testing::Test {
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
509 protected:
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
510 SocketTcp<Ipv4> m_server{AF_INET, 0};
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
511 SocketTcp<Ipv4> m_client{AF_INET, 0};
318
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
512
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
513 std::thread m_tserver;
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
514 std::thread m_tclient;
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
515
318
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
516 public:
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
517 TcpAcceptTest()
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
518 {
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
519 m_server.set(SOL_SOCKET, SO_REUSEADDR, 1);
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
520 m_server.bind(Ipv4{"*", 16000});
318
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
521 m_server.listen();
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
522 }
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
523
318
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
524 ~TcpAcceptTest()
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
525 {
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
526 if (m_tserver.joinable())
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
527 m_tserver.join();
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
528 if (m_tclient.joinable())
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
529 m_tclient.join();
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
530 }
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
531 };
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
532
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
533 /* --------------------------------------------------------
318
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
534 * TCP recv
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
535 * -------------------------------------------------------- */
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
536
318
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
537 class TcpRecvTest : public testing::Test {
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
538 protected:
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
539 SocketTcp<Ipv4> m_server{AF_INET, 0};
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
540 SocketTcp<Ipv4> m_client{AF_INET, 0};
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
541
318
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
542 std::thread m_tserver;
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
543 std::thread m_tclient;
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
544
318
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
545 public:
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
546 TcpRecvTest()
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
547 {
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
548 m_server.set(SOL_SOCKET, SO_REUSEADDR, 1);
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
549 m_server.bind(Ipv4{"*", 16000});
318
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
550 m_server.listen();
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
551 }
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
552
318
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
553 ~TcpRecvTest()
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
554 {
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
555 if (m_tserver.joinable())
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
556 m_tserver.join();
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
557 if (m_tclient.joinable())
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
558 m_tclient.join();
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
559 }
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
560 };
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
561
318
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
562 TEST_F(TcpRecvTest, blockingSuccess)
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
563 {
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
564 m_tserver = std::thread([this] () {
378
92457ea8f7e2 Socket: switch to more OO
David Demelier <markand@malikania.fr>
parents: 370
diff changeset
565 auto client = m_server.accept();
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
566
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
567 ASSERT_EQ("hello", client.recv(32));
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
568 });
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
569
318
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
570 std::this_thread::sleep_for(100ms);
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
571
318
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
572 m_tclient = std::thread([this] () {
381
9fd636045546 Socket:
David Demelier <markand@malikania.fr>
parents: 380
diff changeset
573 m_client.connect(Ipv4{"127.0.0.1", 16000});
318
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
574 m_client.send("hello");
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
575 m_client.close();
68ae6d7dea1f Sockets: improve errors
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
576 });
297
836903141476 Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents: 293
diff changeset
577 }
836903141476 Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents: 293
diff changeset
578
319
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
579 /* --------------------------------------------------------
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
580 * Socket SSL
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
581 * -------------------------------------------------------- */
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
582
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
583 class SslTest : public testing::Test {
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
584 protected:
389
e292f0fa5395 Socket: resurrect SSL
David Demelier <markand@malikania.fr>
parents: 386
diff changeset
585 SocketSsl<Ipv4> client{AF_INET, 0};
319
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
586 };
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
587
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
588 TEST_F(SslTest, connect)
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
589 {
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
590 try {
389
e292f0fa5395 Socket: resurrect SSL
David Demelier <markand@malikania.fr>
parents: 386
diff changeset
591 client.connect(Ipv4{"google.fr", 443});
319
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
592 client.close();
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
593 } catch (const SocketError &error) {
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
594 FAIL() << error.what();
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
595 }
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
596 }
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
597
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
598 TEST_F(SslTest, recv)
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
599 {
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
600 try {
389
e292f0fa5395 Socket: resurrect SSL
David Demelier <markand@malikania.fr>
parents: 386
diff changeset
601 client.connect(Ipv4{"google.fr", 443});
319
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
602 client.send("GET / HTTP/1.0\r\n\r\n");
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
603
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
604 std::string msg = client.recv(512);
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
605 std::string content = msg.substr(0, 18);
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
606
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
607 ASSERT_EQ("HTTP/1.0 302 Found", content);
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
608
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
609 client.close();
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
610 } catch (const SocketError &error) {
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
611 FAIL() << error.what();
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
612 }
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
613 }
cba77da58496 * Finalize SocketSsl
David Demelier <markand@malikania.fr>
parents: 318
diff changeset
614
383
403fa2642e19 Socket: add operator on addresses
David Demelier <markand@malikania.fr>
parents: 382
diff changeset
615 /* --------------------------------------------------------
403fa2642e19 Socket: add operator on addresses
David Demelier <markand@malikania.fr>
parents: 382
diff changeset
616 * Operators
403fa2642e19 Socket: add operator on addresses
David Demelier <markand@malikania.fr>
parents: 382
diff changeset
617 * -------------------------------------------------------- */
403fa2642e19 Socket: add operator on addresses
David Demelier <markand@malikania.fr>
parents: 382
diff changeset
618
403fa2642e19 Socket: add operator on addresses
David Demelier <markand@malikania.fr>
parents: 382
diff changeset
619 TEST(AddressOperator, less)
403fa2642e19 Socket: add operator on addresses
David Demelier <markand@malikania.fr>
parents: 382
diff changeset
620 {
403fa2642e19 Socket: add operator on addresses
David Demelier <markand@malikania.fr>
parents: 382
diff changeset
621 Ipv4 ip1{"*", 8000};
403fa2642e19 Socket: add operator on addresses
David Demelier <markand@malikania.fr>
parents: 382
diff changeset
622 Ipv4 ip2{"*", 8002};
403fa2642e19 Socket: add operator on addresses
David Demelier <markand@malikania.fr>
parents: 382
diff changeset
623
403fa2642e19 Socket: add operator on addresses
David Demelier <markand@malikania.fr>
parents: 382
diff changeset
624 ASSERT_LT(ip1, ip2);
403fa2642e19 Socket: add operator on addresses
David Demelier <markand@malikania.fr>
parents: 382
diff changeset
625 }
403fa2642e19 Socket: add operator on addresses
David Demelier <markand@malikania.fr>
parents: 382
diff changeset
626
403fa2642e19 Socket: add operator on addresses
David Demelier <markand@malikania.fr>
parents: 382
diff changeset
627 TEST(AddressOperator, same)
403fa2642e19 Socket: add operator on addresses
David Demelier <markand@malikania.fr>
parents: 382
diff changeset
628 {
403fa2642e19 Socket: add operator on addresses
David Demelier <markand@malikania.fr>
parents: 382
diff changeset
629 Ipv4 ip1{"*", 8000};
403fa2642e19 Socket: add operator on addresses
David Demelier <markand@malikania.fr>
parents: 382
diff changeset
630 Ipv4 ip2{"*", 8000};
403fa2642e19 Socket: add operator on addresses
David Demelier <markand@malikania.fr>
parents: 382
diff changeset
631
403fa2642e19 Socket: add operator on addresses
David Demelier <markand@malikania.fr>
parents: 382
diff changeset
632 ASSERT_EQ(ip1, ip2);
403fa2642e19 Socket: add operator on addresses
David Demelier <markand@malikania.fr>
parents: 382
diff changeset
633 }
403fa2642e19 Socket: add operator on addresses
David Demelier <markand@malikania.fr>
parents: 382
diff changeset
634
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
635 int main(int argc, char **argv)
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
636 {
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
637 testing::InitGoogleTest(&argc, argv);
260
2096edb63a4f Socket: fix Windows
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
638
315
c9356cb38c86 Split sockets into SocketTcp and SocketUdp
David Demelier <markand@malikania.fr>
parents: 297
diff changeset
639 return RUN_ALL_TESTS();
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
640 }