Author: j16sdiz
Date: 2008-11-07 13:53:18 +0000 (Fri, 07 Nov 2008)
New Revision: 23373
Added:
trunk/freenet/test/freenet/support/io/TempBucketTest.java
Modified:
trunk/freenet/src/freenet/support/io/TempBucketFactory.java
trunk/freenet/test/freenet/support/io/BucketTestBase.java
Log:
junit for TempBucketFactory
Modified: trunk/freenet/src/freenet/support/io/TempBucketFactory.java
===================================================================
--- trunk/freenet/src/freenet/support/io/TempBucketFactory.java 2008-11-07
03:43:25 UTC (rev 23372)
+++ trunk/freenet/src/freenet/support/io/TempBucketFactory.java 2008-11-07
13:53:18 UTC (rev 23373)
@@ -58,7 +58,7 @@
/** How old is a long-lived RAMBucket? */
private final int RAMBUCKET_MAX_AGE = 5*60*1000; // 5mins
/** How many times the maxRAMBucketSize can a RAMBucket be before it
gets migrated? */
- private final int RAMBUCKET_CONVERSION_FACTOR = 4;
+ final static int RAMBUCKET_CONVERSION_FACTOR = 4;
public class TempBucket implements Bucket {
/** The underlying bucket itself */
Modified: trunk/freenet/test/freenet/support/io/BucketTestBase.java
===================================================================
--- trunk/freenet/test/freenet/support/io/BucketTestBase.java 2008-11-07
03:43:25 UTC (rev 23372)
+++ trunk/freenet/test/freenet/support/io/BucketTestBase.java 2008-11-07
13:53:18 UTC (rev 23373)
@@ -24,6 +24,9 @@
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];
@@ -100,9 +103,14 @@
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
Added: trunk/freenet/test/freenet/support/io/TempBucketTest.java
===================================================================
--- trunk/freenet/test/freenet/support/io/TempBucketTest.java
(rev 0)
+++ trunk/freenet/test/freenet/support/io/TempBucketTest.java 2008-11-07
13:53:18 UTC (rev 23373)
@@ -0,0 +1,176 @@
+/* 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.IOException;
+import java.io.OutputStream;
+import java.util.Random;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.spaceroots.mantissa.random.MersenneTwister;
+
+import freenet.crypt.RandomSource;
+import freenet.crypt.Yarrow;
+import freenet.support.Executor;
+import freenet.support.SerialExecutor;
+import freenet.support.api.Bucket;
+import freenet.support.io.TempBucketFactory.TempBucket;
+
+public class TempBucketTest extends TestSuite {
+
+ public static class TempBucketMigrationTest extends TestCase {
+ private RandomSource strongPRNG = new Yarrow();
+ private Random weakPRNG = new MersenneTwister();
+ private Executor exec = new
SerialExecutor(NativeThread.NORM_PRIORITY);
+ private FilenameGenerator fg;
+
+ public TempBucketMigrationTest() throws IOException {
+ fg = new FilenameGenerator(weakPRNG, false, null,
"junit");
+ }
+
+ public void testRamLimitCreate() throws IOException {
+ TempBucketFactory tbf = new TempBucketFactory(exec, fg,
16, 128, strongPRNG, weakPRNG, false);
+
+ int maxRamBucket = 128 / 16;
+
+ // create excess maxTotalRamSize, last one should be on
disk
+ TempBucket[] b = new TempBucket[maxRamBucket + 1];
+ for (int i = 0; i < maxRamBucket + 1; i++) {
+ b[i] = (TempBucket) tbf.makeBucket(16);
+
+ OutputStream os = b[i].getOutputStream();
+ os.write(new byte[16]);
+ os.close();
+ }
+
+ try {
+ assertTrue(b[0].isRAMBucket());
+ assertFalse(b[maxRamBucket].isRAMBucket());
+
+ // Free some, reused the space
+ b[0].free();
+ b[maxRamBucket].free();
+
+ b[0] = (TempBucket) tbf.makeBucket(8);
+ b[maxRamBucket] = (TempBucket)
tbf.makeBucket(8);
+ assertTrue(b[0].isRAMBucket());
+ assertTrue(b[maxRamBucket].isRAMBucket());
+ } finally {
+ for (Bucket bb : b)
+ bb.free();
+ }
+ }
+
+ public void testWriteExcessConversionFactor() throws
IOException {
+ TempBucketFactory tbf = new TempBucketFactory(exec, fg,
16, 128, strongPRNG, weakPRNG, false);
+
+ TempBucket b = (TempBucket) tbf.makeBucket(16);
+ try {
+ assertTrue(b.isRAMBucket());
+
+ OutputStream os = b.getOutputStream();
+
+ os.write(new byte[16]);
+ assertTrue(b.isRAMBucket());
+
+ for (int i = 0; i <
TempBucketFactory.RAMBUCKET_CONVERSION_FACTOR - 1; i++) {
+ os.write(new byte[16]);
+ }
+ assertFalse(b.isRAMBucket());
+ } finally {
+ b.free();
+ }
+ }
+
+ public void testWriteExcessLimit() throws IOException {
+ TempBucketFactory tbf = new TempBucketFactory(exec, fg,
16, 17, strongPRNG, weakPRNG, false);
+
+ TempBucket b = (TempBucket) tbf.makeBucket(16);
+ try {
+ assertTrue(b.isRAMBucket());
+
+ OutputStream os = b.getOutputStream();
+
+ os.write(new byte[16]);
+ assertTrue(b.isRAMBucket());
+
+ os.write(new byte[2]);
+ assertFalse(b.isRAMBucket());
+ } finally {
+ b.free();
+ }
+ }
+ }
+
+ public static class RealTempBucketTest extends BucketTestBase {
+ private RandomSource strongPRNG = new Yarrow();
+ private Random weakPRNG = new MersenneTwister();
+ private Executor exec = new
SerialExecutor(NativeThread.NORM_PRIORITY);
+ private FilenameGenerator fg;
+
+ private TempBucketFactory tbf;
+
+ public RealTempBucketTest(int maxRamSize, int maxTotalRamSize,
boolean encrypted) throws IOException {
+ fg = new FilenameGenerator(weakPRNG, false, null,
"junit");
+ tbf = new TempBucketFactory(exec, fg, maxRamSize,
maxTotalRamSize, strongPRNG, weakPRNG, encrypted);
+
+ canOverwrite = false;
+ }
+
+ @Override
+ protected void freeBucket(Bucket bucket) throws IOException {
+ bucket.free();
+ }
+
+ @Override
+ protected Bucket makeBucket(long size) throws IOException {
+ return tbf.makeBucket(1); // TempBucket allow resize
+ }
+ }
+
+ public static class RealTempBucketTest_8_16_F extends
RealTempBucketTest {
+ public RealTempBucketTest_8_16_F() throws IOException {
+ super(8, 16, false);
+ }
+ }
+
+ public static class RealTempBucketTest_64_128_F extends
RealTempBucketTest {
+ public RealTempBucketTest_64_128_F() throws IOException {
+ super(64, 128, false);
+ }
+ }
+
+ public static class RealTempBucketTest_64k_128k_F extends
RealTempBucketTest {
+ public RealTempBucketTest_64k_128k_F() throws IOException {
+ super(64 * 1024, 128 * 1024, false);
+ }
+ }
+
+ public static class RealTempBucketTest_8_16_T extends
RealTempBucketTest {
+ public RealTempBucketTest_8_16_T() throws IOException {
+ super(8, 16, true);
+ }
+ }
+
+ public static class RealTempBucketTest_64k_128k_T extends
RealTempBucketTest {
+ public RealTempBucketTest_64k_128k_T() throws IOException {
+ super(64 * 1024, 128 * 1024, true);
+ }
+ }
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite("TempBucketTest");
+ suite.addTest(new TestSuite(RealTempBucketTest_8_16_F.class));
+ suite.addTest(new TestSuite(RealTempBucketTest_64_128_F.class));
+ suite.addTest(new
TestSuite(RealTempBucketTest_64k_128k_F.class));
+ suite.addTest(new TestSuite(RealTempBucketTest_8_16_T.class));
+ suite.addTest(new
TestSuite(RealTempBucketTest_64k_128k_T.class));
+ suite.addTest(new TestSuite(TempBucketMigrationTest.class));
+ return suite;
+ }
+
+}
\ No newline at end of file