1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.netty.testsuite.transport.socket;
17
18 import io.netty.bootstrap.AbstractBootstrap;
19 import io.netty.bootstrap.Bootstrap;
20 import io.netty.bootstrap.ServerBootstrap;
21 import io.netty.channel.Channel;
22 import io.netty.channel.ChannelFactory;
23 import io.netty.channel.ChannelOption;
24 import io.netty.channel.EventLoopGroup;
25 import io.netty.channel.nio.NioEventLoopGroup;
26 import io.netty.channel.oio.OioEventLoopGroup;
27 import io.netty.channel.socket.InternetProtocolFamily;
28 import io.netty.channel.socket.nio.NioDatagramChannel;
29 import io.netty.channel.socket.nio.NioServerSocketChannel;
30 import io.netty.channel.socket.nio.NioSocketChannel;
31 import io.netty.channel.socket.oio.OioDatagramChannel;
32 import io.netty.channel.socket.oio.OioServerSocketChannel;
33 import io.netty.channel.socket.oio.OioSocketChannel;
34 import io.netty.testsuite.transport.TestsuitePermutation.BootstrapComboFactory;
35 import io.netty.testsuite.transport.TestsuitePermutation.BootstrapFactory;
36 import io.netty.util.concurrent.DefaultThreadFactory;
37 import io.netty.util.internal.SystemPropertyUtil;
38 import io.netty.util.internal.logging.InternalLogger;
39 import io.netty.util.internal.logging.InternalLoggerFactory;
40
41 import java.util.ArrayList;
42 import java.util.Arrays;
43 import java.util.List;
44
45 public class SocketTestPermutation {
46
47 static final String BAD_HOST = SystemPropertyUtil.get("io.netty.testsuite.badHost", "198.51.100.254");
48 static final int BAD_PORT = SystemPropertyUtil.getInt("io.netty.testsuite.badPort", 65535);
49
50 static {
51 InternalLogger logger = InternalLoggerFactory.getInstance(SocketConnectionAttemptTest.class);
52 logger.debug("-Dio.netty.testsuite.badHost: {}", BAD_HOST);
53 logger.debug("-Dio.netty.testsuite.badPort: {}", BAD_PORT);
54 }
55
56 static final SocketTestPermutation INSTANCE = new SocketTestPermutation();
57
58 protected static final int BOSSES = 2;
59 protected static final int WORKERS = 3;
60
61 protected static final int OIO_SO_TIMEOUT = 10;
62
63 protected final EventLoopGroup nioBossGroup =
64 new NioEventLoopGroup(BOSSES, new DefaultThreadFactory("testsuite-nio-boss", true));
65 protected final EventLoopGroup nioWorkerGroup =
66 new NioEventLoopGroup(WORKERS, new DefaultThreadFactory("testsuite-nio-worker", true));
67 protected final EventLoopGroup oioBossGroup =
68 new OioEventLoopGroup(Integer.MAX_VALUE, new DefaultThreadFactory("testsuite-oio-boss", true));
69 protected final EventLoopGroup oioWorkerGroup =
70 new OioEventLoopGroup(Integer.MAX_VALUE, new DefaultThreadFactory("testsuite-oio-worker", true));
71
72 protected <A extends AbstractBootstrap<?, ?>, B extends AbstractBootstrap<?, ?>>
73
74 List<BootstrapComboFactory<A, B>> combo(List<BootstrapFactory<A>> sbfs, List<BootstrapFactory<B>> cbfs) {
75
76 List<BootstrapComboFactory<A, B>> list = new ArrayList<BootstrapComboFactory<A, B>>();
77
78
79 for (BootstrapFactory<A> sbf: sbfs) {
80 for (BootstrapFactory<B> cbf: cbfs) {
81 final BootstrapFactory<A> sbf0 = sbf;
82 final BootstrapFactory<B> cbf0 = cbf;
83 list.add(new BootstrapComboFactory<A, B>() {
84 @Override
85 public A newServerInstance() {
86 return sbf0.newInstance();
87 }
88
89 @Override
90 public B newClientInstance() {
91 return cbf0.newInstance();
92 }
93 });
94 }
95 }
96
97 return list;
98 }
99
100 public List<BootstrapComboFactory<ServerBootstrap, Bootstrap>> socket() {
101
102 List<BootstrapFactory<ServerBootstrap>> sbfs = serverSocket();
103
104
105 List<BootstrapFactory<Bootstrap>> cbfs = clientSocket();
106
107
108 List<BootstrapComboFactory<ServerBootstrap, Bootstrap>> list = combo(sbfs, cbfs);
109
110
111 list.remove(list.size() - 1);
112
113 return list;
114 }
115
116 public List<BootstrapComboFactory<ServerBootstrap, Bootstrap>> socketWithFastOpen() {
117
118 List<BootstrapFactory<ServerBootstrap>> sbfs = serverSocket();
119
120
121 List<BootstrapFactory<Bootstrap>> cbfs = clientSocketWithFastOpen();
122
123
124 List<BootstrapComboFactory<ServerBootstrap, Bootstrap>> list = combo(sbfs, cbfs);
125
126
127 list.remove(list.size() - 1);
128
129 return list;
130 }
131
132 public List<BootstrapComboFactory<Bootstrap, Bootstrap>> datagram(final InternetProtocolFamily family) {
133
134 List<BootstrapFactory<Bootstrap>> bfs = Arrays.asList(
135 new BootstrapFactory<Bootstrap>() {
136 @Override
137 public Bootstrap newInstance() {
138 return new Bootstrap().group(nioWorkerGroup).channelFactory(new ChannelFactory<Channel>() {
139 @Override
140 public Channel newChannel() {
141 return new NioDatagramChannel(family);
142 }
143
144 @Override
145 public String toString() {
146 return NioDatagramChannel.class.getSimpleName() + ".class";
147 }
148 });
149 }
150 },
151 new BootstrapFactory<Bootstrap>() {
152 @Override
153 public Bootstrap newInstance() {
154 return new Bootstrap().group(oioWorkerGroup).channel(OioDatagramChannel.class)
155 .option(ChannelOption.SO_TIMEOUT, OIO_SO_TIMEOUT);
156 }
157 }
158 );
159
160
161 return combo(bfs, bfs);
162 }
163
164 public List<BootstrapFactory<ServerBootstrap>> serverSocket() {
165 return Arrays.asList(
166 new BootstrapFactory<ServerBootstrap>() {
167 @Override
168 public ServerBootstrap newInstance() {
169 return new ServerBootstrap().group(nioBossGroup, nioWorkerGroup)
170 .channel(NioServerSocketChannel.class);
171 }
172 },
173 new BootstrapFactory<ServerBootstrap>() {
174 @Override
175 public ServerBootstrap newInstance() {
176 return new ServerBootstrap().group(oioBossGroup, oioWorkerGroup)
177 .channel(OioServerSocketChannel.class)
178 .option(ChannelOption.SO_TIMEOUT, OIO_SO_TIMEOUT);
179 }
180 }
181 );
182 }
183
184 public List<BootstrapFactory<Bootstrap>> clientSocket() {
185 return Arrays.asList(
186 new BootstrapFactory<Bootstrap>() {
187 @Override
188 public Bootstrap newInstance() {
189 return new Bootstrap().group(nioWorkerGroup).channel(NioSocketChannel.class);
190 }
191 },
192 new BootstrapFactory<Bootstrap>() {
193 @Override
194 public Bootstrap newInstance() {
195 return new Bootstrap().group(oioWorkerGroup).channel(OioSocketChannel.class)
196 .option(ChannelOption.SO_TIMEOUT, OIO_SO_TIMEOUT);
197 }
198 }
199 );
200 }
201
202 public List<BootstrapFactory<Bootstrap>> clientSocketWithFastOpen() {
203 return clientSocket();
204 }
205
206 public List<BootstrapFactory<Bootstrap>> datagramSocket() {
207 return Arrays.asList(
208 new BootstrapFactory<Bootstrap>() {
209 @Override
210 public Bootstrap newInstance() {
211 return new Bootstrap().group(nioWorkerGroup).channel(NioDatagramChannel.class);
212 }
213 },
214 new BootstrapFactory<Bootstrap>() {
215 @Override
216 public Bootstrap newInstance() {
217 return new Bootstrap().group(oioWorkerGroup).channel(OioDatagramChannel.class)
218 .option(ChannelOption.SO_TIMEOUT, OIO_SO_TIMEOUT);
219 }
220 }
221 );
222 }
223 }