blob: 4527427d95677482716a87f313a55e439f51d662 [file] [log] [blame]
duke6e45e102007-12-01 00:00:00 +00001/*
2 * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any questions.
22 */
23
24import java.net.*;
25import java.io.*;
26import java.util.*;
27
28public class Tests {
29 /**
30 * performs a simple exchange of data between the two sockets
31 * and throws an exception if there is any problem.
32 */
33 public static void simpleDataExchange (Socket s1, Socket s2)
34 throws Exception {
35
36 InputStream i1 = s1.getInputStream();
37 InputStream i2 = s2.getInputStream();
38 OutputStream o1 = s1.getOutputStream();
39 OutputStream o2 = s2.getOutputStream();
40
41 simpleWrite (o1, 100);
42 simpleWrite (o2, 200);
43 simpleRead (i2, 100);
44 simpleRead (i1, 200);
45 }
46
47 /**
48 * Send a packet from s1 to s2 (ia2/s2.localPort) and check it
49 * Send a packet from s2 to s1 (ia1/s1.localPort) and check it
50 */
51 public static void simpleDataExchange (DatagramSocket s1, InetAddress ia1,
52 DatagramSocket s2, InetAddress ia2)
53 throws Exception {
54
55 SocketAddress dest1 = new InetSocketAddress (ia1, s1.getLocalPort());
56 dprintln ("dest1 = " + dest1);
57 SocketAddress dest2 = new InetSocketAddress (ia2, s2.getLocalPort());
58 dprintln ("dest2 = " + dest2);
59
60 byte[] ba = "Hello world".getBytes();
61 byte[] bb = "HELLO WORLD1".getBytes();
62 DatagramPacket p1 = new DatagramPacket (ba, ba.length, dest1);
63 DatagramPacket p2 = new DatagramPacket (ba, ba.length, dest2);
64
65 DatagramPacket r1 = new DatagramPacket (new byte[256], 256);
66 DatagramPacket r2 = new DatagramPacket (new byte[256], 256);
67
68 s2.send (p1);
69 s1.send (p2);
70 s1.receive (r1);
71 s2.receive (r2);
72 comparePackets (p1, r1);
73 comparePackets (p2, r2);
74 }
75
76 /**
77 * Send a packet from s1 to s2 (ia2/s2.localPort) and send same packet
78 * back from s2 to sender. Check s1 receives original packet
79 */
80
81 public static void datagramEcho (DatagramSocket s1, DatagramSocket s2,
82 InetAddress ia2)
83 throws Exception {
84
85 byte[] ba = "Hello world".getBytes();
86 DatagramPacket p1;
87
88 SocketAddress dest2 = null;
89 if (ia2 != null) {
90 dest2 = new InetSocketAddress (ia2, s2.getLocalPort());
91 p1 = new DatagramPacket (ba, ba.length, dest2);
92 } else {
93 p1 = new DatagramPacket (ba, ba.length);
94 }
95
96 dprintln ("dest2 = " + dest2);
97
98
99 DatagramPacket r1 = new DatagramPacket (new byte[256], 256);
100 DatagramPacket r2 = new DatagramPacket (new byte[256], 256);
101
102 s1.send (p1);
103 s2.receive (r1);
104 s2.send (r1);
105 s1.receive (r2);
106 comparePackets (p1, r1);
107 comparePackets (p1, r2);
108 }
109
110 public static void comparePackets (DatagramPacket p1, DatagramPacket p2)
111 throws Exception {
112
113 byte[] b1 = p1.getData();
114 byte[] b2 = p2.getData();
115 int len = p1.getLength () > p2.getLength() ? p2.getLength()
116 : p1.getLength();
117 for (int i=0; i<len; i++) {
118 if (b1[i] != b2[i]) {
119 throw new Exception ("packets not the same");
120 }
121 }
122 }
123
124 /* check the time got is within 20% of the time expected */
125 public static void checkTime (long got, long expected) {
126 dprintln ("checkTime: got " + got + " expected " + expected);
127 long upper = expected + (expected / 5);
128 long lower = expected - (expected / 5);
129 if (got > upper || got < lower) {
130 throw new RuntimeException ("checkTime failed: got " + got + " expected " + expected);
131 }
132 }
133
134 static boolean debug = false;
135
136 public static void checkDebug (String[] args) {
137 debug = args.length > 0 && args[0].equals("-d");
138 }
139
140 public static void dprint (String s) {
141 if (debug) {
142 System.out.print (s);
143 }
144 }
145
146 public static void dprintln (String s) {
147 if (debug) {
148 System.out.println (s);
149 }
150 }
151
152 static int numberInterfaces () {
153 try {
154 Enumeration ifs = NetworkInterface.getNetworkInterfaces();
155 int nifs=0;
156 while (ifs.hasMoreElements()) {
157 nifs++;
158 ifs.nextElement();
159 }
160 return nifs;
161 } catch (SocketException e) {
162 return 0;
163 }
164 }
165
166 public static Enumeration ipv4Addresses() {
167 return new AddrEnum (Inet4Address.class);
168 }
169
170 public static Inet4Address getFirstLocalIPv4Address () {
171 Enumeration e = ipv4Addresses();
172 if (!e.hasMoreElements()) {
173 return null;
174 }
175 return (Inet4Address)e.nextElement();
176 }
177
178 public static Inet6Address getFirstLocalIPv6Address () {
179 Enumeration e = ipv6Addresses();
180 if (!e.hasMoreElements()) {
181 return null;
182 }
183 return (Inet6Address)e.nextElement();
184 }
185
186 public static Enumeration ipv6Addresses() {
187 return new AddrEnum (Inet6Address.class);
188 }
189
190 /* enumerates the Inet4Addresses or Inet6Addresses on the system */
191
192 private static class AddrEnum implements Enumeration {
193
194 Enumeration ifs;
195 NetworkInterface currIf = null;
196 InetAddress nextAddr=null;
197 Enumeration addrs=null;
198 Class filter;
199
200 static final byte[] fe80_loopback = new byte [] {
201 (byte)0xfe,(byte)0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,1
202 };
203
204 AddrEnum (Class filter) {
205 this.filter = filter;
206 try {
207 ifs = NetworkInterface.getNetworkInterfaces();
208 } catch (SocketException e) {}
209 }
210
211 public boolean hasMoreElements () {
212 if (nextAddr == null) {
213 nextAddr = getNext();
214 }
215 return (nextAddr != null);
216 }
217
218 public Object nextElement () {
219 if (!hasMoreElements()) {
220 throw new NoSuchElementException ("no more addresses");
221 }
222 Object next = nextAddr;
223 nextAddr = null;
224 return next;
225 }
226
227 private InetAddress getNext() {
228 while (true) {
229 if (currIf == null) {
230 currIf = getNextIf();
231 if (currIf == null) {
232 return null;
233 }
234 addrs = currIf.getInetAddresses();
235 }
236 while (addrs.hasMoreElements()) {
237 InetAddress addr = (InetAddress) addrs.nextElement();
238 if (filter.isInstance (addr) && !addr.isLoopbackAddress()) {
239 if (Arrays.equals (addr.getAddress(), fe80_loopback)) {
240 continue;
241 }
242 return addr;
243 }
244 }
245 currIf = null;
246 }
247 }
248
249 private NetworkInterface getNextIf () {
250 while (ifs.hasMoreElements()) {
251 NetworkInterface nic = (NetworkInterface)ifs.nextElement();
252 try {
253 if (nic.isUp() && !nic.isLoopback())
254 return nic;
255 } catch (SocketException e) {
256 // ignore
257 }
258 }
259
260 return null;
261 }
262 }
263
264 /**
265 * Throws a RuntimeException if the boolean condition is false
266 */
267 public static void t_assert (boolean assertion) {
268 if (assertion) {
269 return;
270 }
271 Throwable t = new Throwable();
272 StackTraceElement[] strace = t.getStackTrace();
273 String msg = "Assertion failed at: " + strace[1].toString();
274 throw new RuntimeException (msg);
275 }
276
277 private static void simpleRead (InputStream is, int start) throws Exception {
278 byte b[] = new byte [2];
279 for (int i=start; i<start+100; i++) {
280 int x = is.read (b);
281 if (x == 1) {
282 x += is.read (b,1,1);
283 }
284 if (x!=2) {
285 throw new Exception ("read error");
286 }
287 int r = bytes (b[0], b[1]);
288 if (r != i) {
289 throw new Exception ("read " + r + " expected " +i);
290 }
291 }
292 }
293
294 /* convert signed bytes to unisigned int */
295 private static int bytes (byte b1, byte b2) {
296 int i1 = (int)b1 & 0xFF;
297 int i2 = (int)b2 & 0xFF;
298 return i1 * 256 + i2;
299 }
300
301 static void simpleWrite (OutputStream os, int start) throws Exception {
302 byte b[] = new byte [2];
303 for (int i=start; i<start+100; i++) {
304 b[0] = (byte) (i / 256);
305 b[1] = (byte) (i % 256);
306 os.write (b);
307 }
308 }
309
310 private static class Runner extends Thread {
311 Runnable runnee;
312 long delay;
313
314 Runner (Runnable runnee, long delay) {
315 super();
316 this.runnee = runnee;
317 this.delay = delay;
318 }
319
320 public void run () {
321 try {
322 Thread.sleep (delay);
323 runnee.run ();
324 } catch (Exception e) {
325 e.printStackTrace();
326 }
327 }
328 }
329
330 /*
331 * Take the given Runnable and run it in a spawned thread
332 * after the given time has elapsed. runAfter() returns immediately
333 */
334 public static void runAfter (long millis, Runnable runnee) {
335 Runner runner = new Runner (runnee, millis);
336 runner.start ();
337 }
338
339 static String osname;
340
341 static {
342 osname = System.getProperty ("os.name");
343 }
344
345 static boolean isLinux () {
346 return osname.equals ("Linux");
347 }
348
349 static boolean isWindows () {
350 return osname.startsWith ("Windows");
351 }
352}