fe008ae27a
Reviewed-by: darcy, weijun
242 lines
7.6 KiB
Java
242 lines
7.6 KiB
Java
/*
|
|
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* This code is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License version 2 only, as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
* version 2 for more details (a copy is included in the LICENSE file that
|
|
* accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU General Public License version
|
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
* or visit www.oracle.com if you need additional information or have any
|
|
* questions.
|
|
*/
|
|
|
|
/*
|
|
* @bug 4517622
|
|
* @summary SocketException on first read after error; -1 on subsequent reads
|
|
*/
|
|
import java.net.*;
|
|
import java.io.*;
|
|
import java.util.Random;
|
|
|
|
public class Test {
|
|
|
|
static int TEST_COMBINATIONS = 5;
|
|
|
|
// test server that cycles through each combination of response
|
|
|
|
static class Server extends Thread {
|
|
ServerSocket ss;
|
|
|
|
public Server() throws IOException {
|
|
ss = new ServerSocket(0);
|
|
System.out.println("Server listening on port: " + getPort());
|
|
}
|
|
|
|
public void run() {
|
|
|
|
int testCombination = 0;
|
|
|
|
try {
|
|
for (;;) {
|
|
Socket s = ss.accept();
|
|
|
|
switch (testCombination) {
|
|
case 0:
|
|
s.setTcpNoDelay(false);
|
|
s.getOutputStream().write(new byte[256]);
|
|
s.setSoLinger(true, 0);
|
|
break;
|
|
|
|
case 1:
|
|
s.setTcpNoDelay(true);
|
|
s.getOutputStream().write(new byte[256]);
|
|
s.setSoLinger(true, 0);
|
|
break;
|
|
|
|
case 2:
|
|
s.getOutputStream().write("hello".getBytes());
|
|
s.setSoLinger(true, 0);
|
|
break;
|
|
|
|
case 3:
|
|
break; /* EOF test */
|
|
|
|
case 4:
|
|
s.getOutputStream().write(new byte[256]);
|
|
break;
|
|
}
|
|
|
|
s.close();
|
|
|
|
testCombination = (testCombination + 1) % TEST_COMBINATIONS;
|
|
}
|
|
} catch (IOException ioe) {
|
|
if (!ss.isClosed()) {
|
|
System.err.println("Server failed: " + ioe);
|
|
}
|
|
}
|
|
}
|
|
|
|
public int getPort() {
|
|
return ss.getLocalPort();
|
|
}
|
|
|
|
public void shutdown() {
|
|
try {
|
|
ss.close();
|
|
} catch (IOException ioe) { }
|
|
}
|
|
|
|
}
|
|
|
|
static final int STATE_DATA = 0;
|
|
static final int STATE_EOF = 1;
|
|
static final int STATE_IOE = 2;
|
|
|
|
static void Test(SocketAddress sa) throws Exception {
|
|
System.out.println("-----------");
|
|
|
|
Socket s = new Socket();
|
|
s.connect(sa);
|
|
|
|
byte b[] = new byte[50];
|
|
int state = STATE_DATA;
|
|
boolean failed = false;
|
|
|
|
Random rand = new Random();
|
|
|
|
for (int i=0; i<200; i++) {
|
|
switch (rand.nextInt(4)) {
|
|
case 0:
|
|
try {
|
|
s.getOutputStream().write("data".getBytes());
|
|
} catch (IOException ioe) { }
|
|
break;
|
|
|
|
case 1:
|
|
try {
|
|
int n = s.getInputStream().available();
|
|
|
|
// available should never return > 0 if read
|
|
// has already thrown IOE or returned EOF
|
|
|
|
if (n > 0 && state != STATE_DATA) {
|
|
System.out.println("FAILED!! available: " + n +
|
|
" (unexpected as IOE or EOF already received)");
|
|
failed = true;
|
|
}
|
|
} catch (IOException ioe) {
|
|
System.out.println("FAILED!!! available: " + ioe);
|
|
failed = true;
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
try {
|
|
int n = s.getInputStream().read(b);
|
|
|
|
if (n > 0 && state == STATE_IOE) {
|
|
System.out.println("FAILED!! read: " + n +
|
|
" (unexpected as IOE already thrown)");
|
|
failed = true;
|
|
}
|
|
|
|
if (n > 0 && state == STATE_EOF) {
|
|
System.out.println("FAILED!! read: " + n +
|
|
" (unexpected as EOF already received)");
|
|
failed = true;
|
|
}
|
|
|
|
if (n < 0) {
|
|
if (state == STATE_IOE) {
|
|
System.out.println("FAILED!! read: EOF " +
|
|
" (unexpected as IOE already thrown)");
|
|
failed = true;
|
|
}
|
|
if (state != STATE_EOF) {
|
|
System.out.println("read: EOF");
|
|
state = STATE_EOF;
|
|
}
|
|
}
|
|
|
|
} catch (IOException ioe) {
|
|
if (state == STATE_EOF) {
|
|
System.out.println("FAILED!! read: " + ioe +
|
|
" (unexpected as EOF already received)");
|
|
failed = true;
|
|
}
|
|
if (state != STATE_IOE) {
|
|
System.out.println("read: " + ioe);
|
|
state = STATE_IOE;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 3:
|
|
try {
|
|
Thread.currentThread().sleep(100);
|
|
} catch (Exception ie) { }
|
|
}
|
|
|
|
if (failed) {
|
|
failures++;
|
|
break;
|
|
}
|
|
}
|
|
|
|
s.close();
|
|
}
|
|
|
|
static int failures = 0;
|
|
|
|
public static void main(String args[]) throws Exception {
|
|
SocketAddress sa = null;
|
|
Server svr = null;
|
|
|
|
// server mode only
|
|
if (args.length > 0) {
|
|
if (args[0].equals("-server")) {
|
|
svr = new Server();
|
|
svr.start();
|
|
return;
|
|
}
|
|
}
|
|
|
|
// run standalone or connect to remote server
|
|
if (args.length > 0) {
|
|
InetAddress rh = InetAddress.getByName(args[0]);
|
|
int port = Integer.parseInt(args[1]);
|
|
sa = new InetSocketAddress(rh, port);
|
|
} else {
|
|
svr = new Server();
|
|
svr.start();
|
|
|
|
InetAddress lh = InetAddress.getLocalHost();
|
|
sa = new InetSocketAddress(lh, svr.getPort());
|
|
}
|
|
|
|
for (int i=0; i<10; i++) {
|
|
Test(sa);
|
|
}
|
|
|
|
if (svr != null) {
|
|
svr.shutdown();
|
|
}
|
|
|
|
if (failures > 0) {
|
|
throw new Exception(failures + " sub-test(s) failed.");
|
|
}
|
|
}
|
|
}
|