32 import java.io.IOException; |
32 import java.io.IOException; |
33 import java.lang.reflect.Field; |
33 import java.lang.reflect.Field; |
34 import java.lang.reflect.Method; |
34 import java.lang.reflect.Method; |
35 import java.net.DatagramSocket; |
35 import java.net.DatagramSocket; |
36 import java.net.MulticastSocket; |
36 import java.net.MulticastSocket; |
|
37 import java.net.NetworkInterface; |
37 import java.net.ServerSocket; |
38 import java.net.ServerSocket; |
38 import java.net.Socket; |
39 import java.net.Socket; |
|
40 import java.net.SocketException; |
39 import java.net.SocketOption; |
41 import java.net.SocketOption; |
40 import java.nio.channels.DatagramChannel; |
42 import java.nio.channels.DatagramChannel; |
41 import java.nio.channels.ServerSocketChannel; |
43 import java.nio.channels.ServerSocketChannel; |
42 import java.nio.channels.SocketChannel; |
44 import java.nio.channels.SocketChannel; |
43 import java.util.ArrayList; |
45 import java.util.ArrayList; |
44 import java.util.Arrays; |
46 import java.util.Arrays; |
45 import java.util.HashMap; |
47 import java.util.HashMap; |
46 import java.util.List; |
48 import java.util.List; |
47 import java.util.Map; |
49 import java.util.Map; |
|
50 import java.util.stream.Collectors; |
48 import org.testng.annotations.DataProvider; |
51 import org.testng.annotations.DataProvider; |
49 import org.testng.annotations.Test; |
52 import org.testng.annotations.Test; |
50 import static java.lang.Boolean.*; |
53 import static java.lang.Boolean.*; |
51 import static java.net.StandardSocketOptions.*; |
54 import static java.net.StandardSocketOptions.*; |
52 import static org.testng.Assert.expectThrows; |
55 import static org.testng.Assert.expectThrows; |
55 |
58 |
56 static final Class<IOException> IOE = IOException.class; |
59 static final Class<IOException> IOE = IOException.class; |
57 |
60 |
58 static Map<SocketOption<?>,List<Object>> OPTION_VALUES_MAP = optionValueMap(); |
61 static Map<SocketOption<?>,List<Object>> OPTION_VALUES_MAP = optionValueMap(); |
59 |
62 |
|
63 static boolean supportsMulticast(NetworkInterface ni) { |
|
64 try { |
|
65 return ni.supportsMulticast(); |
|
66 } catch (SocketException e) { |
|
67 return false; |
|
68 } |
|
69 } |
|
70 |
|
71 static List<Object> listNetworkInterfaces() { |
|
72 try { |
|
73 return NetworkInterface.networkInterfaces() |
|
74 .filter(AfterClose::supportsMulticast) |
|
75 .collect(Collectors.toList()); |
|
76 } catch (Exception e) { } |
|
77 return List.of(); |
|
78 } |
|
79 |
60 static Map<SocketOption<?>,List<Object>> optionValueMap() { |
80 static Map<SocketOption<?>,List<Object>> optionValueMap() { |
61 Map<SocketOption<?>,List<Object>> map = new HashMap<>(); |
81 Map<SocketOption<?>,List<Object>> map = new HashMap<>(); |
62 map.put(IP_MULTICAST_IF, listOf(TRUE, FALSE) ); |
82 map.put(IP_MULTICAST_IF, listNetworkInterfaces() ); |
63 map.put(IP_MULTICAST_LOOP, listOf(TRUE, FALSE) ); |
83 map.put(IP_MULTICAST_LOOP, listOf(TRUE, FALSE) ); |
64 map.put(IP_MULTICAST_TTL, listOf(0, 100, 255) ); |
84 map.put(IP_MULTICAST_TTL, listOf(0, 100, 255) ); |
65 map.put(IP_TOS, listOf(0, 101, 255) ); |
85 map.put(IP_TOS, listOf(0, 101, 255) ); |
66 map.put(SO_BROADCAST, listOf(TRUE, FALSE) ); |
86 map.put(SO_BROADCAST, listOf(TRUE, FALSE) ); |
67 map.put(SO_KEEPALIVE, listOf(TRUE, FALSE) ); |
87 map.put(SO_KEEPALIVE, listOf(TRUE, FALSE) ); |