aboutsummaryrefslogtreecommitdiff
path: root/test/java/nio/channels
diff options
context:
space:
mode:
authoralanb <none@none>2012-11-04 14:07:35 +0000
committeralanb <none@none>2012-11-04 14:07:35 +0000
commit0379350be47abdda282137e53766d04e48df9e63 (patch)
tree8ce58484065aade124036f8faf1c10252b2eb78b /test/java/nio/channels
parent72bfc510a2bd53dac71e65782241996ae16c042a (diff)
8000330: (fc) FileChannel.truncate issues when given size > file size
8002180: (fc) FileChannel.map does not throw NPE if MapMode specified as null Reviewed-by: chegar
Diffstat (limited to 'test/java/nio/channels')
-rw-r--r--test/java/nio/channels/FileChannel/MapTest.java262
-rw-r--r--test/java/nio/channels/FileChannel/Truncate.java116
2 files changed, 288 insertions, 90 deletions
diff --git a/test/java/nio/channels/FileChannel/MapTest.java b/test/java/nio/channels/FileChannel/MapTest.java
index 42df55c1f..066d60973 100644
--- a/test/java/nio/channels/FileChannel/MapTest.java
+++ b/test/java/nio/channels/FileChannel/MapTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2012, 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
@@ -22,6 +22,7 @@
*/
/* @test
+ * @bug 4429043 8002180
* @summary Test file mapping with FileChannel
* @run main/othervm MapTest
*/
@@ -29,7 +30,10 @@
import java.io.*;
import java.nio.MappedByteBuffer;
import java.nio.channels.*;
-import java.nio.channels.FileChannel;
+import java.nio.channels.FileChannel.MapMode;
+import java.nio.file.Files;
+import static java.nio.file.StandardOpenOption.*;
+import static java.nio.charset.StandardCharsets.*;
import java.util.Random;
@@ -39,6 +43,7 @@ import java.util.Random;
public class MapTest {
+ private static PrintStream out = System.out;
private static PrintStream err = System.err;
private static Random generator = new Random();
@@ -51,15 +56,21 @@ public class MapTest {
blah = File.createTempFile("blah", null);
blah.deleteOnExit();
initTestFile(blah);
- err.println("Test file " + blah + " initialized");
- testZero();
- err.println("Zero size: OK");
- testRead();
- err.println("Read: OK");
- testWrite();
- err.println("Write: OK");
- testHighOffset();
- err.println("High offset: OK");
+ try {
+ out.println("Test file " + blah + " initialized");
+ testZero();
+ out.println("Zero size: OK");
+ testRead();
+ out.println("Read: OK");
+ testWrite();
+ out.println("Write: OK");
+ testHighOffset();
+ out.println("High offset: OK");
+ testExceptions();
+ out.println("Exceptions: OK");
+ } finally {
+ blah.delete();
+ }
}
/**
@@ -77,30 +88,25 @@ public class MapTest {
* ability to index into a file of multiple pages is tested.
*/
private static void initTestFile(File blah) throws Exception {
- FileOutputStream fos = new FileOutputStream(blah);
- BufferedWriter awriter
- = new BufferedWriter(new OutputStreamWriter(fos, "8859_1"));
-
- for(int i=0; i<4000; i++) {
- String number = new Integer(i).toString();
- for (int h=0; h<4-number.length(); h++)
- awriter.write("0");
- awriter.write(""+i);
- awriter.newLine();
+ try (BufferedWriter writer = Files.newBufferedWriter(blah.toPath(), ISO_8859_1)) {
+ for (int i=0; i<4000; i++) {
+ String number = new Integer(i).toString();
+ for (int h=0; h<4-number.length(); h++)
+ writer.write("0");
+ writer.write(""+i);
+ writer.newLine();
+ }
}
- awriter.flush();
- awriter.close();
}
/**
* Tests zero size file mapping
*/
private static void testZero() throws Exception {
- FileInputStream fis = new FileInputStream(blah);
- FileChannel c = fis.getChannel();
- MappedByteBuffer b = c.map(FileChannel.MapMode.READ_ONLY, 0, 0);
- c.close();
- fis.close();
+ try (FileInputStream fis = new FileInputStream(blah)) {
+ FileChannel fc = fis.getChannel();
+ MappedByteBuffer b = fc.map(MapMode.READ_ONLY, 0, 0);
+ }
}
/**
@@ -108,33 +114,32 @@ public class MapTest {
* from the ByteBuffer gets the right line number
*/
private static void testRead() throws Exception {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.setLength(4);
for (int x=0; x<1000; x++) {
- FileInputStream fis = new FileInputStream(blah);
- FileChannel c = fis.getChannel();
+ try (FileInputStream fis = new FileInputStream(blah)) {
+ FileChannel fc = fis.getChannel();
- long offset = generator.nextInt(10000);
- long expectedResult = offset / CHARS_PER_LINE;
- offset = expectedResult * CHARS_PER_LINE;
+ long offset = generator.nextInt(10000);
+ long expectedResult = offset / CHARS_PER_LINE;
+ offset = expectedResult * CHARS_PER_LINE;
- MappedByteBuffer b = c.map(FileChannel.MapMode.READ_ONLY,
- offset, 100);
+ MappedByteBuffer b = fc.map(MapMode.READ_ONLY,
+ offset, 100);
- for (int i=0; i<4; i++) {
- byte aByte = b.get(i);
- sb.setCharAt(i, (char)aByte);
- }
+ for (int i=0; i<4; i++) {
+ byte aByte = b.get(i);
+ sb.setCharAt(i, (char)aByte);
+ }
- int result = Integer.parseInt(sb.toString());
- if (result != expectedResult) {
- err.println("I expected "+expectedResult);
- err.println("I got "+result);
- throw new Exception("Read test failed");
+ int result = Integer.parseInt(sb.toString());
+ if (result != expectedResult) {
+ err.println("I expected "+expectedResult);
+ err.println("I got "+result);
+ throw new Exception("Read test failed");
+ }
}
- c.close();
- fis.close();
}
}
@@ -143,46 +148,159 @@ public class MapTest {
* written out to the file can be read back in
*/
private static void testWrite() throws Exception {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.setLength(4);
for (int x=0; x<1000; x++) {
- RandomAccessFile raf = new RandomAccessFile(blah, "rw");
- FileChannel c = raf.getChannel();
+ try (RandomAccessFile raf = new RandomAccessFile(blah, "rw")) {
+ FileChannel fc = raf.getChannel();
- long offset = generator.nextInt(1000);
- MappedByteBuffer b = c.map(FileChannel.MapMode.READ_WRITE,
- offset, 100);
+ long offset = generator.nextInt(1000);
+ MappedByteBuffer b = fc.map(MapMode.READ_WRITE,
+ offset, 100);
- for (int i=0; i<4; i++) {
- b.put(i, (byte)('0' + i));
- }
+ for (int i=0; i<4; i++) {
+ b.put(i, (byte)('0' + i));
+ }
- for (int i=0; i<4; i++) {
- byte aByte = b.get(i);
- sb.setCharAt(i, (char)aByte);
+ for (int i=0; i<4; i++) {
+ byte aByte = b.get(i);
+ sb.setCharAt(i, (char)aByte);
+ }
+ if (!sb.toString().equals("0123"))
+ throw new Exception("Write test failed");
}
- if (!sb.toString().equals("0123"))
- throw new Exception("Write test failed");
- c.close();
- raf.close();
}
}
private static void testHighOffset() throws Exception {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.setLength(4);
for (int x=0; x<1000; x++) {
- RandomAccessFile raf = new RandomAccessFile(blah, "rw");
- FileChannel fc = raf.getChannel();
- long offset = 66000;
- MappedByteBuffer b = fc.map(FileChannel.MapMode.READ_WRITE,
- offset, 100);
-
- fc.close();
- raf.close();
+ try (RandomAccessFile raf = new RandomAccessFile(blah, "rw")) {
+ FileChannel fc = raf.getChannel();
+ long offset = 66000;
+ MappedByteBuffer b = fc.map(MapMode.READ_WRITE,
+ offset, 100);
+ }
}
}
+ /**
+ * Test exceptions specified by map method
+ */
+ private static void testExceptions() throws Exception {
+ // check exceptions when channel opened for read access
+ try (FileChannel fc = FileChannel.open(blah.toPath(), READ)) {
+ testExceptions(fc);
+
+ checkException(fc, MapMode.READ_WRITE, 0L, fc.size(),
+ NonWritableChannelException.class);
+
+ checkException(fc, MapMode.READ_WRITE, -1L, fc.size(),
+ NonWritableChannelException.class, IllegalArgumentException.class);
+
+ checkException(fc, MapMode.READ_WRITE, 0L, -1L,
+ NonWritableChannelException.class, IllegalArgumentException.class);
+
+ checkException(fc, MapMode.PRIVATE, 0L, fc.size(),
+ NonWritableChannelException.class);
+
+ checkException(fc, MapMode.PRIVATE, -1L, fc.size(),
+ NonWritableChannelException.class, IllegalArgumentException.class);
+
+ checkException(fc, MapMode.PRIVATE, 0L, -1L,
+ NonWritableChannelException.class, IllegalArgumentException.class);
+ }
+
+ // check exceptions when channel opened for write access
+ try (FileChannel fc = FileChannel.open(blah.toPath(), WRITE)) {
+ testExceptions(fc);
+
+ checkException(fc, MapMode.READ_ONLY, 0L, fc.size(),
+ NonReadableChannelException.class);
+
+ checkException(fc, MapMode.READ_ONLY, -1L, fc.size(),
+ NonReadableChannelException.class, IllegalArgumentException.class);
+
+ /*
+ * implementation/spec mismatch, these tests disabled for now
+ */
+ //checkException(fc, MapMode.READ_WRITE, 0L, fc.size(),
+ // NonWritableChannelException.class);
+ //checkException(fc, MapMode.PRIVATE, 0L, fc.size(),
+ // NonWritableChannelException.class);
+ }
+
+ // check exceptions when channel opened for read and write access
+ try (FileChannel fc = FileChannel.open(blah.toPath(), READ, WRITE)) {
+ testExceptions(fc);
+ }
+ }
+
+ private static void testExceptions(FileChannel fc) throws IOException {
+ checkException(fc, null, 0L, fc.size(),
+ NullPointerException.class);
+
+ checkException(fc, MapMode.READ_ONLY, -1L, fc.size(),
+ IllegalArgumentException.class);
+
+ checkException(fc, null, -1L, fc.size(),
+ IllegalArgumentException.class, NullPointerException.class);
+
+ checkException(fc, MapMode.READ_ONLY, 0L, -1L,
+ IllegalArgumentException.class);
+
+ checkException(fc, null, 0L, -1L,
+ IllegalArgumentException.class, NullPointerException.class);
+
+ checkException(fc, MapMode.READ_ONLY, 0L, Integer.MAX_VALUE + 1L,
+ IllegalArgumentException.class);
+
+ checkException(fc, null, 0L, Integer.MAX_VALUE + 1L,
+ IllegalArgumentException.class, NullPointerException.class);
+
+ checkException(fc, MapMode.READ_ONLY, Long.MAX_VALUE, 1L,
+ IllegalArgumentException.class);
+
+ checkException(fc, null, Long.MAX_VALUE, 1L,
+ IllegalArgumentException.class, NullPointerException.class);
+
+ }
+
+ /**
+ * Checks that FileChannel map throws one of the expected exceptions
+ * when invoked with the given inputs.
+ */
+ private static void checkException(FileChannel fc,
+ MapMode mode,
+ long position,
+ long size,
+ Class<?>... expected)
+ throws IOException
+ {
+ Exception exc = null;
+ try {
+ fc.map(mode, position, size);
+ } catch (Exception actual) {
+ exc = actual;
+ }
+ if (exc != null) {
+ for (Class<?> clazz: expected) {
+ if (clazz.isInstance(exc)) {
+ return;
+ }
+ }
+ }
+ System.err.println("Expected one of");
+ for (Class<?> clazz: expected) {
+ System.out.println(clazz);
+ }
+ if (exc == null) {
+ throw new RuntimeException("No expection thrown");
+ } else {
+ throw new RuntimeException("Unexpected exception thrown", exc);
+ }
+ }
}
diff --git a/test/java/nio/channels/FileChannel/Truncate.java b/test/java/nio/channels/FileChannel/Truncate.java
index bc81ffb22..ff62d724a 100644
--- a/test/java/nio/channels/FileChannel/Truncate.java
+++ b/test/java/nio/channels/FileChannel/Truncate.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2012, 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
@@ -22,14 +22,16 @@
*/
/* @test
- * @bug 6191269 6709457
+ * @bug 6191269 6709457 8000330
* @summary Test truncate method of FileChannel
*/
import java.io.*;
import java.nio.ByteBuffer;
-import java.nio.channels.FileChannel;
+import java.nio.channels.*;
+import java.nio.file.Files;
import static java.nio.file.StandardOpenOption.*;
+import static java.nio.charset.StandardCharsets.*;
import java.util.Random;
@@ -46,6 +48,7 @@ public class Truncate {
try {
basicTest(blah);
appendTest(blah);
+ exceptionTests(blah);
} finally {
blah.delete();
}
@@ -66,15 +69,22 @@ public class Truncate {
if (fc.size() != testSize)
throw new RuntimeException("Size failed");
- long position = generator.nextInt((int)testSize);
+ long position = generator.nextInt((int)testSize*2);
fc.position(position);
- long newSize = generator.nextInt((int)testSize);
+ long newSize = generator.nextInt((int)testSize*2);
fc.truncate(newSize);
- if (fc.size() != newSize)
- throw new RuntimeException("Truncate failed");
+ // check new size
+ if (newSize > testSize) {
+ if (fc.size() != testSize)
+ throw new RuntimeException("Attempt to expand file changed size");
+ } else {
+ if (fc.size() != newSize)
+ throw new RuntimeException("Unexpected size after truncate");
+ }
+ // check new position
if (position > newSize) {
if (fc.position() != newSize)
throw new RuntimeException("Position greater than size");
@@ -115,20 +125,90 @@ public class Truncate {
}
/**
+ * Test exceptions specified by truncate method
+ */
+ static void exceptionTests(File blah) throws Exception {
+ // check exceptions when channel opened for read access
+ try (FileChannel fc = FileChannel.open(blah.toPath(), READ)) {
+ long size = fc.size();
+
+ // open channel
+ checkException(fc, 0L, NonWritableChannelException.class);
+
+ checkException(fc, -1L, NonWritableChannelException.class,
+ IllegalArgumentException.class);
+
+ checkException(fc, size+1L, NonWritableChannelException.class);
+
+ // closed channel
+ fc.close();
+
+ checkException(fc, 0L, ClosedChannelException.class);
+
+ checkException(fc, -1L, ClosedChannelException.class,
+ IllegalArgumentException.class);
+
+ checkException(fc, size+1L, ClosedChannelException.class);
+ }
+
+ // check exceptions when channel opened for write access
+ try (FileChannel fc = FileChannel.open(blah.toPath(), WRITE)) {
+ long size = fc.size();
+
+ // open channel
+ checkException(fc, -1L, IllegalArgumentException.class);
+
+ // closed channel
+ fc.close();
+
+ checkException(fc, 0L, ClosedChannelException.class);
+
+ checkException(fc, -1L, ClosedChannelException.class,
+ IllegalArgumentException.class);
+
+ checkException(fc, size+1L, ClosedChannelException.class);
+ }
+ }
+
+ /**
+ * Checks that FileChannel truncate throws one of the expected exceptions
+ * when invoked with the given size.
+ */
+ private static void checkException(FileChannel fc, long size, Class<?>... expected)
+ throws IOException
+ {
+ Exception exc = null;
+ try {
+ fc.truncate(size);
+ } catch (Exception actual) {
+ exc = actual;
+ }
+ if (exc != null) {
+ for (Class<?> clazz: expected) {
+ if (clazz.isInstance(exc)) {
+ return;
+ }
+ }
+ }
+ System.err.println("Expected one of");
+ for (Class<?> clazz: expected) {
+ System.err.println(clazz);
+ }
+ if (exc == null) {
+ throw new RuntimeException("No expection thrown");
+ } else {
+ throw new RuntimeException("Unexpected exception thrown", exc);
+ }
+ }
+
+ /**
* Creates file blah of specified size in bytes.
- *
*/
private static void initTestFile(File blah, long size) throws Exception {
- if (blah.exists())
- blah.delete();
- FileOutputStream fos = new FileOutputStream(blah);
- BufferedWriter awriter
- = new BufferedWriter(new OutputStreamWriter(fos, "8859_1"));
-
- for(int i=0; i<size; i++) {
- awriter.write("e");
+ try (BufferedWriter writer = Files.newBufferedWriter(blah.toPath(), ISO_8859_1)) {
+ for(int i=0; i<size; i++) {
+ writer.write("e");
+ }
}
- awriter.flush();
- awriter.close();
}
}