You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
357 lines
12 KiB
357 lines
12 KiB
/* |
|
* Copyright (c) 2001, 2008, 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. |
|
*/ |
|
|
|
/* @test |
|
* @bug 4417152 4481572 6248930 6725399 6884800 |
|
* @summary Test Channels basic functionality |
|
*/ |
|
|
|
import java.io.*; |
|
import java.nio.*; |
|
import java.nio.charset.*; |
|
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(); |
|
} |
|
|
|
static void failNpeExpected() { |
|
throw new RuntimeException("Did not get the expected NullPointerException."); |
|
} |
|
|
|
private static void test() throws Exception { |
|
//Test if methods of Channels throw NPE with null argument(s) |
|
try { |
|
Channels.newInputStream((ReadableByteChannel)null); |
|
failNpeExpected(); |
|
} catch (NullPointerException npe) {} |
|
|
|
try { |
|
Channels.newOutputStream((WritableByteChannel)null); |
|
failNpeExpected(); |
|
} catch (NullPointerException npe) {} |
|
|
|
try { |
|
ReadableByteChannel channel = Channels.newChannel((InputStream)null); |
|
failNpeExpected(); |
|
} catch (NullPointerException ne) {} // OK. As expected. |
|
|
|
try { |
|
WritableByteChannel channel = Channels.newChannel((OutputStream)null); |
|
failNpeExpected(); |
|
} catch (NullPointerException ne) {} // OK. As expected. |
|
|
|
WritableByteChannel wbc = new WritableByteChannel() { |
|
public int write(ByteBuffer src) { return 0; } |
|
public void close() throws IOException { } |
|
public boolean isOpen() { return true; } |
|
}; |
|
|
|
ReadableByteChannel rbc = new ReadableByteChannel() { |
|
public int read(ByteBuffer dst) { return 0; } |
|
public void close() {} |
|
public boolean isOpen() { return true; } |
|
}; |
|
|
|
try { |
|
Channels.newReader((ReadableByteChannel)null, |
|
Charset.defaultCharset().newDecoder(), |
|
-1); |
|
failNpeExpected(); |
|
} catch (NullPointerException npe) {} |
|
|
|
try { |
|
Channels.newReader(rbc, (CharsetDecoder)null, -1); |
|
failNpeExpected(); |
|
} catch (NullPointerException npe) {} |
|
|
|
try { |
|
Channels.newReader((ReadableByteChannel)null, |
|
Charset.defaultCharset().name()); |
|
failNpeExpected(); |
|
} catch (NullPointerException npe) {} |
|
|
|
try { |
|
Channels.newReader(rbc, null); |
|
failNpeExpected(); |
|
} catch (NullPointerException npe) {} |
|
|
|
|
|
try { |
|
Channels.newReader(null, null); |
|
failNpeExpected(); |
|
} catch (NullPointerException npe) {} |
|
|
|
try { |
|
Channels.newWriter((WritableByteChannel)null, |
|
Charset.defaultCharset().newEncoder(), |
|
-1); |
|
failNpeExpected(); |
|
} catch (NullPointerException npe) {} |
|
|
|
try { |
|
Channels.newWriter(null, null, -1); |
|
failNpeExpected(); |
|
} catch (NullPointerException npe) {} |
|
|
|
try { |
|
Channels.newWriter(wbc, null, -1); |
|
failNpeExpected(); |
|
} catch (NullPointerException npe) {} |
|
|
|
try { |
|
Channels.newWriter((WritableByteChannel)null, |
|
Charset.defaultCharset().name()); |
|
failNpeExpected(); |
|
} catch (NullPointerException npe) {} |
|
|
|
try { |
|
Channels.newWriter(wbc, null); |
|
failNpeExpected(); |
|
} catch (NullPointerException npe) {} |
|
|
|
try { |
|
Channels.newWriter(null, null); |
|
failNpeExpected(); |
|
} catch (NullPointerException npe) {} |
|
|
|
|
|
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(); |
|
InputStream is = Channels.newInputStream(fc); |
|
int messageSize = message.length() * ITERATIONS * 3 + 1; |
|
byte bb[] = new byte[messageSize]; |
|
|
|
int bytesRead = 0; |
|
int totalRead = 0; |
|
while (bytesRead != -1) { |
|
totalRead += bytesRead; |
|
long rem = Math.min(fc.size() - totalRead, (long)Integer.MAX_VALUE); |
|
if (is.available() != (int)rem) |
|
throw new RuntimeException("available not useful or not maximally useful"); |
|
bytesRead = is.read(bb, totalRead, messageSize - totalRead); |
|
} |
|
if (is.available() != 0) |
|
throw new RuntimeException("available() should return 0 at EOF"); |
|
|
|
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); |
|
} |
|
}
|
|
|