duke | 6e45e10 | 2007-12-01 00:00:00 +0000 | [diff] [blame] | 1 | /* |
ohair | 2283b9d | 2010-05-25 15:58:33 -0700 | [diff] [blame^] | 2 | * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved. |
duke | 6e45e10 | 2007-12-01 00:00:00 +0000 | [diff] [blame] | 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 | * |
ohair | 2283b9d | 2010-05-25 15:58:33 -0700 | [diff] [blame^] | 19 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| 20 | * or visit www.oracle.com if you need additional information or have any |
| 21 | * questions. |
duke | 6e45e10 | 2007-12-01 00:00:00 +0000 | [diff] [blame] | 22 | */ |
| 23 | |
| 24 | /* |
| 25 | * @test |
| 26 | * @bug 4092038 |
| 27 | * @summary TCP Urgent data support |
| 28 | * |
| 29 | */ |
| 30 | |
| 31 | import java.net.*; |
| 32 | import java.io.*; |
| 33 | |
| 34 | public class UrgentDataTest { |
| 35 | |
| 36 | Object opref; |
| 37 | boolean isClient, isServer; |
| 38 | String clHost; |
| 39 | ServerSocket listener; |
| 40 | Socket client, server; |
| 41 | int clPort; |
| 42 | InputStream clis, sis; |
| 43 | OutputStream clos, sos; |
| 44 | |
| 45 | static void usage () { |
| 46 | System.out.println (" usage: java UrgentDataTest <runs client and server together>"); |
| 47 | System.out.println (" usage: java UrgentDataTest -server <runs server alone>"); |
| 48 | System.out.println (" usage: java UrgentDataTest -client host port <runs client and connects to"+ |
| 49 | " specified server>"); |
| 50 | } |
| 51 | |
| 52 | public static void main (String args[]) { |
| 53 | try { |
| 54 | UrgentDataTest test = new UrgentDataTest (); |
| 55 | if (args.length == 0) { |
| 56 | test.listener = new ServerSocket (0); |
| 57 | test.isClient = true; |
| 58 | test.isServer = true; |
| 59 | test.clHost = "127.0.0.1"; |
| 60 | test.clPort = test.listener.getLocalPort(); |
| 61 | test.run(); |
| 62 | } else if (args[0].equals ("-server")) { |
| 63 | test.listener = new ServerSocket (0); |
| 64 | System.out.println ("Server listening on port " + test.listener.getLocalPort()); |
| 65 | test.isClient = false; |
| 66 | test.isServer = true; |
| 67 | test.run(); |
| 68 | System.out.println ("Server: Completed OK"); |
| 69 | } else if (args[0].equals ("-client")) { |
| 70 | test.isClient = true; |
| 71 | test.isServer = false; |
| 72 | test.clHost = args [1]; |
| 73 | test.clPort = Integer.parseInt (args[2]); |
| 74 | test.run(); |
| 75 | System.out.println ("Client: Completed OK"); |
| 76 | } else { |
| 77 | usage (); |
| 78 | } |
| 79 | } |
| 80 | catch (ArrayIndexOutOfBoundsException e) { |
| 81 | usage(); |
| 82 | } |
| 83 | catch (NumberFormatException e) { |
| 84 | usage(); |
| 85 | } |
| 86 | catch (Exception e) { |
| 87 | e.printStackTrace (); |
| 88 | throw new RuntimeException ("Exception caught"); |
| 89 | } |
| 90 | } |
| 91 | |
| 92 | public void run () throws Exception { |
| 93 | if (isClient) { |
| 94 | client = new Socket (clHost, clPort); |
| 95 | clis = client.getInputStream(); |
| 96 | clos = client.getOutputStream(); |
| 97 | client.setOOBInline (true); |
| 98 | if (client.getOOBInline() != true) { |
| 99 | throw new RuntimeException ("Setting OOBINLINE failed"); |
| 100 | } |
| 101 | } |
| 102 | if (isServer) { |
| 103 | server = listener.accept (); |
| 104 | sis = server.getInputStream(); |
| 105 | sos = server.getOutputStream(); |
| 106 | } |
| 107 | if (isClient) { |
| 108 | clos.write ("Hello".getBytes ()); |
| 109 | client.sendUrgentData (100); |
| 110 | clos.write ("world".getBytes ()); |
| 111 | } |
| 112 | // read Hello world from server (during which oob byte must have been dropped) |
| 113 | String s = "Helloworld"; |
| 114 | if (isServer) { |
| 115 | for (int y=0; y<s.length(); y++) { |
| 116 | int c = sis.read (); |
| 117 | if (c != (int)s.charAt (y)) { |
| 118 | throw new RuntimeException ("Unexpected character read"); |
| 119 | } |
| 120 | } |
| 121 | // Do the same from server to client |
| 122 | sos.write ("Hello".getBytes ()); |
| 123 | server.sendUrgentData (101); |
| 124 | sos.write ("World".getBytes ()); |
| 125 | } |
| 126 | if (isClient) { |
| 127 | // read Hello world from client (during which oob byte must have been read) |
| 128 | s="Hello"; |
| 129 | for (int y=0; y<s.length(); y++) { |
| 130 | int c = clis.read (); |
| 131 | if (c != (int)s.charAt (y)) { |
| 132 | throw new RuntimeException ("Unexpected character read"); |
| 133 | } |
| 134 | } |
| 135 | if (clis.read() != 101) { |
| 136 | throw new RuntimeException ("OOB byte not received"); |
| 137 | } |
| 138 | s="World"; |
| 139 | for (int y=0; y<s.length(); y++) { |
| 140 | int c = clis.read (); |
| 141 | if (c != (int)s.charAt (y)) { |
| 142 | throw new RuntimeException ("Unexpected character read"); |
| 143 | } |
| 144 | } |
| 145 | } |
| 146 | |
| 147 | if (isClient) |
| 148 | client.close (); |
| 149 | if (isServer) |
| 150 | server.close (); |
| 151 | } |
| 152 | } |