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