8176895: (fc) Split java/nio/channels/FileChannel/Transfer.java into smaller tests
Summary: Move sub-tests writing 4GB and 6GB files into two separate tests
Reviewed-by: clanger
--- a/jdk/test/java/nio/channels/FileChannel/Transfer.java Thu Mar 16 22:58:13 2017 +0000
+++ b/jdk/test/java/nio/channels/FileChannel/Transfer.java Fri Mar 17 08:38:12 2017 -0700
@@ -22,8 +22,7 @@
*/
/* @test
- * @bug 4434723 4482726 4559072 4638365 4795550 5081340 5103988 6253145
- * 6984545
+ * @bug 4434723 4482726 4559072 4795550 5081340 5103988 6984545
* @key intermittent
* @summary Test FileChannel.transferFrom and transferTo (use -Dseed=X to set PRNG seed)
* @library ..
@@ -34,18 +33,13 @@
*/
import java.io.BufferedReader;
-import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.PrintStream;
import java.io.RandomAccessFile;
import java.io.Reader;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
@@ -55,8 +49,6 @@
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.channels.spi.SelectorProvider;
-import java.nio.file.StandardOpenOption;
-import java.nio.file.FileAlreadyExistsException;
import java.util.Random;
import java.util.concurrent.TimeUnit;
@@ -67,8 +59,6 @@
public class Transfer {
private static Random generator = RandomFactory.getRandom();
- private static PrintStream err = System.err;
- private static PrintStream out = System.out;
@Test
public void testFileChannel() throws Exception {
@@ -242,116 +232,7 @@
dest.delete();
}
- // Test transferTo with large file
- @Test
- public void xferTest04() throws Exception { // for bug 4638365
- // Windows and Linux can't handle the really large file sizes for a
- // truncate or a positional write required by the test for 4563125
- String osName = System.getProperty("os.name");
- if (!(osName.startsWith("SunOS") || osName.contains("OS X")))
- return;
- File source = File.createTempFile("blah", null);
- source.deleteOnExit();
- long testSize = ((long)Integer.MAX_VALUE) * 2;
- initTestFile(source, 10);
- RandomAccessFile raf = new RandomAccessFile(source, "rw");
- FileChannel fc = raf.getChannel();
- out.println(" Writing large file...");
- long t0 = System.nanoTime();
- fc.write(ByteBuffer.wrap("Use the source!".getBytes()), testSize - 40);
- long t1 = System.nanoTime();
- out.printf(" Wrote large file in %d ns (%d ms) %n",
- t1 - t0, TimeUnit.NANOSECONDS.toMillis(t1 - t0));
-
- fc.close();
- raf.close();
-
- File sink = File.createTempFile("sink", null);
- sink.deleteOnExit();
-
- FileInputStream fis = new FileInputStream(source);
- FileChannel sourceChannel = fis.getChannel();
-
- raf = new RandomAccessFile(sink, "rw");
- FileChannel sinkChannel = raf.getChannel();
-
- long bytesWritten = sourceChannel.transferTo(testSize -40, 10,
- sinkChannel);
- if (bytesWritten != 10) {
- throw new RuntimeException("Transfer test 4 failed " +
- bytesWritten);
- }
- sourceChannel.close();
- sinkChannel.close();
-
- source.delete();
- sink.delete();
- }
-
- // Test transferFrom with large file
- @Test
- public void xferTest05() throws Exception { // for bug 4638365
- // Create a source file & large sink file for the test
- File source = File.createTempFile("blech", null);
- source.deleteOnExit();
- initTestFile(source, 100);
-
- // Create the sink file as a sparse file if possible
- File sink = null;
- FileChannel fc = null;
- while (fc == null) {
- sink = File.createTempFile("sink", null);
- // re-create as a sparse file
- sink.delete();
- try {
- fc = FileChannel.open(sink.toPath(),
- StandardOpenOption.CREATE_NEW,
- StandardOpenOption.WRITE,
- StandardOpenOption.SPARSE);
- } catch (FileAlreadyExistsException ignore) {
- // someone else got it
- }
- }
- sink.deleteOnExit();
-
- long testSize = ((long)Integer.MAX_VALUE) * 2;
- try {
- out.println(" Writing large file...");
- long t0 = System.nanoTime();
- fc.write(ByteBuffer.wrap("Use the source!".getBytes()),
- testSize - 40);
- long t1 = System.nanoTime();
- out.printf(" Wrote large file in %d ns (%d ms) %n",
- t1 - t0, TimeUnit.NANOSECONDS.toMillis(t1 - t0));
- } catch (IOException e) {
- // Can't set up the test, abort it
- err.println("xferTest05 was aborted.");
- return;
- } finally {
- fc.close();
- }
-
- // Get new channels for the source and sink and attempt transfer
- FileChannel sourceChannel = new FileInputStream(source).getChannel();
- try {
- FileChannel sinkChannel = new RandomAccessFile(sink, "rw").getChannel();
- try {
- long bytesWritten = sinkChannel.transferFrom(sourceChannel,
- testSize - 40, 10);
- if (bytesWritten != 10) {
- throw new RuntimeException("Transfer test 5 failed " +
- bytesWritten);
- }
- } finally {
- sinkChannel.close();
- }
- } finally {
- sourceChannel.close();
- }
-
- source.delete();
- sink.delete();
- }
+ // xferTest04() and xferTest05() moved to Transfer4GBFile.java
static void checkFileData(File file, String expected) throws Exception {
FileInputStream fis = new FileInputStream(file);
@@ -436,118 +317,7 @@
source.delete();
}
-
- // Test transferTo with file positions larger than 2 and 4GB
- @Test
- public void xferTest08() throws Exception { // for bug 6253145
- // Creating a sparse 6GB file on Windows takes too long
- String osName = System.getProperty("os.name");
- if (osName.startsWith("Windows"))
- return;
-
- final long G = 1024L * 1024L * 1024L;
-
- // Create 6GB file
-
- File file = File.createTempFile("source", null);
- file.deleteOnExit();
-
- RandomAccessFile raf = new RandomAccessFile(file, "rw");
- FileChannel fc = raf.getChannel();
-
- out.println(" Writing large file...");
- long t0 = System.nanoTime();
- try {
- fc.write(ByteBuffer.wrap("0123456789012345".getBytes("UTF-8")), 6*G);
- long t1 = System.nanoTime();
- out.printf(" Wrote large file in %d ns (%d ms) %n",
- t1 - t0, TimeUnit.NANOSECONDS.toMillis(t1 - t0));
- } catch (IOException x) {
- err.println(" Unable to create test file:" + x);
- fc.close();
- return;
- }
-
- // Setup looback connection and echo server
-
- ServerSocketChannel ssc = ServerSocketChannel.open();
- ssc.socket().bind(new InetSocketAddress(0));
-
- InetAddress lh = InetAddress.getLocalHost();
- InetSocketAddress isa = new InetSocketAddress(lh, ssc.socket().getLocalPort());
- SocketChannel source = SocketChannel.open(isa);
- SocketChannel sink = ssc.accept();
-
- Thread thr = new Thread(new EchoServer(sink));
- thr.start();
-
- // Test data is array of positions and counts
-
- long testdata[][] = {
- { 2*G-1, 1 },
- { 2*G-1, 10 }, // across 2GB boundary
- { 2*G, 1 },
- { 2*G, 10 },
- { 2*G+1, 1 },
- { 4*G-1, 1 },
- { 4*G-1, 10 }, // across 4GB boundary
- { 4*G, 1 },
- { 4*G, 10 },
- { 4*G+1, 1 },
- { 5*G-1, 1 },
- { 5*G-1, 10 },
- { 5*G, 1 },
- { 5*G, 10 },
- { 5*G+1, 1 },
- { 6*G, 1 },
- };
-
- ByteBuffer sendbuf = ByteBuffer.allocateDirect(100);
- ByteBuffer readbuf = ByteBuffer.allocateDirect(100);
-
- try {
- byte value = 0;
- for (int i=0; i<testdata.length; i++) {
- long position = testdata[(int)i][0];
- long count = testdata[(int)i][1];
-
- // generate bytes
- for (long j=0; j<count; j++) {
- sendbuf.put(++value);
- }
- sendbuf.flip();
-
- // write to file and transfer to echo server
- fc.write(sendbuf, position);
- t0 = System.nanoTime();
- fc.transferTo(position, count, source);
- out.printf(" transferTo(%d, %2d, source): %d ns%n",
- position, count, System.nanoTime() - t0);
-
- // read from echo server
- long nread = 0;
- while (nread < count) {
- int n = source.read(readbuf);
- if (n < 0)
- throw new RuntimeException("Premature EOF!");
- nread += n;
- }
-
- // check reply from echo server
- readbuf.flip();
- sendbuf.flip();
- if (!readbuf.equals(sendbuf))
- throw new RuntimeException("Echoed bytes do not match!");
- readbuf.clear();
- sendbuf.clear();
- }
- } finally {
- source.close();
- ssc.close();
- fc.close();
- file.delete();
- }
- }
+ // xferTest08() moved to TransferTo6GBFile.java
// Test that transferFrom with FileChannel source that is not readable
// throws NonReadableChannelException
@@ -570,56 +340,4 @@
fc2.close();
}
}
-
- /**
- * 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");
- }
- awriter.flush();
- awriter.close();
- }
-
- /**
- * Simple in-process server to echo bytes read by a given socket channel
- */
- static class EchoServer implements Runnable {
- private SocketChannel sc;
-
- public EchoServer(SocketChannel sc) {
- this.sc = sc;
- }
-
- public void run() {
- ByteBuffer bb = ByteBuffer.allocateDirect(1024);
- try {
- for (;;) {
- int n = sc.read(bb);
- if (n < 0)
- break;
-
- bb.flip();
- while (bb.remaining() > 0) {
- sc.write(bb);
- }
- bb.clear();
- }
- } catch (IOException x) {
- x.printStackTrace();
- } finally {
- try {
- sc.close();
- } catch (IOException ignore) { }
- }
- }
- }
-
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/nio/channels/FileChannel/Transfer4GBFile.java Fri Mar 17 08:38:12 2017 -0700
@@ -0,0 +1,179 @@
+/*
+ * Copyright (c) 2001, 2017, 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 4638365
+ * @key intermittent
+ * @summary Test FileChannel.transferFrom and transferTo for 4GB files
+ * @run testng/timeout=300 Transfer4GBFile
+ */
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.PrintStream;
+import java.io.RandomAccessFile;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+import java.nio.file.StandardOpenOption;
+import java.nio.file.FileAlreadyExistsException;
+import java.util.concurrent.TimeUnit;
+
+import org.testng.annotations.Test;
+
+public class Transfer4GBFile {
+
+ private static PrintStream err = System.err;
+ private static PrintStream out = System.out;
+
+ // Test transferTo with large file
+ @Test
+ public void xferTest04() throws Exception { // for bug 4638365
+ // Windows and Linux can't handle the really large file sizes for a
+ // truncate or a positional write required by the test for 4563125
+ String osName = System.getProperty("os.name");
+ if (!(osName.startsWith("SunOS") || osName.contains("OS X")))
+ return;
+ File source = File.createTempFile("blah", null);
+ source.deleteOnExit();
+ long testSize = ((long)Integer.MAX_VALUE) * 2;
+ initTestFile(source, 10);
+ RandomAccessFile raf = new RandomAccessFile(source, "rw");
+ FileChannel fc = raf.getChannel();
+ out.println(" Writing large file...");
+ long t0 = System.nanoTime();
+ fc.write(ByteBuffer.wrap("Use the source!".getBytes()), testSize - 40);
+ long t1 = System.nanoTime();
+ out.printf(" Wrote large file in %d ns (%d ms) %n",
+ t1 - t0, TimeUnit.NANOSECONDS.toMillis(t1 - t0));
+
+ fc.close();
+ raf.close();
+
+ File sink = File.createTempFile("sink", null);
+ sink.deleteOnExit();
+
+ FileInputStream fis = new FileInputStream(source);
+ FileChannel sourceChannel = fis.getChannel();
+
+ raf = new RandomAccessFile(sink, "rw");
+ FileChannel sinkChannel = raf.getChannel();
+
+ long bytesWritten = sourceChannel.transferTo(testSize -40, 10,
+ sinkChannel);
+ if (bytesWritten != 10) {
+ throw new RuntimeException("Transfer test 4 failed " +
+ bytesWritten);
+ }
+ sourceChannel.close();
+ sinkChannel.close();
+
+ source.delete();
+ sink.delete();
+ }
+
+ // Test transferFrom with large file
+ @Test
+ public void xferTest05() throws Exception { // for bug 4638365
+ // Create a source file & large sink file for the test
+ File source = File.createTempFile("blech", null);
+ source.deleteOnExit();
+ initTestFile(source, 100);
+
+ // Create the sink file as a sparse file if possible
+ File sink = null;
+ FileChannel fc = null;
+ while (fc == null) {
+ sink = File.createTempFile("sink", null);
+ // re-create as a sparse file
+ sink.delete();
+ try {
+ fc = FileChannel.open(sink.toPath(),
+ StandardOpenOption.CREATE_NEW,
+ StandardOpenOption.WRITE,
+ StandardOpenOption.SPARSE);
+ } catch (FileAlreadyExistsException ignore) {
+ // someone else got it
+ }
+ }
+ sink.deleteOnExit();
+
+ long testSize = ((long)Integer.MAX_VALUE) * 2;
+ try {
+ out.println(" Writing large file...");
+ long t0 = System.nanoTime();
+ fc.write(ByteBuffer.wrap("Use the source!".getBytes()),
+ testSize - 40);
+ long t1 = System.nanoTime();
+ out.printf(" Wrote large file in %d ns (%d ms) %n",
+ t1 - t0, TimeUnit.NANOSECONDS.toMillis(t1 - t0));
+ } catch (IOException e) {
+ // Can't set up the test, abort it
+ err.println("xferTest05 was aborted.");
+ return;
+ } finally {
+ fc.close();
+ }
+
+ // Get new channels for the source and sink and attempt transfer
+ FileChannel sourceChannel = new FileInputStream(source).getChannel();
+ try {
+ FileChannel sinkChannel = new RandomAccessFile(sink, "rw").getChannel();
+ try {
+ long bytesWritten = sinkChannel.transferFrom(sourceChannel,
+ testSize - 40, 10);
+ if (bytesWritten != 10) {
+ throw new RuntimeException("Transfer test 5 failed " +
+ bytesWritten);
+ }
+ } finally {
+ sinkChannel.close();
+ }
+ } finally {
+ sourceChannel.close();
+ }
+
+ source.delete();
+ sink.delete();
+ }
+
+ /**
+ * 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");
+ }
+ awriter.flush();
+ awriter.close();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/nio/channels/FileChannel/TransferTo6GBFile.java Fri Mar 17 08:38:12 2017 -0700
@@ -0,0 +1,195 @@
+/*
+ * Copyright (c) 2001, 2017, 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 6253145
+ * @key intermittent
+ * @summary Test FileChannel.transferTo with file positions up to 8GB
+ * @run testng/timeout=300 TransferTo6GBFile
+ */
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.io.RandomAccessFile;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+import java.nio.channels.ServerSocketChannel;
+import java.nio.channels.SocketChannel;
+import java.util.concurrent.TimeUnit;
+
+import org.testng.annotations.Test;
+
+public class TransferTo6GBFile {
+
+ private static PrintStream err = System.err;
+ private static PrintStream out = System.out;
+
+ // Test transferTo with file positions larger than 2 and 4GB
+ @Test
+ public void xferTest08() throws Exception { // for bug 6253145
+ // Creating a sparse 6GB file on Windows takes too long
+ String osName = System.getProperty("os.name");
+ if (osName.startsWith("Windows"))
+ return;
+
+ final long G = 1024L * 1024L * 1024L;
+
+ // Create 6GB file
+
+ File file = File.createTempFile("source", null);
+ file.deleteOnExit();
+
+ RandomAccessFile raf = new RandomAccessFile(file, "rw");
+ FileChannel fc = raf.getChannel();
+
+ out.println(" Writing large file...");
+ long t0 = System.nanoTime();
+ try {
+ fc.write(ByteBuffer.wrap("0123456789012345".getBytes("UTF-8")), 6*G);
+ long t1 = System.nanoTime();
+ out.printf(" Wrote large file in %d ns (%d ms) %n",
+ t1 - t0, TimeUnit.NANOSECONDS.toMillis(t1 - t0));
+ } catch (IOException x) {
+ err.println(" Unable to create test file:" + x);
+ fc.close();
+ return;
+ }
+
+ // Setup looback connection and echo server
+
+ ServerSocketChannel ssc = ServerSocketChannel.open();
+ ssc.socket().bind(new InetSocketAddress(0));
+
+ InetAddress lh = InetAddress.getLocalHost();
+ InetSocketAddress isa = new InetSocketAddress(lh, ssc.socket().getLocalPort());
+ SocketChannel source = SocketChannel.open(isa);
+ SocketChannel sink = ssc.accept();
+
+ Thread thr = new Thread(new EchoServer(sink));
+ thr.start();
+
+ // Test data is array of positions and counts
+
+ long testdata[][] = {
+ { 2*G-1, 1 },
+ { 2*G-1, 10 }, // across 2GB boundary
+ { 2*G, 1 },
+ { 2*G, 10 },
+ { 2*G+1, 1 },
+ { 4*G-1, 1 },
+ { 4*G-1, 10 }, // across 4GB boundary
+ { 4*G, 1 },
+ { 4*G, 10 },
+ { 4*G+1, 1 },
+ { 5*G-1, 1 },
+ { 5*G-1, 10 },
+ { 5*G, 1 },
+ { 5*G, 10 },
+ { 5*G+1, 1 },
+ { 6*G, 1 },
+ };
+
+ ByteBuffer sendbuf = ByteBuffer.allocateDirect(100);
+ ByteBuffer readbuf = ByteBuffer.allocateDirect(100);
+
+ try {
+ byte value = 0;
+ for (int i=0; i<testdata.length; i++) {
+ long position = testdata[(int)i][0];
+ long count = testdata[(int)i][1];
+
+ // generate bytes
+ for (long j=0; j<count; j++) {
+ sendbuf.put(++value);
+ }
+ sendbuf.flip();
+
+ // write to file and transfer to echo server
+ fc.write(sendbuf, position);
+ t0 = System.nanoTime();
+ fc.transferTo(position, count, source);
+ out.printf(" transferTo(%d, %2d, source): %d ns%n",
+ position, count, System.nanoTime() - t0);
+
+ // read from echo server
+ long nread = 0;
+ while (nread < count) {
+ int n = source.read(readbuf);
+ if (n < 0)
+ throw new RuntimeException("Premature EOF!");
+ nread += n;
+ }
+
+ // check reply from echo server
+ readbuf.flip();
+ sendbuf.flip();
+ if (!readbuf.equals(sendbuf))
+ throw new RuntimeException("Echoed bytes do not match!");
+ readbuf.clear();
+ sendbuf.clear();
+ }
+ } finally {
+ source.close();
+ ssc.close();
+ fc.close();
+ file.delete();
+ }
+ }
+
+ /**
+ * Simple in-process server to echo bytes read by a given socket channel
+ */
+ static class EchoServer implements Runnable {
+ private SocketChannel sc;
+
+ public EchoServer(SocketChannel sc) {
+ this.sc = sc;
+ }
+
+ public void run() {
+ ByteBuffer bb = ByteBuffer.allocateDirect(1024);
+ try {
+ for (;;) {
+ int n = sc.read(bb);
+ if (n < 0)
+ break;
+
+ bb.flip();
+ while (bb.remaining() > 0) {
+ sc.write(bb);
+ }
+ bb.clear();
+ }
+ } catch (IOException x) {
+ x.printStackTrace();
+ } finally {
+ try {
+ sc.close();
+ } catch (IOException ignore) { }
+ }
+ }
+ }
+}