blob: 6a6034380ba1c90f74e2bace1ac77e5379670408 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 2003 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
24/*
25 *
26 *
27 * Used in conjunction to EchoService to test System.inheritedChannel().
28 *
29 * The first test is the TCP echo test. A service is launched with a TCP
30 * socket and a TCP message is sent to the service. The test checks that
31 * the message is correctly echoed.
32 *
33 * The second test is a UDP echo test. A service is launched with a UDP
34 * socket and a UDP packet is sent to the service. The test checks that
35 * the packet is correctly echoed.
36 *
37 */
38import java.net.*;
39import java.io.*;
40import java.nio.ByteBuffer;
41import java.nio.channels.*;
42import java.util.Random;
43
44public class EchoTest {
45
46 private static int failures = 0;
47
48 private static String ECHO_SERVICE = "EchoService";
49
50 /*
51 * Sends a message with random bytes to the service, and then waits for
52 * a reply (with timeout). Once the reply is received it is checked to ensure
53 * that it matches the original message.
54 */
55 private static void TCPEchoTest() throws IOException {
56 SocketChannel sc = Launcher.launchWithSocketChannel(ECHO_SERVICE, null);
57
58 String msg = "Where's that damn torpedo?";
59 int repeat = 100;
60 int size = msg.length() * repeat;
61
62 // generate bytes into a buffer and send it to the service
63
64 ByteBuffer bb1 = ByteBuffer.allocate(size);
65 Random gen = new Random();
66 for (int i=0; i<repeat; i++) {
67 bb1.put(msg.getBytes("UTF-8"));
68 }
69 bb1.flip();
70 sc.write(bb1);
71
72 // now we put the channel into non-blocking mode and we read the
73 // reply from the service into a second buffer.
74
75 ByteBuffer bb2 = ByteBuffer.allocate(size+100);
76 sc.configureBlocking(false);
77 Selector sel = sc.provider().openSelector();
78 SelectionKey sk = sc.register(sel, SelectionKey.OP_READ);
79 int nread = 0;
80 long to = 5000;
81 while (nread < size) {
82 long st = System.currentTimeMillis();
83 sel.select(to);
84 if (sk.isReadable()) {
85 int n = sc.read(bb2);
86 if (n > 0) {
87 nread += n;
88 }
89 if (n < 0) {
90 break; // EOF
91 }
92 }
93 sel.selectedKeys().remove(sk);
94 to -= System.currentTimeMillis() - st;
95 if (to <= 0) {
96 break;
97 }
98 }
99 sc.close();
100
101 // and compare the response
102
103 boolean err = false;
104
105 if (nread != size) {
106 err = true;
107 } else {
108 bb1.flip();
109 bb2.flip();
110 while (bb1.hasRemaining()) {
111 if (bb1.get() != bb2.get()) {
112 err = true;
113 }
114 }
115 }
116
117 // if error print out the response from the service (could be a stack trace)
118 if (err) {
119 System.err.println("Bad response or premature EOF, bytes read: ");
120 bb2.flip();
121 while (bb2.hasRemaining()) {
122 char c = (char)bb2.get();
123 System.out.print(c);
124 }
125 throw new RuntimeException("Bad response or premature EOF from service");
126 }
127 }
128
129 /*
130 * Send a UDP packet to the service, wait for a reply (with timeout). Finally
131 * check that the packet is the same length as the original.
132 */
133 private static void UDPEchoTest() throws IOException {
134 DatagramChannel dc = Launcher.launchWithDatagramChannel(ECHO_SERVICE, null);
135
136 String msg = "I was out saving the galaxy when your grandfather was in diapers";
137
138 ByteBuffer bb = ByteBuffer.wrap(msg.getBytes("UTF-8"));
139 dc.write(bb);
140
141 // and receive the echo
142 byte b[] = new byte[msg.length() + 100];
143 DatagramPacket pkt2 = new DatagramPacket(b, b.length);
144 dc.socket().setSoTimeout(2000);
145 dc.socket().receive(pkt2);
146
147 if (pkt2.getLength() != msg.length()) {
148 throw new RuntimeException("Received packet of incorrect length");
149 }
150
151 dc.close();
152 }
153
154 public static void main(String args[]) throws IOException {
155
156 // TCP echo
157 try {
158 TCPEchoTest();
159 System.out.println("TCP echo test passed.");
160 } catch (Exception x) {
161 System.err.println(x);
162 failures++;
163 }
164
165 // UDP echo
166 try {
167 UDPEchoTest();
168 System.out.println("UDP echo test passed.");
169 } catch (Exception x) {
170 x.printStackTrace();
171 System.err.println(x);
172 failures++;
173 }
174
175 if (failures > 0) {
176 throw new RuntimeException("Test failed - see log for details");
177 }
178 }
179
180}