1 /* 2 * Copyright (c) 2000, 2010, Oracle and/or its affiliates. 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 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. 22 */ 23 24 /* @test 25 * @summary Test socketchannel vector IO 26 * @library .. 27 */ 28 29 import java.io.*; 30 import java.net.*; 31 import java.nio.*; 32 import java.nio.channels.*; 33 import java.util.*; 34 import sun.misc.*; 35 36 37 public class VectorIO { 38 39 static Random generator = new Random(); 40 41 static int testSize; 42 43 public static void main(String[] args) throws Exception { 44 testSize = 1; 45 runTest(); 46 for(int i=15; i<18; i++) { 47 testSize = i; 48 runTest(); 49 } 50 } 51 52 static void runTest() throws Exception { 53 System.err.println("Length " + testSize); 54 Server sv = new Server(testSize); 55 sv.start(); 56 bufferTest(sv.port()); 57 if (sv.finish(8000) == 0) 58 throw new Exception("Failed: Length = " + testSize); 59 } 60 61 static void bufferTest(int port) throws Exception { 62 ByteBuffer[] bufs = new ByteBuffer[testSize]; 63 long total = 0L; 64 for(int i=0; i<testSize; i++) { 65 String source = "buffer" + i; 66 if (generator.nextBoolean()) 67 bufs[i] = ByteBuffer.allocateDirect(source.length()); 68 else 69 bufs[i] = ByteBuffer.allocate(source.length()); 70 71 bufs[i].put(source.getBytes("8859_1")); 72 bufs[i].flip(); 73 total += bufs[i].remaining(); 74 } 75 76 // Get a connection to the server 77 InetAddress lh = InetAddress.getLocalHost(); 78 InetSocketAddress isa = new InetSocketAddress(lh, port); 79 SocketChannel sc = SocketChannel.open(); 80 sc.connect(isa); 81 sc.configureBlocking(generator.nextBoolean()); 82 83 // Write the data out 84 long rem = total; 85 while (rem > 0L) { 86 long bytesWritten = sc.write(bufs); 87 if (bytesWritten == 0) { 88 if (sc.isBlocking()) 89 throw new RuntimeException("write did not block"); 90 Thread.sleep(50); 91 } else { 92 rem -= bytesWritten; 93 } 94 } 95 96 // Clean up 97 sc.close(); 98 } 99 100 static class Server 101 extends TestThread 102 { 103 static Random generator = new Random(); 104 105 final int testSize; 106 final ServerSocketChannel ssc; 107 108 Server(int testSize) throws IOException { 109 super("Server " + testSize); 110 this.testSize = testSize; 111 this.ssc = ServerSocketChannel.open().bind(new InetSocketAddress(0)); 112 } 113 114 int port() { 115 return ssc.socket().getLocalPort(); 116 } 117 118 void go() throws Exception { 119 bufferTest(); 120 } 121 122 void bufferTest() throws Exception { 123 long total = 0L; 124 ByteBuffer[] bufs = new ByteBuffer[testSize]; 125 for(int i=0; i<testSize; i++) { 126 String source = "buffer" + i; 127 if (generator.nextBoolean()) 128 bufs[i] = ByteBuffer.allocateDirect(source.length()); 129 else 130 bufs[i] = ByteBuffer.allocate(source.length()); 131 total += bufs[i].capacity(); 132 } 133 134 // Get a connection from client 135 SocketChannel sc = null; 136 137 try { 138 139 ssc.configureBlocking(false); 140 141 for (;;) { 142 sc = ssc.accept(); 143 if (sc != null) 144 break; 145 Thread.sleep(50); 146 } 147 148 sc.configureBlocking(generator.nextBoolean()); 149 150 // Read data into multiple buffers 151 long avail = total; 152 while (avail > 0) { 153 long bytesRead = sc.read(bufs); 154 if (bytesRead < 0) 155 break; 156 if (bytesRead == 0) { 157 if (sc.isBlocking()) 158 throw new RuntimeException("read did not block"); 159 Thread.sleep(50); 160 } 161 avail -= bytesRead; 162 } 163 164 // Check results 165 for(int i=0; i<testSize; i++) { 166 String expected = "buffer" + i; 167 bufs[i].flip(); 168 int size = bufs[i].capacity(); 169 byte[] data = new byte[size]; 170 for(int j=0; j<size; j++) 171 data[j] = bufs[i].get(); 172 String message = new String(data, "8859_1"); 173 if (!message.equals(expected)) 174 throw new Exception("Wrong data: Got " 175 + message + ", expected " 176 + expected); 177 } 178 179 } finally { 180 // Clean up 181 ssc.close(); 182 if (sc != null) 183 sc.close(); 184 } 185 186 } 187 188 } 189 190 }