Because we have our own FileChannel implementation, we don't use the JDK one.
Or rather, we wrap the JDK NIO stuff in our own FileSystem layer, so that we
can implement custom FileSystem stuff.
Look at the FilePathDisk.java file, line 423.
It appears that we do not correctly mimic the JDK when handling non-writable channels, since we throw IOException
instead of NonWritableChannelException.
On 2014-05-06 15:25, hs wrote:
Hi,
I'm able to run the unit test in org.h2.test.unit.TestFileSystem.java without
any problems (in H2 version 1.3.174).
However, I'm unable to understand why the 2nd AssertThrows in the code below
(around the call to truncate) is working at
all
private void testSimple(final String fsBase) throws Exception {
...
channel = FileUtils.open(fsBase + "/test", "r");
final byte[] test = new byte[10000];
FileUtils.readFully(channel, ByteBuffer.wrap(test, 0, 10000));
assertEquals(buffer, test);
final FileChannel fc = channel;
new AssertThrows(IOException.class) {
@Override
public void test() throws Exception {
fc.write(ByteBuffer.wrap(test, 0, 10));
}
};
new AssertThrows(IOException.class) {
@Override
public void test() throws Exception {
fc.truncate(10);
}
};
...
From the JDK documentation, FileChannel.truncate
<http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#truncate(long)>
on a readonly channel (or,
a channel with a readonly underlying file) should result in a
NonWritableChannelException, and not an IOException. In
the following program that I wrote...
// size of /tmp/foo = 4 bytes
RandomAccessFile raf = new RandomAccessFile("/tmp/foo", "r");
try {
java.nio.channels.FileChannel c = raf.getChannel();
c.truncate(1);
} catch(Exception e) {
e.printStackTrace();
}
... I do indeed get a NonWritableChannelException.
So, how come the 2nd AssertThrows around truncate in the H2 unit test is
working when it shouldn't?
Stumped,
/HS
--
You received this message because you are subscribed to the Google Groups "H2
Database" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to
h2-database+unsubscr...@googlegroups.com
<mailto:h2-database+unsubscr...@googlegroups.com>.
To post to this group, send email to h2-database@googlegroups.com
<mailto:h2-database@googlegroups.com>.
Visit this group at http://groups.google.com/group/h2-database.
For more options, visit https://groups.google.com/d/optout.
--
You received this message because you are subscribed to the Google Groups "H2
Database" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to h2-database+unsubscr...@googlegroups.com.
To post to this group, send email to h2-database@googlegroups.com.
Visit this group at http://groups.google.com/group/h2-database.
For more options, visit https://groups.google.com/d/optout.