aboutsummaryrefslogtreecommitdiffstats
path: root/src/testcases/org/apache/poi/poifs/nio/TestDataSource.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/testcases/org/apache/poi/poifs/nio/TestDataSource.java')
-rw-r--r--src/testcases/org/apache/poi/poifs/nio/TestDataSource.java183
1 files changed, 144 insertions, 39 deletions
diff --git a/src/testcases/org/apache/poi/poifs/nio/TestDataSource.java b/src/testcases/org/apache/poi/poifs/nio/TestDataSource.java
index 0155cf809c..a7242662ff 100644
--- a/src/testcases/org/apache/poi/poifs/nio/TestDataSource.java
+++ b/src/testcases/org/apache/poi/poifs/nio/TestDataSource.java
@@ -20,10 +20,17 @@
package org.apache.poi.poifs.nio;
import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
import java.nio.BufferUnderflowException;
import java.nio.ByteBuffer;
import org.apache.poi.POIDataSamples;
+import org.apache.poi.util.IOUtils;
+import org.apache.poi.util.TempFile;
import junit.framework.TestCase;
@@ -39,49 +46,147 @@ public class TestDataSource extends TestCase
FileBackedDataSource ds = new FileBackedDataSource(f);
try {
- assertEquals(8192, ds.size());
-
- // Start of file
- ByteBuffer bs;
- bs = ds.read(4, 0);
- assertEquals(4, bs.capacity());
- assertEquals(0, bs.position());
- assertEquals(0xd0-256, bs.get(0));
- assertEquals(0xcf-256, bs.get(1));
- assertEquals(0x11-000, bs.get(2));
- assertEquals(0xe0-256, bs.get(3));
- assertEquals(0xd0-256, bs.get());
- assertEquals(0xcf-256, bs.get());
- assertEquals(0x11-000, bs.get());
- assertEquals(0xe0-256, bs.get());
-
- // Mid way through
- bs = ds.read(8, 0x400);
- assertEquals(8, bs.capacity());
- assertEquals(0, bs.position());
- assertEquals((byte)'R', bs.get(0));
- assertEquals(0, bs.get(1));
- assertEquals((byte)'o', bs.get(2));
- assertEquals(0, bs.get(3));
- assertEquals((byte)'o', bs.get(4));
- assertEquals(0, bs.get(5));
- assertEquals((byte)'t', bs.get(6));
- assertEquals(0, bs.get(7));
-
- // Can go to the end, but not past it
- bs = ds.read(8, 8190);
- assertEquals(0, bs.position()); // TODO How best to warn of a short read?
-
- // Can't go off the end
- try {
- bs = ds.read(4, 8192);
- fail("Shouldn't be able to read off the end of the file");
- } catch(IllegalArgumentException e) {}
+ checkDataSource(ds, false);
+ } finally {
+ ds.close();
+ }
+
+ // try a second time
+ ds = new FileBackedDataSource(f);
+ try {
+ checkDataSource(ds, false);
} finally {
ds.close();
}
}
-
+
+ public void testFileWritable() throws Exception {
+ File temp = TempFile.createTempFile("TestDataSource", ".test");
+ try {
+ writeDataToFile(temp);
+
+ FileBackedDataSource ds = new FileBackedDataSource(temp, false);
+ try {
+ checkDataSource(ds, true);
+ } finally {
+ ds.close();
+ }
+
+ // try a second time
+ ds = new FileBackedDataSource(temp, false);
+ try {
+ checkDataSource(ds, true);
+ } finally {
+ ds.close();
+ }
+
+ writeDataToFile(temp);
+ } finally {
+ assertTrue(temp.exists());
+ assertTrue("Could not delete file " + temp, temp.delete());
+ }
+ }
+
+
+ public void testRewritableFile() throws Exception {
+ File temp = TempFile.createTempFile("TestDataSource", ".test");
+ try {
+ writeDataToFile(temp);
+
+ FileBackedDataSource ds = new FileBackedDataSource(temp, true);
+ try {
+ ByteBuffer buf = ds.read(0, 10);
+ assertNotNull(buf);
+ buf = ds.read(8, 0x400);
+ assertNotNull(buf);
+ } finally {
+ ds.close();
+ }
+
+ // try a second time
+ ds = new FileBackedDataSource(temp, true);
+ try {
+ ByteBuffer buf = ds.read(0, 10);
+ assertNotNull(buf);
+ buf = ds.read(8, 0x400);
+ assertNotNull(buf);
+ } finally {
+ ds.close();
+ }
+
+ writeDataToFile(temp);
+ } finally {
+ assertTrue(temp.exists());
+ assertTrue(temp.delete());
+ }
+ }
+
+ private void writeDataToFile(File temp) throws FileNotFoundException, IOException {
+ OutputStream str = new FileOutputStream(temp);
+ try {
+ InputStream in = data.openResourceAsStream("Notes.ole2");
+ try {
+ IOUtils.copy(in, str);
+ } finally {
+ in.close();
+ }
+ } finally {
+ str.close();
+ }
+ }
+
+ private void checkDataSource(FileBackedDataSource ds, boolean writeable) throws IOException {
+ assertEquals(writeable, ds.isWriteable());
+ assertNotNull(ds.getChannel());
+
+ // rewriting changes the size
+ if(writeable) {
+ assertTrue("Had: " + ds.size(), ds.size() == 8192 || ds.size() == 8198);
+ } else {
+ assertEquals(8192, ds.size());
+ }
+
+ // Start of file
+ ByteBuffer bs;
+ bs = ds.read(4, 0);
+ assertEquals(4, bs.capacity());
+ assertEquals(0, bs.position());
+ assertEquals(0xd0 - 256, bs.get(0));
+ assertEquals(0xcf - 256, bs.get(1));
+ assertEquals(0x11 - 000, bs.get(2));
+ assertEquals(0xe0 - 256, bs.get(3));
+ assertEquals(0xd0 - 256, bs.get());
+ assertEquals(0xcf - 256, bs.get());
+ assertEquals(0x11 - 000, bs.get());
+ assertEquals(0xe0 - 256, bs.get());
+
+ // Mid way through
+ bs = ds.read(8, 0x400);
+ assertEquals(8, bs.capacity());
+ assertEquals(0, bs.position());
+ assertEquals((byte) 'R', bs.get(0));
+ assertEquals(0, bs.get(1));
+ assertEquals((byte) 'o', bs.get(2));
+ assertEquals(0, bs.get(3));
+ assertEquals((byte) 'o', bs.get(4));
+ assertEquals(0, bs.get(5));
+ assertEquals((byte) 't', bs.get(6));
+ assertEquals(0, bs.get(7));
+
+ // Can go to the end, but not past it
+ bs = ds.read(8, 8190);
+ assertEquals(0, bs.position()); // TODO How best to warn of a short read?
+
+ // Can't go off the end
+ try {
+ bs = ds.read(4, 8192);
+ if(!writeable) {
+ fail("Shouldn't be able to read off the end of the file");
+ }
+ } catch (IllegalArgumentException e) {
+ }
+ }
+
public void testByteArray() throws Exception {
byte[] data = new byte[256];
byte b;