1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "net/socket/udp_socket.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <algorithm>
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker #include "base/containers/circular_deque.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/functional/bind.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/location.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/memory/weak_ptr.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/run_loop.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/scoped_clear_last_error.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_number_conversions.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/task/single_thread_task_runner.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/test/scoped_feature_list.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/threading/thread.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
21*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
22*6777b538SAndroid Build Coastguard Worker #include "build/chromeos_buildflags.h"
23*6777b538SAndroid Build Coastguard Worker #include "net/base/features.h"
24*6777b538SAndroid Build Coastguard Worker #include "net/base/io_buffer.h"
25*6777b538SAndroid Build Coastguard Worker #include "net/base/ip_address.h"
26*6777b538SAndroid Build Coastguard Worker #include "net/base/ip_endpoint.h"
27*6777b538SAndroid Build Coastguard Worker #include "net/base/net_errors.h"
28*6777b538SAndroid Build Coastguard Worker #include "net/base/network_interfaces.h"
29*6777b538SAndroid Build Coastguard Worker #include "net/base/test_completion_callback.h"
30*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_event_type.h"
31*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_source.h"
32*6777b538SAndroid Build Coastguard Worker #include "net/log/test_net_log.h"
33*6777b538SAndroid Build Coastguard Worker #include "net/log/test_net_log_util.h"
34*6777b538SAndroid Build Coastguard Worker #include "net/socket/socket_test_util.h"
35*6777b538SAndroid Build Coastguard Worker #include "net/socket/udp_client_socket.h"
36*6777b538SAndroid Build Coastguard Worker #include "net/socket/udp_server_socket.h"
37*6777b538SAndroid Build Coastguard Worker #include "net/socket/udp_socket_global_limits.h"
38*6777b538SAndroid Build Coastguard Worker #include "net/test/gtest_util.h"
39*6777b538SAndroid Build Coastguard Worker #include "net/test/test_with_task_environment.h"
40*6777b538SAndroid Build Coastguard Worker #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
41*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
42*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
43*6777b538SAndroid Build Coastguard Worker #include "testing/platform_test.h"
44*6777b538SAndroid Build Coastguard Worker
45*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_WIN)
46*6777b538SAndroid Build Coastguard Worker #include <netinet/in.h>
47*6777b538SAndroid Build Coastguard Worker #include <sys/socket.h>
48*6777b538SAndroid Build Coastguard Worker #else
49*6777b538SAndroid Build Coastguard Worker #include <winsock2.h>
50*6777b538SAndroid Build Coastguard Worker #endif
51*6777b538SAndroid Build Coastguard Worker
52*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
53*6777b538SAndroid Build Coastguard Worker #include "base/android/build_info.h"
54*6777b538SAndroid Build Coastguard Worker #include "net/android/network_change_notifier_factory_android.h"
55*6777b538SAndroid Build Coastguard Worker #include "net/base/network_change_notifier.h"
56*6777b538SAndroid Build Coastguard Worker #endif
57*6777b538SAndroid Build Coastguard Worker
58*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_IOS)
59*6777b538SAndroid Build Coastguard Worker #include <TargetConditionals.h>
60*6777b538SAndroid Build Coastguard Worker #endif
61*6777b538SAndroid Build Coastguard Worker
62*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_MAC)
63*6777b538SAndroid Build Coastguard Worker #include "base/mac/mac_util.h"
64*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_MAC)
65*6777b538SAndroid Build Coastguard Worker
66*6777b538SAndroid Build Coastguard Worker using net::test::IsError;
67*6777b538SAndroid Build Coastguard Worker using net::test::IsOk;
68*6777b538SAndroid Build Coastguard Worker using testing::DoAll;
69*6777b538SAndroid Build Coastguard Worker using testing::Not;
70*6777b538SAndroid Build Coastguard Worker
71*6777b538SAndroid Build Coastguard Worker namespace net {
72*6777b538SAndroid Build Coastguard Worker
73*6777b538SAndroid Build Coastguard Worker namespace {
74*6777b538SAndroid Build Coastguard Worker
75*6777b538SAndroid Build Coastguard Worker // Creates an address from ip address and port and writes it to |*address|.
CreateUDPAddress(const std::string & ip_str,uint16_t port,IPEndPoint * address)76*6777b538SAndroid Build Coastguard Worker bool CreateUDPAddress(const std::string& ip_str,
77*6777b538SAndroid Build Coastguard Worker uint16_t port,
78*6777b538SAndroid Build Coastguard Worker IPEndPoint* address) {
79*6777b538SAndroid Build Coastguard Worker IPAddress ip_address;
80*6777b538SAndroid Build Coastguard Worker if (!ip_address.AssignFromIPLiteral(ip_str))
81*6777b538SAndroid Build Coastguard Worker return false;
82*6777b538SAndroid Build Coastguard Worker
83*6777b538SAndroid Build Coastguard Worker *address = IPEndPoint(ip_address, port);
84*6777b538SAndroid Build Coastguard Worker return true;
85*6777b538SAndroid Build Coastguard Worker }
86*6777b538SAndroid Build Coastguard Worker
87*6777b538SAndroid Build Coastguard Worker class UDPSocketTest : public PlatformTest, public WithTaskEnvironment {
88*6777b538SAndroid Build Coastguard Worker public:
UDPSocketTest()89*6777b538SAndroid Build Coastguard Worker UDPSocketTest() : buffer_(base::MakeRefCounted<IOBufferWithSize>(kMaxRead)) {}
90*6777b538SAndroid Build Coastguard Worker
91*6777b538SAndroid Build Coastguard Worker // Blocks until data is read from the socket.
RecvFromSocket(UDPServerSocket * socket)92*6777b538SAndroid Build Coastguard Worker std::string RecvFromSocket(UDPServerSocket* socket) {
93*6777b538SAndroid Build Coastguard Worker TestCompletionCallback callback;
94*6777b538SAndroid Build Coastguard Worker
95*6777b538SAndroid Build Coastguard Worker int rv = socket->RecvFrom(buffer_.get(), kMaxRead, &recv_from_address_,
96*6777b538SAndroid Build Coastguard Worker callback.callback());
97*6777b538SAndroid Build Coastguard Worker rv = callback.GetResult(rv);
98*6777b538SAndroid Build Coastguard Worker if (rv < 0)
99*6777b538SAndroid Build Coastguard Worker return std::string();
100*6777b538SAndroid Build Coastguard Worker return std::string(buffer_->data(), rv);
101*6777b538SAndroid Build Coastguard Worker }
102*6777b538SAndroid Build Coastguard Worker
103*6777b538SAndroid Build Coastguard Worker // Sends UDP packet.
104*6777b538SAndroid Build Coastguard Worker // If |address| is specified, then it is used for the destination
105*6777b538SAndroid Build Coastguard Worker // to send to. Otherwise, will send to the last socket this server
106*6777b538SAndroid Build Coastguard Worker // received from.
SendToSocket(UDPServerSocket * socket,const std::string & msg)107*6777b538SAndroid Build Coastguard Worker int SendToSocket(UDPServerSocket* socket, const std::string& msg) {
108*6777b538SAndroid Build Coastguard Worker return SendToSocket(socket, msg, recv_from_address_);
109*6777b538SAndroid Build Coastguard Worker }
110*6777b538SAndroid Build Coastguard Worker
SendToSocket(UDPServerSocket * socket,std::string msg,const IPEndPoint & address)111*6777b538SAndroid Build Coastguard Worker int SendToSocket(UDPServerSocket* socket,
112*6777b538SAndroid Build Coastguard Worker std::string msg,
113*6777b538SAndroid Build Coastguard Worker const IPEndPoint& address) {
114*6777b538SAndroid Build Coastguard Worker scoped_refptr<StringIOBuffer> io_buffer =
115*6777b538SAndroid Build Coastguard Worker base::MakeRefCounted<StringIOBuffer>(msg);
116*6777b538SAndroid Build Coastguard Worker TestCompletionCallback callback;
117*6777b538SAndroid Build Coastguard Worker int rv = socket->SendTo(io_buffer.get(), io_buffer->size(), address,
118*6777b538SAndroid Build Coastguard Worker callback.callback());
119*6777b538SAndroid Build Coastguard Worker return callback.GetResult(rv);
120*6777b538SAndroid Build Coastguard Worker }
121*6777b538SAndroid Build Coastguard Worker
ReadSocket(UDPClientSocket * socket)122*6777b538SAndroid Build Coastguard Worker std::string ReadSocket(UDPClientSocket* socket) {
123*6777b538SAndroid Build Coastguard Worker return ReadSocket(socket, DSCP_DEFAULT, ECN_DEFAULT);
124*6777b538SAndroid Build Coastguard Worker }
125*6777b538SAndroid Build Coastguard Worker
ReadSocket(UDPClientSocket * socket,DiffServCodePoint dscp,EcnCodePoint ecn)126*6777b538SAndroid Build Coastguard Worker std::string ReadSocket(UDPClientSocket* socket,
127*6777b538SAndroid Build Coastguard Worker DiffServCodePoint dscp,
128*6777b538SAndroid Build Coastguard Worker EcnCodePoint ecn) {
129*6777b538SAndroid Build Coastguard Worker TestCompletionCallback callback;
130*6777b538SAndroid Build Coastguard Worker
131*6777b538SAndroid Build Coastguard Worker int rv = socket->Read(buffer_.get(), kMaxRead, callback.callback());
132*6777b538SAndroid Build Coastguard Worker rv = callback.GetResult(rv);
133*6777b538SAndroid Build Coastguard Worker if (rv < 0)
134*6777b538SAndroid Build Coastguard Worker return std::string();
135*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
136*6777b538SAndroid Build Coastguard Worker // The DSCP value is not populated on Windows, in order to avoid incurring
137*6777b538SAndroid Build Coastguard Worker // an extra system call.
138*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(socket->GetLastTos().dscp, DSCP_DEFAULT);
139*6777b538SAndroid Build Coastguard Worker #else
140*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(socket->GetLastTos().dscp, dscp);
141*6777b538SAndroid Build Coastguard Worker #endif
142*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(socket->GetLastTos().ecn, ecn);
143*6777b538SAndroid Build Coastguard Worker return std::string(buffer_->data(), rv);
144*6777b538SAndroid Build Coastguard Worker }
145*6777b538SAndroid Build Coastguard Worker
146*6777b538SAndroid Build Coastguard Worker // Writes specified message to the socket.
WriteSocket(UDPClientSocket * socket,const std::string & msg)147*6777b538SAndroid Build Coastguard Worker int WriteSocket(UDPClientSocket* socket, const std::string& msg) {
148*6777b538SAndroid Build Coastguard Worker scoped_refptr<StringIOBuffer> io_buffer =
149*6777b538SAndroid Build Coastguard Worker base::MakeRefCounted<StringIOBuffer>(msg);
150*6777b538SAndroid Build Coastguard Worker TestCompletionCallback callback;
151*6777b538SAndroid Build Coastguard Worker int rv = socket->Write(io_buffer.get(), io_buffer->size(),
152*6777b538SAndroid Build Coastguard Worker callback.callback(), TRAFFIC_ANNOTATION_FOR_TESTS);
153*6777b538SAndroid Build Coastguard Worker return callback.GetResult(rv);
154*6777b538SAndroid Build Coastguard Worker }
155*6777b538SAndroid Build Coastguard Worker
WriteSocketIgnoreResult(UDPClientSocket * socket,const std::string & msg)156*6777b538SAndroid Build Coastguard Worker void WriteSocketIgnoreResult(UDPClientSocket* socket,
157*6777b538SAndroid Build Coastguard Worker const std::string& msg) {
158*6777b538SAndroid Build Coastguard Worker WriteSocket(socket, msg);
159*6777b538SAndroid Build Coastguard Worker }
160*6777b538SAndroid Build Coastguard Worker
161*6777b538SAndroid Build Coastguard Worker // And again for a bare socket
SendToSocket(UDPSocket * socket,std::string msg,const IPEndPoint & address)162*6777b538SAndroid Build Coastguard Worker int SendToSocket(UDPSocket* socket,
163*6777b538SAndroid Build Coastguard Worker std::string msg,
164*6777b538SAndroid Build Coastguard Worker const IPEndPoint& address) {
165*6777b538SAndroid Build Coastguard Worker auto io_buffer = base::MakeRefCounted<StringIOBuffer>(msg);
166*6777b538SAndroid Build Coastguard Worker TestCompletionCallback callback;
167*6777b538SAndroid Build Coastguard Worker int rv = socket->SendTo(io_buffer.get(), io_buffer->size(), address,
168*6777b538SAndroid Build Coastguard Worker callback.callback());
169*6777b538SAndroid Build Coastguard Worker return callback.GetResult(rv);
170*6777b538SAndroid Build Coastguard Worker }
171*6777b538SAndroid Build Coastguard Worker
172*6777b538SAndroid Build Coastguard Worker // Run unit test for a connection test.
173*6777b538SAndroid Build Coastguard Worker // |use_nonblocking_io| is used to switch between overlapped and non-blocking
174*6777b538SAndroid Build Coastguard Worker // IO on Windows. It has no effect in other ports.
175*6777b538SAndroid Build Coastguard Worker void ConnectTest(bool use_nonblocking_io, bool use_async);
176*6777b538SAndroid Build Coastguard Worker
177*6777b538SAndroid Build Coastguard Worker protected:
178*6777b538SAndroid Build Coastguard Worker static const int kMaxRead = 1024;
179*6777b538SAndroid Build Coastguard Worker scoped_refptr<IOBufferWithSize> buffer_;
180*6777b538SAndroid Build Coastguard Worker IPEndPoint recv_from_address_;
181*6777b538SAndroid Build Coastguard Worker };
182*6777b538SAndroid Build Coastguard Worker
183*6777b538SAndroid Build Coastguard Worker const int UDPSocketTest::kMaxRead;
184*6777b538SAndroid Build Coastguard Worker
ReadCompleteCallback(int * result_out,base::OnceClosure callback,int result)185*6777b538SAndroid Build Coastguard Worker void ReadCompleteCallback(int* result_out,
186*6777b538SAndroid Build Coastguard Worker base::OnceClosure callback,
187*6777b538SAndroid Build Coastguard Worker int result) {
188*6777b538SAndroid Build Coastguard Worker *result_out = result;
189*6777b538SAndroid Build Coastguard Worker std::move(callback).Run();
190*6777b538SAndroid Build Coastguard Worker }
191*6777b538SAndroid Build Coastguard Worker
ConnectTest(bool use_nonblocking_io,bool use_async)192*6777b538SAndroid Build Coastguard Worker void UDPSocketTest::ConnectTest(bool use_nonblocking_io, bool use_async) {
193*6777b538SAndroid Build Coastguard Worker std::string simple_message("hello world!");
194*6777b538SAndroid Build Coastguard Worker RecordingNetLogObserver net_log_observer;
195*6777b538SAndroid Build Coastguard Worker // Setup the server to listen.
196*6777b538SAndroid Build Coastguard Worker IPEndPoint server_address(IPAddress::IPv4Localhost(), 0 /* port */);
197*6777b538SAndroid Build Coastguard Worker auto server =
198*6777b538SAndroid Build Coastguard Worker std::make_unique<UDPServerSocket>(NetLog::Get(), NetLogSource());
199*6777b538SAndroid Build Coastguard Worker if (use_nonblocking_io)
200*6777b538SAndroid Build Coastguard Worker server->UseNonBlockingIO();
201*6777b538SAndroid Build Coastguard Worker server->AllowAddressReuse();
202*6777b538SAndroid Build Coastguard Worker ASSERT_THAT(server->Listen(server_address), IsOk());
203*6777b538SAndroid Build Coastguard Worker // Get bound port.
204*6777b538SAndroid Build Coastguard Worker ASSERT_THAT(server->GetLocalAddress(&server_address), IsOk());
205*6777b538SAndroid Build Coastguard Worker
206*6777b538SAndroid Build Coastguard Worker // Setup the client.
207*6777b538SAndroid Build Coastguard Worker auto client = std::make_unique<UDPClientSocket>(
208*6777b538SAndroid Build Coastguard Worker DatagramSocket::DEFAULT_BIND, NetLog::Get(), NetLogSource());
209*6777b538SAndroid Build Coastguard Worker if (use_nonblocking_io)
210*6777b538SAndroid Build Coastguard Worker client->UseNonBlockingIO();
211*6777b538SAndroid Build Coastguard Worker
212*6777b538SAndroid Build Coastguard Worker if (!use_async) {
213*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(client->Connect(server_address), IsOk());
214*6777b538SAndroid Build Coastguard Worker } else {
215*6777b538SAndroid Build Coastguard Worker TestCompletionCallback callback;
216*6777b538SAndroid Build Coastguard Worker int rv = client->ConnectAsync(server_address, callback.callback());
217*6777b538SAndroid Build Coastguard Worker if (rv != OK) {
218*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(rv, ERR_IO_PENDING);
219*6777b538SAndroid Build Coastguard Worker rv = callback.WaitForResult();
220*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(rv, OK);
221*6777b538SAndroid Build Coastguard Worker } else {
222*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(rv, OK);
223*6777b538SAndroid Build Coastguard Worker }
224*6777b538SAndroid Build Coastguard Worker }
225*6777b538SAndroid Build Coastguard Worker // Client sends to the server.
226*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message.length(),
227*6777b538SAndroid Build Coastguard Worker static_cast<size_t>(WriteSocket(client.get(), simple_message)));
228*6777b538SAndroid Build Coastguard Worker
229*6777b538SAndroid Build Coastguard Worker // Server waits for message.
230*6777b538SAndroid Build Coastguard Worker std::string str = RecvFromSocket(server.get());
231*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message, str);
232*6777b538SAndroid Build Coastguard Worker
233*6777b538SAndroid Build Coastguard Worker // Server echoes reply.
234*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message.length(),
235*6777b538SAndroid Build Coastguard Worker static_cast<size_t>(SendToSocket(server.get(), simple_message)));
236*6777b538SAndroid Build Coastguard Worker
237*6777b538SAndroid Build Coastguard Worker // Client waits for response.
238*6777b538SAndroid Build Coastguard Worker str = ReadSocket(client.get());
239*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message, str);
240*6777b538SAndroid Build Coastguard Worker
241*6777b538SAndroid Build Coastguard Worker // Test asynchronous read. Server waits for message.
242*6777b538SAndroid Build Coastguard Worker base::RunLoop run_loop;
243*6777b538SAndroid Build Coastguard Worker int read_result = 0;
244*6777b538SAndroid Build Coastguard Worker int rv = server->RecvFrom(buffer_.get(), kMaxRead, &recv_from_address_,
245*6777b538SAndroid Build Coastguard Worker base::BindOnce(&ReadCompleteCallback, &read_result,
246*6777b538SAndroid Build Coastguard Worker run_loop.QuitClosure()));
247*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
248*6777b538SAndroid Build Coastguard Worker
249*6777b538SAndroid Build Coastguard Worker // Client sends to the server.
250*6777b538SAndroid Build Coastguard Worker base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
251*6777b538SAndroid Build Coastguard Worker FROM_HERE,
252*6777b538SAndroid Build Coastguard Worker base::BindOnce(&UDPSocketTest::WriteSocketIgnoreResult,
253*6777b538SAndroid Build Coastguard Worker base::Unretained(this), client.get(), simple_message));
254*6777b538SAndroid Build Coastguard Worker run_loop.Run();
255*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message.length(), static_cast<size_t>(read_result));
256*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message, std::string(buffer_->data(), read_result));
257*6777b538SAndroid Build Coastguard Worker
258*6777b538SAndroid Build Coastguard Worker NetLogSource server_net_log_source = server->NetLog().source();
259*6777b538SAndroid Build Coastguard Worker NetLogSource client_net_log_source = client->NetLog().source();
260*6777b538SAndroid Build Coastguard Worker
261*6777b538SAndroid Build Coastguard Worker // Delete sockets so they log their final events.
262*6777b538SAndroid Build Coastguard Worker server.reset();
263*6777b538SAndroid Build Coastguard Worker client.reset();
264*6777b538SAndroid Build Coastguard Worker
265*6777b538SAndroid Build Coastguard Worker // Check the server's log.
266*6777b538SAndroid Build Coastguard Worker auto server_entries =
267*6777b538SAndroid Build Coastguard Worker net_log_observer.GetEntriesForSource(server_net_log_source);
268*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(6u, server_entries.size());
269*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(
270*6777b538SAndroid Build Coastguard Worker LogContainsBeginEvent(server_entries, 0, NetLogEventType::SOCKET_ALIVE));
271*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(LogContainsEvent(server_entries, 1,
272*6777b538SAndroid Build Coastguard Worker NetLogEventType::UDP_LOCAL_ADDRESS,
273*6777b538SAndroid Build Coastguard Worker NetLogEventPhase::NONE));
274*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(LogContainsEvent(server_entries, 2,
275*6777b538SAndroid Build Coastguard Worker NetLogEventType::UDP_BYTES_RECEIVED,
276*6777b538SAndroid Build Coastguard Worker NetLogEventPhase::NONE));
277*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(LogContainsEvent(server_entries, 3,
278*6777b538SAndroid Build Coastguard Worker NetLogEventType::UDP_BYTES_SENT,
279*6777b538SAndroid Build Coastguard Worker NetLogEventPhase::NONE));
280*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(LogContainsEvent(server_entries, 4,
281*6777b538SAndroid Build Coastguard Worker NetLogEventType::UDP_BYTES_RECEIVED,
282*6777b538SAndroid Build Coastguard Worker NetLogEventPhase::NONE));
283*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(
284*6777b538SAndroid Build Coastguard Worker LogContainsEndEvent(server_entries, 5, NetLogEventType::SOCKET_ALIVE));
285*6777b538SAndroid Build Coastguard Worker
286*6777b538SAndroid Build Coastguard Worker // Check the client's log.
287*6777b538SAndroid Build Coastguard Worker auto client_entries =
288*6777b538SAndroid Build Coastguard Worker net_log_observer.GetEntriesForSource(client_net_log_source);
289*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(7u, client_entries.size());
290*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(
291*6777b538SAndroid Build Coastguard Worker LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE));
292*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(
293*6777b538SAndroid Build Coastguard Worker LogContainsBeginEvent(client_entries, 1, NetLogEventType::UDP_CONNECT));
294*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(
295*6777b538SAndroid Build Coastguard Worker LogContainsEndEvent(client_entries, 2, NetLogEventType::UDP_CONNECT));
296*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(LogContainsEvent(client_entries, 3,
297*6777b538SAndroid Build Coastguard Worker NetLogEventType::UDP_BYTES_SENT,
298*6777b538SAndroid Build Coastguard Worker NetLogEventPhase::NONE));
299*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(LogContainsEvent(client_entries, 4,
300*6777b538SAndroid Build Coastguard Worker NetLogEventType::UDP_BYTES_RECEIVED,
301*6777b538SAndroid Build Coastguard Worker NetLogEventPhase::NONE));
302*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(LogContainsEvent(client_entries, 5,
303*6777b538SAndroid Build Coastguard Worker NetLogEventType::UDP_BYTES_SENT,
304*6777b538SAndroid Build Coastguard Worker NetLogEventPhase::NONE));
305*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(
306*6777b538SAndroid Build Coastguard Worker LogContainsEndEvent(client_entries, 6, NetLogEventType::SOCKET_ALIVE));
307*6777b538SAndroid Build Coastguard Worker }
308*6777b538SAndroid Build Coastguard Worker
TEST_F(UDPSocketTest,Connect)309*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, Connect) {
310*6777b538SAndroid Build Coastguard Worker // The variable |use_nonblocking_io| has no effect in non-Windows ports.
311*6777b538SAndroid Build Coastguard Worker // Run ConnectTest once with sync connect and once with async connect
312*6777b538SAndroid Build Coastguard Worker ConnectTest(false, false);
313*6777b538SAndroid Build Coastguard Worker ConnectTest(false, true);
314*6777b538SAndroid Build Coastguard Worker }
315*6777b538SAndroid Build Coastguard Worker
316*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
TEST_F(UDPSocketTest,ConnectNonBlocking)317*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, ConnectNonBlocking) {
318*6777b538SAndroid Build Coastguard Worker ConnectTest(true, false);
319*6777b538SAndroid Build Coastguard Worker ConnectTest(true, true);
320*6777b538SAndroid Build Coastguard Worker }
321*6777b538SAndroid Build Coastguard Worker #endif
322*6777b538SAndroid Build Coastguard Worker
TEST_F(UDPSocketTest,PartialRecv)323*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, PartialRecv) {
324*6777b538SAndroid Build Coastguard Worker UDPServerSocket server_socket(nullptr, NetLogSource());
325*6777b538SAndroid Build Coastguard Worker ASSERT_THAT(server_socket.Listen(IPEndPoint(IPAddress::IPv4Localhost(), 0)),
326*6777b538SAndroid Build Coastguard Worker IsOk());
327*6777b538SAndroid Build Coastguard Worker IPEndPoint server_address;
328*6777b538SAndroid Build Coastguard Worker ASSERT_THAT(server_socket.GetLocalAddress(&server_address), IsOk());
329*6777b538SAndroid Build Coastguard Worker
330*6777b538SAndroid Build Coastguard Worker UDPClientSocket client_socket(DatagramSocket::DEFAULT_BIND, nullptr,
331*6777b538SAndroid Build Coastguard Worker NetLogSource());
332*6777b538SAndroid Build Coastguard Worker ASSERT_THAT(client_socket.Connect(server_address), IsOk());
333*6777b538SAndroid Build Coastguard Worker
334*6777b538SAndroid Build Coastguard Worker std::string test_packet("hello world!");
335*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(static_cast<int>(test_packet.size()),
336*6777b538SAndroid Build Coastguard Worker WriteSocket(&client_socket, test_packet));
337*6777b538SAndroid Build Coastguard Worker
338*6777b538SAndroid Build Coastguard Worker TestCompletionCallback recv_callback;
339*6777b538SAndroid Build Coastguard Worker
340*6777b538SAndroid Build Coastguard Worker // Read just 2 bytes. Read() is expected to return the first 2 bytes from the
341*6777b538SAndroid Build Coastguard Worker // packet and discard the rest.
342*6777b538SAndroid Build Coastguard Worker const int kPartialReadSize = 2;
343*6777b538SAndroid Build Coastguard Worker auto buffer = base::MakeRefCounted<IOBufferWithSize>(kPartialReadSize);
344*6777b538SAndroid Build Coastguard Worker int rv =
345*6777b538SAndroid Build Coastguard Worker server_socket.RecvFrom(buffer.get(), kPartialReadSize,
346*6777b538SAndroid Build Coastguard Worker &recv_from_address_, recv_callback.callback());
347*6777b538SAndroid Build Coastguard Worker rv = recv_callback.GetResult(rv);
348*6777b538SAndroid Build Coastguard Worker
349*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(rv, ERR_MSG_TOO_BIG);
350*6777b538SAndroid Build Coastguard Worker
351*6777b538SAndroid Build Coastguard Worker // Send a different message again.
352*6777b538SAndroid Build Coastguard Worker std::string second_packet("Second packet");
353*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(static_cast<int>(second_packet.size()),
354*6777b538SAndroid Build Coastguard Worker WriteSocket(&client_socket, second_packet));
355*6777b538SAndroid Build Coastguard Worker
356*6777b538SAndroid Build Coastguard Worker // Read whole packet now.
357*6777b538SAndroid Build Coastguard Worker std::string received = RecvFromSocket(&server_socket);
358*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(second_packet, received);
359*6777b538SAndroid Build Coastguard Worker }
360*6777b538SAndroid Build Coastguard Worker
361*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_ANDROID)
362*6777b538SAndroid Build Coastguard Worker // - MacOS: requires root permissions on OSX 10.7+.
363*6777b538SAndroid Build Coastguard Worker // - Android: devices attached to testbots don't have default network, so
364*6777b538SAndroid Build Coastguard Worker // broadcasting to 255.255.255.255 returns error -109 (Address not reachable).
365*6777b538SAndroid Build Coastguard Worker // crbug.com/139144.
366*6777b538SAndroid Build Coastguard Worker #define MAYBE_LocalBroadcast DISABLED_LocalBroadcast
367*6777b538SAndroid Build Coastguard Worker #else
368*6777b538SAndroid Build Coastguard Worker #define MAYBE_LocalBroadcast LocalBroadcast
369*6777b538SAndroid Build Coastguard Worker #endif
TEST_F(UDPSocketTest,MAYBE_LocalBroadcast)370*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, MAYBE_LocalBroadcast) {
371*6777b538SAndroid Build Coastguard Worker std::string first_message("first message"), second_message("second message");
372*6777b538SAndroid Build Coastguard Worker
373*6777b538SAndroid Build Coastguard Worker IPEndPoint listen_address;
374*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateUDPAddress("0.0.0.0", 0 /* port */, &listen_address));
375*6777b538SAndroid Build Coastguard Worker
376*6777b538SAndroid Build Coastguard Worker auto server1 =
377*6777b538SAndroid Build Coastguard Worker std::make_unique<UDPServerSocket>(NetLog::Get(), NetLogSource());
378*6777b538SAndroid Build Coastguard Worker auto server2 =
379*6777b538SAndroid Build Coastguard Worker std::make_unique<UDPServerSocket>(NetLog::Get(), NetLogSource());
380*6777b538SAndroid Build Coastguard Worker server1->AllowAddressReuse();
381*6777b538SAndroid Build Coastguard Worker server1->AllowBroadcast();
382*6777b538SAndroid Build Coastguard Worker server2->AllowAddressReuse();
383*6777b538SAndroid Build Coastguard Worker server2->AllowBroadcast();
384*6777b538SAndroid Build Coastguard Worker
385*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(server1->Listen(listen_address), IsOk());
386*6777b538SAndroid Build Coastguard Worker // Get bound port.
387*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(server1->GetLocalAddress(&listen_address), IsOk());
388*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(server2->Listen(listen_address), IsOk());
389*6777b538SAndroid Build Coastguard Worker
390*6777b538SAndroid Build Coastguard Worker IPEndPoint broadcast_address;
391*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateUDPAddress("127.255.255.255", listen_address.port(),
392*6777b538SAndroid Build Coastguard Worker &broadcast_address));
393*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(static_cast<int>(first_message.size()),
394*6777b538SAndroid Build Coastguard Worker SendToSocket(server1.get(), first_message, broadcast_address));
395*6777b538SAndroid Build Coastguard Worker std::string str = RecvFromSocket(server1.get());
396*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(first_message, str);
397*6777b538SAndroid Build Coastguard Worker str = RecvFromSocket(server2.get());
398*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(first_message, str);
399*6777b538SAndroid Build Coastguard Worker
400*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(static_cast<int>(second_message.size()),
401*6777b538SAndroid Build Coastguard Worker SendToSocket(server2.get(), second_message, broadcast_address));
402*6777b538SAndroid Build Coastguard Worker str = RecvFromSocket(server1.get());
403*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(second_message, str);
404*6777b538SAndroid Build Coastguard Worker str = RecvFromSocket(server2.get());
405*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(second_message, str);
406*6777b538SAndroid Build Coastguard Worker }
407*6777b538SAndroid Build Coastguard Worker
408*6777b538SAndroid Build Coastguard Worker // ConnectRandomBind verifies RANDOM_BIND is handled correctly. It connects
409*6777b538SAndroid Build Coastguard Worker // 1000 sockets and then verifies that the allocated port numbers satisfy the
410*6777b538SAndroid Build Coastguard Worker // following 2 conditions:
411*6777b538SAndroid Build Coastguard Worker // 1. Range from min port value to max is greater than 10000.
412*6777b538SAndroid Build Coastguard Worker // 2. There is at least one port in the 5 buckets in the [min, max] range.
413*6777b538SAndroid Build Coastguard Worker //
414*6777b538SAndroid Build Coastguard Worker // These conditions are not enough to verify that the port numbers are truly
415*6777b538SAndroid Build Coastguard Worker // random, but they are enough to protect from most common non-random port
416*6777b538SAndroid Build Coastguard Worker // allocation strategies (e.g. counter, pool of available ports, etc.) False
417*6777b538SAndroid Build Coastguard Worker // positive result is theoretically possible, but its probability is negligible.
TEST_F(UDPSocketTest,ConnectRandomBind)418*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, ConnectRandomBind) {
419*6777b538SAndroid Build Coastguard Worker const int kIterations = 1000;
420*6777b538SAndroid Build Coastguard Worker
421*6777b538SAndroid Build Coastguard Worker std::vector<int> used_ports;
422*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < kIterations; ++i) {
423*6777b538SAndroid Build Coastguard Worker UDPClientSocket socket(DatagramSocket::RANDOM_BIND, nullptr,
424*6777b538SAndroid Build Coastguard Worker NetLogSource());
425*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(socket.Connect(IPEndPoint(IPAddress::IPv4Localhost(), 53)),
426*6777b538SAndroid Build Coastguard Worker IsOk());
427*6777b538SAndroid Build Coastguard Worker
428*6777b538SAndroid Build Coastguard Worker IPEndPoint client_address;
429*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(socket.GetLocalAddress(&client_address), IsOk());
430*6777b538SAndroid Build Coastguard Worker used_ports.push_back(client_address.port());
431*6777b538SAndroid Build Coastguard Worker }
432*6777b538SAndroid Build Coastguard Worker
433*6777b538SAndroid Build Coastguard Worker int min_port = *std::min_element(used_ports.begin(), used_ports.end());
434*6777b538SAndroid Build Coastguard Worker int max_port = *std::max_element(used_ports.begin(), used_ports.end());
435*6777b538SAndroid Build Coastguard Worker int range = max_port - min_port + 1;
436*6777b538SAndroid Build Coastguard Worker
437*6777b538SAndroid Build Coastguard Worker // Verify that the range of ports used by the random port allocator is wider
438*6777b538SAndroid Build Coastguard Worker // than 10k. Assuming that socket implementation limits port range to 16k
439*6777b538SAndroid Build Coastguard Worker // ports (default on Fuchsia) probability of false negative is below
440*6777b538SAndroid Build Coastguard Worker // 10^-200.
441*6777b538SAndroid Build Coastguard Worker static int kMinRange = 10000;
442*6777b538SAndroid Build Coastguard Worker EXPECT_GT(range, kMinRange);
443*6777b538SAndroid Build Coastguard Worker
444*6777b538SAndroid Build Coastguard Worker static int kBuckets = 5;
445*6777b538SAndroid Build Coastguard Worker std::vector<int> bucket_sizes(kBuckets, 0);
446*6777b538SAndroid Build Coastguard Worker for (int port : used_ports) {
447*6777b538SAndroid Build Coastguard Worker bucket_sizes[(port - min_port) * kBuckets / range] += 1;
448*6777b538SAndroid Build Coastguard Worker }
449*6777b538SAndroid Build Coastguard Worker
450*6777b538SAndroid Build Coastguard Worker // Verify that there is at least one value in each bucket. Probability of
451*6777b538SAndroid Build Coastguard Worker // false negative is below (kBuckets * (1 - 1 / kBuckets) ^ kIterations),
452*6777b538SAndroid Build Coastguard Worker // which is less than 10^-96.
453*6777b538SAndroid Build Coastguard Worker for (int size : bucket_sizes) {
454*6777b538SAndroid Build Coastguard Worker EXPECT_GT(size, 0);
455*6777b538SAndroid Build Coastguard Worker }
456*6777b538SAndroid Build Coastguard Worker }
457*6777b538SAndroid Build Coastguard Worker
TEST_F(UDPSocketTest,ConnectFail)458*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, ConnectFail) {
459*6777b538SAndroid Build Coastguard Worker UDPSocket socket(DatagramSocket::DEFAULT_BIND, nullptr, NetLogSource());
460*6777b538SAndroid Build Coastguard Worker
461*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(socket.Open(ADDRESS_FAMILY_IPV4), IsOk());
462*6777b538SAndroid Build Coastguard Worker
463*6777b538SAndroid Build Coastguard Worker // Connect to an IPv6 address should fail since the socket was created for
464*6777b538SAndroid Build Coastguard Worker // IPv4.
465*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(socket.Connect(net::IPEndPoint(IPAddress::IPv6Localhost(), 53)),
466*6777b538SAndroid Build Coastguard Worker Not(IsOk()));
467*6777b538SAndroid Build Coastguard Worker
468*6777b538SAndroid Build Coastguard Worker // Make sure that UDPSocket actually closed the socket.
469*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(socket.is_connected());
470*6777b538SAndroid Build Coastguard Worker }
471*6777b538SAndroid Build Coastguard Worker
472*6777b538SAndroid Build Coastguard Worker // Similar to ConnectFail but UDPSocket adopts an opened socket instead of
473*6777b538SAndroid Build Coastguard Worker // opening one directly.
TEST_F(UDPSocketTest,AdoptedSocket)474*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, AdoptedSocket) {
475*6777b538SAndroid Build Coastguard Worker auto socketfd =
476*6777b538SAndroid Build Coastguard Worker CreatePlatformSocket(ConvertAddressFamily(ADDRESS_FAMILY_IPV4),
477*6777b538SAndroid Build Coastguard Worker SOCK_DGRAM, AF_UNIX ? 0 : IPPROTO_UDP);
478*6777b538SAndroid Build Coastguard Worker UDPSocket socket(DatagramSocket::DEFAULT_BIND, nullptr, NetLogSource());
479*6777b538SAndroid Build Coastguard Worker
480*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(socket.AdoptOpenedSocket(ADDRESS_FAMILY_IPV4, socketfd), IsOk());
481*6777b538SAndroid Build Coastguard Worker
482*6777b538SAndroid Build Coastguard Worker // Connect to an IPv6 address should fail since the socket was created for
483*6777b538SAndroid Build Coastguard Worker // IPv4.
484*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(socket.Connect(net::IPEndPoint(IPAddress::IPv6Localhost(), 53)),
485*6777b538SAndroid Build Coastguard Worker Not(IsOk()));
486*6777b538SAndroid Build Coastguard Worker
487*6777b538SAndroid Build Coastguard Worker // Make sure that UDPSocket actually closed the socket.
488*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(socket.is_connected());
489*6777b538SAndroid Build Coastguard Worker }
490*6777b538SAndroid Build Coastguard Worker
491*6777b538SAndroid Build Coastguard Worker // Tests that UDPSocket updates the global counter correctly.
TEST_F(UDPSocketTest,LimitAdoptSocket)492*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, LimitAdoptSocket) {
493*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, GetGlobalUDPSocketCountForTesting());
494*6777b538SAndroid Build Coastguard Worker {
495*6777b538SAndroid Build Coastguard Worker // Creating a platform socket does not increase count.
496*6777b538SAndroid Build Coastguard Worker auto socketfd =
497*6777b538SAndroid Build Coastguard Worker CreatePlatformSocket(ConvertAddressFamily(ADDRESS_FAMILY_IPV4),
498*6777b538SAndroid Build Coastguard Worker SOCK_DGRAM, AF_UNIX ? 0 : IPPROTO_UDP);
499*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, GetGlobalUDPSocketCountForTesting());
500*6777b538SAndroid Build Coastguard Worker
501*6777b538SAndroid Build Coastguard Worker // Simply allocating a UDPSocket does not increase count.
502*6777b538SAndroid Build Coastguard Worker UDPSocket socket(DatagramSocket::DEFAULT_BIND, nullptr, NetLogSource());
503*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, GetGlobalUDPSocketCountForTesting());
504*6777b538SAndroid Build Coastguard Worker
505*6777b538SAndroid Build Coastguard Worker // Calling AdoptOpenedSocket() allocates the socket and increases the global
506*6777b538SAndroid Build Coastguard Worker // counter.
507*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(socket.AdoptOpenedSocket(ADDRESS_FAMILY_IPV4, socketfd),
508*6777b538SAndroid Build Coastguard Worker IsOk());
509*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, GetGlobalUDPSocketCountForTesting());
510*6777b538SAndroid Build Coastguard Worker
511*6777b538SAndroid Build Coastguard Worker // Connect to an IPv6 address should fail since the socket was created for
512*6777b538SAndroid Build Coastguard Worker // IPv4.
513*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(socket.Connect(net::IPEndPoint(IPAddress::IPv6Localhost(), 53)),
514*6777b538SAndroid Build Coastguard Worker Not(IsOk()));
515*6777b538SAndroid Build Coastguard Worker
516*6777b538SAndroid Build Coastguard Worker // That Connect() failed doesn't change the global counter.
517*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, GetGlobalUDPSocketCountForTesting());
518*6777b538SAndroid Build Coastguard Worker }
519*6777b538SAndroid Build Coastguard Worker // Finally, destroying UDPSocket decrements the global counter.
520*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, GetGlobalUDPSocketCountForTesting());
521*6777b538SAndroid Build Coastguard Worker }
522*6777b538SAndroid Build Coastguard Worker
523*6777b538SAndroid Build Coastguard Worker // In this test, we verify that connect() on a socket will have the effect
524*6777b538SAndroid Build Coastguard Worker // of filtering reads on this socket only to data read from the destination
525*6777b538SAndroid Build Coastguard Worker // we connected to.
526*6777b538SAndroid Build Coastguard Worker //
527*6777b538SAndroid Build Coastguard Worker // The purpose of this test is that some documentation indicates that connect
528*6777b538SAndroid Build Coastguard Worker // binds the client's sends to send to a particular server endpoint, but does
529*6777b538SAndroid Build Coastguard Worker // not bind the client's reads to only be from that endpoint, and that we need
530*6777b538SAndroid Build Coastguard Worker // to always use recvfrom() to disambiguate.
TEST_F(UDPSocketTest,VerifyConnectBindsAddr)531*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, VerifyConnectBindsAddr) {
532*6777b538SAndroid Build Coastguard Worker std::string simple_message("hello world!");
533*6777b538SAndroid Build Coastguard Worker std::string foreign_message("BAD MESSAGE TO GET!!");
534*6777b538SAndroid Build Coastguard Worker
535*6777b538SAndroid Build Coastguard Worker // Setup the first server to listen.
536*6777b538SAndroid Build Coastguard Worker IPEndPoint server1_address(IPAddress::IPv4Localhost(), 0 /* port */);
537*6777b538SAndroid Build Coastguard Worker UDPServerSocket server1(nullptr, NetLogSource());
538*6777b538SAndroid Build Coastguard Worker ASSERT_THAT(server1.Listen(server1_address), IsOk());
539*6777b538SAndroid Build Coastguard Worker // Get the bound port.
540*6777b538SAndroid Build Coastguard Worker ASSERT_THAT(server1.GetLocalAddress(&server1_address), IsOk());
541*6777b538SAndroid Build Coastguard Worker
542*6777b538SAndroid Build Coastguard Worker // Setup the second server to listen.
543*6777b538SAndroid Build Coastguard Worker IPEndPoint server2_address(IPAddress::IPv4Localhost(), 0 /* port */);
544*6777b538SAndroid Build Coastguard Worker UDPServerSocket server2(nullptr, NetLogSource());
545*6777b538SAndroid Build Coastguard Worker ASSERT_THAT(server2.Listen(server2_address), IsOk());
546*6777b538SAndroid Build Coastguard Worker
547*6777b538SAndroid Build Coastguard Worker // Setup the client, connected to server 1.
548*6777b538SAndroid Build Coastguard Worker UDPClientSocket client(DatagramSocket::DEFAULT_BIND, nullptr, NetLogSource());
549*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(client.Connect(server1_address), IsOk());
550*6777b538SAndroid Build Coastguard Worker
551*6777b538SAndroid Build Coastguard Worker // Client sends to server1.
552*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message.length(),
553*6777b538SAndroid Build Coastguard Worker static_cast<size_t>(WriteSocket(&client, simple_message)));
554*6777b538SAndroid Build Coastguard Worker
555*6777b538SAndroid Build Coastguard Worker // Server1 waits for message.
556*6777b538SAndroid Build Coastguard Worker std::string str = RecvFromSocket(&server1);
557*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message, str);
558*6777b538SAndroid Build Coastguard Worker
559*6777b538SAndroid Build Coastguard Worker // Get the client's address.
560*6777b538SAndroid Build Coastguard Worker IPEndPoint client_address;
561*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(client.GetLocalAddress(&client_address), IsOk());
562*6777b538SAndroid Build Coastguard Worker
563*6777b538SAndroid Build Coastguard Worker // Server2 sends reply.
564*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(foreign_message.length(),
565*6777b538SAndroid Build Coastguard Worker static_cast<size_t>(
566*6777b538SAndroid Build Coastguard Worker SendToSocket(&server2, foreign_message, client_address)));
567*6777b538SAndroid Build Coastguard Worker
568*6777b538SAndroid Build Coastguard Worker // Server1 sends reply.
569*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message.length(),
570*6777b538SAndroid Build Coastguard Worker static_cast<size_t>(
571*6777b538SAndroid Build Coastguard Worker SendToSocket(&server1, simple_message, client_address)));
572*6777b538SAndroid Build Coastguard Worker
573*6777b538SAndroid Build Coastguard Worker // Client waits for response.
574*6777b538SAndroid Build Coastguard Worker str = ReadSocket(&client);
575*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message, str);
576*6777b538SAndroid Build Coastguard Worker }
577*6777b538SAndroid Build Coastguard Worker
TEST_F(UDPSocketTest,ClientGetLocalPeerAddresses)578*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, ClientGetLocalPeerAddresses) {
579*6777b538SAndroid Build Coastguard Worker struct TestData {
580*6777b538SAndroid Build Coastguard Worker std::string remote_address;
581*6777b538SAndroid Build Coastguard Worker std::string local_address;
582*6777b538SAndroid Build Coastguard Worker bool may_fail;
583*6777b538SAndroid Build Coastguard Worker } tests[] = {
584*6777b538SAndroid Build Coastguard Worker {"127.0.00.1", "127.0.0.1", false},
585*6777b538SAndroid Build Coastguard Worker {"::1", "::1", true},
586*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
587*6777b538SAndroid Build Coastguard Worker // Addresses below are disabled on Android. See crbug.com/161248
588*6777b538SAndroid Build Coastguard Worker // They are also disabled on iOS. See https://crbug.com/523225
589*6777b538SAndroid Build Coastguard Worker {"192.168.1.1", "127.0.0.1", false},
590*6777b538SAndroid Build Coastguard Worker {"2001:db8:0::42", "::1", true},
591*6777b538SAndroid Build Coastguard Worker #endif
592*6777b538SAndroid Build Coastguard Worker };
593*6777b538SAndroid Build Coastguard Worker for (const auto& test : tests) {
594*6777b538SAndroid Build Coastguard Worker SCOPED_TRACE(std::string("Connecting from ") + test.local_address +
595*6777b538SAndroid Build Coastguard Worker std::string(" to ") + test.remote_address);
596*6777b538SAndroid Build Coastguard Worker
597*6777b538SAndroid Build Coastguard Worker IPAddress ip_address;
598*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ip_address.AssignFromIPLiteral(test.remote_address));
599*6777b538SAndroid Build Coastguard Worker IPEndPoint remote_address(ip_address, 80);
600*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ip_address.AssignFromIPLiteral(test.local_address));
601*6777b538SAndroid Build Coastguard Worker IPEndPoint local_address(ip_address, 80);
602*6777b538SAndroid Build Coastguard Worker
603*6777b538SAndroid Build Coastguard Worker UDPClientSocket client(DatagramSocket::DEFAULT_BIND, nullptr,
604*6777b538SAndroid Build Coastguard Worker NetLogSource());
605*6777b538SAndroid Build Coastguard Worker int rv = client.Connect(remote_address);
606*6777b538SAndroid Build Coastguard Worker if (test.may_fail && rv == ERR_ADDRESS_UNREACHABLE) {
607*6777b538SAndroid Build Coastguard Worker // Connect() may return ERR_ADDRESS_UNREACHABLE for IPv6
608*6777b538SAndroid Build Coastguard Worker // addresses if IPv6 is not configured.
609*6777b538SAndroid Build Coastguard Worker continue;
610*6777b538SAndroid Build Coastguard Worker }
611*6777b538SAndroid Build Coastguard Worker
612*6777b538SAndroid Build Coastguard Worker EXPECT_LE(ERR_IO_PENDING, rv);
613*6777b538SAndroid Build Coastguard Worker
614*6777b538SAndroid Build Coastguard Worker IPEndPoint fetched_local_address;
615*6777b538SAndroid Build Coastguard Worker rv = client.GetLocalAddress(&fetched_local_address);
616*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(rv, IsOk());
617*6777b538SAndroid Build Coastguard Worker
618*6777b538SAndroid Build Coastguard Worker // TODO(mbelshe): figure out how to verify the IP and port.
619*6777b538SAndroid Build Coastguard Worker // The port is dynamically generated by the udp stack.
620*6777b538SAndroid Build Coastguard Worker // The IP is the real IP of the client, not necessarily
621*6777b538SAndroid Build Coastguard Worker // loopback.
622*6777b538SAndroid Build Coastguard Worker // EXPECT_EQ(local_address.address(), fetched_local_address.address());
623*6777b538SAndroid Build Coastguard Worker
624*6777b538SAndroid Build Coastguard Worker IPEndPoint fetched_remote_address;
625*6777b538SAndroid Build Coastguard Worker rv = client.GetPeerAddress(&fetched_remote_address);
626*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(rv, IsOk());
627*6777b538SAndroid Build Coastguard Worker
628*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(remote_address, fetched_remote_address);
629*6777b538SAndroid Build Coastguard Worker }
630*6777b538SAndroid Build Coastguard Worker }
631*6777b538SAndroid Build Coastguard Worker
TEST_F(UDPSocketTest,ServerGetLocalAddress)632*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, ServerGetLocalAddress) {
633*6777b538SAndroid Build Coastguard Worker IPEndPoint bind_address(IPAddress::IPv4Localhost(), 0);
634*6777b538SAndroid Build Coastguard Worker UDPServerSocket server(nullptr, NetLogSource());
635*6777b538SAndroid Build Coastguard Worker int rv = server.Listen(bind_address);
636*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(rv, IsOk());
637*6777b538SAndroid Build Coastguard Worker
638*6777b538SAndroid Build Coastguard Worker IPEndPoint local_address;
639*6777b538SAndroid Build Coastguard Worker rv = server.GetLocalAddress(&local_address);
640*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(rv, 0);
641*6777b538SAndroid Build Coastguard Worker
642*6777b538SAndroid Build Coastguard Worker // Verify that port was allocated.
643*6777b538SAndroid Build Coastguard Worker EXPECT_GT(local_address.port(), 0);
644*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(local_address.address(), bind_address.address());
645*6777b538SAndroid Build Coastguard Worker }
646*6777b538SAndroid Build Coastguard Worker
TEST_F(UDPSocketTest,ServerGetPeerAddress)647*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, ServerGetPeerAddress) {
648*6777b538SAndroid Build Coastguard Worker IPEndPoint bind_address(IPAddress::IPv4Localhost(), 0);
649*6777b538SAndroid Build Coastguard Worker UDPServerSocket server(nullptr, NetLogSource());
650*6777b538SAndroid Build Coastguard Worker int rv = server.Listen(bind_address);
651*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(rv, IsOk());
652*6777b538SAndroid Build Coastguard Worker
653*6777b538SAndroid Build Coastguard Worker IPEndPoint peer_address;
654*6777b538SAndroid Build Coastguard Worker rv = server.GetPeerAddress(&peer_address);
655*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(rv, ERR_SOCKET_NOT_CONNECTED);
656*6777b538SAndroid Build Coastguard Worker }
657*6777b538SAndroid Build Coastguard Worker
TEST_F(UDPSocketTest,ClientSetDoNotFragment)658*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, ClientSetDoNotFragment) {
659*6777b538SAndroid Build Coastguard Worker for (std::string ip : {"127.0.0.1", "::1"}) {
660*6777b538SAndroid Build Coastguard Worker UDPClientSocket client(DatagramSocket::DEFAULT_BIND, nullptr,
661*6777b538SAndroid Build Coastguard Worker NetLogSource());
662*6777b538SAndroid Build Coastguard Worker IPAddress ip_address;
663*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ip_address.AssignFromIPLiteral(ip));
664*6777b538SAndroid Build Coastguard Worker IPEndPoint remote_address(ip_address, 80);
665*6777b538SAndroid Build Coastguard Worker int rv = client.Connect(remote_address);
666*6777b538SAndroid Build Coastguard Worker // May fail on IPv6 is IPv6 is not configured.
667*6777b538SAndroid Build Coastguard Worker if (ip_address.IsIPv6() && rv == ERR_ADDRESS_UNREACHABLE)
668*6777b538SAndroid Build Coastguard Worker return;
669*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(rv, IsOk());
670*6777b538SAndroid Build Coastguard Worker
671*6777b538SAndroid Build Coastguard Worker rv = client.SetDoNotFragment();
672*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_IOS) || BUILDFLAG(IS_FUCHSIA)
673*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/945590): IP_MTU_DISCOVER is not implemented on Fuchsia.
674*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(rv, IsError(ERR_NOT_IMPLEMENTED));
675*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_MAC)
676*6777b538SAndroid Build Coastguard Worker if (base::mac::MacOSMajorVersion() >= 11) {
677*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(rv, IsOk());
678*6777b538SAndroid Build Coastguard Worker } else {
679*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(rv, IsError(ERR_NOT_IMPLEMENTED));
680*6777b538SAndroid Build Coastguard Worker }
681*6777b538SAndroid Build Coastguard Worker #else
682*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(rv, IsOk());
683*6777b538SAndroid Build Coastguard Worker #endif
684*6777b538SAndroid Build Coastguard Worker }
685*6777b538SAndroid Build Coastguard Worker }
686*6777b538SAndroid Build Coastguard Worker
TEST_F(UDPSocketTest,ServerSetDoNotFragment)687*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, ServerSetDoNotFragment) {
688*6777b538SAndroid Build Coastguard Worker for (std::string ip : {"127.0.0.1", "::1"}) {
689*6777b538SAndroid Build Coastguard Worker IPEndPoint bind_address;
690*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateUDPAddress(ip, 0, &bind_address));
691*6777b538SAndroid Build Coastguard Worker UDPServerSocket server(nullptr, NetLogSource());
692*6777b538SAndroid Build Coastguard Worker int rv = server.Listen(bind_address);
693*6777b538SAndroid Build Coastguard Worker // May fail on IPv6 is IPv6 is not configure
694*6777b538SAndroid Build Coastguard Worker if (bind_address.address().IsIPv6() &&
695*6777b538SAndroid Build Coastguard Worker (rv == ERR_ADDRESS_INVALID || rv == ERR_ADDRESS_UNREACHABLE))
696*6777b538SAndroid Build Coastguard Worker return;
697*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(rv, IsOk());
698*6777b538SAndroid Build Coastguard Worker
699*6777b538SAndroid Build Coastguard Worker rv = server.SetDoNotFragment();
700*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_IOS) || BUILDFLAG(IS_FUCHSIA)
701*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/945590): IP_MTU_DISCOVER is not implemented on Fuchsia.
702*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(rv, IsError(ERR_NOT_IMPLEMENTED));
703*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_MAC)
704*6777b538SAndroid Build Coastguard Worker if (base::mac::MacOSMajorVersion() >= 11) {
705*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(rv, IsOk());
706*6777b538SAndroid Build Coastguard Worker } else {
707*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(rv, IsError(ERR_NOT_IMPLEMENTED));
708*6777b538SAndroid Build Coastguard Worker }
709*6777b538SAndroid Build Coastguard Worker #else
710*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(rv, IsOk());
711*6777b538SAndroid Build Coastguard Worker #endif
712*6777b538SAndroid Build Coastguard Worker }
713*6777b538SAndroid Build Coastguard Worker }
714*6777b538SAndroid Build Coastguard Worker
715*6777b538SAndroid Build Coastguard Worker // Close the socket while read is pending.
TEST_F(UDPSocketTest,CloseWithPendingRead)716*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, CloseWithPendingRead) {
717*6777b538SAndroid Build Coastguard Worker IPEndPoint bind_address(IPAddress::IPv4Localhost(), 0);
718*6777b538SAndroid Build Coastguard Worker UDPServerSocket server(nullptr, NetLogSource());
719*6777b538SAndroid Build Coastguard Worker int rv = server.Listen(bind_address);
720*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(rv, IsOk());
721*6777b538SAndroid Build Coastguard Worker
722*6777b538SAndroid Build Coastguard Worker TestCompletionCallback callback;
723*6777b538SAndroid Build Coastguard Worker IPEndPoint from;
724*6777b538SAndroid Build Coastguard Worker rv = server.RecvFrom(buffer_.get(), kMaxRead, &from, callback.callback());
725*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(rv, ERR_IO_PENDING);
726*6777b538SAndroid Build Coastguard Worker
727*6777b538SAndroid Build Coastguard Worker server.Close();
728*6777b538SAndroid Build Coastguard Worker
729*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(callback.have_result());
730*6777b538SAndroid Build Coastguard Worker }
731*6777b538SAndroid Build Coastguard Worker
732*6777b538SAndroid Build Coastguard Worker // Some Android devices do not support multicast.
733*6777b538SAndroid Build Coastguard Worker // The ones supporting multicast need WifiManager.MulitcastLock to enable it.
734*6777b538SAndroid Build Coastguard Worker // http://goo.gl/jjAk9
735*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_ANDROID)
TEST_F(UDPSocketTest,JoinMulticastGroup)736*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, JoinMulticastGroup) {
737*6777b538SAndroid Build Coastguard Worker const char kGroup[] = "237.132.100.17";
738*6777b538SAndroid Build Coastguard Worker
739*6777b538SAndroid Build Coastguard Worker IPAddress group_ip;
740*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(group_ip.AssignFromIPLiteral(kGroup));
741*6777b538SAndroid Build Coastguard Worker // TODO(https://github.com/google/gvisor/issues/3839): don't guard on
742*6777b538SAndroid Build Coastguard Worker // OS_FUCHSIA.
743*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA)
744*6777b538SAndroid Build Coastguard Worker IPEndPoint bind_address(IPAddress::AllZeros(group_ip.size()), 0 /* port */);
745*6777b538SAndroid Build Coastguard Worker #else
746*6777b538SAndroid Build Coastguard Worker IPEndPoint bind_address(group_ip, 0 /* port */);
747*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA)
748*6777b538SAndroid Build Coastguard Worker
749*6777b538SAndroid Build Coastguard Worker UDPSocket socket(DatagramSocket::DEFAULT_BIND, nullptr, NetLogSource());
750*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(socket.Open(bind_address.GetFamily()), IsOk());
751*6777b538SAndroid Build Coastguard Worker
752*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(socket.Bind(bind_address), IsOk());
753*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(socket.JoinGroup(group_ip), IsOk());
754*6777b538SAndroid Build Coastguard Worker // Joining group multiple times.
755*6777b538SAndroid Build Coastguard Worker EXPECT_NE(OK, socket.JoinGroup(group_ip));
756*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(socket.LeaveGroup(group_ip), IsOk());
757*6777b538SAndroid Build Coastguard Worker // Leaving group multiple times.
758*6777b538SAndroid Build Coastguard Worker EXPECT_NE(OK, socket.LeaveGroup(group_ip));
759*6777b538SAndroid Build Coastguard Worker
760*6777b538SAndroid Build Coastguard Worker socket.Close();
761*6777b538SAndroid Build Coastguard Worker }
762*6777b538SAndroid Build Coastguard Worker
763*6777b538SAndroid Build Coastguard Worker // TODO(https://crbug.com/947115): failing on device on iOS 12.2.
764*6777b538SAndroid Build Coastguard Worker // TODO(https://crbug.com/1227554): flaky on Mac 11.
765*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_IOS) || BUILDFLAG(IS_MAC)
766*6777b538SAndroid Build Coastguard Worker #define MAYBE_SharedMulticastAddress DISABLED_SharedMulticastAddress
767*6777b538SAndroid Build Coastguard Worker #else
768*6777b538SAndroid Build Coastguard Worker #define MAYBE_SharedMulticastAddress SharedMulticastAddress
769*6777b538SAndroid Build Coastguard Worker #endif
TEST_F(UDPSocketTest,MAYBE_SharedMulticastAddress)770*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, MAYBE_SharedMulticastAddress) {
771*6777b538SAndroid Build Coastguard Worker const char kGroup[] = "224.0.0.251";
772*6777b538SAndroid Build Coastguard Worker
773*6777b538SAndroid Build Coastguard Worker IPAddress group_ip;
774*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(group_ip.AssignFromIPLiteral(kGroup));
775*6777b538SAndroid Build Coastguard Worker // TODO(https://github.com/google/gvisor/issues/3839): don't guard on
776*6777b538SAndroid Build Coastguard Worker // OS_FUCHSIA.
777*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA)
778*6777b538SAndroid Build Coastguard Worker IPEndPoint receive_address(IPAddress::AllZeros(group_ip.size()),
779*6777b538SAndroid Build Coastguard Worker 0 /* port */);
780*6777b538SAndroid Build Coastguard Worker #else
781*6777b538SAndroid Build Coastguard Worker IPEndPoint receive_address(group_ip, 0 /* port */);
782*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA)
783*6777b538SAndroid Build Coastguard Worker
784*6777b538SAndroid Build Coastguard Worker NetworkInterfaceList interfaces;
785*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(GetNetworkList(&interfaces, 0));
786*6777b538SAndroid Build Coastguard Worker // The test fails with the Hyper-V switch interface (on the host side).
787*6777b538SAndroid Build Coastguard Worker interfaces.erase(std::remove_if(interfaces.begin(), interfaces.end(),
788*6777b538SAndroid Build Coastguard Worker [](const auto& iface) {
789*6777b538SAndroid Build Coastguard Worker return iface.friendly_name.rfind(
790*6777b538SAndroid Build Coastguard Worker "vEthernet", 0) == 0;
791*6777b538SAndroid Build Coastguard Worker }),
792*6777b538SAndroid Build Coastguard Worker interfaces.end());
793*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(interfaces.empty());
794*6777b538SAndroid Build Coastguard Worker
795*6777b538SAndroid Build Coastguard Worker // Setup first receiving socket.
796*6777b538SAndroid Build Coastguard Worker UDPServerSocket socket1(nullptr, NetLogSource());
797*6777b538SAndroid Build Coastguard Worker socket1.AllowAddressSharingForMulticast();
798*6777b538SAndroid Build Coastguard Worker ASSERT_THAT(socket1.SetMulticastInterface(interfaces[0].interface_index),
799*6777b538SAndroid Build Coastguard Worker IsOk());
800*6777b538SAndroid Build Coastguard Worker ASSERT_THAT(socket1.Listen(receive_address), IsOk());
801*6777b538SAndroid Build Coastguard Worker ASSERT_THAT(socket1.JoinGroup(group_ip), IsOk());
802*6777b538SAndroid Build Coastguard Worker // Get the bound port.
803*6777b538SAndroid Build Coastguard Worker ASSERT_THAT(socket1.GetLocalAddress(&receive_address), IsOk());
804*6777b538SAndroid Build Coastguard Worker
805*6777b538SAndroid Build Coastguard Worker // Setup second receiving socket.
806*6777b538SAndroid Build Coastguard Worker UDPServerSocket socket2(nullptr, NetLogSource());
807*6777b538SAndroid Build Coastguard Worker socket2.AllowAddressSharingForMulticast(), IsOk();
808*6777b538SAndroid Build Coastguard Worker ASSERT_THAT(socket2.SetMulticastInterface(interfaces[0].interface_index),
809*6777b538SAndroid Build Coastguard Worker IsOk());
810*6777b538SAndroid Build Coastguard Worker ASSERT_THAT(socket2.Listen(receive_address), IsOk());
811*6777b538SAndroid Build Coastguard Worker ASSERT_THAT(socket2.JoinGroup(group_ip), IsOk());
812*6777b538SAndroid Build Coastguard Worker
813*6777b538SAndroid Build Coastguard Worker // Setup client socket.
814*6777b538SAndroid Build Coastguard Worker IPEndPoint send_address(group_ip, receive_address.port());
815*6777b538SAndroid Build Coastguard Worker UDPClientSocket client_socket(DatagramSocket::DEFAULT_BIND, nullptr,
816*6777b538SAndroid Build Coastguard Worker NetLogSource());
817*6777b538SAndroid Build Coastguard Worker ASSERT_THAT(client_socket.Connect(send_address), IsOk());
818*6777b538SAndroid Build Coastguard Worker
819*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_CHROMEOS_ASH)
820*6777b538SAndroid Build Coastguard Worker // Send a message via the multicast group. That message is expected be be
821*6777b538SAndroid Build Coastguard Worker // received by both receving sockets.
822*6777b538SAndroid Build Coastguard Worker //
823*6777b538SAndroid Build Coastguard Worker // Skip on ChromeOS where it's known to sometimes not work.
824*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/898964): If possible, fix and reenable.
825*6777b538SAndroid Build Coastguard Worker const char kMessage[] = "hello!";
826*6777b538SAndroid Build Coastguard Worker ASSERT_GE(WriteSocket(&client_socket, kMessage), 0);
827*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kMessage, RecvFromSocket(&socket1));
828*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kMessage, RecvFromSocket(&socket2));
829*6777b538SAndroid Build Coastguard Worker #endif // !BUILDFLAG(IS_CHROMEOS_ASH)
830*6777b538SAndroid Build Coastguard Worker }
831*6777b538SAndroid Build Coastguard Worker #endif // !BUILDFLAG(IS_ANDROID)
832*6777b538SAndroid Build Coastguard Worker
TEST_F(UDPSocketTest,MulticastOptions)833*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, MulticastOptions) {
834*6777b538SAndroid Build Coastguard Worker IPEndPoint bind_address;
835*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateUDPAddress("0.0.0.0", 0 /* port */, &bind_address));
836*6777b538SAndroid Build Coastguard Worker
837*6777b538SAndroid Build Coastguard Worker UDPSocket socket(DatagramSocket::DEFAULT_BIND, nullptr, NetLogSource());
838*6777b538SAndroid Build Coastguard Worker // Before binding.
839*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(socket.SetMulticastLoopbackMode(false), IsOk());
840*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(socket.SetMulticastLoopbackMode(true), IsOk());
841*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(socket.SetMulticastTimeToLive(0), IsOk());
842*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(socket.SetMulticastTimeToLive(3), IsOk());
843*6777b538SAndroid Build Coastguard Worker EXPECT_NE(OK, socket.SetMulticastTimeToLive(-1));
844*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(socket.SetMulticastInterface(0), IsOk());
845*6777b538SAndroid Build Coastguard Worker
846*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(socket.Open(bind_address.GetFamily()), IsOk());
847*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(socket.Bind(bind_address), IsOk());
848*6777b538SAndroid Build Coastguard Worker
849*6777b538SAndroid Build Coastguard Worker EXPECT_NE(OK, socket.SetMulticastLoopbackMode(false));
850*6777b538SAndroid Build Coastguard Worker EXPECT_NE(OK, socket.SetMulticastTimeToLive(0));
851*6777b538SAndroid Build Coastguard Worker EXPECT_NE(OK, socket.SetMulticastInterface(0));
852*6777b538SAndroid Build Coastguard Worker
853*6777b538SAndroid Build Coastguard Worker socket.Close();
854*6777b538SAndroid Build Coastguard Worker }
855*6777b538SAndroid Build Coastguard Worker
856*6777b538SAndroid Build Coastguard Worker // Checking that DSCP bits are set correctly is difficult,
857*6777b538SAndroid Build Coastguard Worker // but let's check that the code doesn't crash at least.
TEST_F(UDPSocketTest,SetDSCP)858*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, SetDSCP) {
859*6777b538SAndroid Build Coastguard Worker // Setup the server to listen.
860*6777b538SAndroid Build Coastguard Worker IPEndPoint bind_address;
861*6777b538SAndroid Build Coastguard Worker UDPSocket client(DatagramSocket::DEFAULT_BIND, nullptr, NetLogSource());
862*6777b538SAndroid Build Coastguard Worker // We need a real IP, but we won't actually send anything to it.
863*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateUDPAddress("8.8.8.8", 9999, &bind_address));
864*6777b538SAndroid Build Coastguard Worker int rv = client.Open(bind_address.GetFamily());
865*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(rv, IsOk());
866*6777b538SAndroid Build Coastguard Worker
867*6777b538SAndroid Build Coastguard Worker rv = client.Connect(bind_address);
868*6777b538SAndroid Build Coastguard Worker if (rv != OK) {
869*6777b538SAndroid Build Coastguard Worker // Let's try localhost then.
870*6777b538SAndroid Build Coastguard Worker bind_address = IPEndPoint(IPAddress::IPv4Localhost(), 9999);
871*6777b538SAndroid Build Coastguard Worker rv = client.Connect(bind_address);
872*6777b538SAndroid Build Coastguard Worker }
873*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(rv, IsOk());
874*6777b538SAndroid Build Coastguard Worker
875*6777b538SAndroid Build Coastguard Worker client.SetDiffServCodePoint(DSCP_NO_CHANGE);
876*6777b538SAndroid Build Coastguard Worker client.SetDiffServCodePoint(DSCP_AF41);
877*6777b538SAndroid Build Coastguard Worker client.SetDiffServCodePoint(DSCP_DEFAULT);
878*6777b538SAndroid Build Coastguard Worker client.SetDiffServCodePoint(DSCP_CS2);
879*6777b538SAndroid Build Coastguard Worker client.SetDiffServCodePoint(DSCP_NO_CHANGE);
880*6777b538SAndroid Build Coastguard Worker client.SetDiffServCodePoint(DSCP_DEFAULT);
881*6777b538SAndroid Build Coastguard Worker client.Close();
882*6777b538SAndroid Build Coastguard Worker }
883*6777b538SAndroid Build Coastguard Worker
884*6777b538SAndroid Build Coastguard Worker // Send DSCP + ECN marked packets from server to client and verify the TOS
885*6777b538SAndroid Build Coastguard Worker // bytes that arrive.
TEST_F(UDPSocketTest,VerifyDscpAndEcnExchange)886*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, VerifyDscpAndEcnExchange) {
887*6777b538SAndroid Build Coastguard Worker IPEndPoint server_address(IPAddress::IPv4Localhost(), 0);
888*6777b538SAndroid Build Coastguard Worker UDPServerSocket server(nullptr, NetLogSource());
889*6777b538SAndroid Build Coastguard Worker server.AllowAddressReuse();
890*6777b538SAndroid Build Coastguard Worker ASSERT_THAT(server.Listen(server_address), IsOk());
891*6777b538SAndroid Build Coastguard Worker // Get bound port.
892*6777b538SAndroid Build Coastguard Worker ASSERT_THAT(server.GetLocalAddress(&server_address), IsOk());
893*6777b538SAndroid Build Coastguard Worker UDPClientSocket client(DatagramSocket::DEFAULT_BIND, nullptr, NetLogSource());
894*6777b538SAndroid Build Coastguard Worker client.Connect(server_address);
895*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(client.SetRecvTos(), 0);
896*6777b538SAndroid Build Coastguard Worker IPEndPoint client_address;
897*6777b538SAndroid Build Coastguard Worker client.GetLocalAddress(&client_address);
898*6777b538SAndroid Build Coastguard Worker
899*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(server.SetTos(DSCP_AF41, ECN_ECT1), 0);
900*6777b538SAndroid Build Coastguard Worker std::string first_message = "foobar";
901*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SendToSocket(&server, first_message, client_address),
902*6777b538SAndroid Build Coastguard Worker static_cast<int>(first_message.length()));
903*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(ReadSocket(&client, DSCP_AF41, ECN_ECT1), first_message.data());
904*6777b538SAndroid Build Coastguard Worker
905*6777b538SAndroid Build Coastguard Worker std::string second_message = "foo";
906*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(server.SetTos(DSCP_CS2, ECN_ECT0), 0);
907*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SendToSocket(&server, second_message, client_address),
908*6777b538SAndroid Build Coastguard Worker static_cast<int>(second_message.length()));
909*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(ReadSocket(&client, DSCP_CS2, ECN_ECT0), second_message.data());
910*6777b538SAndroid Build Coastguard Worker
911*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
912*6777b538SAndroid Build Coastguard Worker // The Windows sendmsg API does not allow setting ECN_CE as the outgoing mark.
913*6777b538SAndroid Build Coastguard Worker EcnCodePoint final_ecn = ECN_ECT1;
914*6777b538SAndroid Build Coastguard Worker #else
915*6777b538SAndroid Build Coastguard Worker EcnCodePoint final_ecn = ECN_CE;
916*6777b538SAndroid Build Coastguard Worker #endif
917*6777b538SAndroid Build Coastguard Worker
918*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(server.SetTos(DSCP_NO_CHANGE, final_ecn), 0);
919*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SendToSocket(&server, second_message, client_address),
920*6777b538SAndroid Build Coastguard Worker static_cast<int>(second_message.length()));
921*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(ReadSocket(&client, DSCP_CS2, final_ecn), second_message.data());
922*6777b538SAndroid Build Coastguard Worker
923*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(server.SetTos(DSCP_AF41, ECN_NO_CHANGE), 0);
924*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SendToSocket(&server, second_message, client_address),
925*6777b538SAndroid Build Coastguard Worker static_cast<int>(second_message.length()));
926*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(ReadSocket(&client, DSCP_AF41, final_ecn), second_message.data());
927*6777b538SAndroid Build Coastguard Worker
928*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(server.SetTos(DSCP_NO_CHANGE, ECN_NO_CHANGE), 0);
929*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SendToSocket(&server, second_message, client_address),
930*6777b538SAndroid Build Coastguard Worker static_cast<int>(second_message.length()));
931*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(ReadSocket(&client, DSCP_AF41, final_ecn), second_message.data());
932*6777b538SAndroid Build Coastguard Worker
933*6777b538SAndroid Build Coastguard Worker server.Close();
934*6777b538SAndroid Build Coastguard Worker client.Close();
935*6777b538SAndroid Build Coastguard Worker }
936*6777b538SAndroid Build Coastguard Worker
937*6777b538SAndroid Build Coastguard Worker // For windows, test with Nonblocking sockets. For other platforms, this test
938*6777b538SAndroid Build Coastguard Worker // is identical to VerifyDscpAndEcnExchange, above.
TEST_F(UDPSocketTest,VerifyDscpAndEcnExchangeNonBlocking)939*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, VerifyDscpAndEcnExchangeNonBlocking) {
940*6777b538SAndroid Build Coastguard Worker IPEndPoint server_address(IPAddress::IPv4Localhost(), 0);
941*6777b538SAndroid Build Coastguard Worker UDPServerSocket server(nullptr, NetLogSource());
942*6777b538SAndroid Build Coastguard Worker server.UseNonBlockingIO();
943*6777b538SAndroid Build Coastguard Worker server.AllowAddressReuse();
944*6777b538SAndroid Build Coastguard Worker ASSERT_THAT(server.Listen(server_address), IsOk());
945*6777b538SAndroid Build Coastguard Worker // Get bound port.
946*6777b538SAndroid Build Coastguard Worker ASSERT_THAT(server.GetLocalAddress(&server_address), IsOk());
947*6777b538SAndroid Build Coastguard Worker UDPClientSocket client(DatagramSocket::DEFAULT_BIND, nullptr, NetLogSource());
948*6777b538SAndroid Build Coastguard Worker client.UseNonBlockingIO();
949*6777b538SAndroid Build Coastguard Worker client.Connect(server_address);
950*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(client.SetRecvTos(), 0);
951*6777b538SAndroid Build Coastguard Worker IPEndPoint client_address;
952*6777b538SAndroid Build Coastguard Worker client.GetLocalAddress(&client_address);
953*6777b538SAndroid Build Coastguard Worker
954*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(server.SetTos(DSCP_AF41, ECN_ECT1), 0);
955*6777b538SAndroid Build Coastguard Worker std::string first_message = "foobar";
956*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SendToSocket(&server, first_message, client_address),
957*6777b538SAndroid Build Coastguard Worker static_cast<int>(first_message.length()));
958*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(ReadSocket(&client, DSCP_AF41, ECN_ECT1), first_message.data());
959*6777b538SAndroid Build Coastguard Worker
960*6777b538SAndroid Build Coastguard Worker std::string second_message = "foo";
961*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(server.SetTos(DSCP_CS2, ECN_ECT0), 0);
962*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SendToSocket(&server, second_message, client_address),
963*6777b538SAndroid Build Coastguard Worker static_cast<int>(second_message.length()));
964*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(ReadSocket(&client, DSCP_CS2, ECN_ECT0), second_message.data());
965*6777b538SAndroid Build Coastguard Worker
966*6777b538SAndroid Build Coastguard Worker // The Windows sendmsg API does not allow setting ECN_CE as the outgoing mark.
967*6777b538SAndroid Build Coastguard Worker EcnCodePoint final_ecn = ECN_ECT1;
968*6777b538SAndroid Build Coastguard Worker
969*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(server.SetTos(DSCP_NO_CHANGE, final_ecn), 0);
970*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SendToSocket(&server, second_message, client_address),
971*6777b538SAndroid Build Coastguard Worker static_cast<int>(second_message.length()));
972*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(ReadSocket(&client, DSCP_CS2, final_ecn), second_message.data());
973*6777b538SAndroid Build Coastguard Worker
974*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(server.SetTos(DSCP_AF41, ECN_NO_CHANGE), 0);
975*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SendToSocket(&server, second_message, client_address),
976*6777b538SAndroid Build Coastguard Worker static_cast<int>(second_message.length()));
977*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(ReadSocket(&client, DSCP_AF41, final_ecn), second_message.data());
978*6777b538SAndroid Build Coastguard Worker
979*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(server.SetTos(DSCP_NO_CHANGE, ECN_NO_CHANGE), 0);
980*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SendToSocket(&server, second_message, client_address),
981*6777b538SAndroid Build Coastguard Worker static_cast<int>(second_message.length()));
982*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(ReadSocket(&client, DSCP_AF41, final_ecn), second_message.data());
983*6777b538SAndroid Build Coastguard Worker
984*6777b538SAndroid Build Coastguard Worker server.Close();
985*6777b538SAndroid Build Coastguard Worker client.Close();
986*6777b538SAndroid Build Coastguard Worker }
987*6777b538SAndroid Build Coastguard Worker
TEST_F(UDPSocketTest,ConnectUsingNetwork)988*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, ConnectUsingNetwork) {
989*6777b538SAndroid Build Coastguard Worker // The specific value of this address doesn't really matter, and no
990*6777b538SAndroid Build Coastguard Worker // server needs to be running here. The test only needs to call
991*6777b538SAndroid Build Coastguard Worker // ConnectUsingNetwork() and won't send any datagrams.
992*6777b538SAndroid Build Coastguard Worker const IPEndPoint fake_server_address(IPAddress::IPv4Localhost(), 8080);
993*6777b538SAndroid Build Coastguard Worker const handles::NetworkHandle wrong_network_handle = 65536;
994*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
995*6777b538SAndroid Build Coastguard Worker NetworkChangeNotifierFactoryAndroid ncn_factory;
996*6777b538SAndroid Build Coastguard Worker NetworkChangeNotifier::DisableForTest ncn_disable_for_test;
997*6777b538SAndroid Build Coastguard Worker std::unique_ptr<NetworkChangeNotifier> ncn(ncn_factory.CreateInstance());
998*6777b538SAndroid Build Coastguard Worker if (!NetworkChangeNotifier::AreNetworkHandlesSupported())
999*6777b538SAndroid Build Coastguard Worker GTEST_SKIP() << "Network handles are required to test BindToNetwork.";
1000*6777b538SAndroid Build Coastguard Worker
1001*6777b538SAndroid Build Coastguard Worker {
1002*6777b538SAndroid Build Coastguard Worker // Connecting using a not existing network should fail but not report
1003*6777b538SAndroid Build Coastguard Worker // ERR_NOT_IMPLEMENTED when network handles are supported.
1004*6777b538SAndroid Build Coastguard Worker UDPClientSocket socket(DatagramSocket::RANDOM_BIND, nullptr,
1005*6777b538SAndroid Build Coastguard Worker NetLogSource());
1006*6777b538SAndroid Build Coastguard Worker int rv =
1007*6777b538SAndroid Build Coastguard Worker socket.ConnectUsingNetwork(wrong_network_handle, fake_server_address);
1008*6777b538SAndroid Build Coastguard Worker EXPECT_NE(ERR_NOT_IMPLEMENTED, rv);
1009*6777b538SAndroid Build Coastguard Worker EXPECT_NE(OK, rv);
1010*6777b538SAndroid Build Coastguard Worker EXPECT_NE(wrong_network_handle, socket.GetBoundNetwork());
1011*6777b538SAndroid Build Coastguard Worker }
1012*6777b538SAndroid Build Coastguard Worker
1013*6777b538SAndroid Build Coastguard Worker {
1014*6777b538SAndroid Build Coastguard Worker // Connecting using an existing network should succeed when
1015*6777b538SAndroid Build Coastguard Worker // NetworkChangeNotifier returns a valid default network.
1016*6777b538SAndroid Build Coastguard Worker UDPClientSocket socket(DatagramSocket::RANDOM_BIND, nullptr,
1017*6777b538SAndroid Build Coastguard Worker NetLogSource());
1018*6777b538SAndroid Build Coastguard Worker const handles::NetworkHandle network_handle =
1019*6777b538SAndroid Build Coastguard Worker NetworkChangeNotifier::GetDefaultNetwork();
1020*6777b538SAndroid Build Coastguard Worker if (network_handle != handles::kInvalidNetworkHandle) {
1021*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(
1022*6777b538SAndroid Build Coastguard Worker OK, socket.ConnectUsingNetwork(network_handle, fake_server_address));
1023*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(network_handle, socket.GetBoundNetwork());
1024*6777b538SAndroid Build Coastguard Worker }
1025*6777b538SAndroid Build Coastguard Worker }
1026*6777b538SAndroid Build Coastguard Worker #else
1027*6777b538SAndroid Build Coastguard Worker UDPClientSocket socket(DatagramSocket::RANDOM_BIND, nullptr, NetLogSource());
1028*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(
1029*6777b538SAndroid Build Coastguard Worker ERR_NOT_IMPLEMENTED,
1030*6777b538SAndroid Build Coastguard Worker socket.ConnectUsingNetwork(wrong_network_handle, fake_server_address));
1031*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_ANDROID)
1032*6777b538SAndroid Build Coastguard Worker }
1033*6777b538SAndroid Build Coastguard Worker
TEST_F(UDPSocketTest,ConnectUsingNetworkAsync)1034*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, ConnectUsingNetworkAsync) {
1035*6777b538SAndroid Build Coastguard Worker // The specific value of this address doesn't really matter, and no
1036*6777b538SAndroid Build Coastguard Worker // server needs to be running here. The test only needs to call
1037*6777b538SAndroid Build Coastguard Worker // ConnectUsingNetwork() and won't send any datagrams.
1038*6777b538SAndroid Build Coastguard Worker const IPEndPoint fake_server_address(IPAddress::IPv4Localhost(), 8080);
1039*6777b538SAndroid Build Coastguard Worker const handles::NetworkHandle wrong_network_handle = 65536;
1040*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
1041*6777b538SAndroid Build Coastguard Worker NetworkChangeNotifierFactoryAndroid ncn_factory;
1042*6777b538SAndroid Build Coastguard Worker NetworkChangeNotifier::DisableForTest ncn_disable_for_test;
1043*6777b538SAndroid Build Coastguard Worker std::unique_ptr<NetworkChangeNotifier> ncn(ncn_factory.CreateInstance());
1044*6777b538SAndroid Build Coastguard Worker if (!NetworkChangeNotifier::AreNetworkHandlesSupported())
1045*6777b538SAndroid Build Coastguard Worker GTEST_SKIP() << "Network handles are required to test BindToNetwork.";
1046*6777b538SAndroid Build Coastguard Worker
1047*6777b538SAndroid Build Coastguard Worker {
1048*6777b538SAndroid Build Coastguard Worker // Connecting using a not existing network should fail but not report
1049*6777b538SAndroid Build Coastguard Worker // ERR_NOT_IMPLEMENTED when network handles are supported.
1050*6777b538SAndroid Build Coastguard Worker UDPClientSocket socket(DatagramSocket::RANDOM_BIND, nullptr,
1051*6777b538SAndroid Build Coastguard Worker NetLogSource());
1052*6777b538SAndroid Build Coastguard Worker TestCompletionCallback callback;
1053*6777b538SAndroid Build Coastguard Worker int rv = socket.ConnectUsingNetworkAsync(
1054*6777b538SAndroid Build Coastguard Worker wrong_network_handle, fake_server_address, callback.callback());
1055*6777b538SAndroid Build Coastguard Worker
1056*6777b538SAndroid Build Coastguard Worker if (rv == ERR_IO_PENDING) {
1057*6777b538SAndroid Build Coastguard Worker rv = callback.WaitForResult();
1058*6777b538SAndroid Build Coastguard Worker }
1059*6777b538SAndroid Build Coastguard Worker EXPECT_NE(ERR_NOT_IMPLEMENTED, rv);
1060*6777b538SAndroid Build Coastguard Worker EXPECT_NE(OK, rv);
1061*6777b538SAndroid Build Coastguard Worker }
1062*6777b538SAndroid Build Coastguard Worker
1063*6777b538SAndroid Build Coastguard Worker {
1064*6777b538SAndroid Build Coastguard Worker // Connecting using an existing network should succeed when
1065*6777b538SAndroid Build Coastguard Worker // NetworkChangeNotifier returns a valid default network.
1066*6777b538SAndroid Build Coastguard Worker UDPClientSocket socket(DatagramSocket::RANDOM_BIND, nullptr,
1067*6777b538SAndroid Build Coastguard Worker NetLogSource());
1068*6777b538SAndroid Build Coastguard Worker TestCompletionCallback callback;
1069*6777b538SAndroid Build Coastguard Worker const handles::NetworkHandle network_handle =
1070*6777b538SAndroid Build Coastguard Worker NetworkChangeNotifier::GetDefaultNetwork();
1071*6777b538SAndroid Build Coastguard Worker if (network_handle != handles::kInvalidNetworkHandle) {
1072*6777b538SAndroid Build Coastguard Worker int rv = socket.ConnectUsingNetworkAsync(
1073*6777b538SAndroid Build Coastguard Worker network_handle, fake_server_address, callback.callback());
1074*6777b538SAndroid Build Coastguard Worker if (rv == ERR_IO_PENDING) {
1075*6777b538SAndroid Build Coastguard Worker rv = callback.WaitForResult();
1076*6777b538SAndroid Build Coastguard Worker }
1077*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(OK, rv);
1078*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(network_handle, socket.GetBoundNetwork());
1079*6777b538SAndroid Build Coastguard Worker }
1080*6777b538SAndroid Build Coastguard Worker }
1081*6777b538SAndroid Build Coastguard Worker #else
1082*6777b538SAndroid Build Coastguard Worker UDPClientSocket socket(DatagramSocket::RANDOM_BIND, nullptr, NetLogSource());
1083*6777b538SAndroid Build Coastguard Worker TestCompletionCallback callback;
1084*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(ERR_NOT_IMPLEMENTED, socket.ConnectUsingNetworkAsync(
1085*6777b538SAndroid Build Coastguard Worker wrong_network_handle, fake_server_address,
1086*6777b538SAndroid Build Coastguard Worker callback.callback()));
1087*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_ANDROID)
1088*6777b538SAndroid Build Coastguard Worker }
1089*6777b538SAndroid Build Coastguard Worker
1090*6777b538SAndroid Build Coastguard Worker } // namespace
1091*6777b538SAndroid Build Coastguard Worker
1092*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
1093*6777b538SAndroid Build Coastguard Worker
1094*6777b538SAndroid Build Coastguard Worker namespace {
1095*6777b538SAndroid Build Coastguard Worker
1096*6777b538SAndroid Build Coastguard Worker const HANDLE kFakeHandle1 = (HANDLE)12;
1097*6777b538SAndroid Build Coastguard Worker const HANDLE kFakeHandle2 = (HANDLE)13;
1098*6777b538SAndroid Build Coastguard Worker
1099*6777b538SAndroid Build Coastguard Worker const QOS_FLOWID kFakeFlowId1 = (QOS_FLOWID)27;
1100*6777b538SAndroid Build Coastguard Worker const QOS_FLOWID kFakeFlowId2 = (QOS_FLOWID)38;
1101*6777b538SAndroid Build Coastguard Worker
1102*6777b538SAndroid Build Coastguard Worker class TestUDPSocketWin : public UDPSocketWin {
1103*6777b538SAndroid Build Coastguard Worker public:
TestUDPSocketWin(QwaveApi * qos,DatagramSocket::BindType bind_type,net::NetLog * net_log,const net::NetLogSource & source)1104*6777b538SAndroid Build Coastguard Worker TestUDPSocketWin(QwaveApi* qos,
1105*6777b538SAndroid Build Coastguard Worker DatagramSocket::BindType bind_type,
1106*6777b538SAndroid Build Coastguard Worker net::NetLog* net_log,
1107*6777b538SAndroid Build Coastguard Worker const net::NetLogSource& source)
1108*6777b538SAndroid Build Coastguard Worker : UDPSocketWin(bind_type, net_log, source), qos_(qos) {}
1109*6777b538SAndroid Build Coastguard Worker
1110*6777b538SAndroid Build Coastguard Worker TestUDPSocketWin(const TestUDPSocketWin&) = delete;
1111*6777b538SAndroid Build Coastguard Worker TestUDPSocketWin& operator=(const TestUDPSocketWin&) = delete;
1112*6777b538SAndroid Build Coastguard Worker
1113*6777b538SAndroid Build Coastguard Worker // Overriding GetQwaveApi causes the test class to use the injected mock
1114*6777b538SAndroid Build Coastguard Worker // QwaveApi instance instead of the singleton.
GetQwaveApi() const1115*6777b538SAndroid Build Coastguard Worker QwaveApi* GetQwaveApi() const override { return qos_; }
1116*6777b538SAndroid Build Coastguard Worker
1117*6777b538SAndroid Build Coastguard Worker private:
1118*6777b538SAndroid Build Coastguard Worker raw_ptr<QwaveApi> qos_;
1119*6777b538SAndroid Build Coastguard Worker };
1120*6777b538SAndroid Build Coastguard Worker
1121*6777b538SAndroid Build Coastguard Worker class MockQwaveApi : public QwaveApi {
1122*6777b538SAndroid Build Coastguard Worker public:
1123*6777b538SAndroid Build Coastguard Worker MOCK_CONST_METHOD0(qwave_supported, bool());
1124*6777b538SAndroid Build Coastguard Worker MOCK_METHOD0(OnFatalError, void());
1125*6777b538SAndroid Build Coastguard Worker MOCK_METHOD2(CreateHandle, BOOL(PQOS_VERSION version, PHANDLE handle));
1126*6777b538SAndroid Build Coastguard Worker MOCK_METHOD1(CloseHandle, BOOL(HANDLE handle));
1127*6777b538SAndroid Build Coastguard Worker MOCK_METHOD6(AddSocketToFlow,
1128*6777b538SAndroid Build Coastguard Worker BOOL(HANDLE handle,
1129*6777b538SAndroid Build Coastguard Worker SOCKET socket,
1130*6777b538SAndroid Build Coastguard Worker PSOCKADDR addr,
1131*6777b538SAndroid Build Coastguard Worker QOS_TRAFFIC_TYPE traffic_type,
1132*6777b538SAndroid Build Coastguard Worker DWORD flags,
1133*6777b538SAndroid Build Coastguard Worker PQOS_FLOWID flow_id));
1134*6777b538SAndroid Build Coastguard Worker
1135*6777b538SAndroid Build Coastguard Worker MOCK_METHOD4(
1136*6777b538SAndroid Build Coastguard Worker RemoveSocketFromFlow,
1137*6777b538SAndroid Build Coastguard Worker BOOL(HANDLE handle, SOCKET socket, QOS_FLOWID flow_id, DWORD reserved));
1138*6777b538SAndroid Build Coastguard Worker MOCK_METHOD7(SetFlow,
1139*6777b538SAndroid Build Coastguard Worker BOOL(HANDLE handle,
1140*6777b538SAndroid Build Coastguard Worker QOS_FLOWID flow_id,
1141*6777b538SAndroid Build Coastguard Worker QOS_SET_FLOW op,
1142*6777b538SAndroid Build Coastguard Worker ULONG size,
1143*6777b538SAndroid Build Coastguard Worker PVOID data,
1144*6777b538SAndroid Build Coastguard Worker DWORD reserved,
1145*6777b538SAndroid Build Coastguard Worker LPOVERLAPPED overlapped));
1146*6777b538SAndroid Build Coastguard Worker };
1147*6777b538SAndroid Build Coastguard Worker
OpenedDscpTestClient(QwaveApi * api,IPEndPoint bind_address)1148*6777b538SAndroid Build Coastguard Worker std::unique_ptr<UDPSocket> OpenedDscpTestClient(QwaveApi* api,
1149*6777b538SAndroid Build Coastguard Worker IPEndPoint bind_address) {
1150*6777b538SAndroid Build Coastguard Worker auto client = std::make_unique<TestUDPSocketWin>(
1151*6777b538SAndroid Build Coastguard Worker api, DatagramSocket::DEFAULT_BIND, nullptr, NetLogSource());
1152*6777b538SAndroid Build Coastguard Worker int rv = client->Open(bind_address.GetFamily());
1153*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(rv, IsOk());
1154*6777b538SAndroid Build Coastguard Worker
1155*6777b538SAndroid Build Coastguard Worker return client;
1156*6777b538SAndroid Build Coastguard Worker }
1157*6777b538SAndroid Build Coastguard Worker
ConnectedDscpTestClient(QwaveApi * api)1158*6777b538SAndroid Build Coastguard Worker std::unique_ptr<UDPSocket> ConnectedDscpTestClient(QwaveApi* api) {
1159*6777b538SAndroid Build Coastguard Worker IPEndPoint bind_address;
1160*6777b538SAndroid Build Coastguard Worker // We need a real IP, but we won't actually send anything to it.
1161*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CreateUDPAddress("8.8.8.8", 9999, &bind_address));
1162*6777b538SAndroid Build Coastguard Worker auto client = OpenedDscpTestClient(api, bind_address);
1163*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(client->Connect(bind_address), IsOk());
1164*6777b538SAndroid Build Coastguard Worker return client;
1165*6777b538SAndroid Build Coastguard Worker }
1166*6777b538SAndroid Build Coastguard Worker
UnconnectedDscpTestClient(QwaveApi * api)1167*6777b538SAndroid Build Coastguard Worker std::unique_ptr<UDPSocket> UnconnectedDscpTestClient(QwaveApi* api) {
1168*6777b538SAndroid Build Coastguard Worker IPEndPoint bind_address;
1169*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CreateUDPAddress("0.0.0.0", 9999, &bind_address));
1170*6777b538SAndroid Build Coastguard Worker auto client = OpenedDscpTestClient(api, bind_address);
1171*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(client->Bind(bind_address), IsOk());
1172*6777b538SAndroid Build Coastguard Worker return client;
1173*6777b538SAndroid Build Coastguard Worker }
1174*6777b538SAndroid Build Coastguard Worker
1175*6777b538SAndroid Build Coastguard Worker } // namespace
1176*6777b538SAndroid Build Coastguard Worker
1177*6777b538SAndroid Build Coastguard Worker using ::testing::Return;
1178*6777b538SAndroid Build Coastguard Worker using ::testing::SetArgPointee;
1179*6777b538SAndroid Build Coastguard Worker using ::testing::_;
1180*6777b538SAndroid Build Coastguard Worker
TEST_F(UDPSocketTest,SetDSCPNoopIfPassedNoChange)1181*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, SetDSCPNoopIfPassedNoChange) {
1182*6777b538SAndroid Build Coastguard Worker MockQwaveApi api;
1183*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, qwave_supported()).WillRepeatedly(Return(true));
1184*6777b538SAndroid Build Coastguard Worker
1185*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, AddSocketToFlow(_, _, _, _, _, _)).Times(0);
1186*6777b538SAndroid Build Coastguard Worker std::unique_ptr<UDPSocket> client = ConnectedDscpTestClient(&api);
1187*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(client->SetDiffServCodePoint(DSCP_NO_CHANGE), IsOk());
1188*6777b538SAndroid Build Coastguard Worker }
1189*6777b538SAndroid Build Coastguard Worker
TEST_F(UDPSocketTest,SetDSCPFailsIfQOSDoesntLink)1190*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, SetDSCPFailsIfQOSDoesntLink) {
1191*6777b538SAndroid Build Coastguard Worker MockQwaveApi api;
1192*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, qwave_supported()).WillRepeatedly(Return(false));
1193*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, CreateHandle(_, _)).Times(0);
1194*6777b538SAndroid Build Coastguard Worker
1195*6777b538SAndroid Build Coastguard Worker std::unique_ptr<UDPSocket> client = ConnectedDscpTestClient(&api);
1196*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(ERR_NOT_IMPLEMENTED, client->SetDiffServCodePoint(DSCP_AF41));
1197*6777b538SAndroid Build Coastguard Worker }
1198*6777b538SAndroid Build Coastguard Worker
TEST_F(UDPSocketTest,SetDSCPFailsIfHandleCantBeCreated)1199*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, SetDSCPFailsIfHandleCantBeCreated) {
1200*6777b538SAndroid Build Coastguard Worker MockQwaveApi api;
1201*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, qwave_supported()).WillRepeatedly(Return(true));
1202*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, CreateHandle(_, _)).WillOnce(Return(false));
1203*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, OnFatalError()).Times(1);
1204*6777b538SAndroid Build Coastguard Worker
1205*6777b538SAndroid Build Coastguard Worker std::unique_ptr<UDPSocket> client = ConnectedDscpTestClient(&api);
1206*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(ERR_INVALID_HANDLE, client->SetDiffServCodePoint(DSCP_AF41));
1207*6777b538SAndroid Build Coastguard Worker
1208*6777b538SAndroid Build Coastguard Worker RunUntilIdle();
1209*6777b538SAndroid Build Coastguard Worker
1210*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, qwave_supported()).WillRepeatedly(Return(false));
1211*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(ERR_NOT_IMPLEMENTED, client->SetDiffServCodePoint(DSCP_AF41));
1212*6777b538SAndroid Build Coastguard Worker }
1213*6777b538SAndroid Build Coastguard Worker
1214*6777b538SAndroid Build Coastguard Worker MATCHER_P(DscpPointee, dscp, "") {
1215*6777b538SAndroid Build Coastguard Worker return *(DWORD*)arg == (DWORD)dscp;
1216*6777b538SAndroid Build Coastguard Worker }
1217*6777b538SAndroid Build Coastguard Worker
TEST_F(UDPSocketTest,ConnectedSocketDelayedInitAndUpdate)1218*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, ConnectedSocketDelayedInitAndUpdate) {
1219*6777b538SAndroid Build Coastguard Worker MockQwaveApi api;
1220*6777b538SAndroid Build Coastguard Worker std::unique_ptr<UDPSocket> client = ConnectedDscpTestClient(&api);
1221*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, qwave_supported()).WillRepeatedly(Return(true));
1222*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, CreateHandle(_, _))
1223*6777b538SAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgPointee<1>(kFakeHandle1), Return(true)));
1224*6777b538SAndroid Build Coastguard Worker
1225*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, AddSocketToFlow(_, _, _, _, _, _))
1226*6777b538SAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgPointee<5>(kFakeFlowId1), Return(true)));
1227*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, SetFlow(_, _, _, _, _, _, _));
1228*6777b538SAndroid Build Coastguard Worker
1229*6777b538SAndroid Build Coastguard Worker // First set on connected sockets will fail since init is async and
1230*6777b538SAndroid Build Coastguard Worker // we haven't given the runloop a chance to execute the callback.
1231*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(ERR_INVALID_HANDLE, client->SetDiffServCodePoint(DSCP_AF41));
1232*6777b538SAndroid Build Coastguard Worker RunUntilIdle();
1233*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(client->SetDiffServCodePoint(DSCP_AF41), IsOk());
1234*6777b538SAndroid Build Coastguard Worker
1235*6777b538SAndroid Build Coastguard Worker // New dscp value should reset the flow.
1236*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, RemoveSocketFromFlow(_, _, kFakeFlowId1, _));
1237*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, AddSocketToFlow(_, _, _, QOSTrafficTypeBestEffort, _, _))
1238*6777b538SAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgPointee<5>(kFakeFlowId2), Return(true)));
1239*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, SetFlow(_, _, QOSSetOutgoingDSCPValue, _,
1240*6777b538SAndroid Build Coastguard Worker DscpPointee(DSCP_DEFAULT), _, _));
1241*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(client->SetDiffServCodePoint(DSCP_DEFAULT), IsOk());
1242*6777b538SAndroid Build Coastguard Worker
1243*6777b538SAndroid Build Coastguard Worker // Called from DscpManager destructor.
1244*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, RemoveSocketFromFlow(_, _, kFakeFlowId2, _));
1245*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, CloseHandle(kFakeHandle1));
1246*6777b538SAndroid Build Coastguard Worker }
1247*6777b538SAndroid Build Coastguard Worker
TEST_F(UDPSocketTest,UnonnectedSocketDelayedInitAndUpdate)1248*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, UnonnectedSocketDelayedInitAndUpdate) {
1249*6777b538SAndroid Build Coastguard Worker MockQwaveApi api;
1250*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, qwave_supported()).WillRepeatedly(Return(true));
1251*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, CreateHandle(_, _))
1252*6777b538SAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgPointee<1>(kFakeHandle1), Return(true)));
1253*6777b538SAndroid Build Coastguard Worker
1254*6777b538SAndroid Build Coastguard Worker // CreateHandle won't have completed yet. Set passes.
1255*6777b538SAndroid Build Coastguard Worker std::unique_ptr<UDPSocket> client = UnconnectedDscpTestClient(&api);
1256*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(client->SetDiffServCodePoint(DSCP_AF41), IsOk());
1257*6777b538SAndroid Build Coastguard Worker
1258*6777b538SAndroid Build Coastguard Worker RunUntilIdle();
1259*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(client->SetDiffServCodePoint(DSCP_AF42), IsOk());
1260*6777b538SAndroid Build Coastguard Worker
1261*6777b538SAndroid Build Coastguard Worker // Called from DscpManager destructor.
1262*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, CloseHandle(kFakeHandle1));
1263*6777b538SAndroid Build Coastguard Worker }
1264*6777b538SAndroid Build Coastguard Worker
1265*6777b538SAndroid Build Coastguard Worker // TODO(zstein): Mocking out DscpManager might be simpler here
1266*6777b538SAndroid Build Coastguard Worker // (just verify that DscpManager::Set and DscpManager::PrepareForSend are
1267*6777b538SAndroid Build Coastguard Worker // called).
TEST_F(UDPSocketTest,SendToCallsQwaveApis)1268*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, SendToCallsQwaveApis) {
1269*6777b538SAndroid Build Coastguard Worker MockQwaveApi api;
1270*6777b538SAndroid Build Coastguard Worker std::unique_ptr<UDPSocket> client = UnconnectedDscpTestClient(&api);
1271*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, qwave_supported()).WillRepeatedly(Return(true));
1272*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, CreateHandle(_, _))
1273*6777b538SAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgPointee<1>(kFakeHandle1), Return(true)));
1274*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(client->SetDiffServCodePoint(DSCP_AF41), IsOk());
1275*6777b538SAndroid Build Coastguard Worker RunUntilIdle();
1276*6777b538SAndroid Build Coastguard Worker
1277*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, AddSocketToFlow(_, _, _, _, _, _))
1278*6777b538SAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgPointee<5>(kFakeFlowId1), Return(true)));
1279*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, SetFlow(_, _, _, _, _, _, _));
1280*6777b538SAndroid Build Coastguard Worker std::string simple_message("hello world");
1281*6777b538SAndroid Build Coastguard Worker IPEndPoint server_address(IPAddress::IPv4Localhost(), 9438);
1282*6777b538SAndroid Build Coastguard Worker int rv = SendToSocket(client.get(), simple_message, server_address);
1283*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message.length(), static_cast<size_t>(rv));
1284*6777b538SAndroid Build Coastguard Worker
1285*6777b538SAndroid Build Coastguard Worker // TODO(zstein): Move to second test case (Qwave APIs called once per address)
1286*6777b538SAndroid Build Coastguard Worker rv = SendToSocket(client.get(), simple_message, server_address);
1287*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message.length(), static_cast<size_t>(rv));
1288*6777b538SAndroid Build Coastguard Worker
1289*6777b538SAndroid Build Coastguard Worker // TODO(zstein): Move to third test case (Qwave APIs called for each
1290*6777b538SAndroid Build Coastguard Worker // destination address).
1291*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, AddSocketToFlow(_, _, _, _, _, _)).WillOnce(Return(true));
1292*6777b538SAndroid Build Coastguard Worker IPEndPoint server_address2(IPAddress::IPv4Localhost(), 9439);
1293*6777b538SAndroid Build Coastguard Worker
1294*6777b538SAndroid Build Coastguard Worker rv = SendToSocket(client.get(), simple_message, server_address2);
1295*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message.length(), static_cast<size_t>(rv));
1296*6777b538SAndroid Build Coastguard Worker
1297*6777b538SAndroid Build Coastguard Worker // Called from DscpManager destructor.
1298*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, RemoveSocketFromFlow(_, _, _, _));
1299*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, CloseHandle(kFakeHandle1));
1300*6777b538SAndroid Build Coastguard Worker }
1301*6777b538SAndroid Build Coastguard Worker
TEST_F(UDPSocketTest,SendToCallsApisAfterDeferredInit)1302*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, SendToCallsApisAfterDeferredInit) {
1303*6777b538SAndroid Build Coastguard Worker MockQwaveApi api;
1304*6777b538SAndroid Build Coastguard Worker std::unique_ptr<UDPSocket> client = UnconnectedDscpTestClient(&api);
1305*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, qwave_supported()).WillRepeatedly(Return(true));
1306*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, CreateHandle(_, _))
1307*6777b538SAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgPointee<1>(kFakeHandle1), Return(true)));
1308*6777b538SAndroid Build Coastguard Worker
1309*6777b538SAndroid Build Coastguard Worker // SetDiffServCodepoint works even if qos api hasn't finished initing.
1310*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(client->SetDiffServCodePoint(DSCP_CS7), IsOk());
1311*6777b538SAndroid Build Coastguard Worker
1312*6777b538SAndroid Build Coastguard Worker std::string simple_message("hello world");
1313*6777b538SAndroid Build Coastguard Worker IPEndPoint server_address(IPAddress::IPv4Localhost(), 9438);
1314*6777b538SAndroid Build Coastguard Worker
1315*6777b538SAndroid Build Coastguard Worker // SendTo works, but doesn't yet apply TOS
1316*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, AddSocketToFlow(_, _, _, _, _, _)).Times(0);
1317*6777b538SAndroid Build Coastguard Worker int rv = SendToSocket(client.get(), simple_message, server_address);
1318*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message.length(), static_cast<size_t>(rv));
1319*6777b538SAndroid Build Coastguard Worker
1320*6777b538SAndroid Build Coastguard Worker RunUntilIdle();
1321*6777b538SAndroid Build Coastguard Worker // Now we're initialized, SendTo triggers qos calls with correct codepoint.
1322*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, AddSocketToFlow(_, _, _, QOSTrafficTypeControl, _, _))
1323*6777b538SAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgPointee<5>(kFakeFlowId1), Return(true)));
1324*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, SetFlow(_, _, _, _, _, _, _)).WillOnce(Return(true));
1325*6777b538SAndroid Build Coastguard Worker rv = SendToSocket(client.get(), simple_message, server_address);
1326*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message.length(), static_cast<size_t>(rv));
1327*6777b538SAndroid Build Coastguard Worker
1328*6777b538SAndroid Build Coastguard Worker // Called from DscpManager destructor.
1329*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, RemoveSocketFromFlow(_, _, kFakeFlowId1, _));
1330*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api, CloseHandle(kFakeHandle1));
1331*6777b538SAndroid Build Coastguard Worker }
1332*6777b538SAndroid Build Coastguard Worker
1333*6777b538SAndroid Build Coastguard Worker class DscpManagerTest : public TestWithTaskEnvironment {
1334*6777b538SAndroid Build Coastguard Worker protected:
DscpManagerTest()1335*6777b538SAndroid Build Coastguard Worker DscpManagerTest() {
1336*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, qwave_supported()).WillRepeatedly(Return(true));
1337*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, CreateHandle(_, _))
1338*6777b538SAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgPointee<1>(kFakeHandle1), Return(true)));
1339*6777b538SAndroid Build Coastguard Worker dscp_manager_ = std::make_unique<DscpManager>(&api_, INVALID_SOCKET);
1340*6777b538SAndroid Build Coastguard Worker
1341*6777b538SAndroid Build Coastguard Worker CreateUDPAddress("1.2.3.4", 9001, &address1_);
1342*6777b538SAndroid Build Coastguard Worker CreateUDPAddress("1234:5678:90ab:cdef:1234:5678:90ab:cdef", 9002,
1343*6777b538SAndroid Build Coastguard Worker &address2_);
1344*6777b538SAndroid Build Coastguard Worker }
1345*6777b538SAndroid Build Coastguard Worker
1346*6777b538SAndroid Build Coastguard Worker MockQwaveApi api_;
1347*6777b538SAndroid Build Coastguard Worker std::unique_ptr<DscpManager> dscp_manager_;
1348*6777b538SAndroid Build Coastguard Worker
1349*6777b538SAndroid Build Coastguard Worker IPEndPoint address1_;
1350*6777b538SAndroid Build Coastguard Worker IPEndPoint address2_;
1351*6777b538SAndroid Build Coastguard Worker };
1352*6777b538SAndroid Build Coastguard Worker
TEST_F(DscpManagerTest,PrepareForSendIsNoopIfNoSet)1353*6777b538SAndroid Build Coastguard Worker TEST_F(DscpManagerTest, PrepareForSendIsNoopIfNoSet) {
1354*6777b538SAndroid Build Coastguard Worker RunUntilIdle();
1355*6777b538SAndroid Build Coastguard Worker dscp_manager_->PrepareForSend(address1_);
1356*6777b538SAndroid Build Coastguard Worker }
1357*6777b538SAndroid Build Coastguard Worker
TEST_F(DscpManagerTest,PrepareForSendCallsQwaveApisAfterSet)1358*6777b538SAndroid Build Coastguard Worker TEST_F(DscpManagerTest, PrepareForSendCallsQwaveApisAfterSet) {
1359*6777b538SAndroid Build Coastguard Worker RunUntilIdle();
1360*6777b538SAndroid Build Coastguard Worker dscp_manager_->Set(DSCP_CS2);
1361*6777b538SAndroid Build Coastguard Worker
1362*6777b538SAndroid Build Coastguard Worker // AddSocketToFlow should be called for each address.
1363*6777b538SAndroid Build Coastguard Worker // SetFlow should only be called when the flow is first created.
1364*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, AddSocketToFlow(_, _, _, _, _, _))
1365*6777b538SAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgPointee<5>(kFakeFlowId1), Return(true)));
1366*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, SetFlow(_, kFakeFlowId1, _, _, _, _, _));
1367*6777b538SAndroid Build Coastguard Worker dscp_manager_->PrepareForSend(address1_);
1368*6777b538SAndroid Build Coastguard Worker
1369*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, AddSocketToFlow(_, _, _, _, _, _))
1370*6777b538SAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgPointee<5>(kFakeFlowId1), Return(true)));
1371*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, SetFlow(_, _, _, _, _, _, _)).Times(0);
1372*6777b538SAndroid Build Coastguard Worker dscp_manager_->PrepareForSend(address2_);
1373*6777b538SAndroid Build Coastguard Worker
1374*6777b538SAndroid Build Coastguard Worker // Called from DscpManager destructor.
1375*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, RemoveSocketFromFlow(_, _, kFakeFlowId1, _));
1376*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, CloseHandle(kFakeHandle1));
1377*6777b538SAndroid Build Coastguard Worker }
1378*6777b538SAndroid Build Coastguard Worker
TEST_F(DscpManagerTest,PrepareForSendCallsQwaveApisOncePerAddress)1379*6777b538SAndroid Build Coastguard Worker TEST_F(DscpManagerTest, PrepareForSendCallsQwaveApisOncePerAddress) {
1380*6777b538SAndroid Build Coastguard Worker RunUntilIdle();
1381*6777b538SAndroid Build Coastguard Worker dscp_manager_->Set(DSCP_CS2);
1382*6777b538SAndroid Build Coastguard Worker
1383*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, AddSocketToFlow(_, _, _, _, _, _))
1384*6777b538SAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgPointee<5>(kFakeFlowId1), Return(true)));
1385*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, SetFlow(_, kFakeFlowId1, _, _, _, _, _));
1386*6777b538SAndroid Build Coastguard Worker dscp_manager_->PrepareForSend(address1_);
1387*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, AddSocketToFlow(_, _, _, _, _, _)).Times(0);
1388*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, SetFlow(_, _, _, _, _, _, _)).Times(0);
1389*6777b538SAndroid Build Coastguard Worker dscp_manager_->PrepareForSend(address1_);
1390*6777b538SAndroid Build Coastguard Worker
1391*6777b538SAndroid Build Coastguard Worker // Called from DscpManager destructor.
1392*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, RemoveSocketFromFlow(_, _, kFakeFlowId1, _));
1393*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, CloseHandle(kFakeHandle1));
1394*6777b538SAndroid Build Coastguard Worker }
1395*6777b538SAndroid Build Coastguard Worker
TEST_F(DscpManagerTest,SetDestroysExistingFlow)1396*6777b538SAndroid Build Coastguard Worker TEST_F(DscpManagerTest, SetDestroysExistingFlow) {
1397*6777b538SAndroid Build Coastguard Worker RunUntilIdle();
1398*6777b538SAndroid Build Coastguard Worker dscp_manager_->Set(DSCP_CS2);
1399*6777b538SAndroid Build Coastguard Worker
1400*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, AddSocketToFlow(_, _, _, _, _, _))
1401*6777b538SAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgPointee<5>(kFakeFlowId1), Return(true)));
1402*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, SetFlow(_, kFakeFlowId1, _, _, _, _, _));
1403*6777b538SAndroid Build Coastguard Worker dscp_manager_->PrepareForSend(address1_);
1404*6777b538SAndroid Build Coastguard Worker
1405*6777b538SAndroid Build Coastguard Worker // Calling Set should destroy the existing flow.
1406*6777b538SAndroid Build Coastguard Worker // TODO(zstein): Verify that RemoveSocketFromFlow with no address
1407*6777b538SAndroid Build Coastguard Worker // destroys the flow for all destinations.
1408*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, RemoveSocketFromFlow(_, NULL, kFakeFlowId1, _));
1409*6777b538SAndroid Build Coastguard Worker dscp_manager_->Set(DSCP_CS5);
1410*6777b538SAndroid Build Coastguard Worker
1411*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, AddSocketToFlow(_, _, _, _, _, _))
1412*6777b538SAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgPointee<5>(kFakeFlowId2), Return(true)));
1413*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, SetFlow(_, kFakeFlowId2, _, _, _, _, _));
1414*6777b538SAndroid Build Coastguard Worker dscp_manager_->PrepareForSend(address1_);
1415*6777b538SAndroid Build Coastguard Worker
1416*6777b538SAndroid Build Coastguard Worker // Called from DscpManager destructor.
1417*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, RemoveSocketFromFlow(_, _, kFakeFlowId2, _));
1418*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, CloseHandle(kFakeHandle1));
1419*6777b538SAndroid Build Coastguard Worker }
1420*6777b538SAndroid Build Coastguard Worker
TEST_F(DscpManagerTest,SocketReAddedOnRecreateHandle)1421*6777b538SAndroid Build Coastguard Worker TEST_F(DscpManagerTest, SocketReAddedOnRecreateHandle) {
1422*6777b538SAndroid Build Coastguard Worker RunUntilIdle();
1423*6777b538SAndroid Build Coastguard Worker dscp_manager_->Set(DSCP_CS2);
1424*6777b538SAndroid Build Coastguard Worker
1425*6777b538SAndroid Build Coastguard Worker // First Set and Send work fine.
1426*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, AddSocketToFlow(_, _, _, _, _, _))
1427*6777b538SAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgPointee<5>(kFakeFlowId1), Return(true)));
1428*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, SetFlow(_, kFakeFlowId1, _, _, _, _, _))
1429*6777b538SAndroid Build Coastguard Worker .WillOnce(Return(true));
1430*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(dscp_manager_->PrepareForSend(address1_), IsOk());
1431*6777b538SAndroid Build Coastguard Worker
1432*6777b538SAndroid Build Coastguard Worker // Make Second flow operation fail (requires resetting the codepoint).
1433*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, RemoveSocketFromFlow(_, _, kFakeFlowId1, _))
1434*6777b538SAndroid Build Coastguard Worker .WillOnce(Return(true));
1435*6777b538SAndroid Build Coastguard Worker dscp_manager_->Set(DSCP_CS7);
1436*6777b538SAndroid Build Coastguard Worker
1437*6777b538SAndroid Build Coastguard Worker auto error = std::make_unique<base::ScopedClearLastError>();
1438*6777b538SAndroid Build Coastguard Worker ::SetLastError(ERROR_DEVICE_REINITIALIZATION_NEEDED);
1439*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, AddSocketToFlow(_, _, _, _, _, _)).WillOnce(Return(false));
1440*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, SetFlow(_, _, _, _, _, _, _)).Times(0);
1441*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, CloseHandle(kFakeHandle1));
1442*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, CreateHandle(_, _))
1443*6777b538SAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgPointee<1>(kFakeHandle2), Return(true)));
1444*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(ERR_INVALID_HANDLE, dscp_manager_->PrepareForSend(address1_));
1445*6777b538SAndroid Build Coastguard Worker error = nullptr;
1446*6777b538SAndroid Build Coastguard Worker RunUntilIdle();
1447*6777b538SAndroid Build Coastguard Worker
1448*6777b538SAndroid Build Coastguard Worker // Next Send should work fine, without requiring another Set
1449*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, AddSocketToFlow(_, _, _, QOSTrafficTypeControl, _, _))
1450*6777b538SAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgPointee<5>(kFakeFlowId2), Return(true)));
1451*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, SetFlow(_, kFakeFlowId2, _, _, _, _, _))
1452*6777b538SAndroid Build Coastguard Worker .WillOnce(Return(true));
1453*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(dscp_manager_->PrepareForSend(address1_), IsOk());
1454*6777b538SAndroid Build Coastguard Worker
1455*6777b538SAndroid Build Coastguard Worker // Called from DscpManager destructor.
1456*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, RemoveSocketFromFlow(_, _, kFakeFlowId2, _));
1457*6777b538SAndroid Build Coastguard Worker EXPECT_CALL(api_, CloseHandle(kFakeHandle2));
1458*6777b538SAndroid Build Coastguard Worker }
1459*6777b538SAndroid Build Coastguard Worker
1460*6777b538SAndroid Build Coastguard Worker #endif
1461*6777b538SAndroid Build Coastguard Worker
TEST_F(UDPSocketTest,ReadWithSocketOptimization)1462*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, ReadWithSocketOptimization) {
1463*6777b538SAndroid Build Coastguard Worker std::string simple_message("hello world!");
1464*6777b538SAndroid Build Coastguard Worker
1465*6777b538SAndroid Build Coastguard Worker // Setup the server to listen.
1466*6777b538SAndroid Build Coastguard Worker IPEndPoint server_address(IPAddress::IPv4Localhost(), 0 /* port */);
1467*6777b538SAndroid Build Coastguard Worker UDPServerSocket server(nullptr, NetLogSource());
1468*6777b538SAndroid Build Coastguard Worker server.AllowAddressReuse();
1469*6777b538SAndroid Build Coastguard Worker ASSERT_THAT(server.Listen(server_address), IsOk());
1470*6777b538SAndroid Build Coastguard Worker // Get bound port.
1471*6777b538SAndroid Build Coastguard Worker ASSERT_THAT(server.GetLocalAddress(&server_address), IsOk());
1472*6777b538SAndroid Build Coastguard Worker
1473*6777b538SAndroid Build Coastguard Worker // Setup the client, enable experimental optimization and connected to the
1474*6777b538SAndroid Build Coastguard Worker // server.
1475*6777b538SAndroid Build Coastguard Worker UDPClientSocket client(DatagramSocket::DEFAULT_BIND, nullptr, NetLogSource());
1476*6777b538SAndroid Build Coastguard Worker client.EnableRecvOptimization();
1477*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(client.Connect(server_address), IsOk());
1478*6777b538SAndroid Build Coastguard Worker
1479*6777b538SAndroid Build Coastguard Worker // Get the client's address.
1480*6777b538SAndroid Build Coastguard Worker IPEndPoint client_address;
1481*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(client.GetLocalAddress(&client_address), IsOk());
1482*6777b538SAndroid Build Coastguard Worker
1483*6777b538SAndroid Build Coastguard Worker // Server sends the message to the client.
1484*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message.length(),
1485*6777b538SAndroid Build Coastguard Worker static_cast<size_t>(
1486*6777b538SAndroid Build Coastguard Worker SendToSocket(&server, simple_message, client_address)));
1487*6777b538SAndroid Build Coastguard Worker
1488*6777b538SAndroid Build Coastguard Worker // Client receives the message.
1489*6777b538SAndroid Build Coastguard Worker std::string str = ReadSocket(&client);
1490*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message, str);
1491*6777b538SAndroid Build Coastguard Worker
1492*6777b538SAndroid Build Coastguard Worker server.Close();
1493*6777b538SAndroid Build Coastguard Worker client.Close();
1494*6777b538SAndroid Build Coastguard Worker }
1495*6777b538SAndroid Build Coastguard Worker
1496*6777b538SAndroid Build Coastguard Worker // Tests that read from a socket correctly returns
1497*6777b538SAndroid Build Coastguard Worker // |ERR_MSG_TOO_BIG| when the buffer is too small and
1498*6777b538SAndroid Build Coastguard Worker // returns the actual message when it fits the buffer.
1499*6777b538SAndroid Build Coastguard Worker // For the optimized path, the buffer size should be at least
1500*6777b538SAndroid Build Coastguard Worker // 1 byte greater than the message.
TEST_F(UDPSocketTest,ReadWithSocketOptimizationTruncation)1501*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, ReadWithSocketOptimizationTruncation) {
1502*6777b538SAndroid Build Coastguard Worker std::string too_long_message(kMaxRead + 1, 'A');
1503*6777b538SAndroid Build Coastguard Worker std::string right_length_message(kMaxRead - 1, 'B');
1504*6777b538SAndroid Build Coastguard Worker std::string exact_length_message(kMaxRead, 'C');
1505*6777b538SAndroid Build Coastguard Worker
1506*6777b538SAndroid Build Coastguard Worker // Setup the server to listen.
1507*6777b538SAndroid Build Coastguard Worker IPEndPoint server_address(IPAddress::IPv4Localhost(), 0 /* port */);
1508*6777b538SAndroid Build Coastguard Worker UDPServerSocket server(nullptr, NetLogSource());
1509*6777b538SAndroid Build Coastguard Worker server.AllowAddressReuse();
1510*6777b538SAndroid Build Coastguard Worker ASSERT_THAT(server.Listen(server_address), IsOk());
1511*6777b538SAndroid Build Coastguard Worker // Get bound port.
1512*6777b538SAndroid Build Coastguard Worker ASSERT_THAT(server.GetLocalAddress(&server_address), IsOk());
1513*6777b538SAndroid Build Coastguard Worker
1514*6777b538SAndroid Build Coastguard Worker // Setup the client, enable experimental optimization and connected to the
1515*6777b538SAndroid Build Coastguard Worker // server.
1516*6777b538SAndroid Build Coastguard Worker UDPClientSocket client(DatagramSocket::DEFAULT_BIND, nullptr, NetLogSource());
1517*6777b538SAndroid Build Coastguard Worker client.EnableRecvOptimization();
1518*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(client.Connect(server_address), IsOk());
1519*6777b538SAndroid Build Coastguard Worker
1520*6777b538SAndroid Build Coastguard Worker // Get the client's address.
1521*6777b538SAndroid Build Coastguard Worker IPEndPoint client_address;
1522*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(client.GetLocalAddress(&client_address), IsOk());
1523*6777b538SAndroid Build Coastguard Worker
1524*6777b538SAndroid Build Coastguard Worker // Send messages to the client.
1525*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(too_long_message.length(),
1526*6777b538SAndroid Build Coastguard Worker static_cast<size_t>(
1527*6777b538SAndroid Build Coastguard Worker SendToSocket(&server, too_long_message, client_address)));
1528*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(right_length_message.length(),
1529*6777b538SAndroid Build Coastguard Worker static_cast<size_t>(
1530*6777b538SAndroid Build Coastguard Worker SendToSocket(&server, right_length_message, client_address)));
1531*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(exact_length_message.length(),
1532*6777b538SAndroid Build Coastguard Worker static_cast<size_t>(
1533*6777b538SAndroid Build Coastguard Worker SendToSocket(&server, exact_length_message, client_address)));
1534*6777b538SAndroid Build Coastguard Worker
1535*6777b538SAndroid Build Coastguard Worker // Client receives the messages.
1536*6777b538SAndroid Build Coastguard Worker
1537*6777b538SAndroid Build Coastguard Worker // 1. The first message is |too_long_message|. Its size exceeds the buffer.
1538*6777b538SAndroid Build Coastguard Worker // In that case, the client is expected to get |ERR_MSG_TOO_BIG| when the
1539*6777b538SAndroid Build Coastguard Worker // data is read.
1540*6777b538SAndroid Build Coastguard Worker TestCompletionCallback callback;
1541*6777b538SAndroid Build Coastguard Worker int rv = client.Read(buffer_.get(), kMaxRead, callback.callback());
1542*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(ERR_MSG_TOO_BIG, callback.GetResult(rv));
1543*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(client.GetLastTos().dscp, DSCP_DEFAULT);
1544*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(client.GetLastTos().ecn, ECN_DEFAULT);
1545*6777b538SAndroid Build Coastguard Worker
1546*6777b538SAndroid Build Coastguard Worker // 2. The second message is |right_length_message|. Its size is
1547*6777b538SAndroid Build Coastguard Worker // one byte smaller than the size of the buffer. In that case, the client
1548*6777b538SAndroid Build Coastguard Worker // is expected to read the whole message successfully.
1549*6777b538SAndroid Build Coastguard Worker rv = client.Read(buffer_.get(), kMaxRead, callback.callback());
1550*6777b538SAndroid Build Coastguard Worker rv = callback.GetResult(rv);
1551*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(static_cast<int>(right_length_message.length()), rv);
1552*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(right_length_message, std::string(buffer_->data(), rv));
1553*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(client.GetLastTos().dscp, DSCP_DEFAULT);
1554*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(client.GetLastTos().ecn, ECN_DEFAULT);
1555*6777b538SAndroid Build Coastguard Worker
1556*6777b538SAndroid Build Coastguard Worker // 3. The third message is |exact_length_message|. Its size is equal to
1557*6777b538SAndroid Build Coastguard Worker // the read buffer size. In that case, the client expects to get
1558*6777b538SAndroid Build Coastguard Worker // |ERR_MSG_TOO_BIG| when the socket is read. Internally, the optimized
1559*6777b538SAndroid Build Coastguard Worker // path uses read() system call that requires one extra byte to detect
1560*6777b538SAndroid Build Coastguard Worker // truncated messages; therefore, messages that fill the buffer exactly
1561*6777b538SAndroid Build Coastguard Worker // are considered truncated.
1562*6777b538SAndroid Build Coastguard Worker // The optimization is only enabled on POSIX platforms. On Windows,
1563*6777b538SAndroid Build Coastguard Worker // the optimization is turned off; therefore, the client
1564*6777b538SAndroid Build Coastguard Worker // should be able to read the whole message without encountering
1565*6777b538SAndroid Build Coastguard Worker // |ERR_MSG_TOO_BIG|.
1566*6777b538SAndroid Build Coastguard Worker rv = client.Read(buffer_.get(), kMaxRead, callback.callback());
1567*6777b538SAndroid Build Coastguard Worker rv = callback.GetResult(rv);
1568*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(client.GetLastTos().dscp, DSCP_DEFAULT);
1569*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(client.GetLastTos().ecn, ECN_DEFAULT);
1570*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_POSIX)
1571*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(ERR_MSG_TOO_BIG, rv);
1572*6777b538SAndroid Build Coastguard Worker #else
1573*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(static_cast<int>(exact_length_message.length()), rv);
1574*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(exact_length_message, std::string(buffer_->data(), rv));
1575*6777b538SAndroid Build Coastguard Worker #endif
1576*6777b538SAndroid Build Coastguard Worker server.Close();
1577*6777b538SAndroid Build Coastguard Worker client.Close();
1578*6777b538SAndroid Build Coastguard Worker }
1579*6777b538SAndroid Build Coastguard Worker
1580*6777b538SAndroid Build Coastguard Worker // On Android, where socket tagging is supported, verify that UDPSocket::Tag
1581*6777b538SAndroid Build Coastguard Worker // works as expected.
1582*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
TEST_F(UDPSocketTest,Tag)1583*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, Tag) {
1584*6777b538SAndroid Build Coastguard Worker if (!CanGetTaggedBytes()) {
1585*6777b538SAndroid Build Coastguard Worker DVLOG(0) << "Skipping test - GetTaggedBytes unsupported.";
1586*6777b538SAndroid Build Coastguard Worker return;
1587*6777b538SAndroid Build Coastguard Worker }
1588*6777b538SAndroid Build Coastguard Worker
1589*6777b538SAndroid Build Coastguard Worker UDPServerSocket server(nullptr, NetLogSource());
1590*6777b538SAndroid Build Coastguard Worker ASSERT_THAT(server.Listen(IPEndPoint(IPAddress::IPv4Localhost(), 0)), IsOk());
1591*6777b538SAndroid Build Coastguard Worker IPEndPoint server_address;
1592*6777b538SAndroid Build Coastguard Worker ASSERT_THAT(server.GetLocalAddress(&server_address), IsOk());
1593*6777b538SAndroid Build Coastguard Worker
1594*6777b538SAndroid Build Coastguard Worker UDPClientSocket client(DatagramSocket::DEFAULT_BIND, nullptr, NetLogSource());
1595*6777b538SAndroid Build Coastguard Worker ASSERT_THAT(client.Connect(server_address), IsOk());
1596*6777b538SAndroid Build Coastguard Worker
1597*6777b538SAndroid Build Coastguard Worker // Verify UDP packets are tagged and counted properly.
1598*6777b538SAndroid Build Coastguard Worker int32_t tag_val1 = 0x12345678;
1599*6777b538SAndroid Build Coastguard Worker uint64_t old_traffic = GetTaggedBytes(tag_val1);
1600*6777b538SAndroid Build Coastguard Worker SocketTag tag1(SocketTag::UNSET_UID, tag_val1);
1601*6777b538SAndroid Build Coastguard Worker client.ApplySocketTag(tag1);
1602*6777b538SAndroid Build Coastguard Worker // Client sends to the server.
1603*6777b538SAndroid Build Coastguard Worker std::string simple_message("hello world!");
1604*6777b538SAndroid Build Coastguard Worker int rv = WriteSocket(&client, simple_message);
1605*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message.length(), static_cast<size_t>(rv));
1606*6777b538SAndroid Build Coastguard Worker // Server waits for message.
1607*6777b538SAndroid Build Coastguard Worker std::string str = RecvFromSocket(&server);
1608*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message, str);
1609*6777b538SAndroid Build Coastguard Worker // Server echoes reply.
1610*6777b538SAndroid Build Coastguard Worker rv = SendToSocket(&server, simple_message);
1611*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message.length(), static_cast<size_t>(rv));
1612*6777b538SAndroid Build Coastguard Worker // Client waits for response.
1613*6777b538SAndroid Build Coastguard Worker str = ReadSocket(&client);
1614*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message, str);
1615*6777b538SAndroid Build Coastguard Worker EXPECT_GT(GetTaggedBytes(tag_val1), old_traffic);
1616*6777b538SAndroid Build Coastguard Worker
1617*6777b538SAndroid Build Coastguard Worker // Verify socket can be retagged with a new value and the current process's
1618*6777b538SAndroid Build Coastguard Worker // UID.
1619*6777b538SAndroid Build Coastguard Worker int32_t tag_val2 = 0x87654321;
1620*6777b538SAndroid Build Coastguard Worker old_traffic = GetTaggedBytes(tag_val2);
1621*6777b538SAndroid Build Coastguard Worker SocketTag tag2(getuid(), tag_val2);
1622*6777b538SAndroid Build Coastguard Worker client.ApplySocketTag(tag2);
1623*6777b538SAndroid Build Coastguard Worker // Client sends to the server.
1624*6777b538SAndroid Build Coastguard Worker rv = WriteSocket(&client, simple_message);
1625*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message.length(), static_cast<size_t>(rv));
1626*6777b538SAndroid Build Coastguard Worker // Server waits for message.
1627*6777b538SAndroid Build Coastguard Worker str = RecvFromSocket(&server);
1628*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message, str);
1629*6777b538SAndroid Build Coastguard Worker // Server echoes reply.
1630*6777b538SAndroid Build Coastguard Worker rv = SendToSocket(&server, simple_message);
1631*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message.length(), static_cast<size_t>(rv));
1632*6777b538SAndroid Build Coastguard Worker // Client waits for response.
1633*6777b538SAndroid Build Coastguard Worker str = ReadSocket(&client);
1634*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message, str);
1635*6777b538SAndroid Build Coastguard Worker EXPECT_GT(GetTaggedBytes(tag_val2), old_traffic);
1636*6777b538SAndroid Build Coastguard Worker
1637*6777b538SAndroid Build Coastguard Worker // Verify socket can be retagged with a new value and the current process's
1638*6777b538SAndroid Build Coastguard Worker // UID.
1639*6777b538SAndroid Build Coastguard Worker old_traffic = GetTaggedBytes(tag_val1);
1640*6777b538SAndroid Build Coastguard Worker client.ApplySocketTag(tag1);
1641*6777b538SAndroid Build Coastguard Worker // Client sends to the server.
1642*6777b538SAndroid Build Coastguard Worker rv = WriteSocket(&client, simple_message);
1643*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message.length(), static_cast<size_t>(rv));
1644*6777b538SAndroid Build Coastguard Worker // Server waits for message.
1645*6777b538SAndroid Build Coastguard Worker str = RecvFromSocket(&server);
1646*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message, str);
1647*6777b538SAndroid Build Coastguard Worker // Server echoes reply.
1648*6777b538SAndroid Build Coastguard Worker rv = SendToSocket(&server, simple_message);
1649*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message.length(), static_cast<size_t>(rv));
1650*6777b538SAndroid Build Coastguard Worker // Client waits for response.
1651*6777b538SAndroid Build Coastguard Worker str = ReadSocket(&client);
1652*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(simple_message, str);
1653*6777b538SAndroid Build Coastguard Worker EXPECT_GT(GetTaggedBytes(tag_val1), old_traffic);
1654*6777b538SAndroid Build Coastguard Worker }
1655*6777b538SAndroid Build Coastguard Worker
TEST_F(UDPSocketTest,BindToNetwork)1656*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, BindToNetwork) {
1657*6777b538SAndroid Build Coastguard Worker // The specific value of this address doesn't really matter, and no
1658*6777b538SAndroid Build Coastguard Worker // server needs to be running here. The test only needs to call
1659*6777b538SAndroid Build Coastguard Worker // Connect() and won't send any datagrams.
1660*6777b538SAndroid Build Coastguard Worker const IPEndPoint fake_server_address(IPAddress::IPv4Localhost(), 8080);
1661*6777b538SAndroid Build Coastguard Worker NetworkChangeNotifierFactoryAndroid ncn_factory;
1662*6777b538SAndroid Build Coastguard Worker NetworkChangeNotifier::DisableForTest ncn_disable_for_test;
1663*6777b538SAndroid Build Coastguard Worker std::unique_ptr<NetworkChangeNotifier> ncn(ncn_factory.CreateInstance());
1664*6777b538SAndroid Build Coastguard Worker if (!NetworkChangeNotifier::AreNetworkHandlesSupported())
1665*6777b538SAndroid Build Coastguard Worker GTEST_SKIP() << "Network handles are required to test BindToNetwork.";
1666*6777b538SAndroid Build Coastguard Worker
1667*6777b538SAndroid Build Coastguard Worker // Binding the socket to a not existing network should fail at connect time.
1668*6777b538SAndroid Build Coastguard Worker const handles::NetworkHandle wrong_network_handle = 65536;
1669*6777b538SAndroid Build Coastguard Worker UDPClientSocket wrong_socket(DatagramSocket::RANDOM_BIND, nullptr,
1670*6777b538SAndroid Build Coastguard Worker NetLogSource(), wrong_network_handle);
1671*6777b538SAndroid Build Coastguard Worker // Different Android versions might report different errors. Hence, just check
1672*6777b538SAndroid Build Coastguard Worker // what shouldn't happen.
1673*6777b538SAndroid Build Coastguard Worker int rv = wrong_socket.Connect(fake_server_address);
1674*6777b538SAndroid Build Coastguard Worker EXPECT_NE(OK, rv);
1675*6777b538SAndroid Build Coastguard Worker EXPECT_NE(ERR_NOT_IMPLEMENTED, rv);
1676*6777b538SAndroid Build Coastguard Worker EXPECT_NE(wrong_network_handle, wrong_socket.GetBoundNetwork());
1677*6777b538SAndroid Build Coastguard Worker
1678*6777b538SAndroid Build Coastguard Worker // Binding the socket to an existing network should succeed.
1679*6777b538SAndroid Build Coastguard Worker const handles::NetworkHandle network_handle =
1680*6777b538SAndroid Build Coastguard Worker NetworkChangeNotifier::GetDefaultNetwork();
1681*6777b538SAndroid Build Coastguard Worker if (network_handle != handles::kInvalidNetworkHandle) {
1682*6777b538SAndroid Build Coastguard Worker UDPClientSocket correct_socket(DatagramSocket::RANDOM_BIND, nullptr,
1683*6777b538SAndroid Build Coastguard Worker NetLogSource(), network_handle);
1684*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(OK, correct_socket.Connect(fake_server_address));
1685*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(network_handle, correct_socket.GetBoundNetwork());
1686*6777b538SAndroid Build Coastguard Worker }
1687*6777b538SAndroid Build Coastguard Worker }
1688*6777b538SAndroid Build Coastguard Worker
1689*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_ANDROID)
1690*6777b538SAndroid Build Coastguard Worker
1691*6777b538SAndroid Build Coastguard Worker // Scoped helper to override the process-wide UDP socket limit.
1692*6777b538SAndroid Build Coastguard Worker class OverrideUDPSocketLimit {
1693*6777b538SAndroid Build Coastguard Worker public:
OverrideUDPSocketLimit(int new_limit)1694*6777b538SAndroid Build Coastguard Worker explicit OverrideUDPSocketLimit(int new_limit) {
1695*6777b538SAndroid Build Coastguard Worker base::FieldTrialParams params;
1696*6777b538SAndroid Build Coastguard Worker params[features::kLimitOpenUDPSocketsMax.name] =
1697*6777b538SAndroid Build Coastguard Worker base::NumberToString(new_limit);
1698*6777b538SAndroid Build Coastguard Worker
1699*6777b538SAndroid Build Coastguard Worker scoped_feature_list_.InitAndEnableFeatureWithParameters(
1700*6777b538SAndroid Build Coastguard Worker features::kLimitOpenUDPSockets, params);
1701*6777b538SAndroid Build Coastguard Worker }
1702*6777b538SAndroid Build Coastguard Worker
1703*6777b538SAndroid Build Coastguard Worker private:
1704*6777b538SAndroid Build Coastguard Worker base::test::ScopedFeatureList scoped_feature_list_;
1705*6777b538SAndroid Build Coastguard Worker };
1706*6777b538SAndroid Build Coastguard Worker
1707*6777b538SAndroid Build Coastguard Worker // Tests that UDPClientSocket respects the global UDP socket limits.
TEST_F(UDPSocketTest,LimitClientSocket)1708*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, LimitClientSocket) {
1709*6777b538SAndroid Build Coastguard Worker // Reduce the global UDP limit to 2.
1710*6777b538SAndroid Build Coastguard Worker OverrideUDPSocketLimit set_limit(2);
1711*6777b538SAndroid Build Coastguard Worker
1712*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, GetGlobalUDPSocketCountForTesting());
1713*6777b538SAndroid Build Coastguard Worker
1714*6777b538SAndroid Build Coastguard Worker auto socket1 = std::make_unique<UDPClientSocket>(DatagramSocket::DEFAULT_BIND,
1715*6777b538SAndroid Build Coastguard Worker nullptr, NetLogSource());
1716*6777b538SAndroid Build Coastguard Worker auto socket2 = std::make_unique<UDPClientSocket>(DatagramSocket::DEFAULT_BIND,
1717*6777b538SAndroid Build Coastguard Worker nullptr, NetLogSource());
1718*6777b538SAndroid Build Coastguard Worker
1719*6777b538SAndroid Build Coastguard Worker // Simply constructing a UDPClientSocket does not increase the limit (no
1720*6777b538SAndroid Build Coastguard Worker // Connect() or Bind() has been called yet).
1721*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, GetGlobalUDPSocketCountForTesting());
1722*6777b538SAndroid Build Coastguard Worker
1723*6777b538SAndroid Build Coastguard Worker // The specific value of this address doesn't really matter, and no server
1724*6777b538SAndroid Build Coastguard Worker // needs to be running here. The test only needs to call Connect() and won't
1725*6777b538SAndroid Build Coastguard Worker // send any datagrams.
1726*6777b538SAndroid Build Coastguard Worker IPEndPoint server_address(IPAddress::IPv4Localhost(), 8080);
1727*6777b538SAndroid Build Coastguard Worker
1728*6777b538SAndroid Build Coastguard Worker // Successful Connect() on socket1 increases socket count.
1729*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(socket1->Connect(server_address), IsOk());
1730*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, GetGlobalUDPSocketCountForTesting());
1731*6777b538SAndroid Build Coastguard Worker
1732*6777b538SAndroid Build Coastguard Worker // Successful Connect() on socket2 increases socket count.
1733*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(socket2->Connect(server_address), IsOk());
1734*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, GetGlobalUDPSocketCountForTesting());
1735*6777b538SAndroid Build Coastguard Worker
1736*6777b538SAndroid Build Coastguard Worker // Attempting a third Connect() should fail with ERR_INSUFFICIENT_RESOURCES,
1737*6777b538SAndroid Build Coastguard Worker // as the limit is currently 2.
1738*6777b538SAndroid Build Coastguard Worker auto socket3 = std::make_unique<UDPClientSocket>(DatagramSocket::DEFAULT_BIND,
1739*6777b538SAndroid Build Coastguard Worker nullptr, NetLogSource());
1740*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(socket3->Connect(server_address),
1741*6777b538SAndroid Build Coastguard Worker IsError(ERR_INSUFFICIENT_RESOURCES));
1742*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, GetGlobalUDPSocketCountForTesting());
1743*6777b538SAndroid Build Coastguard Worker
1744*6777b538SAndroid Build Coastguard Worker // Check that explicitly closing socket2 free up a count.
1745*6777b538SAndroid Build Coastguard Worker socket2->Close();
1746*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, GetGlobalUDPSocketCountForTesting());
1747*6777b538SAndroid Build Coastguard Worker
1748*6777b538SAndroid Build Coastguard Worker // Since the socket was already closed, deleting it will not affect the count.
1749*6777b538SAndroid Build Coastguard Worker socket2.reset();
1750*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, GetGlobalUDPSocketCountForTesting());
1751*6777b538SAndroid Build Coastguard Worker
1752*6777b538SAndroid Build Coastguard Worker // Now that the count is below limit, try to connect another socket. This time
1753*6777b538SAndroid Build Coastguard Worker // it will work.
1754*6777b538SAndroid Build Coastguard Worker auto socket4 = std::make_unique<UDPClientSocket>(DatagramSocket::DEFAULT_BIND,
1755*6777b538SAndroid Build Coastguard Worker nullptr, NetLogSource());
1756*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(socket4->Connect(server_address), IsOk());
1757*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, GetGlobalUDPSocketCountForTesting());
1758*6777b538SAndroid Build Coastguard Worker
1759*6777b538SAndroid Build Coastguard Worker // Verify that closing the two remaining sockets brings the open count back to
1760*6777b538SAndroid Build Coastguard Worker // 0.
1761*6777b538SAndroid Build Coastguard Worker socket1.reset();
1762*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, GetGlobalUDPSocketCountForTesting());
1763*6777b538SAndroid Build Coastguard Worker socket4.reset();
1764*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, GetGlobalUDPSocketCountForTesting());
1765*6777b538SAndroid Build Coastguard Worker }
1766*6777b538SAndroid Build Coastguard Worker
1767*6777b538SAndroid Build Coastguard Worker // Tests that UDPSocketClient updates the global counter
1768*6777b538SAndroid Build Coastguard Worker // correctly when Connect() fails.
TEST_F(UDPSocketTest,LimitConnectFail)1769*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, LimitConnectFail) {
1770*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, GetGlobalUDPSocketCountForTesting());
1771*6777b538SAndroid Build Coastguard Worker
1772*6777b538SAndroid Build Coastguard Worker {
1773*6777b538SAndroid Build Coastguard Worker // Simply allocating a UDPSocket does not increase count.
1774*6777b538SAndroid Build Coastguard Worker UDPSocket socket(DatagramSocket::DEFAULT_BIND, nullptr, NetLogSource());
1775*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, GetGlobalUDPSocketCountForTesting());
1776*6777b538SAndroid Build Coastguard Worker
1777*6777b538SAndroid Build Coastguard Worker // Calling Open() allocates the socket and increases the global counter.
1778*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(socket.Open(ADDRESS_FAMILY_IPV4), IsOk());
1779*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, GetGlobalUDPSocketCountForTesting());
1780*6777b538SAndroid Build Coastguard Worker
1781*6777b538SAndroid Build Coastguard Worker // Connect to an IPv6 address should fail since the socket was created for
1782*6777b538SAndroid Build Coastguard Worker // IPv4.
1783*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(socket.Connect(net::IPEndPoint(IPAddress::IPv6Localhost(), 53)),
1784*6777b538SAndroid Build Coastguard Worker Not(IsOk()));
1785*6777b538SAndroid Build Coastguard Worker
1786*6777b538SAndroid Build Coastguard Worker // That Connect() failed doesn't change the global counter.
1787*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, GetGlobalUDPSocketCountForTesting());
1788*6777b538SAndroid Build Coastguard Worker }
1789*6777b538SAndroid Build Coastguard Worker
1790*6777b538SAndroid Build Coastguard Worker // Finally, destroying UDPSocket decrements the global counter.
1791*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, GetGlobalUDPSocketCountForTesting());
1792*6777b538SAndroid Build Coastguard Worker }
1793*6777b538SAndroid Build Coastguard Worker
1794*6777b538SAndroid Build Coastguard Worker // Tests allocating UDPClientSockets and Connect()ing them in parallel.
1795*6777b538SAndroid Build Coastguard Worker //
1796*6777b538SAndroid Build Coastguard Worker // This is primarily intended for coverage under TSAN, to check for races
1797*6777b538SAndroid Build Coastguard Worker // enforcing the global socket counter.
TEST_F(UDPSocketTest,LimitConnectMultithreaded)1798*6777b538SAndroid Build Coastguard Worker TEST_F(UDPSocketTest, LimitConnectMultithreaded) {
1799*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, GetGlobalUDPSocketCountForTesting());
1800*6777b538SAndroid Build Coastguard Worker
1801*6777b538SAndroid Build Coastguard Worker // Start up some threads.
1802*6777b538SAndroid Build Coastguard Worker std::vector<std::unique_ptr<base::Thread>> threads;
1803*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < 5; ++i) {
1804*6777b538SAndroid Build Coastguard Worker threads.push_back(std::make_unique<base::Thread>("Worker thread"));
1805*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(threads.back()->Start());
1806*6777b538SAndroid Build Coastguard Worker }
1807*6777b538SAndroid Build Coastguard Worker
1808*6777b538SAndroid Build Coastguard Worker // Post tasks to each of the threads.
1809*6777b538SAndroid Build Coastguard Worker for (const auto& thread : threads) {
1810*6777b538SAndroid Build Coastguard Worker thread->task_runner()->PostTask(
1811*6777b538SAndroid Build Coastguard Worker FROM_HERE, base::BindOnce([] {
1812*6777b538SAndroid Build Coastguard Worker // The specific value of this address doesn't really matter, and no
1813*6777b538SAndroid Build Coastguard Worker // server needs to be running here. The test only needs to call
1814*6777b538SAndroid Build Coastguard Worker // Connect() and won't send any datagrams.
1815*6777b538SAndroid Build Coastguard Worker IPEndPoint server_address(IPAddress::IPv4Localhost(), 8080);
1816*6777b538SAndroid Build Coastguard Worker
1817*6777b538SAndroid Build Coastguard Worker UDPClientSocket socket(DatagramSocket::DEFAULT_BIND, nullptr,
1818*6777b538SAndroid Build Coastguard Worker NetLogSource());
1819*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(socket.Connect(server_address), IsOk());
1820*6777b538SAndroid Build Coastguard Worker }));
1821*6777b538SAndroid Build Coastguard Worker }
1822*6777b538SAndroid Build Coastguard Worker
1823*6777b538SAndroid Build Coastguard Worker // Complete all the tasks.
1824*6777b538SAndroid Build Coastguard Worker threads.clear();
1825*6777b538SAndroid Build Coastguard Worker
1826*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, GetGlobalUDPSocketCountForTesting());
1827*6777b538SAndroid Build Coastguard Worker }
1828*6777b538SAndroid Build Coastguard Worker
1829*6777b538SAndroid Build Coastguard Worker } // namespace net
1830