/* * Copyright 2001-2005 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ /* @test * @bug 4417152 4481572 6248930 * @summary Test Channels basic functionality */ import java.io.*; import java.nio.*; import java.nio.channels.*; public class Basic { static String message; static String encoding; static File blah; static int ITERATIONS = 500; public static void main(String[] args) throws Exception { message = "ascii data for a test"; encoding = "ISO-8859-1"; test(); message = "\ucafe\ubabe\ucafe\ubabe\ucafe\ubabe"; encoding = "UTF-8"; test(); } private static void test() throws Exception { try { ReadableByteChannel channel = Channels.newChannel((InputStream)null); throw new RuntimeException("Did not get the expected NullPointerException."); } catch (NullPointerException ne) { // OK. As expected. } try { WritableByteChannel channel = Channels.newChannel((OutputStream)null); throw new RuntimeException("Did not get the expected NullPointerException."); } catch (NullPointerException ne) { // OK. As expected. } try { blah = File.createTempFile("blah", null); testNewOutputStream(blah); readAndCheck(blah); blah.delete(); writeOut(blah, ITERATIONS); testNewInputStream(blah); blah.delete(); testNewChannelOut(blah); readAndCheck(blah); blah.delete(); writeOut(blah, ITERATIONS); testNewChannelIn(blah); test4481572(blah); blah.delete(); testNewWriter(blah); readAndCheck(blah); blah.delete(); writeOut(blah, ITERATIONS); testNewReader(blah); } finally { blah.delete(); } } private static void readAndCheck(File blah) throws Exception { FileInputStream fis = new FileInputStream(blah); int messageSize = message.length() * ITERATIONS * 3 + 1; byte bb[] = new byte[messageSize]; int bytesRead = 0; int totalRead = 0; while (bytesRead != -1) { totalRead += bytesRead; bytesRead = fis.read(bb, totalRead, messageSize - totalRead); } String result = new String(bb, 0, totalRead, encoding); int len = message.length(); for (int i=0; i<ITERATIONS; i++) { String segment = result.substring(i++ * len, i * len); if (!segment.equals(message)) throw new RuntimeException("Test failed"); } fis.close(); } private static void writeOut(File blah, int limit) throws Exception { FileOutputStream fos = new FileOutputStream(blah); for (int i=0; i<limit; i++) fos.write(message.getBytes(encoding)); fos.close(); } private static void testNewOutputStream(File blah) throws Exception { FileOutputStream fos = new FileOutputStream(blah); FileChannel fc = fos.getChannel(); WritableByteChannel wbc = (WritableByteChannel)fc; OutputStream os = Channels.newOutputStream(wbc); for (int i=0; i<ITERATIONS; i++) os.write(message.getBytes(encoding)); os.close(); fos.close(); } private static void testNewInputStream(File blah) throws Exception { FileInputStream fis = new FileInputStream(blah); FileChannel fc = fis.getChannel(); ReadableByteChannel rbc = (ReadableByteChannel)fc; InputStream is = Channels.newInputStream(rbc); int messageSize = message.length() * ITERATIONS * 3 + 1; byte bb[] = new byte[messageSize]; int bytesRead = 0; int totalRead = 0; while (bytesRead != -1) { totalRead += bytesRead; bytesRead = is.read(bb, totalRead, messageSize - totalRead); } String result = new String(bb, 0, totalRead, encoding); int len = message.length(); for (int i=0; i<ITERATIONS; i++) { String segment = result.substring(i++ * len, i * len); if (!segment.equals(message)) throw new RuntimeException("Test failed"); } is.close(); fis.close(); } private static void testNewChannelOut(File blah) throws Exception { ExtendedFileOutputStream fos = new ExtendedFileOutputStream(blah); WritableByteChannel wbc = Channels.newChannel(fos); for (int i=0; i<ITERATIONS; i++) wbc.write(ByteBuffer.wrap(message.getBytes(encoding))); wbc.close(); fos.close(); } private static void testNewChannelIn(File blah) throws Exception { ExtendedFileInputStream fis = new ExtendedFileInputStream(blah); ReadableByteChannel rbc = Channels.newChannel(fis); int messageSize = message.length() * ITERATIONS * 3; byte data[] = new byte[messageSize+1]; ByteBuffer bb = ByteBuffer.wrap(data); int bytesRead = 0; int totalRead = 0; while (bytesRead != -1) { totalRead += bytesRead; bytesRead = rbc.read(bb); } String result = new String(data, 0, totalRead, encoding); int len = message.length(); for (int i=0; i<ITERATIONS; i++) { String segment = result.substring(i++ * len, i * len); if (!segment.equals(message)) throw new RuntimeException("Test failed"); } rbc.close(); fis.close(); } // Causes BufferOverflowException if bug 4481572 is present. private static void test4481572(File blah) throws Exception { ExtendedFileInputStream fis = new ExtendedFileInputStream(blah); ReadableByteChannel rbc = Channels.newChannel(fis); byte data[] = new byte[9000]; ByteBuffer bb = ByteBuffer.wrap(data); int bytesRead = 1; int totalRead = 0; while (bytesRead > 0) { totalRead += bytesRead; bytesRead = rbc.read(bb); } rbc.close(); fis.close(); } private static void testNewWriter(File blah) throws Exception { FileOutputStream fos = new FileOutputStream(blah); WritableByteChannel wbc = (WritableByteChannel)fos.getChannel(); Writer w = Channels.newWriter(wbc, encoding); char data[] = new char[40]; message.getChars(0, message.length(), data, 0); for (int i=0; i<ITERATIONS; i++) w.write(data, 0, message.length()); w.flush(); w.close(); fos.close(); } private static void testNewReader(File blah) throws Exception { FileInputStream fis = new FileInputStream(blah); ReadableByteChannel rbc = (ReadableByteChannel)fis.getChannel(); Reader r = Channels.newReader(rbc, encoding); int messageSize = message.length() * ITERATIONS; char data[] = new char[messageSize]; int totalRead = 0; int charsRead = 0; while (totalRead < messageSize) { totalRead += charsRead; charsRead = r.read(data, totalRead, messageSize - totalRead); } String result = new String(data, 0, totalRead); int len = message.length(); for (int i=0; i<ITERATIONS; i++) { String segment = result.substring(i++ * len, i * len); if (!segment.equals(message)) throw new RuntimeException("Test failed"); } r.close(); fis.close(); } } class ExtendedFileInputStream extends java.io.FileInputStream { ExtendedFileInputStream(File file) throws FileNotFoundException { super(file); } } class ExtendedFileOutputStream extends java.io.FileOutputStream { ExtendedFileOutputStream(File file) throws FileNotFoundException { super(file); } }