| 
					
				 | 
			
			
				@@ -73,26 +73,35 @@ void test_connect(const char *server_host, const char *client_host, int port, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   cq_verifier *v_client; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   cq_verifier *v_server; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   gpr_timespec deadline; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  int got_port; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  gpr_join_host_port(&client_hostport, client_host, port); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   gpr_join_host_port(&server_hostport, server_host, port); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  gpr_log(GPR_INFO, "Testing with server=%s client=%s (expecting %s)", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          server_hostport, client_hostport, expect_ok ? "success" : "failure"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   /* Create server. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   server_cq = grpc_completion_queue_create(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   server = grpc_server_create(server_cq, NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  GPR_ASSERT(grpc_server_add_http2_port(server, server_hostport)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GPR_ASSERT((got_port = grpc_server_add_http2_port(server, server_hostport)) > 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (port == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    port = got_port; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    GPR_ASSERT(port == got_port); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_server_start(server); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  gpr_free(server_hostport); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   v_server = cq_verifier_create(server_cq); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   /* Create client. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_join_host_port(&client_hostport, client_host, port); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   client_cq = grpc_completion_queue_create(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   client = grpc_channel_create(client_hostport, NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  gpr_free(client_hostport); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   v_client = cq_verifier_create(client_cq); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_log(GPR_INFO, "Testing with server=%s client=%s (expecting %s)", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          server_hostport, client_hostport, expect_ok ? "success" : "failure"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_free(client_hostport); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_free(server_hostport); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (expect_ok) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /* Normal deadline, shouldn't be reached. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     deadline = ms_from_now(60000); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -170,8 +179,7 @@ void test_connect(const char *server_host, const char *client_host, int port, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 int main(int argc, char **argv) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   int do_ipv6 = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  int i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  int port = grpc_pick_unused_port_or_die(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  int fixed_port; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_test_init(argc, argv); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_init(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -181,30 +189,34 @@ int main(int argc, char **argv) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     do_ipv6 = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  for (i = 0; i <= 1; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  for (fixed_port = 0; fixed_port <= 1; fixed_port++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    int port = fixed_port ? grpc_pick_unused_port_or_die() : 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /* For coverage, test with and without dualstack sockets. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    grpc_forbid_dualstack_sockets_for_testing = i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    /* :: and 0.0.0.0 are handled identically. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    test_connect("::", "127.0.0.1", port, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    test_connect("::", "::ffff:127.0.0.1", port, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    test_connect("::", "localhost", port, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    test_connect("0.0.0.0", "127.0.0.1", port, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    test_connect("0.0.0.0", "::ffff:127.0.0.1", port, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    test_connect("0.0.0.0", "localhost", port, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (do_ipv6) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      test_connect("::", "::1", port, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      test_connect("0.0.0.0", "::1", port, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for (grpc_forbid_dualstack_sockets_for_testing = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         grpc_forbid_dualstack_sockets_for_testing <= 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         grpc_forbid_dualstack_sockets_for_testing++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      /* :: and 0.0.0.0 are handled identically. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      test_connect("::", "127.0.0.1", port, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      test_connect("::", "::ffff:127.0.0.1", port, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      test_connect("::", "localhost", port, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      test_connect("0.0.0.0", "127.0.0.1", port, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      test_connect("0.0.0.0", "::ffff:127.0.0.1", port, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      test_connect("0.0.0.0", "localhost", port, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (do_ipv6) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        test_connect("::", "::1", port, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        test_connect("0.0.0.0", "::1", port, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      /* These only work when the families agree. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      test_connect("127.0.0.1", "127.0.0.1", port, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (do_ipv6) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        test_connect("::1", "::1", port, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        test_connect("::1", "127.0.0.1", port, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        test_connect("127.0.0.1", "::1", port, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    /* These only work when the families agree. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    test_connect("127.0.0.1", "127.0.0.1", port, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (do_ipv6) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      test_connect("::1", "::1", port, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      test_connect("::1", "127.0.0.1", port, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      test_connect("127.0.0.1", "::1", port, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_shutdown(); 
			 |