/* This code is part of Freenet. It is distributed under the GNU General
* Public License, version 2 (or at your option any later version). See
* http://www.gnu.org/ for further details of the GPL. */
package freenet.support.io;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import junit.framework.TestCase;
import freenet.support.ByteArrayWrapper;
import freenet.support.api.Bucket;
public abstract class BucketTestBase extends TestCase {
protected byte[] DATA1 = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
protected byte[] DATA2 = new byte[] { 0x70, (byte) 0x81, (byte) 0x92, (byte) 0xa3, (byte) 0xb4, (byte) 0xc5,
(byte) 0xd6, (byte) 0xe7, (byte) 0xf8 };
protected abstract Bucket makeBucket(long size) throws IOException;
protected abstract void freeBucket(Bucket bucket) throws IOException;
public void testReadEmpty() throws IOException {
Bucket bucket = makeBucket(3);
try {
assertEquals("Size-0", 0, bucket.size());
OutputStream os = bucket.getOutputStream();
os.close();
// Read byte[]
InputStream is = bucket.getInputStream();
byte[] data = new byte[10];
int read = is.read(data, 0, 10);
is.close();
assertEquals("Read-Empty", -1, read);
} finally {
freeBucket(bucket);
}
}
public void testReadExcess() throws IOException {
Bucket bucket = makeBucket(Math.max(DATA1.length, DATA2.length));
try {
assertEquals("Size-0", 0, bucket.size());
// Write
OutputStream os = bucket.getOutputStream();
os.write(new byte[] { 5 });
os.close();
assertEquals("Read-Excess-Size", 1, bucket.size());
// Read byte[]
InputStream is = bucket.getInputStream();
byte[] data = new byte[10];
int read = is.read(data, 0, 10);
assertEquals("Read-Excess", 1, read);
assertEquals("Read-Excess-5", 5, data[0]);
read = is.read(data, 0, 10);
assertEquals("Read-Excess-EOF", -1, read);
is.close();
} finally {
freeBucket(bucket);
}
}
public void testReadWrite() throws IOException {
Bucket bucket = makeBucket(Math.max(DATA1.length, DATA2.length));
try {
assertEquals("Size-0", 0, bucket.size());
// Write
OutputStream os = bucket.getOutputStream();
os.write(DATA1);
os.close();
assertEquals("Size-1", DATA1.length, bucket.size());
// Read byte[]
InputStream is = bucket.getInputStream();
byte[] data = new byte[DATA1.length];
int read = is.read(data, 0, DATA1.length);
is.close();
assertEquals("SimpleRead-1-SIZE", DATA1.length, read);
assertEquals("SimpleRead-1", new ByteArrayWrapper(DATA1), new ByteArrayWrapper(data));
// Read byte
is = bucket.getInputStream();
for (byte b : DATA1)
assertEquals("SimpleRead-2", b, (byte) is.read());
// EOF
assertEquals("SimpleRead-EOF0", -1, is.read(new byte[4]));
assertEquals("SimpleRead-EOF1", -1, is.read());
assertEquals("SimpleRead-EOF2", -1, is.read());
is.close();
} finally {
freeBucket(bucket);
}
}
protected boolean canOverwrite = true;
// Write twice -- should overwrite, not append
public void testReuse() throws IOException {
if (!canOverwrite)
return;
Bucket bucket = makeBucket(Math.max(DATA1.length, DATA2.length));
try {
// Write
OutputStream os = bucket.getOutputStream();
os.write(DATA1);
os.close();
// Read byte[]
InputStream is = bucket.getInputStream();
byte[] data = new byte[DATA1.length];
int read = is.read(data, 0, DATA1.length);
is.close();
assertEquals("Read-1-SIZE", DATA1.length, read);
assertEquals("Read-1", new ByteArrayWrapper(DATA1), new ByteArrayWrapper(data));
// Write again
os = bucket.getOutputStream();
os.write(DATA2);
os.close();
// Read byte[]
is = bucket.getInputStream();
data = new byte[DATA2.length];
read = is.read(data, 0, DATA2.length);
is.close();
assertEquals("Read-2-SIZE", DATA2.length, read);
assertEquals("Read-2", new ByteArrayWrapper(DATA2), new ByteArrayWrapper(data));
} finally {
freeBucket(bucket);
}
}
public void testNegative() throws IOException {
Bucket bucket = makeBucket(Math.max(DATA1.length, DATA2.length));
try {
// Write
OutputStream os = bucket.getOutputStream();
os.write(0);
os.write(-1);
os.write(-2);
os.write(123);
os.close();
// Read byte[]
InputStream is = bucket.getInputStream();
assertEquals("Write-0", 0xff & (byte) 0, is.read());
assertEquals("Write-1", 0xff & (byte) -1, is.read());
assertEquals("Write-2", 0xff & (byte) -2, is.read());
assertEquals("Write-123", 0xff & (byte) 123, is.read());
assertEquals("EOF", -1, is.read());
is.close();
} finally {
freeBucket(bucket);
}
}
protected static byte[] DATA_LONG;
static {
DATA_LONG = new byte[32768 + 1]; // 32K + 1
for (int i = 0; i < DATA_LONG.length; i++)
DATA_LONG[i] = (byte) i;
}
public void testLargeData() throws IOException {
Bucket bucket = makeBucket(DATA_LONG.length * 16);
try {
// Write
OutputStream os = bucket.getOutputStream();
for (int i = 0; i < 16; i++)
os.write(DATA_LONG);
os.close();
// Read byte[]
DataInputStream is = new DataInputStream(bucket.getInputStream());
for (int i = 0; i < 16; i++) {
byte[] buf = new byte[DATA_LONG.length];
is.readFully(buf);
assertEquals("Read-Long", new ByteArrayWrapper(DATA_LONG), new ByteArrayWrapper(buf));
}
int read = is.read(new byte[1]);
assertEquals("Read-Long-Size", -1, read);
is.close();
} finally {
freeBucket(bucket);
}
}
}