annotate C++/Tests/Sockets/main.cpp @ 293:9b3270513f40

Socket: accept() can also block
author David Demelier <markand@malikania.fr>
date Thu, 13 Nov 2014 21:03:12 +0100
parents ea55a3886da0
children 836903141476
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
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 #include <Socket.h>
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 #include <SocketListener.h>
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 #include <SocketAddress.h>
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
30
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 using namespace std::literals::chrono_literals;
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
32
280
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
33 using namespace error;
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 using namespace address;
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
35
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 /* --------------------------------------------------------
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 * Miscellaneous
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 * -------------------------------------------------------- */
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
39
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 TEST(Misc, set)
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
42 Socket s;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
43
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 try {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
45 s = { AF_INET6, SOCK_STREAM, 0 };
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
46
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
47 s.set(IPPROTO_IPV6, IPV6_V6ONLY, 0);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
48 ASSERT_EQ(0, s.get<int>(IPPROTO_IPV6, IPV6_V6ONLY));
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
49
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
50 s.set(IPPROTO_IPV6, IPV6_V6ONLY, 1);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
51 ASSERT_EQ(1, s.get<int>(IPPROTO_IPV6, IPV6_V6ONLY));
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
52 } catch (const std::exception &ex) {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
53 std::cerr << "warning: " << ex.what() << std::endl;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
54 }
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
55
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
56 s.close();
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
58
278
adcae2bde2f0 Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents: 277
diff changeset
59 TEST(Misc, initializer)
adcae2bde2f0 Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents: 277
diff changeset
60 {
adcae2bde2f0 Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents: 277
diff changeset
61 Socket s1, s2;
adcae2bde2f0 Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents: 277
diff changeset
62
adcae2bde2f0 Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents: 277
diff changeset
63 try {
adcae2bde2f0 Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents: 277
diff changeset
64 s1 = { AF_INET6, SOCK_STREAM, 0 };
adcae2bde2f0 Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents: 277
diff changeset
65 s2 = { AF_INET6, SOCK_STREAM, 0 };
adcae2bde2f0 Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents: 277
diff changeset
66
adcae2bde2f0 Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents: 277
diff changeset
67 SocketListener listener {
adcae2bde2f0 Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents: 277
diff changeset
68 { s1, Read },
adcae2bde2f0 Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents: 277
diff changeset
69 { s2, Read },
adcae2bde2f0 Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents: 277
diff changeset
70 };
adcae2bde2f0 Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents: 277
diff changeset
71
adcae2bde2f0 Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents: 277
diff changeset
72 ASSERT_EQ(2UL, listener.size());
adcae2bde2f0 Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents: 277
diff changeset
73
adcae2bde2f0 Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents: 277
diff changeset
74 listener.list([&] (const auto &so, auto direction) {
adcae2bde2f0 Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents: 277
diff changeset
75 ASSERT_TRUE(so == s1 || so == s2);
adcae2bde2f0 Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents: 277
diff changeset
76 ASSERT_EQ(Read, direction);
adcae2bde2f0 Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents: 277
diff changeset
77 });
adcae2bde2f0 Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents: 277
diff changeset
78 } catch (const std::exception &ex) {
adcae2bde2f0 Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents: 277
diff changeset
79 std::cerr << "warning: " << ex.what() << std::endl;
adcae2bde2f0 Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents: 277
diff changeset
80 }
adcae2bde2f0 Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents: 277
diff changeset
81
adcae2bde2f0 Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents: 277
diff changeset
82 s1.close();
adcae2bde2f0 Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents: 277
diff changeset
83 s2.close();
adcae2bde2f0 Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents: 277
diff changeset
84 }
adcae2bde2f0 Socket: listener now have initializer list constructor
David Demelier <markand@malikania.fr>
parents: 277
diff changeset
85
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 /* --------------------------------------------------------
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 * Select tests
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 * -------------------------------------------------------- */
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
89
280
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
90 TEST(ListenerMethodSelect, timeout)
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
91 {
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
92 std::thread server([] () {
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
93 Socket s, client;
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
94 SocketListener listener(Select);
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
95 bool running = true;
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
96 int tries = 0;
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
97
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
98 try {
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
99 s = { AF_INET, SOCK_STREAM, 0 };
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
100 s.set(SOL_SOCKET, SO_REUSEADDR, 1);
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
101 s.bind(Internet{"*", 10000, AF_INET});
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
102 s.listen(10);
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
103
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
104 listener.add(s, Read);
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
105
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
106 while (running) {
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
107 try {
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
108 listener.select(500ms);
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
109 client = s.accept();
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
110 running = false;
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
111
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
112 // Abort if no client connected
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
113 if (tries >= 10)
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
114 running = false;
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
115 } catch (const Timeout &) {
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
116 }
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
117 }
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
118 } catch (const std::exception &ex) {
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
119 std::cerr << "warning: " << ex.what() << std::endl;
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
120 }
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
121
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
122 s.close();
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
123 client.close();
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
124 });
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
125
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
126 std::thread client([] () {
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
127 std::this_thread::sleep_for(2s);
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
128
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
129 Socket s;
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
130
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
131 try {
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
132 s = { AF_INET, SOCK_STREAM, 0 };
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
133 s.connect(Internet{"localhost", 10000, AF_INET});
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
134 } catch (const std::exception &ex) {
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
135 std::cerr << "warning: " << ex.what() << std::endl;
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
136 }
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
137
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
138 s.close();
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
139 });
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
140
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
141 server.join();
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
142 client.join();
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
143 }
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
144
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
145 TEST(ListenerMethodSelect, add)
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
147 Socket s, s2;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
148
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 try {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
150 s = { AF_INET, SOCK_STREAM, 0 };
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
151 s2 = { AF_INET, SOCK_STREAM, 0 };
280
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
152 SocketListener listener(Select);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
153
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
154 listener.add(s, Read);
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
155 listener.add(s2, Read);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
156
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
157 ASSERT_EQ(2UL, listener.size());
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 } catch (const std::exception &ex) {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
159 std::cerr << "warning: " << ex.what() << std::endl;
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 }
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
161
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
162 s.close();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
163 s2.close();
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
165
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
166 TEST(ListenerMethodSelect, remove)
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
168 Socket s, s2;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
169
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 try {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
171 s = { AF_INET, SOCK_STREAM, 0 };
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
172 s2 = { AF_INET, SOCK_STREAM, 0 };
280
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
173 SocketListener listener(Select);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
174
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
175 listener.add(s, Read);
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
176 listener.add(s2, Read);
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
177 listener.remove(s, Read);
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
178 listener.remove(s2, Read);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
179
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
180 ASSERT_EQ(0UL, listener.size());
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 } catch (const std::exception &ex) {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
182 std::cerr << "warning: " << ex.what() << std::endl;
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 }
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
184
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
185 s.close();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
186 s2.close();
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
188
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 /*
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
190 * Add two sockets for both reading and writing, them remove only reading and then
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
191 * move only writing.
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 */
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
193 TEST(ListenerMethodSelect, inOut)
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
195 Socket s, s2;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
196
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 try {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
198 s = { AF_INET, SOCK_STREAM, 0 };
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
199 s2 = { AF_INET, SOCK_STREAM, 0 };
280
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
200 SocketListener listener(Select);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
201
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
202 listener.add(s, Read | Write);
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
203 listener.add(s2, Read | Write);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
204
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
205 listener.list([&] (Socket &si, int dir) {
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 ASSERT_TRUE(si == s || si == s2);
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 ASSERT_EQ(0x03, static_cast<int>(dir));
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 });
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
209
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
210 listener.remove(s, Write);
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
211 listener.remove(s2, Write);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
212
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
213 ASSERT_EQ(2UL, listener.size());
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
214
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
215 listener.list([&] (Socket &si, int dir) {
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 ASSERT_TRUE(si == s || si == s2);
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
217 ASSERT_EQ(Read, dir);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 });
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
219
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
220 listener.remove(s, Read);
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
221 listener.remove(s2, Read);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
222
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
223 ASSERT_EQ(0UL, listener.size());
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
224 } catch (const std::exception &ex) {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
225 std::cerr << "warning: " << ex.what() << std::endl;
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
226 }
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
227
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
228 s.close();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
229 s2.close();
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
230 }
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
231
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
232 TEST(ListenerMethodSelect, addSame)
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
233 {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
234 Socket s;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
235
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
236 try {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
237 s = { AF_INET, SOCK_STREAM, 0 };
280
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
238 SocketListener listener(Select);
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
239
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
240 listener.add(s, Read);
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
241 ASSERT_EQ(1UL, listener.size());
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
242 listener.list([&] (const Socket &si, int dir) {
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
243 ASSERT_TRUE(si == s);
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
244 ASSERT_EQ(Read, dir);
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
245 });
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
246
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
247 listener.add(s, Write);
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
248 ASSERT_EQ(1UL, listener.size());
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
249 listener.list([&] (const Socket &si, int dir) {
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
250 ASSERT_TRUE(si == s);
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
251 ASSERT_EQ(0x03, static_cast<int>(dir));
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
252 });
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
253
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
254 // Oops, added the same
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
255 listener.add(s, Read);
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
256 listener.add(s, Write);
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
257 listener.add(s, Read | Write);
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
258
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
259 ASSERT_EQ(1UL, listener.size());
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
260 listener.list([&] (const Socket &si, int dir) {
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
261 ASSERT_TRUE(si == s);
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
262 ASSERT_EQ(0x03, static_cast<int>(dir));
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
263 });
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
264 } catch (const std::exception &ex) {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
265 std::cerr << "warning: " << ex.what() << std::endl;
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
266 }
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
267
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
268 s.close();
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
269 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
270
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
271 /* --------------------------------------------------------
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
272 * Poll tests
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
273 * -------------------------------------------------------- */
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
274
280
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
275 TEST(ListenerMethodPoll, timeout)
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
276 {
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
277 std::thread server([] () {
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
278 Socket s, client;
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
279 SocketListener listener(Poll);
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
280 bool running = true;
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
281 int tries = 0;
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
282
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
283 try {
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
284 s = { AF_INET, SOCK_STREAM, 0 };
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
285 s.set(SOL_SOCKET, SO_REUSEADDR, 1);
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
286 s.bind(Internet{"*", 10000, AF_INET});
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
287 s.listen(10);
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
288
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
289 listener.add(s, Read);
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
290
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
291 while (running) {
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
292 try {
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
293 listener.select(500ms);
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
294 client = s.accept();
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
295 running = false;
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
296
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
297 // Abort if no client connected
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
298 if (tries >= 10)
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
299 running = false;
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
300 } catch (const Timeout &) {
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
301 }
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
302 }
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
303 } catch (const std::exception &ex) {
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
304 std::cerr << "warning: " << ex.what() << std::endl;
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
305 }
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
306
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
307 s.close();
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
308 client.close();
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
309 });
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
310
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
311 std::thread client([] () {
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
312 std::this_thread::sleep_for(2s);
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
313
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
314 Socket s;
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
315
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
316 try {
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
317 s = { AF_INET, SOCK_STREAM, 0 };
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
318 s.connect(Internet{"localhost", 10000, AF_INET});
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
319 } catch (const std::exception &ex) {
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
320 std::cerr << "warning: " << ex.what() << std::endl;
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
321 }
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
322
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
323 s.close();
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
324 });
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
325
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
326 server.join();
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
327 client.join();
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
328 }
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
329
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
330 TEST(ListenerMethodPoll, add)
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
331 {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
332 Socket s, s2;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
333
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
334 try {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
335 s = { AF_INET, SOCK_STREAM, 0 };
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
336 s2 = { AF_INET, SOCK_STREAM, 0 };
280
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
337 SocketListener listener(Poll);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
338
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
339 listener.add(s, Read);
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
340 listener.add(s2, Read);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
341
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
342 ASSERT_EQ(2UL, listener.size());
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
343 } catch (const std::exception &ex) {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
344 std::cerr << "warning: " << ex.what() << std::endl;
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
345 }
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
346
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
347 s.close();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
348 s2.close();
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
349 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
350
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
351 TEST(ListenerMethodPoll, remove)
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
352 {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
353 Socket s, s2;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
354
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
355 try {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
356 s = { AF_INET, SOCK_STREAM, 0 };
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
357 s2 = { AF_INET, SOCK_STREAM, 0 };
280
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
358 SocketListener listener(Poll);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
359
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
360 listener.add(s, Read);
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
361 listener.add(s2, Read);
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
362 listener.remove(s, Read);
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
363 listener.remove(s2, Read);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
364
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
365 ASSERT_EQ(0UL, listener.size());
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
366 } catch (const std::exception &ex) {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
367 std::cerr << "warning: " << ex.what() << std::endl;
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
368 }
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
369
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
370 s.close();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
371 s2.close();
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
372 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
373
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
374 TEST(ListenerMethodPoll, inOut)
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
375 {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
376 Socket s, s2;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
377
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
378 try {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
379 s = { AF_INET, SOCK_STREAM, 0 };
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
380 s2 = { AF_INET, SOCK_STREAM, 0 };
280
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
381 SocketListener listener(Poll);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
382
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
383 listener.add(s, Read | Write);
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
384 listener.add(s2, Read | Write);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
385
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
386 listener.list([&] (Socket &si, int dir) {
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
387 ASSERT_TRUE(si == s || si == s2);
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
388 ASSERT_EQ(0x03, static_cast<int>(dir));
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
389 });
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
390
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
391 listener.remove(s, Write);
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
392 listener.remove(s2, Write);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
393
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
394 ASSERT_EQ(2UL, listener.size());
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
395
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
396 listener.list([&] (Socket &si, int dir) {
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
397 ASSERT_TRUE(si == s || si == s2);
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
398 ASSERT_EQ(Read, dir);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
399 });
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
400
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
401 listener.remove(s, Read);
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
402 listener.remove(s2, Read);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
403
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
404 ASSERT_EQ(0UL, listener.size());
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
405 } catch (const std::exception &ex) {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
406 std::cerr << "warning: " << ex.what() << std::endl;
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
407 }
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
408
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
409 s.close();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
410 s2.close();
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
411 }
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
412
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
413 TEST(ListenerMethodPoll, addSame)
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
414 {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
415 Socket s;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
416
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
417 try {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
418 s = { AF_INET, SOCK_STREAM, 0 };
280
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
419 SocketListener listener(Poll);
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
420
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
421 listener.add(s, Read);
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
422 ASSERT_EQ(1UL, listener.size());
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
423 listener.list([&] (const Socket &si, int dir) {
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
424 ASSERT_TRUE(si == s);
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
425 ASSERT_EQ(Read, dir);
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
426 });
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
427
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
428 listener.add(s, Write);
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
429 ASSERT_EQ(1UL, listener.size());
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
430 listener.list([&] (const Socket &si, int dir) {
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
431 ASSERT_TRUE(si == s);
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
432 ASSERT_EQ(0x03, static_cast<int>(dir));
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
433 });
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
434
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
435 // Oops, added the same
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
436 listener.add(s, Read);
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
437 listener.add(s, Write);
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
438 listener.add(s, Read | Write);
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
439
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
440 ASSERT_EQ(1UL, listener.size());
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
441 listener.list([&] (const Socket &si, int dir) {
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
442 ASSERT_TRUE(si == s);
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
443 ASSERT_EQ(0x03, static_cast<int>(dir));
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
444 });
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
445 } catch (const std::exception &ex) {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
446 std::cerr << "warning: " << ex.what() << std::endl;
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
447 }
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
448
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
449 s.close();
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
450 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
451
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
452 /* --------------------------------------------------------
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
453 * Socket listener class
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
454 * -------------------------------------------------------- */
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
455
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
456 TEST(Listener, connection)
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
457 {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
458 std::thread server([] () {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
459 Socket s;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
460 SocketListener listener;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
461
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
462 try {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
463 s = { AF_INET, SOCK_STREAM, 0 };
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
464
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
465 s.set(SOL_SOCKET, SO_REUSEADDR, 1);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
466 s.bind(Internet{"*", 10000, AF_INET});
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
467 s.listen(8);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
468
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
469 listener.add(s, Read);
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
470
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
471 auto client = listener.select(10s);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
472
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
473 ASSERT_TRUE(client.direction == Read);
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
474 ASSERT_TRUE(client.socket == s);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
475 } catch (const std::exception &ex) {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
476 std::cerr << "warning: " << ex.what() << std::endl;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
477 }
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
478
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
479 s.close();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
480 });
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
481
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
482 std::thread client([] () {
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
483 Socket client;
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
484
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
485 std::this_thread::sleep_for(500ms);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
486
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
487 try {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
488 client = { AF_INET, SOCK_STREAM, 0 };
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
489 client.connect(Internet{"localhost", 10000, AF_INET});
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
490 } catch (const std::exception &ex) {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
491 std::cerr << "warning: " << ex.what() << std::endl;
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
492 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
493
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
494 client.close();
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
495 });
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
496
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
497 server.join();
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
498 client.join();
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
499 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
500
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
501 TEST(Listener, connectionAndRead)
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
502 {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
503 std::thread server([] () {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
504 Socket s;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
505 SocketListener listener;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
506
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
507 try {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
508 s = { AF_INET, SOCK_STREAM, 0 };
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
509
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
510 s.set(SOL_SOCKET, SO_REUSEADDR, 1);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
511 s.bind(Internet("*", 10000, AF_INET));
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
512 s.listen(8);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
513
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
514 // Read for master
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
515 listener.add(s, Read);
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
516
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
517 auto result = listener.select(10s);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
518
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
519 ASSERT_TRUE(result.direction == Read);
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
520 ASSERT_TRUE(result.socket == s);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
521
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
522 // Wait for client
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
523 auto client = s.accept();
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
524 listener.add(client, Read);
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
525
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
526 result = listener.select(10s);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
527
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
528 ASSERT_TRUE(result.direction == Read);
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
529 ASSERT_TRUE(result.socket == client);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
530
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
531 char data[512];
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
532 auto nb = client.recv(data, sizeof (data) - 1);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
533
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
534 data[nb] = '\0';
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
535
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
536 client.close();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
537 ASSERT_STREQ("hello world", data);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
538 } catch (const std::exception &ex) {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
539 std::cerr << "warning: " << ex.what() << std::endl;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
540 }
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
541
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
542 s.close();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
543 });
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
544
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
545 std::thread client([] () {
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
546 Socket client;
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
547
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
548 std::this_thread::sleep_for(500ms);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
549
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
550 try {
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
551 client = Socket(AF_INET, SOCK_STREAM, 0);
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
552 client.connect(Internet("localhost", 10000, AF_INET));
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
553 client.send("hello world");
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
554 } catch (const std::exception &ex) {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
555 std::cerr << "warning: " << ex.what() << std::endl;
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
556 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
557
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
558 client.close();
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
559 });
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
560
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
561 server.join();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
562 client.join();
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
563 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
564
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
565 TEST(Listener, bigData)
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
566 {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
567 std::thread server([] () {
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
568 std::ostringstream out;
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
569
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
570 Socket server;
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
571 SocketListener listener;
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
572 bool finished(false);
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
573
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
574 try {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
575 server = { AF_INET, SOCK_STREAM, 0 };
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
576
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
577 server.set(SOL_SOCKET, SO_REUSEADDR, 1);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
578 server.bind(Internet{"*", 10000, AF_INET});
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
579 server.listen(10);
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
580 listener.add(server, Read);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
581
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
582 while (!finished) {
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
583 auto s = listener.select(60s).socket;
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
584
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
585 if (s == server) {
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
586 listener.add(s.accept(), Read);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
587 } else {
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
588 char data[512];
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
589 auto nb = s.recv(data, sizeof (data) - 1);
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
590
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
591 if (nb == 0)
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
592 finished = true;
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
593 else {
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
594 data[nb] = '\0';
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
595 out << data;
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
596 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
597 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
598 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
599
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
600 ASSERT_EQ(9000002UL, out.str().size());
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
601 } catch (const std::exception &ex) {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
602 std::cerr << "warning: " << ex.what() << std::endl;
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
603 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
604
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
605 server.close();
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
606 });
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
607
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
608 std::thread client([] () {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
609 std::string data;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
610
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
611 data.reserve(9000000);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
612 for (int i = 0; i < 9000000; ++i)
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
613 data.push_back('a');
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
614
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
615 data.push_back('\r');
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
616 data.push_back('\n');
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
617
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
618 std::this_thread::sleep_for(500ms);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
619
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
620 Socket client;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
621 SocketListener listener;
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
622
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
623 try {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
624 client = { AF_INET, SOCK_STREAM, 0 };
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
625
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
626 client.connect(Internet{"localhost", 10000, AF_INET});
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
627 client.blockMode(false);
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
628 listener.add(client, Write);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
629
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
630 while (data.size() > 0) {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
631 auto s = listener.select(30s).socket;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
632 auto nb = s.send(data.data(), data.size());
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
633 data.erase(0, nb);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
634 }
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
635 } catch (const std::exception &ex) {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
636 std::cerr << "warning: " << ex.what() << std::endl;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
637 }
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
638
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
639 client.close();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
640 });
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
641
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
642 server.join();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
643 client.join();
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
644 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
645
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
646 /* --------------------------------------------------------
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
647 * Multiple selection tests
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
648 * -------------------------------------------------------- */
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
649
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
650 TEST(MultipleSelection, select)
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
651 {
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
652 /*
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
653 * Normally, 3 sockets added for writing should be marked ready immediately
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
654 * as there are no data being currently queued to be sent.
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
655 */
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
656 std::thread server([] () {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
657 Socket master;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
658
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
659 try {
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
660 SocketListener masterListener, clientListener;
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
661 master = { AF_INET, SOCK_STREAM, 0 };
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
662
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
663 master.set(SOL_SOCKET, SO_REUSEADDR, 1);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
664 master.bind(Internet{"*", 10000, AF_INET});
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
665 master.listen(8);
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
666
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
667 masterListener.add(master, Read);
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
668
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
669 while (clientListener.size() != 3) {
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
670 masterListener.select(3s);
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
671 clientListener.add(master.accept(), Write);
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
672 }
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
673
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
674 // Now do the test of writing
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
675 auto result = clientListener.selectMultiple(3s);
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
676 ASSERT_EQ(3UL, result.size());
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
677
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
678 clientListener.list([] (auto s, auto) {
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
679 s.close();
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
680 });
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
681 } catch (const std::exception &ex) {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
682 std::cerr << "warning: " << ex.what() << std::endl;
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
683 }
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
684
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
685 master.close();
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
686 });
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
687
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
688 std::thread client([] () {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
689 Socket s1, s2, s3;
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
690
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
691 try {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
692 s1 = { AF_INET, SOCK_STREAM, 0 };
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
693 s2 = { AF_INET, SOCK_STREAM, 0 };
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
694 s3 = { AF_INET, SOCK_STREAM, 0 };
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
695
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
696 std::this_thread::sleep_for(1s);
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
697
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
698 s1.connect(Internet{"localhost", 10000, AF_INET});
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
699 s2.connect(Internet{"localhost", 10000, AF_INET});
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
700 s3.connect(Internet{"localhost", 10000, AF_INET});
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
701 } catch (const std::exception &ex) {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
702 std::cerr << "warning: " << ex.what() << std::endl;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
703 }
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
704
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
705 s1.close();
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
706 s2.close();
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
707 s3.close();
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
708 });
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
709
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
710 server.join();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
711 client.join();
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
712 }
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
713
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
714 #if defined(SOCKET_LISTENER_HAVE_POLL)
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
715
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
716 TEST(MultipleSelection, poll)
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
717 {
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
718 /*
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
719 * Normally, 3 sockets added for writing should be marked ready immediately
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
720 * as there are no data being currently queued to be sent.
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
721 */
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
722 std::thread server([] () {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
723 Socket master;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
724
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
725 try {
280
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 278
diff changeset
726 SocketListener masterListener(Poll), clientListener(Poll);
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
727 master = { AF_INET, SOCK_STREAM, 0 };
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
728
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
729 master.set(SOL_SOCKET, SO_REUSEADDR, 1);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
730 master.bind(Internet{"*", 10000, AF_INET});
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
731 master.listen(8);
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
732
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
733 masterListener.add(master, Read);
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
734
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
735 while (clientListener.size() != 3) {
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
736 masterListener.select(3s);
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
737 clientListener.add(master.accept(), Write);
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
738 }
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
739
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
740 // Now do the test of writing
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
741 auto result = clientListener.selectMultiple(3s);
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
742 ASSERT_EQ(3UL, result.size());
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
743
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
744 clientListener.list([] (auto s, auto) {
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
745 s.close();
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
746 });
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
747 } catch (const std::exception &ex) {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
748 std::cerr << "warning: " << ex.what() << std::endl;
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
749 }
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
750
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
751 master.close();
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
752 });
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
753
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
754 std::thread client([] () {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
755 Socket s1, s2, s3;
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
756
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
757 try {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
758 s1 = { AF_INET, SOCK_STREAM, 0 };
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
759 s2 = { AF_INET, SOCK_STREAM, 0 };
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
760 s3 = { AF_INET, SOCK_STREAM, 0 };
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
761
277
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
762 std::this_thread::sleep_for(1s);
b544a599e08e Socket: remove enum class
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
763
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
764 s1.connect(Internet("localhost", 10000, AF_INET));
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
765 s2.connect(Internet("localhost", 10000, AF_INET));
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
766 s3.connect(Internet("localhost", 10000, AF_INET));
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
767 } catch (const std::exception &ex) {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
768 std::cerr << "warning: " << ex.what() << std::endl;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
769 }
275
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
770
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
771 s1.close();
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
772 s2.close();
d945fa44f601 Socket: update tests
David Demelier <markand@malikania.fr>
parents: 270
diff changeset
773 s3.close();
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
774 });
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
775
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
776 server.join();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
777 client.join();
270
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
778 }
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
779
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
780 #endif
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
781
46ccfbee84d9 Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
782 /* --------------------------------------------------------
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
783 * Basic TCP tests
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
784 * -------------------------------------------------------- */
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
785
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
786 TEST(BasicTcp, sendipv4) {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
787 std::thread server([] () {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
788 Socket server, client;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
789
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
790 try {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
791 server = { AF_INET, SOCK_STREAM, 0 };
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
792
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
793 server.set(SOL_SOCKET, SO_REUSEADDR, 1);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
794 server.bind(Internet{"*", 10000, AF_INET});
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
795 server.listen(8);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
796
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
797 client = server.accept();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
798
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
799 char data[512];
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
800 auto nb = client.recv(data, sizeof (data) - 1);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
801
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
802 data[nb] = '\0';
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
803
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
804 ASSERT_STREQ("hello", data);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
805 } catch (const std::exception &ex) {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
806 std::cerr << "warning: " << ex.what() << std::endl;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
807 }
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
808
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
809 server.close();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
810 client.close();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
811 });
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
812
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
813 std::thread client([] () {
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
814 Socket s;
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
815
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
816 std::this_thread::sleep_for(500ms);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
817 try {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
818 s = { AF_INET, SOCK_STREAM, 0 };
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
819
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
820 s.connect(Internet{"localhost", 10000, AF_INET});
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
821 s.send("hello");
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
822 } catch (const std::exception &ex) {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
823 std::cerr << "warning: " << ex.what() << std::endl;
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
824 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
825
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
826 s.close();
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
827 });
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
828
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
829 server.join();
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
830 client.join();
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
831 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
832
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
833 TEST(BasicTcp, sendipv6) {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
834 std::thread server([] () {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
835 Socket server, client;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
836
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
837 try {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
838 server = { AF_INET6, SOCK_STREAM, 0 };
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
839
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
840 server.set(SOL_SOCKET, SO_REUSEADDR, 1);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
841 server.bind(Internet("*", 10000, AF_INET6));
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
842 server.listen(8);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
843
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
844 client = server.accept();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
845
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
846 char data[512];
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
847 auto nb = client.recv(data, sizeof (data) - 1);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
848
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
849 data[nb] = '\0';
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
850
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
851 ASSERT_STREQ("hello", data);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
852 } catch (const std::exception &ex) {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
853 std::cerr << "warning: " << ex.what() << std::endl;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
854 }
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
855
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
856 server.close();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
857 client.close();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
858 });
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
859
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
860 std::thread client([] () {
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
861 Socket s;
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
862
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
863 std::this_thread::sleep_for(500ms);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
864 try {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
865 s = { AF_INET6, SOCK_STREAM, 0 };
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
866
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
867 s.connect(Internet{"ip6-localhost", 10000, AF_INET6});
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
868 s.send("hello");
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
869 } catch (const std::exception &ex) {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
870 std::cerr << "warning: " << ex.what() << std::endl;
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
871 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
872
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
873 s.close();
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
874 });
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
875
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
876 server.join();
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
877 client.join();
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
878 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
879
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
880 #if !defined(_WIN32)
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
881
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
882 TEST(BasicTcp, sendunix) {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
883 std::thread server([] () {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
884 Socket server, client;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
885
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
886 try {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
887 server = { AF_UNIX, SOCK_STREAM, 0 };
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
888
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
889 server.set(SOL_SOCKET, SO_REUSEADDR, 1);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
890 server.bind(Unix("/tmp/gtest-send-tcp-unix.sock", true));
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
891 server.listen(8);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
892
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
893 client = server.accept();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
894
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
895 char data[512];
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
896 auto nb = client.recv(data, sizeof (data) - 1);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
897
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
898 data[nb] = '\0';
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
899
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
900 ASSERT_STREQ("hello", data);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
901 } catch (const std::exception &ex) {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
902 std::cerr << "warning: " << ex.what() << std::endl;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
903 }
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
904
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
905 server.close();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
906 client.close();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
907 });
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
908
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
909 std::thread client([] () {
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
910 Socket s;
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
911
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
912 std::this_thread::sleep_for(500ms);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
913 try {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
914 s = { AF_UNIX, SOCK_STREAM, 0 };
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
915
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
916 s.connect(Unix{"/tmp/gtest-send-tcp-unix.sock"});
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
917 s.send("hello");
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
918 } catch (const std::exception &ex) {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
919 std::cerr << "warning: " << ex.what() << std::endl;
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
920 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
921
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
922 s.close();
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
923 });
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
924
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
925 server.join();
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
926 client.join();
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
927 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
928
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
929 #endif
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
930
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
931 /* --------------------------------------------------------
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
932 * Basic UDP tests
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
933 * -------------------------------------------------------- */
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
934
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
935 TEST(BasicUdp, sendipv4) {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
936 std::thread server([] () {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
937 Socket server;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
938
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
939 try {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
940 server = { AF_INET, SOCK_DGRAM, 0 };
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
941
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
942 server.set(SOL_SOCKET, SO_REUSEADDR, 1);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
943 server.bind(Internet("*", 10000, AF_INET));
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
944
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
945 char data[512];
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
946 auto nb = server.recvfrom(data, sizeof (data) - 1);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
947
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
948 data[nb] = '\0';
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
949
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
950 ASSERT_STREQ("hello", data);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
951 } catch (const std::exception &ex) {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
952 std::cerr << "warning: " << ex.what() << std::endl;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
953 }
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
954
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
955 server.close();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
956 });
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
957
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
958 std::thread client([] () {
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
959 Socket s;
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
960
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
961 std::this_thread::sleep_for(500ms);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
962 try {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
963 s = { AF_INET, SOCK_DGRAM, 0 };
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
964
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
965 s.sendto("hello", Internet{"localhost", 10000, AF_INET});
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
966 } catch (const std::exception &ex) {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
967 std::cerr << "warning: " << ex.what() << std::endl;
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
968 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
969
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
970 s.close();
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
971 });
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
972
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
973 server.join();
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
974 client.join();
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
975 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
976
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
977 TEST(BasicUdp, sendipv6) {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
978 std::thread server([] () {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
979 Socket server;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
980
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
981 try {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
982 server = { AF_INET6, SOCK_DGRAM, 0 };
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
983
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
984 server.set(SOL_SOCKET, SO_REUSEADDR, 1);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
985 server.set(IPPROTO_IPV6, IPV6_V6ONLY, 1);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
986 server.bind(Internet{"*", 10000, AF_INET6});
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
987
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
988 char data[512];
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
989 auto nb = server.recvfrom(data, sizeof (data) - 1);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
990
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
991 data[nb] = '\0';
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
992
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
993 ASSERT_STREQ("hello", data);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
994 } catch (const std::exception &ex) {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
995 std::cerr << "warning: " << ex.what() << std::endl;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
996 }
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
997
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
998 server.close();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
999 });
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1000
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1001 std::thread client([] () {
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1002 Socket s;
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1003
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1004 std::this_thread::sleep_for(500ms);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1005 try {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1006 s = { AF_INET6, SOCK_DGRAM, 0 };
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1007
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1008 s.sendto("hello", Internet{"ip6-localhost", 10000, AF_INET6});
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1009 } catch (const std::exception &ex) {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1010 std::cerr << "warning: " << ex.what() << std::endl;
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1011 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1012
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1013 s.close();
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1014 });
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1015
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1016 server.join();
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1017 client.join();
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1018 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1019
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1020 #if !defined(_WIN32)
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1021
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1022 TEST(BasicUdp, sendunix) {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1023 std::thread server([] () {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1024 Socket server;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1025
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1026 try {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1027 server = { AF_UNIX, SOCK_DGRAM, 0 };
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1028
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1029 server.set(SOL_SOCKET, SO_REUSEADDR, 1);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1030 server.bind(Unix{"/tmp/gtest-send-udp-unix.sock", true});
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1031
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1032 char data[512];
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1033 auto nb = server.recvfrom(data, sizeof (data) - 1);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1034
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1035 data[nb] = '\0';
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1036
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1037 ASSERT_STREQ("hello", data);
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1038 } catch (const std::exception &ex) {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1039 std::cerr << "warning: " << ex.what() << std::endl;
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1040 }
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1041
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1042 server.close();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1043 });
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1044
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1045 std::thread client([] () {
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1046 Socket s;
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1047
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1048 std::this_thread::sleep_for(500ms);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1049 try {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1050 s = { AF_UNIX, SOCK_DGRAM, 0 };
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1051
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1052 s.sendto("hello", Unix{"/tmp/gtest-send-udp-unix.sock"});
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1053 } catch (const std::exception &ex) {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1054 std::cerr << "warning: " << ex.what() << std::endl;
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1055 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1056
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1057 s.close();
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1058 });
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1059
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 275
diff changeset
1060 server.join();
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1061 client.join();
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1062 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1063
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1064 #endif
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1065
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1066 int main(int argc, char **argv)
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1067 {
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1068 Socket::init();
260
2096edb63a4f Socket: fix Windows
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
1069
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1070 testing::InitGoogleTest(&argc, argv);
260
2096edb63a4f Socket: fix Windows
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
1071
2096edb63a4f Socket: fix Windows
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
1072 auto ret = RUN_ALL_TESTS();
2096edb63a4f Socket: fix Windows
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
1073
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1074 Socket::finish();
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1075
260
2096edb63a4f Socket: fix Windows
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
1076 return ret;
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1077 }