blob: 9a89f7ee528bde56eb9a28fb57ef30424d2aa120 [file] [log] [blame]
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.harmony.nio.tests.java.nio.channels;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.io.UnsupportedEncodingException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.nio.BufferOverflowException;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.ReadOnlyBufferException;
import java.nio.channels.ClosedChannelException;
import java.nio.channels.DatagramChannel;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.channels.NonReadableChannelException;
import java.nio.channels.NonWritableChannelException;
import java.nio.channels.OverlappingFileLockException;
import java.nio.channels.Pipe;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.channels.WritableByteChannel;
import java.nio.channels.FileChannel.MapMode;
import java.util.Arrays;
import junit.framework.TestCase;
public class FileChannelTest extends TestCase {
private static final int CAPACITY = 100;
private static final int LIMITED_CAPACITY = 2;
private static final int TIME_OUT = 10000;
private static final String CONTENT = "MYTESTSTRING needs to be a little long";
private static final byte[] TEST_BYTES;
private static final byte[] CONTENT_AS_BYTES;
private static final int CONTENT_AS_BYTES_LENGTH;
static {
try {
TEST_BYTES = "test".getBytes("iso8859-1");
CONTENT_AS_BYTES = CONTENT.getBytes("iso8859-1");
CONTENT_AS_BYTES_LENGTH = CONTENT_AS_BYTES.length;
} catch (UnsupportedEncodingException e) {
throw new Error(e);
}
}
private static final int CONTENT_LENGTH = CONTENT.length();
private FileChannel readOnlyFileChannel;
private FileChannel writeOnlyFileChannel;
private FileChannel readWriteFileChannel;
private File fileOfReadOnlyFileChannel;
private File fileOfWriteOnlyFileChannel;
private File fileOfReadWriteFileChannel;
private ReadableByteChannel readByteChannel;
private WritableByteChannel writableByteChannel;
private DatagramChannel datagramChannelSender;
private DatagramChannel datagramChannelReceiver;
private ServerSocketChannel serverSocketChannel;
private SocketChannel socketChannelSender;
private SocketChannel socketChannelReceiver;
private Pipe pipe;
// to read content from FileChannel
private FileInputStream fis;
private FileLock fileLock;
protected void setUp() throws Exception {
fileOfReadOnlyFileChannel = File.createTempFile(
"File_of_readOnlyFileChannel", "tmp");
fileOfReadOnlyFileChannel.deleteOnExit();
fileOfWriteOnlyFileChannel = File.createTempFile(
"File_of_writeOnlyFileChannel", "tmp");
fileOfWriteOnlyFileChannel.deleteOnExit();
fileOfReadWriteFileChannel = File.createTempFile(
"File_of_readWriteFileChannel", "tmp");
fileOfReadWriteFileChannel.deleteOnExit();
fis = null;
fileLock = null;
readOnlyFileChannel = new FileInputStream(fileOfReadOnlyFileChannel)
.getChannel();
writeOnlyFileChannel = new FileOutputStream(fileOfWriteOnlyFileChannel)
.getChannel();
readWriteFileChannel = new RandomAccessFile(fileOfReadWriteFileChannel,
"rw").getChannel();
}
protected void tearDown() {
if (null != readOnlyFileChannel) {
try {
readOnlyFileChannel.close();
} catch (IOException e) {
// do nothing
}
}
if (null != writeOnlyFileChannel) {
try {
writeOnlyFileChannel.close();
} catch (IOException e) {
// do nothing
}
}
if (null != readWriteFileChannel) {
try {
readWriteFileChannel.close();
} catch (IOException e) {
// do nothing
}
}
if (null != fis) {
try {
fis.close();
} catch (IOException e) {
// do nothing
}
}
if (null != fileLock) {
try {
fileLock.release();
} catch (IOException e) {
// do nothing
}
}
if (null != fileOfReadOnlyFileChannel) {
fileOfReadOnlyFileChannel.delete();
}
if (null != fileOfWriteOnlyFileChannel) {
fileOfWriteOnlyFileChannel.delete();
}
if (null != fileOfReadWriteFileChannel) {
fileOfReadWriteFileChannel.delete();
}
if (null != datagramChannelSender) {
try {
datagramChannelSender.close();
} catch (IOException e) {
// do nothing
}
}
if (null != datagramChannelReceiver) {
try {
datagramChannelReceiver.close();
} catch (IOException e) {
// do nothing
}
}
if (null != serverSocketChannel) {
try {
serverSocketChannel.close();
} catch (IOException e) {
// do nothing
}
}
if (null != socketChannelSender) {
try {
socketChannelSender.close();
} catch (IOException e) {
// do nothing
}
}
if (null != socketChannelReceiver) {
try {
socketChannelReceiver.close();
} catch (IOException e) {
// do nothing
}
}
if (null != pipe) {
if (null != pipe.source()) {
try {
pipe.source().close();
} catch (IOException e) {
// do nothing
}
}
if (null != pipe.sink()) {
try {
pipe.sink().close();
} catch (IOException e) {
// do nothing
}
}
}
}
/**
* @tests java.nio.channels.FileChannel#force(boolean)
*/
public void test_forceJ() throws Exception {
ByteBuffer writeBuffer = ByteBuffer.wrap(CONTENT_AS_BYTES);
writeOnlyFileChannel.write(writeBuffer);
writeOnlyFileChannel.force(true);
byte[] readBuffer = new byte[CONTENT_AS_BYTES_LENGTH];
fis = new FileInputStream(fileOfWriteOnlyFileChannel);
fis.read(readBuffer);
assertTrue(Arrays.equals(CONTENT_AS_BYTES, readBuffer));
}
/**
* @tests java.nio.channels.FileChannel#force(boolean)
*/
public void test_forceJ_closed() throws Exception {
writeOnlyFileChannel.close();
try {
writeOnlyFileChannel.force(true);
fail();
} catch (ClosedChannelException expected) {
}
try {
writeOnlyFileChannel.force(false);
fail();
} catch (ClosedChannelException expected) {
}
}
/**
* @tests java.nio.channels.FileChannel#force(boolean)
*/
public void test_forceJ_ReadOnlyChannel() throws Exception {
// force on a read only file channel has no effect.
readOnlyFileChannel.force(true);
readOnlyFileChannel.force(false);
}
/**
* @tests java.nio.channels.FileChannel#position()
*/
public void test_position_Init() throws Exception {
assertEquals(0, readOnlyFileChannel.position());
assertEquals(0, writeOnlyFileChannel.position());
assertEquals(0, readWriteFileChannel.position());
}
/**
* @tests java.nio.channels.FileChannel#position()
*/
public void test_position_ReadOnly() throws Exception {
writeDataToFile(fileOfReadOnlyFileChannel);
assertEquals(0, readOnlyFileChannel.position());
ByteBuffer readBuffer = ByteBuffer.allocate(CONTENT_LENGTH);
readOnlyFileChannel.read(readBuffer);
assertEquals(CONTENT_LENGTH, readOnlyFileChannel.position());
}
/**
* Initializes test file.
*
* @param file
* @throws FileNotFoundException
* @throws IOException
*/
private void writeDataToFile(File file) throws FileNotFoundException,
IOException {
FileOutputStream fos = new FileOutputStream(file);
try {
fos.write(CONTENT_AS_BYTES);
} finally {
fos.close();
}
}
/**
* Initializes large test file.
*
* @param file the file to be written
* @param size the content size to be written
* @throws FileNotFoundException
* @throws IOException
*/
private void writeLargeDataToFile(File file, int size) throws FileNotFoundException,
IOException {
FileOutputStream fos = new FileOutputStream(file);
byte[] buf = new byte[size];
try {
// we don't care about content - just need a particular file size
fos.write(buf);
} finally {
fos.close();
}
}
/**
* @tests java.nio.channels.FileChannel#position()
*/
public void test_position_WriteOnly() throws Exception {
ByteBuffer writeBuffer = ByteBuffer.wrap(CONTENT_AS_BYTES);
writeOnlyFileChannel.write(writeBuffer);
assertEquals(CONTENT_LENGTH, writeOnlyFileChannel.position());
}
/**
* @tests java.nio.channels.FileChannel#position()
*/
public void test_position_ReadWrite() throws Exception {
writeDataToFile(fileOfReadWriteFileChannel);
assertEquals(0, readWriteFileChannel.position());
ByteBuffer readBuffer = ByteBuffer.allocate(CONTENT_LENGTH);
readWriteFileChannel.read(readBuffer);
assertEquals(CONTENT_LENGTH, readWriteFileChannel.position());
ByteBuffer writeBuffer = ByteBuffer.wrap(CONTENT_AS_BYTES);
readWriteFileChannel.write(writeBuffer);
assertEquals(CONTENT_LENGTH * 2, readWriteFileChannel.position());
}
/**
* @tests java.nio.channels.FileChannel#position()
*/
public void test_position_Closed() throws Exception {
readOnlyFileChannel.close();
try {
readOnlyFileChannel.position();
fail("should throw ClosedChannelException");
} catch (ClosedChannelException expected) {
}
writeOnlyFileChannel.close();
try {
writeOnlyFileChannel.position();
fail("should throw ClosedChannelException");
} catch (ClosedChannelException expected) {
}
readWriteFileChannel.close();
try {
readWriteFileChannel.position();
fail("should throw ClosedChannelException");
} catch (ClosedChannelException expected) {
}
}
/**
* @tests java.nio.channels.FileChannel#position(long)
*/
public void test_positionJ_Closed() throws Exception {
final long POSITION = 100;
readOnlyFileChannel.close();
try {
readOnlyFileChannel.position(POSITION);
fail();
} catch (ClosedChannelException expected) {
}
writeOnlyFileChannel.close();
try {
writeOnlyFileChannel.position(POSITION);
fail();
} catch (ClosedChannelException expected) {
}
readWriteFileChannel.close();
try {
readWriteFileChannel.position(POSITION);
fail();
} catch (ClosedChannelException expected) {
}
}
/**
* @tests java.nio.channels.FileChannel#position(long)
*/
public void test_positionJ_Negative() throws Exception {
final long NEGATIVE_POSITION = -1;
try {
readOnlyFileChannel.position(NEGATIVE_POSITION);
fail("should throw IllegalArgumentException");
} catch (IllegalArgumentException e) {
// expected
}
try {
writeOnlyFileChannel.position(NEGATIVE_POSITION);
fail("should throw IllegalArgumentException");
} catch (IllegalArgumentException e) {
// expected
}
try {
readWriteFileChannel.position(NEGATIVE_POSITION);
fail("should throw IllegalArgumentException");
} catch (IllegalArgumentException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#position(long)
*/
public void test_positionJ_ReadOnly() throws Exception {
writeDataToFile(fileOfReadOnlyFileChannel);
// set the position of the read only file channel to POSITION
final int POSITION = 4;
readOnlyFileChannel.position(POSITION);
// reads the content left to readBuffer through read only file channel
ByteBuffer readBuffer = ByteBuffer.allocate(CONTENT_LENGTH);
int count = readOnlyFileChannel.read(readBuffer);
assertEquals(CONTENT_LENGTH - POSITION, count);
// asserts the content read is the part which stays beyond the POSITION
readBuffer.flip();
int i = POSITION;
while (readBuffer.hasRemaining()) {
assertEquals(CONTENT_AS_BYTES[i], readBuffer.get());
i++;
}
}
/**
* @tests java.nio.channels.FileChannel#position(long)
*/
public void test_positionJ_WriteOnly() throws Exception {
writeDataToFile(fileOfWriteOnlyFileChannel);
// init data to write
ByteBuffer writeBuffer = ByteBuffer.wrap(CONTENT_AS_BYTES);
// set the position of the write only file channel to POSITION
final int POSITION = 4;
writeOnlyFileChannel.position(POSITION);
// writes to the write only file channel
writeOnlyFileChannel.write(writeBuffer);
// force to write out.
writeOnlyFileChannel.close();
// gets the result of the write only file channel
byte[] result = new byte[POSITION + CONTENT_LENGTH];
fis = new FileInputStream(fileOfWriteOnlyFileChannel);
fis.read(result);
// constructs the expected result which has content[0... POSITION] plus
// content[0...length()]
byte[] expectedResult = new byte[POSITION + CONTENT_LENGTH];
System.arraycopy(CONTENT_AS_BYTES, 0, expectedResult, 0, POSITION);
System.arraycopy(CONTENT_AS_BYTES, 0, expectedResult, POSITION,
CONTENT_LENGTH);
// asserts result of the write only file channel same as expected
assertTrue(Arrays.equals(expectedResult, result));
}
/**
* @tests java.nio.channels.FileChannel#size()
*/
public void test_size_Init() throws Exception {
assertEquals(0, readOnlyFileChannel.size());
assertEquals(0, writeOnlyFileChannel.size());
assertEquals(0, readWriteFileChannel.size());
}
/**
* @tests java.nio.channels.FileChannel#size()
*/
public void test_size() throws Exception {
writeDataToFile(fileOfReadOnlyFileChannel);
assertEquals(fileOfReadOnlyFileChannel.length(), readOnlyFileChannel
.size());
// REGRESSION test for read(ByteBuffer[], int, int) on special files
try {
FileChannel specialFile =
new FileInputStream("/dev/zero").getChannel();
assertEquals(0, specialFile.size());
ByteBuffer buf = ByteBuffer.allocate(8);
assertEquals(8, specialFile.read(buf));
ByteBuffer[] bufs = { ByteBuffer.allocate(8) };
assertEquals(8, specialFile.read(bufs, 0, 1));
specialFile.close();
} catch (FileNotFoundException e) {
// skip test if special file doesn't exist
}
}
/**
* @tests java.nio.channels.FileChannel#size()
*/
public void test_size_Closed() throws Exception {
readOnlyFileChannel.close();
try {
readOnlyFileChannel.size();
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
writeOnlyFileChannel.close();
try {
writeOnlyFileChannel.size();
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
readWriteFileChannel.close();
try {
readWriteFileChannel.size();
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#truncate(long)
*/
public void test_truncateJ_Closed() throws Exception {
readOnlyFileChannel.close();
try {
readOnlyFileChannel.truncate(0);
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
writeOnlyFileChannel.close();
try {
writeOnlyFileChannel.truncate(0);
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
readWriteFileChannel.close();
try {
readWriteFileChannel.truncate(-1);
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#truncate(long)
*/
public void test_truncateJ_IllegalArgument() throws Exception {
// regression test for Harmony-941
try {
readOnlyFileChannel.truncate(-1);
fail("should throw IllegalArgumentException");
} catch (IllegalArgumentException e) {
// expected
}
try {
writeOnlyFileChannel.truncate(-1);
fail("should throw IllegalArgumentException");
} catch (IllegalArgumentException e) {
// expected
}
try {
readWriteFileChannel.truncate(-1);
fail("should throw IllegalArgumentException");
} catch (IllegalArgumentException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#truncate(long)
*/
public void test_truncateJ_ReadOnly() throws Exception {
writeDataToFile(fileOfReadOnlyFileChannel);
try {
readOnlyFileChannel.truncate(readOnlyFileChannel.size());
fail("should throw NonWritableChannelException.");
} catch (NonWritableChannelException e) {
// expected
}
try {
readOnlyFileChannel.truncate(0);
fail("should throw NonWritableChannelException.");
} catch (NonWritableChannelException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#truncate(long)
*/
public void test_truncateJ() throws Exception {
writeDataToFile(fileOfReadWriteFileChannel);
int truncateLength = CONTENT_LENGTH + 2;
assertEquals(readWriteFileChannel, readWriteFileChannel
.truncate(truncateLength));
assertEquals(CONTENT_LENGTH, fileOfReadWriteFileChannel.length());
truncateLength = CONTENT_LENGTH;
assertEquals(readWriteFileChannel, readWriteFileChannel
.truncate(truncateLength));
assertEquals(CONTENT_LENGTH, fileOfReadWriteFileChannel.length());
truncateLength = CONTENT_LENGTH / 2;
assertEquals(readWriteFileChannel, readWriteFileChannel
.truncate(truncateLength));
assertEquals(truncateLength, fileOfReadWriteFileChannel.length());
}
/**
* @tests java.nio.channels.FileChannel#lock()
*/
public void test_lock() throws Exception {
MockFileChannel mockFileChannel = new MockFileChannel();
// Verify that calling lock() leads to the method
// lock(long, long, boolean) being called with a 0 for the
// first parameter, Long.MAX_VALUE as the second parameter and false
// as the third parameter.
mockFileChannel.lock();
assertTrue(mockFileChannel.isLockCalled);
}
/**
* @tests java.nio.channels.FileChannel#lock(long, long, boolean)
*/
public void test_lockJJZ_Closed() throws Exception {
readOnlyFileChannel.close();
try {
readOnlyFileChannel.lock(0, 10, false);
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
writeOnlyFileChannel.close();
try {
writeOnlyFileChannel.lock(0, 10, false);
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
readWriteFileChannel.close();
try {
readWriteFileChannel.lock(0, 10, false);
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
// throws ClosedChannelException before IllegalArgumentException
try {
readWriteFileChannel.lock(-1, 0, false);
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#lock(long, long, boolean)
*/
public void test_lockJJZ_IllegalArgument() throws Exception {
try {
writeOnlyFileChannel.lock(0, -1, false);
fail("should throw IllegalArgumentException");
} catch (IllegalArgumentException e) {
// expected
}
try {
writeOnlyFileChannel.lock(-1, 0, false);
fail("should throw IllegalArgumentException");
} catch (IllegalArgumentException e) {
// expected
}
try {
readWriteFileChannel.lock(-1, -1, false);
fail("should throw IllegalArgumentException");
} catch (IllegalArgumentException e) {
// expected
}
try {
readWriteFileChannel.lock(Long.MAX_VALUE, 1, false);
fail("should throw IllegalArgumentException");
} catch (IllegalArgumentException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#lock(long, long, boolean)
*/
public void test_lockJJZ_NonWritable() throws Exception {
try {
readOnlyFileChannel.lock(0, 10, false);
fail("should throw NonWritableChannelException");
} catch (NonWritableChannelException e) {
// expected
}
// throws NonWritableChannelException before IllegalArgumentException
try {
readOnlyFileChannel.lock(-1, 0, false);
fail("should throw NonWritableChannelException");
} catch (NonWritableChannelException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#lock(long, long, boolean)
*/
public void test_lockJJZ_NonReadable() throws Exception {
try {
writeOnlyFileChannel.lock(0, 10, true);
fail("should throw NonReadableChannelException");
} catch (NonReadableChannelException e) {
// expected
}
// throws NonReadableChannelException before IllegalArgumentException
try {
writeOnlyFileChannel.lock(-1, 0, true);
fail("should throw NonReadableChannelException");
} catch (NonReadableChannelException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#lock(long, long, boolean)
*/
public void test_lockJJZ_Shared() throws Exception {
final long POSITION = 100;
final long SIZE = 200;
fileLock = readOnlyFileChannel.lock(POSITION, SIZE, true);
assertTrue(fileLock.isValid());
// fileLock.isShared depends on whether the underlying platform support
// shared lock, but it works on Windows & Linux.
assertTrue(fileLock.isShared());
assertSame(readOnlyFileChannel, fileLock.channel());
assertEquals(POSITION, fileLock.position());
assertEquals(SIZE, fileLock.size());
}
/**
* @tests java.nio.channels.FileChannel#lock(long, long, boolean)
*/
public void test_lockJJZ_NotShared() throws Exception {
final long POSITION = 100;
final long SIZE = 200;
fileLock = writeOnlyFileChannel.lock(POSITION, SIZE, false);
assertTrue(fileLock.isValid());
assertFalse(fileLock.isShared());
assertSame(writeOnlyFileChannel, fileLock.channel());
assertEquals(POSITION, fileLock.position());
assertEquals(SIZE, fileLock.size());
}
/**
* @tests java.nio.channels.FileChannel#lock(long, long, boolean)
*/
public void test_lockJJZ_Long_MAX_VALUE() throws Exception {
final long POSITION = 0;
final long SIZE = Long.MAX_VALUE;
fileLock = readOnlyFileChannel.lock(POSITION, SIZE, true);
assertTrue(fileLock.isValid());
assertTrue(fileLock.isShared());
assertEquals(POSITION, fileLock.position());
assertEquals(SIZE, fileLock.size());
assertSame(readOnlyFileChannel, fileLock.channel());
}
/**
* @tests java.nio.channels.FileChannel#lock(long, long, boolean)
*/
public void test_lockJJZ_Overlapping() throws Exception {
final long POSITION = 100;
final long SIZE = 200;
fileLock = writeOnlyFileChannel.lock(POSITION, SIZE, false);
assertTrue(fileLock.isValid());
try {
writeOnlyFileChannel.lock(POSITION + 1, SIZE, false);
fail("should throw OverlappingFileLockException");
} catch (OverlappingFileLockException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#lock(long, long, boolean)
*/
public void test_lockJJZ_NotOverlapping() throws Exception {
final long POSITION = 100;
final long SIZE = 200;
FileLock fileLock1 = writeOnlyFileChannel.lock(POSITION, SIZE, false);
assertTrue(fileLock1.isValid());
FileLock fileLock2 = writeOnlyFileChannel.lock(POSITION + SIZE, SIZE,
false);
assertTrue(fileLock2.isValid());
}
/**
* @tests java.nio.channels.FileChannel#lock(long,long,boolean)
*/
public void test_lockJJZ_After_Release() throws Exception {
fileLock = writeOnlyFileChannel.lock(0, 10, false);
fileLock.release();
// after release file lock can be obtained again.
fileLock = writeOnlyFileChannel.lock(0, 10, false);
assertTrue(fileLock.isValid());
}
/**
* @tests java.nio.channels.FileChannel#tryLock()
*/
public void test_tryLock() throws Exception {
MockFileChannel mockFileChannel = new MockFileChannel();
// Verify that calling tryLock() leads to the method
// tryLock(long, long, boolean) being called with a 0 for the
// first parameter, Long.MAX_VALUE as the second parameter and false
// as the third parameter.
mockFileChannel.tryLock();
assertTrue(mockFileChannel.isTryLockCalled);
}
/**
* @tests java.nio.channels.FileChannel#tryLock(long, long, boolean)
*/
public void test_tryLockJJZ_Closed() throws Exception {
readOnlyFileChannel.close();
try {
readOnlyFileChannel.tryLock(0, 10, false);
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
writeOnlyFileChannel.close();
try {
writeOnlyFileChannel.tryLock(0, 10, false);
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
readWriteFileChannel.close();
try {
readWriteFileChannel.tryLock(0, 10, false);
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
// throws ClosedChannelException before IllegalArgumentException
try {
readWriteFileChannel.tryLock(-1, 0, false);
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#tryLock(long, long, boolean)
*/
public void test_tryLockJJZ_IllegalArgument() throws Exception {
try {
writeOnlyFileChannel.tryLock(0, -1, false);
fail("should throw IllegalArgumentException");
} catch (IllegalArgumentException e) {
// expected
}
try {
writeOnlyFileChannel.tryLock(-1, 0, false);
fail("should throw IllegalArgumentException");
} catch (IllegalArgumentException e) {
// expected
}
try {
readWriteFileChannel.tryLock(-1, -1, false);
fail("should throw IllegalArgumentException");
} catch (IllegalArgumentException e) {
// expected
}
try {
readWriteFileChannel.tryLock(Long.MAX_VALUE, 1, false);
fail("should throw IllegalArgumentException");
} catch (IllegalArgumentException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#tryLock(long, long, boolean)
*/
public void test_tryLockJJZ_NonWritable() throws Exception {
try {
readOnlyFileChannel.tryLock(0, 10, false);
fail("should throw NonWritableChannelException");
} catch (NonWritableChannelException e) {
// expected
}
// throws NonWritableChannelException before IllegalArgumentException
try {
readOnlyFileChannel.tryLock(-1, 0, false);
fail("should throw NonWritableChannelException");
} catch (NonWritableChannelException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#tryLock(long, long, boolean)
*/
public void test_tryLockJJZ_NonReadable() throws Exception {
try {
writeOnlyFileChannel.tryLock(0, 10, true);
fail("should throw NonReadableChannelException");
} catch (NonReadableChannelException e) {
// expected
}
// throws NonReadableChannelException before IllegalArgumentException
try {
writeOnlyFileChannel.tryLock(-1, 0, true);
fail("should throw NonReadableChannelException");
} catch (NonReadableChannelException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#tryLock(long, long, boolean)
*/
public void test_tryLockJJZ_Shared() throws Exception {
final long POSITION = 100;
final long SIZE = 200;
fileLock = readOnlyFileChannel.tryLock(POSITION, SIZE, true);
assertTrue(fileLock.isValid());
// fileLock.isShared depends on whether the underlying platform support
// shared lock, but it works on Windows & Linux.
assertTrue(fileLock.isShared());
assertSame(readOnlyFileChannel, fileLock.channel());
assertEquals(POSITION, fileLock.position());
assertEquals(SIZE, fileLock.size());
}
/**
* @tests java.nio.channels.FileChannel#tryLock(long, long, boolean)
*/
public void test_tryLockJJZ_NotShared() throws Exception {
final long POSITION = 100;
final long SIZE = 200;
fileLock = writeOnlyFileChannel.tryLock(POSITION, SIZE, false);
assertTrue(fileLock.isValid());
assertFalse(fileLock.isShared());
assertSame(writeOnlyFileChannel, fileLock.channel());
assertEquals(POSITION, fileLock.position());
assertEquals(SIZE, fileLock.size());
}
/**
* @tests java.nio.channels.FileChannel#tryLock(long, long, boolean)
*/
public void test_tryLockJJZ_Long_MAX_VALUE() throws Exception {
final long POSITION = 0;
final long SIZE = Long.MAX_VALUE;
fileLock = readOnlyFileChannel.tryLock(POSITION, SIZE, true);
assertTrue(fileLock.isValid());
assertTrue(fileLock.isShared());
assertEquals(POSITION, fileLock.position());
assertEquals(SIZE, fileLock.size());
assertSame(readOnlyFileChannel, fileLock.channel());
}
/**
* @tests java.nio.channels.FileChannel#tryLock(long, long, boolean)
*/
public void test_tryLockJJZ_Overlapping() throws Exception {
final long POSITION = 100;
final long SIZE = 200;
fileLock = writeOnlyFileChannel.lock(POSITION, SIZE, false);
assertTrue(fileLock.isValid());
try {
writeOnlyFileChannel.lock(POSITION + 1, SIZE, false);
fail("should throw OverlappingFileLockException");
} catch (OverlappingFileLockException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#tryLock(long, long, boolean)
*/
public void test_tryLockJJZ_NotOverlapping() throws Exception {
final long POSITION = 100;
final long SIZE = 200;
FileLock fileLock1 = writeOnlyFileChannel
.tryLock(POSITION, SIZE, false);
assertTrue(fileLock1.isValid());
FileLock fileLock2 = writeOnlyFileChannel.tryLock(POSITION + SIZE,
SIZE, false);
assertTrue(fileLock2.isValid());
}
/**
* @tests java.nio.channels.FileChannel#tryLock(long,long,boolean)
*/
public void test_tryLockJJZ_After_Release() throws Exception {
fileLock = writeOnlyFileChannel.tryLock(0, 10, false);
fileLock.release();
// after release file lock can be obtained again.
fileLock = writeOnlyFileChannel.tryLock(0, 10, false);
assertTrue(fileLock.isValid());
}
/**
* @tests java.nio.channels.FileChannel#read(ByteBuffer)
*/
public void test_readLByteBuffer_Null() throws Exception {
ByteBuffer readBuffer = null;
try {
readOnlyFileChannel.read(readBuffer);
fail("should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
try {
readWriteFileChannel.read(readBuffer);
fail("should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#read(ByteBuffer)
*/
public void test_readLByteBuffer_Closed() throws Exception {
ByteBuffer readBuffer = ByteBuffer.allocate(CAPACITY);
readOnlyFileChannel.close();
try {
readOnlyFileChannel.read(readBuffer);
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
writeOnlyFileChannel.close();
try {
writeOnlyFileChannel.read(readBuffer);
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
readWriteFileChannel.close();
try {
readWriteFileChannel.read(readBuffer);
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
// should throw ClosedChannelException first
readBuffer = null;
try {
readWriteFileChannel.read(readBuffer);
fail();
} catch (ClosedChannelException expected) {
} catch (NullPointerException expected) {
}
}
public void test_readLByteBuffer_WriteOnly() throws Exception {
ByteBuffer readBuffer = ByteBuffer.allocate(CAPACITY);
try {
writeOnlyFileChannel.read(readBuffer);
fail();
} catch (NonReadableChannelException expected) {
}
readBuffer = null;
try {
writeOnlyFileChannel.read(readBuffer);
fail();
} catch (NonReadableChannelException expected) {
} catch (NullPointerException expected) {
}
}
public void test_readLByteBuffer_EmptyFile() throws Exception {
ByteBuffer readBuffer = ByteBuffer.allocate(CAPACITY);
int result = readOnlyFileChannel.read(readBuffer);
assertEquals(-1, result);
assertEquals(0, readBuffer.position());
}
/**
* @tests java.nio.channels.FileChannel#read(ByteBuffer)
*/
public void test_readLByteBuffer_LimitedCapacity() throws Exception {
writeDataToFile(fileOfReadOnlyFileChannel);
ByteBuffer readBuffer = ByteBuffer.allocate(LIMITED_CAPACITY);
int result = readOnlyFileChannel.read(readBuffer);
assertEquals(LIMITED_CAPACITY, result);
assertEquals(LIMITED_CAPACITY, readBuffer.position());
readBuffer.flip();
for (int i = 0; i < LIMITED_CAPACITY; i++) {
assertEquals(CONTENT_AS_BYTES[i], readBuffer.get());
}
}
public void test_readLByteBuffer() throws Exception {
writeDataToFile(fileOfReadOnlyFileChannel);
ByteBuffer readBuffer = ByteBuffer.allocate(CONTENT_AS_BYTES_LENGTH);
int result = readOnlyFileChannel.read(readBuffer);
assertEquals(CONTENT_AS_BYTES_LENGTH, result);
assertEquals(CONTENT_AS_BYTES_LENGTH, readBuffer.position());
readBuffer.flip();
for (int i = 0; i < CONTENT_AS_BYTES_LENGTH; i++) {
assertEquals(CONTENT_AS_BYTES[i], readBuffer.get());
}
}
public void test_readLByteBufferJ_Null() throws Exception {
try {
readOnlyFileChannel.read(null, 0);
fail();
} catch (NullPointerException expected) {
}
try {
readWriteFileChannel.read(null, 0);
fail();
} catch (NullPointerException expected) {
}
}
public void test_readLByteBufferJ_Closed() throws Exception {
ByteBuffer readBuffer = ByteBuffer.allocate(CAPACITY);
readOnlyFileChannel.close();
try {
readOnlyFileChannel.read(readBuffer, 0);
fail();
} catch (ClosedChannelException expected) {
}
readWriteFileChannel.close();
try {
readWriteFileChannel.read(readBuffer, 0);
fail();
} catch (ClosedChannelException expected) {
}
}
public void test_readLByteBufferJ_IllegalArgument() throws Exception {
ByteBuffer readBuffer = ByteBuffer.allocate(CAPACITY);
try {
readOnlyFileChannel.read(readBuffer, -1);
fail();
} catch (IllegalArgumentException expected) {
}
try {
writeOnlyFileChannel.read(readBuffer, -1);
fail();
} catch (IllegalArgumentException expected) {
}
try {
readWriteFileChannel.read(readBuffer, -1);
fail();
} catch (IllegalArgumentException expected) {
}
}
public void test_readLByteBufferJ_WriteOnly() throws Exception {
ByteBuffer readBuffer = ByteBuffer.allocate(CAPACITY);
try {
writeOnlyFileChannel.read(readBuffer, 0);
fail();
} catch (NonReadableChannelException expected) {
}
}
public void test_readLByteBufferJ_Emptyfile() throws Exception {
ByteBuffer readBuffer = ByteBuffer.allocate(CAPACITY);
int result = readOnlyFileChannel.read(readBuffer, 0);
assertEquals(-1, result);
assertEquals(0, readBuffer.position());
}
public void test_readLByteBufferJ_Position_BeyondFileLimit() throws Exception {
writeDataToFile(fileOfReadOnlyFileChannel);
ByteBuffer readBuffer = ByteBuffer.allocate(CAPACITY);
int result = readOnlyFileChannel.read(readBuffer,
CONTENT_AS_BYTES.length);
assertEquals(-1, result);
assertEquals(0, readBuffer.position());
}
public void test_readLByteBufferJ_Position_As_Long() throws Exception {
ByteBuffer readBuffer = ByteBuffer.allocate(CAPACITY);
try {
readOnlyFileChannel.read(readBuffer, Long.MAX_VALUE);
} catch (IOException expected) {
}
}
public void test_readLByteBufferJ() throws Exception {
writeDataToFile(fileOfReadOnlyFileChannel);
ByteBuffer readBuffer = ByteBuffer.allocate(CAPACITY);
final int BUFFER_POSITION = 1;
readBuffer.position(BUFFER_POSITION);
final int POSITION = 2;
int result = readOnlyFileChannel.read(readBuffer, POSITION);
assertEquals(CONTENT_AS_BYTES_LENGTH - POSITION, result);
assertEquals(BUFFER_POSITION + result, readBuffer.position());
readBuffer.flip();
readBuffer.position(BUFFER_POSITION);
for (int i = POSITION; i < CONTENT_AS_BYTES_LENGTH; i++) {
assertEquals(CONTENT_AS_BYTES[i], readBuffer.get());
}
}
/**
* @tests java.nio.channels.FileChannel#read(ByteBuffer[])
*/
public void test_read$LByteBuffer() throws Exception {
// regression test for Harmony-849
writeDataToFile(fileOfReadOnlyFileChannel);
ByteBuffer[] readBuffers = new ByteBuffer[2];
readBuffers[0] = ByteBuffer.allocate(CAPACITY);
readBuffers[1] = ByteBuffer.allocate(CAPACITY);
long readCount = readOnlyFileChannel.read(readBuffers);
assertEquals(CONTENT_AS_BYTES_LENGTH, readCount);
assertEquals(CONTENT_AS_BYTES_LENGTH, readBuffers[0].position());
assertEquals(0, readBuffers[1].position());
readBuffers[0].flip();
for (int i = 0; i < CONTENT_AS_BYTES_LENGTH; i++) {
assertEquals(CONTENT_AS_BYTES[i], readBuffers[0].get());
}
}
/**
* @tests java.nio.channels.FileChannel#read(ByteBuffer[])
*/
public void test_read$LByteBuffer_mock() throws Exception {
FileChannel mockChannel = new MockFileChannel();
ByteBuffer[] buffers = new ByteBuffer[2];
mockChannel.read(buffers);
// Verify that calling read(ByteBuffer[] dsts) leads to the method
// read(dsts, 0, dsts.length)
assertTrue(((MockFileChannel)mockChannel).isReadCalled);
}
/**
* @tests java.nio.channels.FileChannel#read(ByteBuffer[], int, int)
*/
public void test_read$LByteBufferII_Null() throws Exception {
ByteBuffer[] readBuffers = null;
try {
readOnlyFileChannel.read(readBuffers, 0, 1);
fail("should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
try {
readOnlyFileChannel.read(readBuffers, 1, 11);
fail("should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
try {
writeOnlyFileChannel.read(readBuffers, 0, 1);
fail("should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
try {
readWriteFileChannel.read(readBuffers, 0, 1);
fail("should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
// first throws NullPointerException
writeOnlyFileChannel.close();
try {
writeOnlyFileChannel.read(readBuffers, 0, 1);
fail("should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#read(ByteBuffer[], int, int)
*/
public void test_read$LByteBufferII_Closed() throws Exception {
ByteBuffer[] readBuffers = new ByteBuffer[2];
readBuffers[0] = ByteBuffer.allocate(CAPACITY);
readOnlyFileChannel.close();
try {
readOnlyFileChannel.read(readBuffers, 0, 1);
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
writeOnlyFileChannel.close();
try {
writeOnlyFileChannel.read(readBuffers, 0, 1);
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
readWriteFileChannel.close();
try {
readWriteFileChannel.read(readBuffers, 0, 1);
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
// regression test for Harmony-902
readBuffers[0] = null;
try {
readOnlyFileChannel.read(readBuffers, 0, 1);
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
try {
writeOnlyFileChannel.read(readBuffers, 0, 1);
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
try {
readWriteFileChannel.read(readBuffers, 0, 1);
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#read(ByteBuffer[], int, int)
*/
public void test_read$LByteBufferII_WriteOnly() throws Exception {
ByteBuffer[] readBuffers = new ByteBuffer[2];
readBuffers[0] = ByteBuffer.allocate(CAPACITY);
try {
writeOnlyFileChannel.read(readBuffers, 0, 1);
fail("should throw NonReadableChannelException");
} catch (NonReadableChannelException e) {
// expected
}
// first throws NonReadableChannelException.
readBuffers[0] = null;
try {
writeOnlyFileChannel.read(readBuffers, 0, 1);
fail("should throw NonReadableChannelException");
} catch (NonReadableChannelException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#read(ByteBuffer[], int, int)
*/
public void test_read$LByteBufferII_IndexOutOfBound() throws Exception {
ByteBuffer[] readBuffers = new ByteBuffer[2];
readBuffers[0] = ByteBuffer.allocate(CAPACITY);
readBuffers[1] = ByteBuffer.allocate(CAPACITY);
try {
readOnlyFileChannel.read(readBuffers, 2, 1);
fail();
} catch (IndexOutOfBoundsException expected) {
}
try {
readWriteFileChannel.read(null, -1, 0);
fail();
} catch (IndexOutOfBoundsException expected) {
} catch (NullPointerException expected) {
}
try {
writeOnlyFileChannel.read(readBuffers, 0, 3);
fail();
} catch (IndexOutOfBoundsException expected) {
}
try {
readWriteFileChannel.read(readBuffers, -1, 0);
fail();
} catch (IndexOutOfBoundsException expected) {
}
readWriteFileChannel.close();
try {
readWriteFileChannel.read(readBuffers, 0, 3);
fail();
} catch (IndexOutOfBoundsException expected) {
}
}
/**
* @tests java.nio.channels.FileChannel#read(ByteBuffer[], int, int)
*/
public void test_read$LByteBufferII_EmptyFile() throws Exception {
ByteBuffer[] readBuffers = new ByteBuffer[2];
readBuffers[0] = ByteBuffer.allocate(CAPACITY);
readBuffers[1] = ByteBuffer.allocate(CAPACITY);
long result = readOnlyFileChannel.read(readBuffers, 0, 2);
assertEquals(-1, result);
assertEquals(0, readBuffers[0].position());
assertEquals(0, readBuffers[1].position());
}
/**
* @tests java.nio.channels.FileChannel#read(ByteBuffer[], int, int)
*/
public void test_read$LByteBufferII_EmptyBuffers() throws Exception {
ByteBuffer[] readBuffers = new ByteBuffer[2];
try {
readOnlyFileChannel.read(readBuffers, 0, 2);
} catch (NullPointerException e) {
// expected
}
writeDataToFile(fileOfReadOnlyFileChannel);
readBuffers[0] = ByteBuffer.allocate(CAPACITY);
try {
readOnlyFileChannel.read(readBuffers, 0, 2);
} catch (NullPointerException e) {
// expected
}
long result = readOnlyFileChannel.read(readBuffers, 0, 1);
assertEquals(CONTENT_AS_BYTES_LENGTH, result);
}
/**
* @tests java.nio.channels.FileChannel#read(ByteBuffer[], int, int)
*/
public void test_read$LByteBufferII_EmptyFile_EmptyBuffers()
throws Exception {
ByteBuffer[] readBuffers = new ByteBuffer[2];
// will not throw NullPointerException
long result = readOnlyFileChannel.read(readBuffers, 0, 0);
assertEquals(0, result);
}
/**
* @tests java.nio.channels.FileChannel#read(ByteBuffer[], int, int)
*/
public void test_read$LByteBufferII_Length_Zero() throws Exception {
writeDataToFile(fileOfReadOnlyFileChannel);
ByteBuffer[] readBuffers = new ByteBuffer[2];
readBuffers[0] = ByteBuffer.allocate(LIMITED_CAPACITY);
readBuffers[1] = ByteBuffer.allocate(LIMITED_CAPACITY);
long result = readOnlyFileChannel.read(readBuffers, 1, 0);
assertEquals(0, result);
}
/**
* @tests java.nio.channels.FileChannel#read(ByteBuffer[], int, int)
*/
public void test_read$LByteBufferII_LimitedCapacity() throws Exception {
writeDataToFile(fileOfReadOnlyFileChannel);
ByteBuffer[] readBuffers = new ByteBuffer[2];
readBuffers[0] = ByteBuffer.allocate(LIMITED_CAPACITY);
readBuffers[1] = ByteBuffer.allocate(LIMITED_CAPACITY);
// reads to the second buffer
long result = readOnlyFileChannel.read(readBuffers, 1, 1);
assertEquals(LIMITED_CAPACITY, result);
assertEquals(0, readBuffers[0].position());
assertEquals(LIMITED_CAPACITY, readBuffers[1].position());
readBuffers[1].flip();
for (int i = 0; i < LIMITED_CAPACITY; i++) {
assertEquals(CONTENT_AS_BYTES[i], readBuffers[1].get());
}
}
/**
* @tests java.nio.channels.FileChannel#read(ByteBuffer[], int, int)
*/
public void test_read$LByteBufferII() throws Exception {
writeDataToFile(fileOfReadOnlyFileChannel);
ByteBuffer[] readBuffers = new ByteBuffer[2];
readBuffers[0] = ByteBuffer.allocate(CAPACITY);
readBuffers[1] = ByteBuffer.allocate(CAPACITY);
// writes to the second buffer
assertEquals(CONTENT_AS_BYTES_LENGTH, readOnlyFileChannel.read(
readBuffers, 1, 1));
assertEquals(0, readBuffers[0].position());
assertEquals(CONTENT_AS_BYTES_LENGTH, readBuffers[1].position());
readBuffers[1].flip();
for (int i = 0; i < CONTENT_AS_BYTES_LENGTH; i++) {
assertEquals(CONTENT_AS_BYTES[i], readBuffers[1].get());
}
}
/**
* @tests java.nio.channels.FileChannel#isOpen()
*/
public void test_isOpen() throws Exception {
// Regression for HARMONY-40
File logFile = File.createTempFile("out", "tmp");
logFile.deleteOnExit();
FileOutputStream out = new FileOutputStream(logFile, true);
FileChannel channel = out.getChannel();
out.write(1);
out.close();
assertFalse("Assert 0: Channel is still open", channel.isOpen());
}
/**
* @tests java.nio.channels.FileChannel#position()
*/
public void test_position_append() throws Exception {
// Regression test for Harmony-508
File tmpfile = File.createTempFile("FileOutputStream", "tmp");
tmpfile.deleteOnExit();
FileOutputStream fos = new FileOutputStream(tmpfile);
byte[] b = new byte[10];
for (int i = 0; i < b.length; i++) {
b[i] = (byte) i;
}
fos.write(b);
fos.flush();
fos.close();
FileOutputStream f = new FileOutputStream(tmpfile, true);
// Harmony expected 10, but the RI and Android report 0.
assertEquals(0, f.getChannel().position());
}
/**
* @tests java.nio.channels.FileChannel#map(MapMode,long,long)
*/
public void test_map_AbnormalMode() throws IOException {
try {
writeOnlyFileChannel.map(MapMode.READ_ONLY, 0, CONTENT_LENGTH);
fail("should throw NonReadableChannelException.");
} catch (NonReadableChannelException ex) {
// expected;
}
try {
writeOnlyFileChannel.map(MapMode.READ_WRITE, 0, CONTENT_LENGTH);
fail("should throw NonReadableChannelException.");
} catch (NonReadableChannelException ex) {
// expected;
}
try {
writeOnlyFileChannel.map(MapMode.PRIVATE, 0, CONTENT_LENGTH);
fail("should throw NonReadableChannelException.");
} catch (NonReadableChannelException ex) {
// expected;
}
writeOnlyFileChannel.close();
try {
writeOnlyFileChannel.map(MapMode.READ_WRITE, 0, -1);
fail("should throw ClosedChannelException.");
} catch (ClosedChannelException ex) {
// expected;
}
try {
readOnlyFileChannel.map(MapMode.READ_WRITE, 0, CONTENT_LENGTH);
fail("should throw NonWritableChannelException .");
} catch (NonWritableChannelException ex) {
// expected;
}
try {
readOnlyFileChannel.map(MapMode.PRIVATE, 0, CONTENT_LENGTH);
fail("should throw NonWritableChannelException .");
} catch (NonWritableChannelException ex) {
// expected;
}
try {
readOnlyFileChannel.map(MapMode.READ_WRITE, -1, CONTENT_LENGTH);
fail("should throw IAE.");
} catch (IllegalArgumentException ex) {
// expected;
}
try {
readOnlyFileChannel.map(MapMode.READ_WRITE, 0, -1);
fail("should throw IAE.");
} catch (IllegalArgumentException ex) {
// expected;
}
try {
readOnlyFileChannel.map(MapMode.READ_ONLY, 0, CONTENT_LENGTH + 1);
fail();
} catch (NonWritableChannelException expected) {
} catch (IOException expected) {
}
try {
readOnlyFileChannel.map(MapMode.READ_ONLY, 2, CONTENT_LENGTH - 1);
fail();
} catch (NonWritableChannelException expected) {
} catch (IOException expected) {
}
readOnlyFileChannel.close();
try {
readOnlyFileChannel.map(MapMode.READ_WRITE, 0, -1);
fail("should throw ClosedChannelException.");
} catch (ClosedChannelException ex) {
// expected;
}
try {
readOnlyFileChannel.map(MapMode.READ_ONLY, 2, CONTENT_LENGTH - 1);
fail("should throw IOException.");
} catch (IOException ex) {
// expected;
}
readWriteFileChannel.close();
try {
readWriteFileChannel.map(MapMode.READ_WRITE, 0, -1);
fail("should throw ClosedChannelException.");
} catch (ClosedChannelException ex) {
// expected;
}
}
/**
* @tests java.nio.channels.FileChannel#map(MapMode,long,long)
*/
public void test_map_ReadOnly_CloseChannel() throws IOException {
// close channel has no effect on map if mapped
assertEquals(0, readWriteFileChannel.size());
MappedByteBuffer mapped = readWriteFileChannel.map(MapMode.READ_ONLY,
0, CONTENT_LENGTH);
assertEquals(CONTENT_LENGTH, readWriteFileChannel.size());
readOnlyFileChannel.close();
assertEquals(CONTENT_LENGTH, mapped.limit());
}
/**
* @tests java.nio.channels.FileChannel#map(MapMode,long,long)
*/
public void test_map_Private_CloseChannel() throws IOException {
MappedByteBuffer mapped = readWriteFileChannel.map(MapMode.PRIVATE, 0,
CONTENT_LENGTH);
readWriteFileChannel.close();
mapped.put(TEST_BYTES);
assertEquals(CONTENT_LENGTH, mapped.limit());
assertEquals("test".length(), mapped.position());
}
/**
* @tests java.nio.channels.FileChannel#map(MapMode,long,long)
*/
public void test_map_ReadOnly() throws IOException {
MappedByteBuffer mapped = null;
// try put something to readonly map
writeDataToFile(fileOfReadOnlyFileChannel);
mapped = readOnlyFileChannel.map(MapMode.READ_ONLY, 0, CONTENT_LENGTH);
try {
mapped.put(TEST_BYTES);
fail("should throw ReadOnlyBufferException.");
} catch (ReadOnlyBufferException ex) {
// expected;
}
assertEquals(CONTENT_LENGTH, mapped.limit());
assertEquals(CONTENT_LENGTH, mapped.capacity());
assertEquals(0, mapped.position());
// try to get a readonly map from read/write channel
writeDataToFile(fileOfReadWriteFileChannel);
mapped = readWriteFileChannel.map(MapMode.READ_ONLY, 0, CONTENT
.length());
assertEquals(CONTENT_LENGTH, mapped.limit());
assertEquals(CONTENT_LENGTH, mapped.capacity());
assertEquals(0, mapped.position());
// map not change channel's position
assertEquals(0, readOnlyFileChannel.position());
assertEquals(0, readWriteFileChannel.position());
}
/**
* @tests java.nio.channels.FileChannel#map(MapMode,long,long)
*/
public void test_map_ReadOnly_NonZeroPosition() throws IOException {
this.writeDataToFile(fileOfReadOnlyFileChannel);
MappedByteBuffer mapped = readOnlyFileChannel.map(MapMode.READ_ONLY,
10, CONTENT_LENGTH - 10);
assertEquals(CONTENT_LENGTH - 10, mapped.limit());
assertEquals(CONTENT_LENGTH - 10, mapped.capacity());
assertEquals(0, mapped.position());
}
/**
* @tests java.nio.channels.FileChannel#map(MapMode,long,long)
*/
public void test_map_Private() throws IOException {
this.writeDataToFile(fileOfReadWriteFileChannel);
MappedByteBuffer mapped = readWriteFileChannel.map(MapMode.PRIVATE, 0,
CONTENT_LENGTH);
assertEquals(CONTENT_LENGTH, mapped.limit());
// test copy on write if private
ByteBuffer returnByPut = mapped.put(TEST_BYTES);
assertSame(returnByPut, mapped);
ByteBuffer checkBuffer = ByteBuffer.allocate(CONTENT_LENGTH);
mapped.force();
readWriteFileChannel.read(checkBuffer);
assertEquals(CONTENT, new String(checkBuffer.array(), "iso8859-1"));
// test overflow
try {
mapped.put(("test" + CONTENT).getBytes("iso8859-1"));
fail("should throw BufferOverflowException.");
} catch (BufferOverflowException ex) {
// expected;
}
}
/**
* @tests java.nio.channels.FileChannel#map(MapMode,long,long)
*/
public void test_map_Private_NonZeroPosition() throws IOException {
MappedByteBuffer mapped = readWriteFileChannel.map(MapMode.PRIVATE, 10,
CONTENT_LENGTH - 10);
assertEquals(CONTENT_LENGTH - 10, mapped.limit());
assertEquals(CONTENT_LENGTH - 10, mapped.capacity());
assertEquals(0, mapped.position());
}
/**
* @tests java.nio.channels.FileChannel#map(MapMode,long,long)
*/
public void test_map_ReadWrite() throws IOException {
MappedByteBuffer mapped = null;
writeDataToFile(fileOfReadWriteFileChannel);
mapped = readWriteFileChannel.map(MapMode.READ_WRITE, 0, CONTENT
.length());
// put something will change its channel
ByteBuffer returnByPut = mapped.put(TEST_BYTES);
assertSame(returnByPut, mapped);
String checkString = "test" + CONTENT.substring(4);
ByteBuffer checkBuffer = ByteBuffer.allocate(CONTENT_LENGTH);
mapped.force();
readWriteFileChannel.position(0);
readWriteFileChannel.read(checkBuffer);
assertEquals(checkString, new String(checkBuffer.array(), "iso8859-1"));
try {
mapped.put(("test" + CONTENT).getBytes("iso8859-1"));
fail("should throw BufferOverflowException.");
} catch (BufferOverflowException ex) {
// expected;
}
}
/**
* @tests java.nio.channels.FileChannel#map(MapMode,long,long)
*/
public void test_map_ReadWrite_NonZeroPosition() throws IOException {
// test position non-zero
writeDataToFile(fileOfReadWriteFileChannel);
MappedByteBuffer mapped = readWriteFileChannel.map(MapMode.READ_WRITE,
10, CONTENT_LENGTH - 10);
assertEquals(CONTENT_LENGTH - 10, mapped.limit());
assertEquals(CONTENT.length() - 10, mapped.capacity());
assertEquals(0, mapped.position());
mapped.put(TEST_BYTES);
ByteBuffer checkBuffer = ByteBuffer.allocate(CONTENT_LENGTH);
readWriteFileChannel.read(checkBuffer);
String expected = CONTENT.substring(0, 10) + "test"
+ CONTENT.substring(10 + "test".length());
assertEquals(expected, new String(checkBuffer.array(), "iso8859-1"));
}
/**
* Tests map() method for the value of positions exceeding memory
* page size and allocation granularity size.
*
* @tests java.nio.channels.FileChannel#map(MapMode,long,long)
*/
public void test_map_LargePosition() throws IOException {
// Regression test for HARMONY-3085
int[] sizes = {
4096, // 4K size (normal page size for Linux & Windows)
65536, // 64K size (alocation granularity size for Windows)
};
final int CONTENT_LEN = 10;
for (int i = 0; i < sizes.length; ++i) {
// reset the file and the channel for the iterations
// (for the first iteration it was done by setUp()
if (i > 0 ) {
fileOfReadOnlyFileChannel = File.createTempFile(
"File_of_readOnlyFileChannel", "tmp");
fileOfReadOnlyFileChannel.deleteOnExit();
readOnlyFileChannel = new FileInputStream(fileOfReadOnlyFileChannel)
.getChannel();
}
writeLargeDataToFile(fileOfReadOnlyFileChannel, sizes[i] + 2 * CONTENT_LEN);
MappedByteBuffer mapped = readOnlyFileChannel.map(MapMode.READ_ONLY,
sizes[i], CONTENT_LEN);
assertEquals("Incorrectly mapped file channel for " + sizes[i]
+ " position (capacity)", CONTENT_LEN, mapped.capacity());
assertEquals("Incorrectly mapped file channel for " + sizes[i]
+ " position (limit)", CONTENT_LEN, mapped.limit());
assertEquals("Incorrectly mapped file channel for " + sizes[i]
+ " position (position)", 0, mapped.position());
// map not change channel's position
assertEquals(0, readOnlyFileChannel.position());
// Close the file and the channel before the next iteration
readOnlyFileChannel.close();
fileOfReadOnlyFileChannel.delete();
}
}
/**
* @tests java.nio.channels.FileChannel#write(ByteBuffer)
*/
public void test_writeLByteBuffer_Null() throws Exception {
ByteBuffer writeBuffer = null;
try {
writeOnlyFileChannel.write(writeBuffer);
fail("should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
try {
readWriteFileChannel.write(writeBuffer);
fail("should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#write(ByteBuffer)
*/
public void test_writeLByteBuffer_Closed() throws Exception {
ByteBuffer writeBuffer = ByteBuffer.allocate(CAPACITY);
readOnlyFileChannel.close();
try {
readOnlyFileChannel.write(writeBuffer);
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
writeOnlyFileChannel.close();
try {
writeOnlyFileChannel.write(writeBuffer);
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
readWriteFileChannel.close();
try {
readWriteFileChannel.write(writeBuffer);
fail();
} catch (ClosedChannelException expected) {
}
writeBuffer = null;
try {
readWriteFileChannel.read(writeBuffer);
fail();
} catch (NullPointerException expected) {
} catch (ClosedChannelException expected) {
}
}
/**
* @tests java.nio.channels.FileChannel#write(ByteBuffer)
*/
public void test_writeLByteBuffer_ReadOnly() throws Exception {
ByteBuffer writeBuffer = ByteBuffer.allocate(CAPACITY);
try {
readOnlyFileChannel.write(writeBuffer);
fail("should throw NonWritableChannelException");
} catch (NonWritableChannelException e) {
// expected
}
// first throws NonWriteableChannelException
writeBuffer = null;
try {
readOnlyFileChannel.write(writeBuffer);
fail("should throw NonWritableChannelException");
} catch (NonWritableChannelException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#write(ByteBuffer)
*/
public void test_writeLByteBuffer() throws Exception {
ByteBuffer writeBuffer = ByteBuffer.wrap(CONTENT_AS_BYTES);
int result = writeOnlyFileChannel.write(writeBuffer);
assertEquals(CONTENT_AS_BYTES_LENGTH, result);
assertEquals(CONTENT_AS_BYTES_LENGTH, writeBuffer.position());
writeOnlyFileChannel.close();
assertEquals(CONTENT_AS_BYTES_LENGTH, fileOfWriteOnlyFileChannel
.length());
fis = new FileInputStream(fileOfWriteOnlyFileChannel);
byte[] inputBuffer = new byte[CONTENT_AS_BYTES_LENGTH];
fis.read(inputBuffer);
assertTrue(Arrays.equals(CONTENT_AS_BYTES, inputBuffer));
}
/**
* @tests java.nio.channels.FileChannel#write(ByteBuffer)
*/
public void test_writeLByteBuffer_positioned() throws Exception {
final int pos = 5;
ByteBuffer writeBuffer = ByteBuffer.wrap(CONTENT_AS_BYTES);
writeBuffer.position(pos);
int result = writeOnlyFileChannel.write(writeBuffer);
assertEquals(CONTENT_AS_BYTES_LENGTH - pos, result);
assertEquals(CONTENT_AS_BYTES_LENGTH, writeBuffer.position());
writeOnlyFileChannel.close();
assertEquals(CONTENT_AS_BYTES_LENGTH - pos, fileOfWriteOnlyFileChannel
.length());
fis = new FileInputStream(fileOfWriteOnlyFileChannel);
byte[] inputBuffer = new byte[CONTENT_AS_BYTES_LENGTH - pos];
fis.read(inputBuffer);
String test = CONTENT.substring(pos);
assertTrue(Arrays.equals(test.getBytes("iso8859-1"), inputBuffer));
}
public void test_writeLByteBufferJ_Null() throws Exception {
try {
readWriteFileChannel.write(null, 0);
fail();
} catch (NullPointerException expected) {
} catch (NonWritableChannelException expected) {
}
try {
writeOnlyFileChannel.write(null, 0);
fail();
} catch (NullPointerException expected) {
}
try {
readWriteFileChannel.write(null, 0);
fail();
} catch (NullPointerException expected) {
}
}
public void test_writeLByteBufferJ_Closed() throws Exception {
ByteBuffer writeBuffer = ByteBuffer.allocate(CAPACITY);
writeOnlyFileChannel.close();
try {
writeOnlyFileChannel.write(writeBuffer, 0);
fail();
} catch (ClosedChannelException expected) {
}
readWriteFileChannel.close();
try {
readWriteFileChannel.write(writeBuffer, 0);
fail();
} catch (ClosedChannelException expected) {
}
}
public void test_writeLByteBufferJ_ReadOnly() throws Exception {
ByteBuffer writeBuffer = ByteBuffer.allocate(CAPACITY);
try {
readOnlyFileChannel.write(writeBuffer, 10);
fail();
} catch (NonWritableChannelException expected) {
}
}
public void test_writeLByteBufferJ_IllegalArgument() throws Exception {
ByteBuffer writeBuffer = ByteBuffer.allocate(CAPACITY);
try {
readOnlyFileChannel.write(writeBuffer, -1);
fail();
} catch (IllegalArgumentException expected) {
}
try {
writeOnlyFileChannel.write(writeBuffer, -1);
fail();
} catch (IllegalArgumentException expected) {
}
try {
readWriteFileChannel.write(writeBuffer, -1);
fail();
} catch (IllegalArgumentException expected) {
}
}
/**
* @tests java.nio.channels.FileChannel#write(ByteBuffer,long)
*/
public void test_writeLByteBufferJ() throws Exception {
writeDataToFile(fileOfWriteOnlyFileChannel);
final int POSITION = 4;
ByteBuffer writeBuffer = ByteBuffer.wrap(CONTENT_AS_BYTES);
int result = writeOnlyFileChannel.write(writeBuffer, POSITION);
assertEquals(CONTENT_AS_BYTES_LENGTH, result);
assertEquals(CONTENT_AS_BYTES_LENGTH, writeBuffer.position());
writeOnlyFileChannel.close();
assertEquals(POSITION + CONTENT_AS_BYTES_LENGTH,
fileOfWriteOnlyFileChannel.length());
fis = new FileInputStream(fileOfWriteOnlyFileChannel);
byte[] inputBuffer = new byte[POSITION + CONTENT_AS_BYTES_LENGTH];
fis.read(inputBuffer);
byte[] expectedResult = new byte[POSITION + CONTENT_AS_BYTES_LENGTH];
System.arraycopy(CONTENT_AS_BYTES, 0, expectedResult, 0, POSITION);
System.arraycopy(CONTENT_AS_BYTES, 0, expectedResult, POSITION,
CONTENT_AS_BYTES_LENGTH);
assertTrue(Arrays.equals(expectedResult, inputBuffer));
}
/**
* @tests java.nio.channels.FileChannel#write(ByteBuffer[])
*/
public void test_write$LByteBuffer() throws Exception {
ByteBuffer[] writeBuffers = new ByteBuffer[2];
MockFileChannel mockFileChannel = new MockFileChannel();
mockFileChannel.write(writeBuffers);
// verify that calling write(ByteBuffer[] srcs) leads to the method
// write(srcs, 0, srcs.length)
assertTrue(mockFileChannel.isWriteCalled);
}
/**
* @tests java.nio.channels.FileChannel#write(ByteBuffer[],int,int)
*/
public void test_write$LByteBufferII_Null() throws Exception {
ByteBuffer[] writeBuffers = null;
try {
readOnlyFileChannel.write(writeBuffers, 1, 2);
fail("should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
try {
writeOnlyFileChannel.write(writeBuffers, 1, 2);
fail("should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
try {
readWriteFileChannel.write(writeBuffers, 1, 2);
fail("should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
// first throws NullPointerException
readWriteFileChannel.close();
try {
readWriteFileChannel.write(writeBuffers, 0, 0);
fail("should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#write(ByteBuffer[],int,int)
*/
public void test_write$LByteBufferII_Closed() throws Exception {
ByteBuffer[] writeBuffers = new ByteBuffer[2];
writeBuffers[0] = ByteBuffer.allocate(CAPACITY);
writeBuffers[1] = ByteBuffer.allocate(CAPACITY);
readOnlyFileChannel.close();
try {
readOnlyFileChannel.write(writeBuffers, 0, 2);
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
writeOnlyFileChannel.close();
try {
writeOnlyFileChannel.write(writeBuffers, 0, 2);
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
readWriteFileChannel.close();
try {
readWriteFileChannel.write(writeBuffers, 0, 2);
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
// throws ClosedChannelException first
writeBuffers[0] = null;
try {
readWriteFileChannel.write(writeBuffers, 0, 2);
fail("should throw ClosedChannelException");
} catch (ClosedChannelException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#write(ByteBuffer[],int,int)
*/
public void test_write$LByteBufferII_ReadOnly() throws Exception {
ByteBuffer[] writeBuffers = new ByteBuffer[2];
writeBuffers[0] = ByteBuffer.allocate(CAPACITY);
writeBuffers[1] = ByteBuffer.allocate(CAPACITY);
try {
readOnlyFileChannel.write(writeBuffers, 0, 2);
fail();
} catch (NonWritableChannelException e) {
}
try {
readOnlyFileChannel.write(writeBuffers, 0, -1);
fail();
} catch (IndexOutOfBoundsException expected) {
}
writeBuffers = null;
try {
readOnlyFileChannel.write(writeBuffers, 0, 1);
fail();
} catch (NullPointerException expected) {
}
readOnlyFileChannel.close();
}
/**
* @tests java.nio.channels.FileChannel#write(ByteBuffer[],int,int)
*/
public void test_write$LByteBufferII_EmptyBuffers() throws Exception {
ByteBuffer[] writeBuffers = new ByteBuffer[2];
try {
writeOnlyFileChannel.write(writeBuffers, 0, 2);
fail("should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
try {
readWriteFileChannel.write(writeBuffers, 0, 2);
fail("should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#write(ByteBuffer[],int,int)
*/
public void test_write$LByteBufferII() throws Exception {
ByteBuffer[] writeBuffers = new ByteBuffer[2];
writeBuffers[0] = ByteBuffer.wrap(CONTENT_AS_BYTES);
writeBuffers[1] = ByteBuffer.wrap(CONTENT_AS_BYTES);
long result = writeOnlyFileChannel.write(writeBuffers, 0, 2);
assertEquals(CONTENT_AS_BYTES_LENGTH * 2, result);
assertEquals(CONTENT_AS_BYTES_LENGTH, writeBuffers[0].position());
assertEquals(CONTENT_AS_BYTES_LENGTH, writeBuffers[1].position());
writeOnlyFileChannel.close();
assertEquals(CONTENT_AS_BYTES_LENGTH * 2, fileOfWriteOnlyFileChannel
.length());
fis = new FileInputStream(fileOfWriteOnlyFileChannel);
byte[] inputBuffer = new byte[CONTENT_AS_BYTES_LENGTH];
fis.read(inputBuffer);
byte[] expectedResult = new byte[CONTENT_AS_BYTES_LENGTH * 2];
System.arraycopy(CONTENT_AS_BYTES, 0, expectedResult, 0,
CONTENT_AS_BYTES_LENGTH);
System.arraycopy(CONTENT_AS_BYTES, 0, expectedResult,
CONTENT_AS_BYTES_LENGTH, CONTENT_AS_BYTES_LENGTH);
assertTrue(Arrays.equals(CONTENT_AS_BYTES, inputBuffer));
}
/**
* @tests java.nio.channels.FileChannel#transferFrom(ReadableByteChannel,long,long)
*/
public void test_transferFromLReadableByteChannelJJ_Closed()
throws Exception {
readByteChannel = DatagramChannel.open();
readOnlyFileChannel.close();
try {
readOnlyFileChannel.transferFrom(readByteChannel, 0, 0);
fail("should throw ClosedChannelException.");
} catch (ClosedChannelException e) {
// expected
}
writeOnlyFileChannel.close();
try {
writeOnlyFileChannel.transferFrom(readByteChannel, 0, 10);
fail("should throw ClosedChannelException.");
} catch (ClosedChannelException e) {
// expected
}
readWriteFileChannel.close();
try {
readWriteFileChannel.transferFrom(readByteChannel, 0, 0);
fail("should throw ClosedChannelException.");
} catch (ClosedChannelException e) {
// expected
}
// should throw ClosedChannelException first.
try {
readWriteFileChannel.transferFrom(readByteChannel, 0, -1);
fail("should throw ClosedChannelException.");
} catch (ClosedChannelException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#transferFrom(ReadableByteChannel,long,long)
*/
public void test_transferFromLReadableByteChannelJJ_SourceClosed()
throws Exception {
readByteChannel = DatagramChannel.open();
readByteChannel.close();
try {
readOnlyFileChannel.transferFrom(readByteChannel, 0, 10);
fail("should throw ClosedChannelException.");
} catch (ClosedChannelException e) {
// expected
}
try {
writeOnlyFileChannel.transferFrom(readByteChannel, 0, 10);
fail("should throw ClosedChannelException.");
} catch (ClosedChannelException e) {
// expected
}
try {
readWriteFileChannel.transferFrom(readByteChannel, 0, 10);
fail("should throw ClosedChannelException.");
} catch (ClosedChannelException e) {
// expected
}
// should throw ClosedChannelException first.
try {
readWriteFileChannel.transferFrom(readByteChannel, 0, -1);
fail("should throw ClosedChannelException.");
} catch (ClosedChannelException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#transferFrom(ReadableByteChannel,long,long)
*/
public void test_transferFromLReadableByteChannelJJ_IllegalArgument()
throws Exception {
readByteChannel = DatagramChannel.open();
try {
writeOnlyFileChannel.transferFrom(readByteChannel, 10, -1);
fail("should throw IllegalArgumentException.");
} catch (IllegalArgumentException e) {
// expected
}
try {
readWriteFileChannel.transferFrom(readByteChannel, -1, -10);
fail("should throw IllegalArgumentException.");
} catch (IllegalArgumentException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#transferFrom(ReadableByteChannel,long,long)
*/
public void test_transferFromLReadableByteChannelJJ_NonWritable()
throws Exception {
readByteChannel = DatagramChannel.open();
try {
readOnlyFileChannel.transferFrom(readByteChannel, 0, 0);
fail("should throw NonWritableChannelException.");
} catch (NonWritableChannelException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#transferFrom(ReadableByteChannel,long,long)
*/
public void test_transferFromLReadableByteChannelJJ_SourceNonReadable()
throws Exception {
try {
readWriteFileChannel.transferFrom(writeOnlyFileChannel, 0, 0);
fail("should throw NonReadableChannelException.");
} catch (NonReadableChannelException e) {
// expected
}
// not throws NonReadableChannelException first if position beyond file
// size.
readWriteFileChannel.transferFrom(writeOnlyFileChannel, 10, 10);
}
/**
* @tests java.nio.channels.FileChannel#transferFrom(ReadableByteChannel,long,long)
*/
public void test_transferFromLReadableByteChannelJJ_PositionBeyondSize()
throws Exception {
// init data to file.
writeDataToFile(fileOfReadOnlyFileChannel);
writeDataToFile(fileOfWriteOnlyFileChannel);
final int READONLYFILECHANNELPOSITION = 2;
readOnlyFileChannel.position(READONLYFILECHANNELPOSITION);
final int POSITION = CONTENT_AS_BYTES_LENGTH * 2;
final int LENGTH = 5;
long result = writeOnlyFileChannel.transferFrom(readOnlyFileChannel,
POSITION, LENGTH);
assertEquals(0, result);
assertEquals(0, writeOnlyFileChannel.position());
assertEquals(READONLYFILECHANNELPOSITION, readOnlyFileChannel
.position());
}
/**
* @tests java.nio.channels.FileChannel#transferFrom(ReadableByteChannel,long,long)
*/
public void test_transferFromLReadableByteChannelJJ_FileChannel()
throws Exception {
// init data to file.
writeDataToFile(fileOfReadOnlyFileChannel);
writeDataToFile(fileOfWriteOnlyFileChannel);
final int READONLYFILECHANNELPOSITION = 2;
final int WRITEONLYFILECHANNELPOSITION = 4;
readOnlyFileChannel.position(READONLYFILECHANNELPOSITION);
writeOnlyFileChannel.position(WRITEONLYFILECHANNELPOSITION);
final int POSITION = 3;
final int LENGTH = 5;
long result = writeOnlyFileChannel.transferFrom(readOnlyFileChannel,
POSITION, LENGTH);
assertEquals(LENGTH, result);
assertEquals(WRITEONLYFILECHANNELPOSITION, writeOnlyFileChannel
.position());
assertEquals(READONLYFILECHANNELPOSITION + LENGTH, readOnlyFileChannel
.position());
writeOnlyFileChannel.close();
final int EXPECTED_LENGTH = POSITION + LENGTH;
fis = new FileInputStream(fileOfWriteOnlyFileChannel);
byte[] resultContent = new byte[EXPECTED_LENGTH];
fis.read(resultContent);
byte[] expectedContent = new byte[EXPECTED_LENGTH];
System.arraycopy(CONTENT_AS_BYTES, 0, expectedContent, 0, POSITION);
System.arraycopy(CONTENT_AS_BYTES, READONLYFILECHANNELPOSITION,
expectedContent, POSITION, LENGTH);
assertTrue(Arrays.equals(expectedContent, resultContent));
}
/**
* @tests java.nio.channels.FileChannel#transferFrom(ReadableByteChannel,long,long)
*/
public void test_transferFromLReadableByteChannelJJ_DatagramChannel()
throws Exception {
// connects two datagramChannels.
datagramChannelReceiver = DatagramChannel.open();
datagramChannelReceiver.socket().bind(
new InetSocketAddress(InetAddress.getLocalHost(), 0));
datagramChannelSender = DatagramChannel.open();
datagramChannelSender.socket().bind(
new InetSocketAddress(InetAddress.getLocalHost(), 0));
datagramChannelReceiver.socket().setSoTimeout(TIME_OUT);
datagramChannelReceiver.connect(datagramChannelSender.socket()
.getLocalSocketAddress());
datagramChannelSender.socket().setSoTimeout(TIME_OUT);
ByteBuffer writeBuffer = ByteBuffer.wrap(CONTENT_AS_BYTES);
datagramChannelSender.socket().setSoTimeout(TIME_OUT);
// sends data from datagramChannelSender to datagramChannelReceiver.
datagramChannelSender.send(writeBuffer, datagramChannelReceiver
.socket().getLocalSocketAddress());
datagramChannelReceiver.socket().setSoTimeout(TIME_OUT);
// transfers data from datagramChannelReceiver to fileChannel.
long result = writeOnlyFileChannel.transferFrom(
datagramChannelReceiver, 0, CONTENT_AS_BYTES_LENGTH);
assertEquals(CONTENT_AS_BYTES_LENGTH, result);
assertEquals(0, writeOnlyFileChannel.position());
writeOnlyFileChannel.close();
// gets content from file.
fis = new FileInputStream(fileOfWriteOnlyFileChannel);
assertEquals(CONTENT_AS_BYTES_LENGTH, fileOfWriteOnlyFileChannel
.length());
byte[] resultContent = new byte[CONTENT_AS_BYTES_LENGTH];
fis.read(resultContent);
// compares contents.
assertTrue(Arrays.equals(CONTENT_AS_BYTES, resultContent));
}
/**
* @tests java.nio.channels.FileChannel#transferFrom(ReadableByteChannel,long,long)
*/
public void test_transferFromLReadableByteChannelJJ_SocketChannel()
throws Exception {
// connects two socketChannels.
socketChannelReceiver = SocketChannel.open();
serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(
new InetSocketAddress(InetAddress.getLocalHost(), 0));
socketChannelReceiver.socket().setSoTimeout(TIME_OUT);
socketChannelReceiver.connect(serverSocketChannel.socket()
.getLocalSocketAddress());
serverSocketChannel.socket().setSoTimeout(TIME_OUT);
socketChannelSender = serverSocketChannel.accept();
socketChannelSender.socket().setSoTimeout(TIME_OUT);
// sends data from socketChannelSender to socketChannelReceiver.
ByteBuffer writeBuffer = ByteBuffer.wrap(CONTENT_AS_BYTES);
socketChannelSender.write(writeBuffer);
// transfers data from socketChannelReceiver to fileChannel.
long result = readWriteFileChannel.transferFrom(socketChannelReceiver,
0, CONTENT_AS_BYTES_LENGTH);
assertEquals(CONTENT_AS_BYTES_LENGTH, result);
assertEquals(0, readWriteFileChannel.position());
readWriteFileChannel.close();
// gets content from file.
fis = new FileInputStream(fileOfReadWriteFileChannel);
assertEquals(CONTENT_AS_BYTES_LENGTH, fileOfReadWriteFileChannel
.length());
byte[] resultContent = new byte[CONTENT_AS_BYTES_LENGTH];
fis.read(resultContent);
// compares content.
assertTrue(Arrays.equals(CONTENT_AS_BYTES, resultContent));
}
/**
* @tests java.nio.channels.FileChannel#transferFrom(ReadableByteChannel,long,long)
*/
public void test_transferFromLReadableByteChannelJJ_Pipe() throws Exception {
// inits data in file.
writeDataToFile(fileOfWriteOnlyFileChannel);
// inits pipe.
pipe = Pipe.open();
// writes content to pipe.
ByteBuffer writeBuffer = ByteBuffer.wrap(CONTENT_AS_BYTES);
pipe.sink().write(writeBuffer);
// transfers data from pipe to fileChannel.
final int OFFSET = 2;
final int LENGTH = 4;
long result = writeOnlyFileChannel.transferFrom(pipe.source(), OFFSET,
LENGTH);
assertEquals(LENGTH, result);
writeOnlyFileChannel.close();
// gets content from file.
fis = new FileInputStream(fileOfWriteOnlyFileChannel);
byte[] resultBytes = new byte[OFFSET + LENGTH];
fis.read(resultBytes);
// compares content.
byte[] expectedBytes = new byte[OFFSET + LENGTH];
System.arraycopy(CONTENT_AS_BYTES, 0, expectedBytes, 0, OFFSET);
System.arraycopy(CONTENT_AS_BYTES, 0, expectedBytes, OFFSET, LENGTH);
assertTrue(Arrays.equals(expectedBytes, resultBytes));
}
/**
* @tests java.nio.channels.FileChannel#transferTo(long,long,WritableByteChannel)
*/
public void test_transferToJJLWritableByteChannel_Null() throws Exception {
writableByteChannel = null;
try {
readOnlyFileChannel.transferTo(0, 10, writableByteChannel);
fail();
} catch (NullPointerException expected) {
}
try {
writeOnlyFileChannel.transferTo(0, 10, writableByteChannel);
fail();
} catch (NullPointerException expected) {
} catch (NonReadableChannelException expected) {
}
try {
readWriteFileChannel.transferTo(0, 10, writableByteChannel);
fail();
} catch (NullPointerException expected) {
}
readOnlyFileChannel.close();
try {
writeOnlyFileChannel.transferTo(-1, 0, writableByteChannel);
fail();
} catch (NullPointerException expected) {
} catch (NonReadableChannelException expected) {
}
}
/**
* @tests java.nio.channels.FileChannel#transferTo(long,long,WritableByteChannel)
*/
public void test_transferToJJLWritableByteChannel_Closed() throws Exception {
writableByteChannel = DatagramChannel.open();
readOnlyFileChannel.close();
try {
readOnlyFileChannel.transferTo(0, 10, writableByteChannel);
fail("should throw ClosedChannelException.");
} catch (ClosedChannelException e) {
// expected
}
writeOnlyFileChannel.close();
try {
writeOnlyFileChannel.transferTo(0, 10, writableByteChannel);
fail("should throw ClosedChannelException.");
} catch (ClosedChannelException e) {
// expected
}
readWriteFileChannel.close();
try {
readWriteFileChannel.transferTo(0, 10, writableByteChannel);
fail("should throw ClosedChannelException.");
} catch (ClosedChannelException e) {
// expected
}
// should throw ClosedChannelException first.
try {
readWriteFileChannel.transferTo(0, -1, writableByteChannel);
fail("should throw ClosedChannelException.");
} catch (ClosedChannelException e) {
// expected
}
}
public void test_transferToJJLWritableByteChannel_SourceClosed() throws Exception {
writableByteChannel = DatagramChannel.open();
writableByteChannel.close();
try {
readOnlyFileChannel.transferTo(0, 10, writableByteChannel);
fail();
} catch (ClosedChannelException expected) {
}
try {
writeOnlyFileChannel.transferTo(0, 10, writableByteChannel);
fail();
} catch (ClosedChannelException expected) {
} catch (NonReadableChannelException expected) {
}
try {
readWriteFileChannel.transferTo(0, 10, writableByteChannel);
fail();
} catch (ClosedChannelException expected) {
}
try {
readWriteFileChannel.transferTo(0, -1, writableByteChannel);
fail();
} catch (ClosedChannelException expected) {
}
}
/**
* @tests java.nio.channels.FileChannel#transferTo(long,long,WritableByteChannel)
*/
public void test_transferToJJLWritableByteChannel_IllegalArgument()
throws Exception {
writableByteChannel = DatagramChannel.open();
try {
readOnlyFileChannel.transferTo(10, -1, writableByteChannel);
fail("should throw IllegalArgumentException.");
} catch (IllegalArgumentException e) {
// expected
}
try {
readWriteFileChannel.transferTo(-1, -10, writableByteChannel);
fail("should throw IllegalArgumentException.");
} catch (IllegalArgumentException e) {
// expected
}
}
public void test_transferToJJLWritableByteChannel_NonReadable() throws Exception {
writableByteChannel = DatagramChannel.open();
try {
writeOnlyFileChannel.transferTo(0, 10, writableByteChannel);
fail();
} catch (NonReadableChannelException expected) {
}
}
/**
* @tests java.nio.channels.FileChannel#transferTo(long,long,WritableByteChannel)
*/
public void test_transferToJJLWritableByteChannel_TargetNonWritable()
throws Exception {
try {
readWriteFileChannel.transferTo(0, 0, readOnlyFileChannel);
fail("should throw NonWritableChannelException.");
} catch (NonWritableChannelException e) {
// expected
}
// first throws NonWritableChannelException even position out of file
// size.
try {
readWriteFileChannel.transferTo(10, 10, readOnlyFileChannel);
fail("should throw NonWritableChannelException.");
} catch (NonWritableChannelException e) {
// expected
}
// regression test for Harmony-941
// first throws NonWritableChannelException even arguments are illegal.
try {
readWriteFileChannel.transferTo(-1, 10, readOnlyFileChannel);
fail("should throw NonWritableChannelException.");
} catch (NonWritableChannelException e) {
// expected
}
try {
readWriteFileChannel.transferTo(0, -1, readOnlyFileChannel);
fail("should throw NonWritableChannelException.");
} catch (NonWritableChannelException e) {
// expected
}
}
/**
* @tests java.nio.channels.FileChannel#transferTo(long,long,WritableByteChannel)
*/
public void test_transferToJJLWritableByteChannel_PositionBeyondSize()
throws Exception {
// init data to file.
writeDataToFile(fileOfReadOnlyFileChannel);
writeDataToFile(fileOfWriteOnlyFileChannel);
final int WRITEONLYFILECHANNELPOSITION = 2;
writeOnlyFileChannel.position(WRITEONLYFILECHANNELPOSITION);
final int POSITION = CONTENT_AS_BYTES_LENGTH * 2;
final int LENGTH = 5;
long result = readOnlyFileChannel.transferTo(POSITION, LENGTH,
writeOnlyFileChannel);
assertEquals(0, result);
assertEquals(0, readOnlyFileChannel.position());
assertEquals(WRITEONLYFILECHANNELPOSITION, writeOnlyFileChannel
.position());
}
/**
* @tests java.nio.channels.FileChannel#transferTo(long,long,WritableByteChannel)
*/
public void test_transferToJJLWritableByteChannel_FileChannel()
throws Exception {
// init data to file.
writeDataToFile(fileOfReadOnlyFileChannel);
writeDataToFile(fileOfWriteOnlyFileChannel);
final int READONLYFILECHANNELPOSITION = 2;
final int WRITEONLYFILECHANNELPOSITION = 4;
readOnlyFileChannel.position(READONLYFILECHANNELPOSITION);
writeOnlyFileChannel.position(WRITEONLYFILECHANNELPOSITION);
final int POSITION = 3;
final int LENGTH = 5;
long result = readOnlyFileChannel.transferTo(POSITION, LENGTH,
writeOnlyFileChannel);
assertEquals(LENGTH, result);
assertEquals(READONLYFILECHANNELPOSITION, readOnlyFileChannel
.position());
assertEquals(WRITEONLYFILECHANNELPOSITION + LENGTH,
writeOnlyFileChannel.position());
writeOnlyFileChannel.close();
final int EXPECTED_LENGTH = WRITEONLYFILECHANNELPOSITION + LENGTH;
fis = new FileInputStream(fileOfWriteOnlyFileChannel);
byte[] resultContent = new byte[EXPECTED_LENGTH];
fis.read(resultContent);
byte[] expectedContent = new byte[EXPECTED_LENGTH];
System.arraycopy(CONTENT_AS_BYTES, 0, expectedContent, 0,
WRITEONLYFILECHANNELPOSITION);
System.arraycopy(CONTENT_AS_BYTES, POSITION, expectedContent,
WRITEONLYFILECHANNELPOSITION, LENGTH);
assertTrue(Arrays.equals(expectedContent, resultContent));
}
/**
* @tests java.nio.channels.FileChannel#transferTo(long,long,WritableByteChannel)
*/
public void test_transferToJJLWritableByteChannel_SocketChannel()
throws Exception {
// inits data into file.
writeDataToFile(fileOfReadOnlyFileChannel);
// connects two socketChannels.
socketChannelReceiver = SocketChannel.open();
socketChannelReceiver.socket().bind(
new InetSocketAddress(InetAddress.getLocalHost(), 0));
serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(
new InetSocketAddress(InetAddress.getLocalHost(), 0));
socketChannelReceiver.socket().setSoTimeout(TIME_OUT);
socketChannelReceiver.connect(serverSocketChannel.socket()
.getLocalSocketAddress());
serverSocketChannel.socket().setSoTimeout(TIME_OUT);
socketChannelSender = serverSocketChannel.accept();
socketChannelSender.socket().setSoTimeout(TIME_OUT);
// position here should have no effect on transferTo since it uses
// offset from file_begin
final int POSITION = 10;
readOnlyFileChannel.position(POSITION);
// transfers data from file to socketChannelSender.
final int OFFSET = 2;
long result = readOnlyFileChannel.transferTo(OFFSET,
CONTENT_AS_BYTES_LENGTH * 2, socketChannelSender);
final int LENGTH = CONTENT_AS_BYTES_LENGTH - OFFSET;
assertEquals(LENGTH, result);
assertEquals(POSITION, readOnlyFileChannel.position());
readOnlyFileChannel.close();
socketChannelSender.close();
// gets contents from socketChannelReceiver.
ByteBuffer readBuffer = ByteBuffer.allocate(LENGTH + 1);
int totalRead = 0;
int countRead = 0;
long beginTime = System.currentTimeMillis();
while ((countRead = socketChannelReceiver.read(readBuffer)) != -1) {
totalRead += countRead;
// TIMEOUT
if (System.currentTimeMillis() - beginTime > TIME_OUT) {
break;
}
}
assertEquals(LENGTH, totalRead);
// compares contents.
readBuffer.flip();
for (int i = OFFSET; i < CONTENT_AS_BYTES_LENGTH; i++) {
assertEquals(CONTENT_AS_BYTES[i], readBuffer.get());
}
}
/**
* @tests java.nio.channels.FileChannel#transferTo(long,long,WritableByteChannel)
*/
public void test_transferToJJLWritableByteChannel_DatagramChannel()
throws Exception {
// inits data to file.
writeDataToFile(fileOfReadOnlyFileChannel);
// connects two datagramChannel
datagramChannelReceiver = DatagramChannel.open();
datagramChannelReceiver.socket().bind(
new InetSocketAddress(InetAddress.getLocalHost(), 0));
datagramChannelSender = DatagramChannel.open();
datagramChannelSender.socket().bind(
new InetSocketAddress(InetAddress.getLocalHost(), 0));
datagramChannelSender.socket().setSoTimeout(TIME_OUT);
datagramChannelSender.connect(datagramChannelReceiver.socket()
.getLocalSocketAddress());
datagramChannelReceiver.socket().setSoTimeout(TIME_OUT);
datagramChannelReceiver.connect(datagramChannelSender.socket()
.getLocalSocketAddress());
// transfers data from fileChannel to datagramChannelSender
long result = readOnlyFileChannel.transferTo(0,
CONTENT_AS_BYTES_LENGTH, datagramChannelSender);
assertEquals(CONTENT_AS_BYTES_LENGTH, result);
assertEquals(0, readOnlyFileChannel.position());
readOnlyFileChannel.close();
datagramChannelSender.close();
// gets contents from datagramChannelReceiver
ByteBuffer readBuffer = ByteBuffer.allocate(CONTENT_AS_BYTES_LENGTH);
long beginTime = System.currentTimeMillis();
int totalRead = 0;
while (totalRead < CONTENT_AS_BYTES_LENGTH) {
totalRead += datagramChannelReceiver.read(readBuffer);
if (System.currentTimeMillis() - beginTime > TIME_OUT) {
break;
}
}
assertEquals(CONTENT_AS_BYTES_LENGTH, totalRead);
// compares contents.
readBuffer.flip();
for (int i = 0; i < CONTENT_AS_BYTES_LENGTH; i++) {
assertEquals(CONTENT_AS_BYTES[i], readBuffer.get());
}
}
/**
* @tests java.nio.channels.FileChannel#transferTo(long,long,WritableByteChannel)
*/
public void test_transferToJJLWritableByteChannel_Pipe() throws Exception {
// inits data in file.
writeDataToFile(fileOfReadOnlyFileChannel);
// inits pipe.
pipe = Pipe.open();
// transfers data from fileChannel to pipe.
final int OFFSET = 2;
final int LENGTH = 4;
long result = readOnlyFileChannel.transferTo(OFFSET, LENGTH, pipe
.sink());
assertEquals(LENGTH, result);
assertEquals(0, readOnlyFileChannel.position());
readOnlyFileChannel.close();
// gets content from pipe.
ByteBuffer readBuffer = ByteBuffer.allocate(LENGTH);
result = pipe.source().read(readBuffer);
assertEquals(LENGTH, result);
// compares content.
readBuffer.flip();
for (int i = OFFSET; i < OFFSET + LENGTH; i++) {
assertEquals(CONTENT_AS_BYTES[i], readBuffer.get());
}
}
/**
* Regression test for Harmony-3324
* Make sure we could delete the file after we called transferTo() method.
*/
public void test_transferTo_couldDelete() throws Exception {
// init data in files
writeDataToFile(fileOfReadOnlyFileChannel);
writeDataToFile(fileOfWriteOnlyFileChannel);
// call transferTo() method
readOnlyFileChannel.transferTo(0 , 2, writeOnlyFileChannel);
// delete both files
readOnlyFileChannel.close();
writeOnlyFileChannel.close();
boolean rDel = fileOfReadOnlyFileChannel.delete();
boolean wDel = fileOfWriteOnlyFileChannel.delete();
// make sure both files were deleted
assertTrue("File " + readOnlyFileChannel + " exists", rDel);
assertTrue("File " + writeOnlyFileChannel + " exists", wDel);
}
/**
* Regression test for Harmony-3324
* Make sure we could delete the file after we called transferFrom() method.
*/
public void test_transferFrom_couldDelete() throws Exception {
// init data in files
writeDataToFile(fileOfReadOnlyFileChannel);
writeDataToFile(fileOfWriteOnlyFileChannel);
// call transferTo() method
writeOnlyFileChannel.transferFrom(readOnlyFileChannel, 0 , 2);
// delete both files
readOnlyFileChannel.close();
writeOnlyFileChannel.close();
boolean rDel = fileOfReadOnlyFileChannel.delete();
boolean wDel = fileOfWriteOnlyFileChannel.delete();
// make sure both files were deleted
assertTrue("File " + readOnlyFileChannel + " exists", rDel);
assertTrue("File " + writeOnlyFileChannel + " exists", wDel);
}
private class MockFileChannel extends FileChannel {
private boolean isLockCalled = false;
private boolean isTryLockCalled = false;
private boolean isReadCalled = false;
private boolean isWriteCalled = false;
public void force(boolean arg0) throws IOException {
// do nothing
}
public FileLock lock(long position, long size, boolean shared)
throws IOException {
// verify that calling lock() leads to the method
// lock(0, Long.MAX_VALUE, false).
if (0 == position && Long.MAX_VALUE == size && false == shared) {
isLockCalled = true;
}
return null;
}
public MappedByteBuffer map(MapMode arg0, long arg1, long arg2)
throws IOException {
return null;
}
public long position() throws IOException {
return 0;
}
public FileChannel position(long arg0) throws IOException {
return null;
}
public int read(ByteBuffer arg0) throws IOException {
return 0;
}
public int read(ByteBuffer arg0, long arg1) throws IOException {
return 0;
}
public long read(ByteBuffer[] srcs, int offset, int length)
throws IOException {
// verify that calling read(ByteBuffer[] srcs) leads to the method
// read(srcs, 0, srcs.length)
if (0 == offset && length == srcs.length) {
isReadCalled = true;
}
return 0;
}
public long size() throws IOException {
return 0;
}
public long transferFrom(ReadableByteChannel arg0, long arg1, long arg2)
throws IOException {
return 0;
}
public long transferTo(long arg0, long arg1, WritableByteChannel arg2)
throws IOException {
return 0;
}
public FileChannel truncate(long arg0) throws IOException {
return null;
}
public FileLock tryLock(long position, long size, boolean shared)
throws IOException {
// verify that calling tryLock() leads to the method
// tryLock(0, Long.MAX_VALUE, false).
if (0 == position && Long.MAX_VALUE == size && false == shared) {
isTryLockCalled = true;
}
return null;
}
public int write(ByteBuffer arg0) throws IOException {
return 0;
}
public int write(ByteBuffer arg0, long arg1) throws IOException {
return 0;
}
public long write(ByteBuffer[] srcs, int offset, int length)
throws IOException {
// verify that calling write(ByteBuffer[] srcs) leads to the method
// write(srcs, 0, srcs.length)
if(0 == offset && length == srcs.length){
isWriteCalled = true;
}
return 0;
}
protected void implCloseChannel() throws IOException {
}
}
}