You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ju...@apache.org on 2012/04/12 17:01:52 UTC

svn commit: r1325300 - in /jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs: AbstractBlobStoreTest.java DbBlobStoreTest.java FileBlobStoreTest.java MemoryBlobStoreTest.java MongoBlobStoreTest.java

Author: jukka
Date: Thu Apr 12 15:01:51 2012
New Revision: 1325300

URL: http://svn.apache.org/viewvc?rev=1325300&view=rev
Log:
OAK-58: connection leak in h2 persistence

Move generic test code to Db- to a new AbstractBlobStoreTest class.

Added:
    jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStoreTest.java
      - copied, changed from r1325296, jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/DbBlobStoreTest.java
Modified:
    jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/DbBlobStoreTest.java
    jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/FileBlobStoreTest.java
    jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/MemoryBlobStoreTest.java
    jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/MongoBlobStoreTest.java

Copied: jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStoreTest.java (from r1325296, jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/DbBlobStoreTest.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStoreTest.java?p2=jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStoreTest.java&p1=jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/DbBlobStoreTest.java&r1=1325296&r2=1325300&rev=1325300&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/DbBlobStoreTest.java (original)
+++ jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStoreTest.java Thu Apr 12 15:01:51 2012
@@ -21,7 +21,6 @@ import org.apache.jackrabbit.mk.api.Micr
 import org.apache.jackrabbit.mk.json.JsopBuilder;
 import org.apache.jackrabbit.mk.json.JsopTokenizer;
 import org.apache.jackrabbit.mk.util.IOUtilsTest;
-import org.h2.jdbcx.JdbcConnectionPool;
 
 import java.io.ByteArrayInputStream;
 import java.io.File;
@@ -30,7 +29,6 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.sql.Connection;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -38,34 +36,19 @@ import java.util.Random;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
- * Tests the DbBlobStore implementation.
+ * Tests a BlobStore implementation.
  */
-public class DbBlobStoreTest extends TestCase {
+abstract class AbstractBlobStoreTest extends TestCase {
 
     protected AbstractBlobStore store;
-    private Connection sentinel;
-    private JdbcConnectionPool cp;
 
-    public void setUp() throws Exception {
-        Class.forName("org.h2.Driver");
-        cp = JdbcConnectionPool.create("jdbc:h2:mem:", "", "");
-        sentinel = cp.getConnection();
-        DbBlobStore blobStore = new DbBlobStore();
-        blobStore.setConnectionPool(cp);
-        blobStore.setBlockSize(128);
-        blobStore.setBlockSizeMin(32);
-        this.store = blobStore;
-    }
+    /**
+     * Should be overridden by subclasses to set the {@link #store} variable.
+     */
+    public abstract void setUp() throws Exception;
 
     public void tearDown() throws Exception {
-        if (sentinel != null) {
-            sentinel.close();
-        }
         store.close();
-
-        if (cp != null) {
-            cp.dispose();
-        }
     }
 
     public void testAddFile() throws Exception {

Modified: jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/DbBlobStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/DbBlobStoreTest.java?rev=1325300&r1=1325299&r2=1325300&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/DbBlobStoreTest.java (original)
+++ jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/DbBlobStoreTest.java Thu Apr 12 15:01:51 2012
@@ -16,33 +16,15 @@
  */
 package org.apache.jackrabbit.mk.blobs;
 
-import junit.framework.TestCase;
-import org.apache.jackrabbit.mk.api.MicroKernelException;
-import org.apache.jackrabbit.mk.json.JsopBuilder;
-import org.apache.jackrabbit.mk.json.JsopTokenizer;
-import org.apache.jackrabbit.mk.util.IOUtilsTest;
-import org.h2.jdbcx.JdbcConnectionPool;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
 import java.sql.Connection;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Random;
-import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.h2.jdbcx.JdbcConnectionPool;
 
 /**
  * Tests the DbBlobStore implementation.
  */
-public class DbBlobStoreTest extends TestCase {
+public class DbBlobStoreTest extends AbstractBlobStoreTest {
 
-    protected AbstractBlobStore store;
     private Connection sentinel;
     private JdbcConnectionPool cp;
 
@@ -58,300 +40,11 @@ public class DbBlobStoreTest extends Tes
     }
 
     public void tearDown() throws Exception {
+        super.tearDown();
         if (sentinel != null) {
             sentinel.close();
         }
-        store.close();
-
-        if (cp != null) {
-            cp.dispose();
-        }
-    }
-
-    public void testAddFile() throws Exception {
-        store.setBlockSize(1024 * 1024);
-        byte[] data = new byte[4 * 1024 * 1024];
-        Random r = new Random(0);
-        r.nextBytes(data);
-        String tempFileName = "target/temp/test";
-        File tempFile = new File(tempFileName);
-        tempFile.getParentFile().mkdirs();
-        OutputStream out = new FileOutputStream(tempFile, false);
-        out.write(data);
-        out.close();
-        String s = store.addBlob(tempFileName);
-        assertEquals(data.length, store.getBlobLength(s));
-        byte[] buff = new byte[1];
-        for (int i = 0; i < data.length; i += 1024) {
-            store.readBlob(s, i, buff, 0, 1);
-            assertEquals(data[i], buff[0]);
-        }
-        try {
-            store.addBlob(tempFileName + "_wrong");
-            fail();
-        } catch (Exception e) {
-            // expected
-        }
-    }
-
-    public void testCombinedIdentifier() throws Exception {
-        String id = store.writeBlob(new ByteArrayInputStream(new byte[2]));
-        assertEquals(2, store.getBlobLength(id));
-        String combinedId = id + id;
-        assertEquals(4, store.getBlobLength(combinedId));
-        doTestRead(new byte[4], 4, combinedId);
-    }
-
-    public void testEmptyIdentifier() throws Exception {
-        byte[] data = new byte[1];
-        assertEquals(-1, store.readBlob("", 0, data, 0, 1));
-        assertEquals(0, store.getBlobLength(""));
-    }
-
-    public void testCloseStream() throws Exception {
-        final AtomicBoolean closed = new AtomicBoolean();
-        InputStream in = new InputStream() {
-            public void close() {
-                closed.set(true);
-            }
-            public int read() throws IOException {
-                return -1;
-            }
-        };
-        store.writeBlob(in);
-        assertTrue(closed.get());
-    }
-
-    public void testExceptionWhileReading() throws Exception {
-        final AtomicBoolean closed = new AtomicBoolean();
-        InputStream in = new InputStream() {
-            public void close() {
-                closed.set(true);
-            }
-            public int read() throws IOException {
-                throw new RuntimeException("abc");
-            }
-        };
-        try {
-            store.writeBlob(in);
-        } catch (Exception e) {
-            String msg = e.getMessage();
-            assertTrue(msg, msg.indexOf("abc") >= 0);
-        }
-        assertTrue(closed.get());
-    }
-
-
-    public void testIllegalIdentifier() throws Exception {
-        byte[] data = new byte[1];
-        try {
-            store.readBlob("ff", 0, data, 0, 1);
-            fail();
-        } catch (MicroKernelException e) {
-            // expected
-        }
-        try {
-            store.getBlobLength("ff");
-            fail();
-        } catch (MicroKernelException e) {
-            // expected
-        }
-        try {
-            store.mark("ff");
-            fail();
-        } catch (Exception e) {
-            // expected
-        }
-    }
-
-    public void testSmall() throws Exception {
-        doTest(10, 300);
-    }
-
-    public void testMedium() throws Exception {
-        doTest(100, 100);
-    }
-
-    public void testLarge() throws Exception {
-        doTest(1000, 10);
-    }
-
-    public void testGarbageCollection() throws Exception {
-        HashMap<String, byte[]> map = new HashMap<String, byte[]>();
-        ArrayList<String> mem = new ArrayList<String>();
-        int count;
-        for (int i = 1; i < 10000; i += (i + 1) * 10) {
-            byte[] data = new byte[i];
-            String id;
-            id = store.writeBlob(new ByteArrayInputStream(data));
-            // copy the id so the string is not in the weak hash map
-            map.put(new String(id), data);
-            mem.add(id);
-            data = new byte[i];
-            Arrays.fill(data, (byte) 1);
-            id = store.writeBlob(new ByteArrayInputStream(data));
-            // copy the id so the string is not in the weak hash map
-            map.put(new String(id), data);
-            mem.add(id);
-        }
-        store.startMark();
-        store.sweep();
-        for (String id : map.keySet()) {
-            byte[] test = readFully(id);
-            assertTrue(Arrays.equals(map.get(id), test));
-        }
-
-        mem.clear();
-
-        store.clearInUse();
-        store.startMark();
-        for (String id : map.keySet()) {
-            byte[] d = map.get(id);
-            if (d[0] != 0) {
-                continue;
-            }
-            store.mark(id);
-        }
-        store.sweep();
-
-        store.clearInUse();
-        store.clearCache();
-
-        // https://issues.apache.org/jira/browse/OAK-60
-        // endure there is at least one old entry (with age 1 ms)
-        try {
-            Thread.sleep(1);
-        } catch (InterruptedException e) {
-            // ignore
-        }
-
-        store.startMark();
-        count = store.sweep();
-        assertTrue("count: " + count, count > 0);
-        int failedCount = 0;
-        for (String id : map.keySet()) {
-            long length = store.getBlobLength(id);
-            try {
-                readFully(id);
-            } catch (Exception e) {
-                assertTrue(id + ":" + length, length > store.getBlockSizeMin());
-                failedCount++;
-            }
-        }
-        assertTrue("failedCount: " + failedCount, failedCount > 0);
-    }
-
-    private void doTest(int maxLength, int count) throws Exception {
-        String[] s = new String[count * 2];
-        Random r = new Random(0);
-        for (int i = 0; i < s.length;) {
-            byte[] data = new byte[r.nextInt(maxLength)];
-            r.nextBytes(data);
-            s[i++] = store.writeBlob(new ByteArrayInputStream(data));
-            s[i++] = store.writeBlob(new ByteArrayInputStream(data));
-        }
-        r.setSeed(0);
-        for (int i = 0; i < s.length;) {
-            int expectedLen = r.nextInt(maxLength);
-            byte[] expectedData = new byte[expectedLen];
-            r.nextBytes(expectedData);
-            assertEquals(expectedLen, store.getBlobLength(s[i++]));
-
-            String id = s[i++];
-            doTestRead(expectedData, expectedLen, id);
-        }
-    }
-
-    private void doTestRead(byte[] expectedData, int expectedLen, String id) throws Exception {
-        byte[] got = readFully(id);
-        assertEquals(expectedLen, got.length);
-        IOUtilsTest.assertEquals(expectedData, got);
-    }
-
-    public byte[] readFully(String id) throws Exception {
-        int len = (int) store.getBlobLength(id);
-        byte[] data;
-        if (len < 100) {
-            data = new byte[len];
-            for (int i = 0; i < len; i++) {
-                store.readBlob(id, i, data, i, 1);
-            }
-        } else {
-            data = BlobStoreInputStream.readFully(store, id);
-        }
-        assertEquals(len, data.length);
-        return data;
-    }
-
-    public static void main(String... args) throws Exception {
-        FileBlobStore store = new FileBlobStore("target/temp");
-
-//        DbBlobStore store = new DbBlobStore();
-//        store.setConnectionPool(JdbcConnectionPool.create("jdbc:h2:target/test;log=0;undo_log=0", "", ""));
-
-        String id = addFiles(store, "~/temp/ds");
-        extractFiles(store, id, "target/test");
-
-        store.close();
-    }
-
-    public static void extractFiles(AbstractBlobStore store, String listingId, String target) throws IOException {
-        String listing = new String(BlobStoreInputStream.readFully(store, listingId), "UTF-8");
-        JsopTokenizer t = new JsopTokenizer(listing);
-        File targetDir = new File(target);
-        targetDir.mkdirs();
-        t.read('{');
-        if (!t.matches('}')) {
-            do {
-                String file = t.readString();
-                t.read(':');
-                String id = t.readString();
-                byte[] data = BlobStoreInputStream.readFully(store, id);
-                File outFile = new File(targetDir, file);
-                outFile.getParentFile().mkdirs();
-                FileOutputStream out = new FileOutputStream(outFile);
-                try {
-                    out.write(data);
-                } finally {
-                    out.close();
-                }
-            } while (t.matches(','));
-        }
-        t.read('}');
-    }
-
-    public static String addFiles(AbstractBlobStore store, String dir) throws Exception {
-        ArrayList<String> list = new ArrayList<String>();
-        String root = new File(dir).getAbsolutePath();
-        String parent = new File(dir).getParentFile().getAbsolutePath();
-        addFiles(list, new File(root));
-        JsopBuilder listing = new JsopBuilder();
-        listing.object();
-        for (String f : list) {
-            FileInputStream in = new FileInputStream(f);
-            String id = store.writeBlob(in);
-            in.close();
-            String name = f.substring(parent.length());
-            listing.key(name).value(id);
-            listing.newline();
-        }
-        listing.endObject();
-        String l = listing.toString();
-        String id = store.writeBlob(new ByteArrayInputStream(l.getBytes("UTF-8")));
-        return id;
-    }
-
-    private static void addFiles(ArrayList<String> list, File file) {
-        if (file.isDirectory()) {
-            for (File f : file.listFiles()) {
-                addFiles(list, f);
-            }
-            return;
-        }
-        if (!file.isFile()) {
-            return;
-        }
-        list.add(file.getAbsolutePath());
+        cp.dispose();
     }
 
 }

Modified: jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/FileBlobStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/FileBlobStoreTest.java?rev=1325300&r1=1325299&r2=1325300&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/FileBlobStoreTest.java (original)
+++ jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/FileBlobStoreTest.java Thu Apr 12 15:01:51 2012
@@ -19,7 +19,7 @@ package org.apache.jackrabbit.mk.blobs;
 /**
  * Tests the FileBlobStore implementation.
  */
-public class FileBlobStoreTest extends DbBlobStoreTest {
+public class FileBlobStoreTest extends AbstractBlobStoreTest {
 
     public void setUp() throws Exception {
         FileBlobStore store = new FileBlobStore("target/temp");

Modified: jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/MemoryBlobStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/MemoryBlobStoreTest.java?rev=1325300&r1=1325299&r2=1325300&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/MemoryBlobStoreTest.java (original)
+++ jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/MemoryBlobStoreTest.java Thu Apr 12 15:01:51 2012
@@ -19,7 +19,7 @@ package org.apache.jackrabbit.mk.blobs;
 /**
  * Tests the MemoryBlobStore implementation.
  */
-public class MemoryBlobStoreTest extends DbBlobStoreTest {
+public class MemoryBlobStoreTest extends AbstractBlobStoreTest {
 
     public void setUp() throws Exception {
         store = new MemoryBlobStore();

Modified: jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/MongoBlobStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/MongoBlobStoreTest.java?rev=1325300&r1=1325299&r2=1325300&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/MongoBlobStoreTest.java (original)
+++ jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/blobs/MongoBlobStoreTest.java Thu Apr 12 15:01:51 2012
@@ -19,7 +19,7 @@ package org.apache.jackrabbit.mk.blobs;
 /**
  * Tests the MongoBlobStore implementation.
  */
-public class MongoBlobStoreTest extends DbBlobStoreTest {
+public class MongoBlobStoreTest extends AbstractBlobStoreTest {
 
     public void setUp() throws Exception {
         store = new MemoryBlobStore();