@@ -26,7 +26,7 @@ static const char WS_HANDSHAKE_RESPONSE[] =
26
26
{ \
27
27
Timeout timeout (&loop); \
28
28
while ((condition) && !timeout.timed_out ) { \
29
- uv_run (&loop, UV_RUN_NOWAIT); \
29
+ uv_run (&loop, UV_RUN_ONCE); \
30
30
} \
31
31
ASSERT_FALSE ((condition)); \
32
32
}
@@ -41,6 +41,7 @@ class Timeout {
41
41
explicit Timeout (uv_loop_t * loop) : timed_out(false ), done_(false ) {
42
42
uv_timer_init (loop, &timer_);
43
43
uv_timer_start (&timer_, Timeout::set_flag, 5000 , 0 );
44
+ uv_unref (reinterpret_cast <uv_handle_t *>(&timer_));
44
45
}
45
46
46
47
~Timeout () {
@@ -163,18 +164,20 @@ class SocketWrapper {
163
164
connected_(false ),
164
165
sending_(false ) { }
165
166
166
- void Connect (std::string host, int port) {
167
+ void Connect (std::string host, int port, bool v6 = false ) {
167
168
closed_ = false ;
168
169
connection_failed_ = false ;
169
170
connected_ = false ;
170
171
eof_ = false ;
171
172
contents_.clear ();
172
173
uv_tcp_init (loop_, &socket_);
173
- sockaddr_in addr;
174
- uv_ip4_addr (host.c_str (), port, &addr);
175
- int err = uv_tcp_connect (&connect_, &socket_,
176
- reinterpret_cast <const sockaddr*>(&addr),
177
- Connected_);
174
+ union {sockaddr generic; sockaddr_in v4; sockaddr_in6 v6;} addr;
175
+ if (v6) {
176
+ uv_ip6_addr (host.c_str (), port, &addr.v6 );
177
+ } else {
178
+ uv_ip4_addr (host.c_str (), port, &addr.v4 );
179
+ }
180
+ int err = uv_tcp_connect (&connect_, &socket_, &addr.generic , Connected_);
178
181
ASSERT_EQ (0 , err);
179
182
SPIN_WHILE (!connected_)
180
183
uv_read_start (reinterpret_cast <uv_stream_t *>(&socket_), AllocCallback,
@@ -306,9 +309,14 @@ class SocketWrapper {
306
309
class ServerHolder {
307
310
public:
308
311
template <typename Delegate>
309
- ServerHolder (Delegate* delegate, uv_loop_t * loop, int port, FILE* out = NULL )
312
+ ServerHolder (Delegate* delegate, uv_loop_t * loop, int port)
313
+ : ServerHolder(delegate, loop, HOST, port, NULL ) { }
314
+
315
+ template <typename Delegate>
316
+ ServerHolder (Delegate* delegate, uv_loop_t * loop, const std::string host,
317
+ int port, FILE* out)
310
318
: closed(false ), paused(false ),
311
- server_ (delegate, loop, HOST , port, out) {
319
+ server_ (delegate, loop, host , port, out) {
312
320
delegate->Connect (&server_);
313
321
}
314
322
@@ -317,7 +325,7 @@ class ServerHolder {
317
325
}
318
326
319
327
int port () {
320
- return server_.port ();
328
+ return server_.Port ();
321
329
}
322
330
323
331
static void CloseCallback (InspectorSocketServer* server) {
@@ -575,3 +583,47 @@ TEST_F(InspectorSocketServerTest, TerminatingSessionReportsDone) {
575
583
socket1.ExpectEOF ();
576
584
SPIN_WHILE (!delegate.done );
577
585
}
586
+
587
+ TEST_F (InspectorSocketServerTest, FailsToBindToNodejsHost) {
588
+ TestInspectorServerDelegate delegate;
589
+ ServerHolder server (&delegate, &loop, " nodejs.org" , 0 , nullptr );
590
+ ASSERT_FALSE (server->Start ());
591
+ SPIN_WHILE (uv_loop_alive (&loop));
592
+ }
593
+
594
+ bool has_ipv6_address () {
595
+ uv_interface_address_s* addresses = nullptr ;
596
+ int address_count = 0 ;
597
+ int err = uv_interface_addresses (&addresses, &address_count);
598
+ if (err != 0 ) {
599
+ return false ;
600
+ }
601
+ bool has_address = false ;
602
+ for (int i = 0 ; i < address_count; i++) {
603
+ if (addresses[i].address .address6 .sin6_family == AF_INET6) {
604
+ has_address = true ;
605
+ }
606
+ }
607
+ uv_free_interface_addresses (addresses, address_count);
608
+ return has_address;
609
+ }
610
+
611
+ TEST_F (InspectorSocketServerTest, BindsToIpV6) {
612
+ if (!has_ipv6_address ()) {
613
+ fprintf (stderr, " No IPv6 network detected\n " );
614
+ return ;
615
+ }
616
+ TestInspectorServerDelegate delegate;
617
+ ServerHolder server (&delegate, &loop, " ::" , 0 , NULL );
618
+ ASSERT_TRUE (server->Start ());
619
+
620
+ SocketWrapper socket1 (&loop);
621
+ socket1.Connect (" [::]" , server.port (), true );
622
+ socket1.Write (WsHandshakeRequest (MAIN_TARGET_ID));
623
+ socket1.Expect (WS_HANDSHAKE_RESPONSE);
624
+ server->Stop (ServerHolder::CloseCallback);
625
+ SPIN_WHILE (!server.closed );
626
+ ASSERT_FALSE (delegate.done );
627
+ socket1.Close ();
628
+ SPIN_WHILE (!delegate.done );
629
+ }
0 commit comments