com.amazon.carbonado.repo.jdbc.TestH2.java Source code

Java tutorial

Introduction

Here is the source code for com.amazon.carbonado.repo.jdbc.TestH2.java

Source

/*
 * Copyright 2008-2012 Amazon Technologies, Inc. or its affiliates.
 * Amazon, Amazon.com and Carbonado are trademarks or registered trademarks
 * of Amazon Technologies, Inc. or its affiliates.  All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.amazon.carbonado.repo.jdbc;

import java.math.BigDecimal;
import java.math.BigInteger;

import java.io.*;

import java.sql.DriverManager;

import junit.framework.TestSuite;

import org.apache.commons.dbcp.BasicDataSource;

import com.amazon.carbonado.*;

import com.amazon.carbonado.capability.ShutdownCapability;

import com.amazon.carbonado.lob.*;

import com.amazon.carbonado.repo.indexed.IndexedRepositoryBuilder;

import com.amazon.carbonado.TestUtilities;

import com.amazon.carbonado.stored.StorableWithLobs;
import com.amazon.carbonado.stored.WithPropertyOther;

/**
 * 
 *
 * @author Brian S O'Neill
 */
public class TestH2 extends com.amazon.carbonado.TestStorables {
    public static void main(String[] args) {
        junit.textui.TestRunner.run(suite());
    }

    public static TestSuite suite() {
        TestSuite suite = new TestSuite();
        suite.addTestSuite(TestH2.class);
        return suite;
    }

    public TestH2(String name) {
        super(name);
    }

    @Override
    protected void tearDown() throws Exception {
        Repository repo = getRepository();
        JDBCConnectionCapability cap = repo.getCapability(JDBCConnectionCapability.class);
        if (cap == null) {
            super.tearDown();
        } else {
            ShutdownCapability cap2 = repo.getCapability(ShutdownCapability.class);
            if (cap2 != null) {
                cap2.setAutoShutdownEnabled(false);
            }
            cap.getConnection().createStatement().execute("SHUTDOWN IMMEDIATELY");
        }
    }

    public void test_propertyOther() throws Exception {
        Storage<WithPropertyOther> storage = getRepository().storageFor(WithPropertyOther.class);
        WithPropertyOther other = storage.prepare();
        other.setId(1);
        other.setObject("hello");
        other.insert();

        other.load();
        assertEquals("hello", other.getObject());
    }

    @Override
    public void test_derivedJoinIndex() throws Exception {
        // Needs to use custom indexing for this test to work.
        IndexedRepositoryBuilder builder = new IndexedRepositoryBuilder();
        builder.setWrappedRepository(jdbcBuilder(true));
        Repository repo = builder.build();
        test_derivedJoinIndex(repo);
    }

    /* FIXME: Deleting of derived index entries needs more thought.
    @Override
    public void test_basicDerivedJoinIndex() throws Exception {
    // Needs to use custom indexing for this test to work.
    IndexedRepositoryBuilder builder = new IndexedRepositoryBuilder();
    builder.setWrappedRepository(jdbcBuilder(true));
    Repository repo = builder.build();
    test_basicDerivedJoinIndex(repo);
    }
    */

    // Override because H2 does not fully support LOBs.
    @Override
    public void test_lobInsert() throws Exception {
        Storage<StorableWithLobs> storage = getRepository().storageFor(StorableWithLobs.class);

        // Test null insert
        {
            StorableWithLobs lobs = storage.prepare();
            lobs.insert();
            assertEquals(null, lobs.getBlobValue());
            assertEquals(null, lobs.getClobValue());
            lobs.load();
            assertEquals(null, lobs.getBlobValue());
            assertEquals(null, lobs.getClobValue());
        }

        // Test content insert
        int id;
        {
            StorableWithLobs lobs = storage.prepare();
            lobs.setBlobValue(new ByteArrayBlob("hello".getBytes()));
            lobs.setClobValue(new StringClob("world"));
            lobs.insert();
            assertEquals("hello", lobs.getBlobValue().asString());
            assertEquals("world", lobs.getClobValue().asString());
            lobs.load();
            assertEquals("hello", lobs.getBlobValue().asString());
            assertEquals("world", lobs.getClobValue().asString());
            id = lobs.getId();
        }

        // Test insert failure
        {
            StorableWithLobs lobs = storage.prepare();
            lobs.setId(id);

            Blob newBlob = new ByteArrayBlob("blob insert should fail".getBytes());
            Clob newClob = new StringClob("clob insert should fail");

            lobs.setBlobValue(newBlob);
            lobs.setClobValue(newClob);

            try {
                lobs.insert();
                fail();
            } catch (UniqueConstraintException e) {
            }

            assertTrue(newBlob == lobs.getBlobValue());
            assertTrue(newClob == lobs.getClobValue());
        }
    }

    // Override because H2 does not fully support LOBs.
    @Override
    public void test_lobUpdate() throws Exception {
        Storage<StorableWithLobs> storage = getRepository().storageFor(StorableWithLobs.class);

        // Test null replaces null
        {
            StorableWithLobs lobs = storage.prepare();
            lobs.insert();

            lobs.setBlobValue(null);
            lobs.setClobValue(null);

            lobs.update();

            assertEquals(null, lobs.getBlobValue());
            assertEquals(null, lobs.getClobValue());

            lobs.load();
            assertEquals(null, lobs.getBlobValue());
            assertEquals(null, lobs.getClobValue());
        }

        // Test null replaces content and verify content deleted
        {
            StorableWithLobs lobs = storage.prepare();
            lobs.setBlobValue(new ByteArrayBlob("hello".getBytes()));
            lobs.setClobValue(new StringClob("world!!!"));
            lobs.insert();

            Blob blob = lobs.getBlobValue();
            Clob clob = lobs.getClobValue();

            assertEquals(5, blob.getLength());
            assertEquals(8, clob.getLength());

            lobs.setBlobValue(null);

            lobs.update();

            assertNull(lobs.getBlobValue());
            assertEquals(clob.asString(), lobs.getClobValue().asString());

            lobs.load();

            assertNull(lobs.getBlobValue());
            assertEquals(clob.asString(), lobs.getClobValue().asString());

            lobs.setClobValue(null);

            lobs.update();

            assertNull(lobs.getBlobValue());
            assertNull(lobs.getClobValue());

            lobs.load();

            assertNull(lobs.getBlobValue());
            assertNull(lobs.getClobValue());
        }

        // Test content replaces null
        {
            StorableWithLobs lobs = storage.prepare();
            lobs.insert();

            lobs.setBlobValue(new ByteArrayBlob("hello".getBytes()));
            lobs.setClobValue(new StringClob("world"));

            assertTrue(lobs.getBlobValue() instanceof ByteArrayBlob);
            assertTrue(lobs.getClobValue() instanceof StringClob);

            lobs.update();

            assertEquals("hello", lobs.getBlobValue().asString());
            assertEquals("world", lobs.getClobValue().asString());

            assertFalse(lobs.getBlobValue() instanceof ByteArrayBlob);
            assertFalse(lobs.getClobValue() instanceof StringClob);

            lobs.load();

            assertEquals("hello", lobs.getBlobValue().asString());
            assertEquals("world", lobs.getClobValue().asString());

            assertFalse(lobs.getBlobValue() instanceof ByteArrayBlob);
            assertFalse(lobs.getClobValue() instanceof StringClob);
        }

        // Test content replaces content of same length
        {
            StorableWithLobs lobs = storage.prepare();
            lobs.setBlobValue(new ByteArrayBlob("hello".getBytes()));
            lobs.setClobValue(new StringClob("world?"));
            lobs.insert();

            Blob blob = lobs.getBlobValue();
            Clob clob = lobs.getClobValue();

            lobs.setBlobValue(new ByteArrayBlob("12345".getBytes()));
            lobs.update();

            assertEquals(5, lobs.getBlobValue().getLength());
            assertEquals(6, lobs.getClobValue().getLength());

            assertEquals("12345", lobs.getBlobValue().asString());
            assertEquals("world?", lobs.getClobValue().asString());

            assertTrue(blob.asString().equals(lobs.getBlobValue().asString()));
            assertTrue(clob.asString().equals(lobs.getClobValue().asString()));

            lobs.setClobValue(new StringClob("123456"));
            lobs.update();

            assertEquals(5, lobs.getBlobValue().getLength());
            assertEquals(6, lobs.getClobValue().getLength());

            assertEquals("12345", lobs.getBlobValue().asString());
            assertEquals("123456", lobs.getClobValue().asString());

            assertTrue(blob.asString().equals(lobs.getBlobValue().asString()));
            assertTrue(clob.asString().equals(lobs.getClobValue().asString()));
        }

        // Test content replaces content of longer length
        {
            StorableWithLobs lobs = storage.prepare();
            lobs.setBlobValue(new ByteArrayBlob("hello".getBytes()));
            lobs.setClobValue(new StringClob("world?"));
            lobs.insert();

            Blob blob = lobs.getBlobValue();
            Clob clob = lobs.getClobValue();

            lobs.setBlobValue(new ByteArrayBlob("123".getBytes()));
            lobs.update();

            assertEquals(3, lobs.getBlobValue().getLength());
            assertEquals(6, lobs.getClobValue().getLength());

            assertEquals("123", lobs.getBlobValue().asString());
            assertEquals("world?", lobs.getClobValue().asString());

            assertTrue(blob.asString().equals(lobs.getBlobValue().asString()));
            assertTrue(clob.asString().equals(lobs.getClobValue().asString()));

            lobs.setClobValue(new StringClob("12"));
            lobs.update();

            assertEquals(3, lobs.getBlobValue().getLength());
            assertEquals(2, lobs.getClobValue().getLength());

            assertEquals("123", lobs.getBlobValue().asString());
            assertEquals("12", lobs.getClobValue().asString());

            assertTrue(blob.asString().equals(lobs.getBlobValue().asString()));
            assertTrue(clob.asString().equals(lobs.getClobValue().asString()));
        }

        // Test content replaces content of shorter length
        {
            StorableWithLobs lobs = storage.prepare();
            lobs.setBlobValue(new ByteArrayBlob("hello".getBytes()));
            lobs.setClobValue(new StringClob("world?"));
            lobs.insert();

            Blob blob = lobs.getBlobValue();
            Clob clob = lobs.getClobValue();

            lobs.setBlobValue(new ByteArrayBlob("123456789".getBytes()));
            lobs.update();

            assertEquals(9, lobs.getBlobValue().getLength());
            assertEquals(6, lobs.getClobValue().getLength());

            assertEquals("123456789", lobs.getBlobValue().asString());
            assertEquals("world?", lobs.getClobValue().asString());

            assertTrue(blob.asString().equals(lobs.getBlobValue().asString()));
            assertTrue(clob.asString().equals(lobs.getClobValue().asString()));

            lobs.setClobValue(new StringClob("1234567890"));
            lobs.update();

            assertEquals(9, lobs.getBlobValue().getLength());
            assertEquals(10, lobs.getClobValue().getLength());

            assertEquals("123456789", lobs.getBlobValue().asString());
            assertEquals("1234567890", lobs.getClobValue().asString());

            assertTrue(blob.asString().equals(lobs.getBlobValue().asString()));
            assertTrue(clob.asString().equals(lobs.getClobValue().asString()));
        }

        // Test update failure
        {
            StorableWithLobs lobs = storage.prepare();
            lobs.setId(10000);

            Blob newBlob = new ByteArrayBlob("blob update should fail".getBytes());
            Clob newClob = new StringClob("clob update should fail");

            lobs.setBlobValue(newBlob);
            lobs.setClobValue(newClob);

            try {
                lobs.update();
                fail();
            } catch (PersistNoneException e) {
            }

            assertTrue(newBlob == lobs.getBlobValue());
            assertTrue(newClob == lobs.getClobValue());
        }
    }

    @Override
    public void test_insertLobBig() throws Exception {
        // Not a useful test.
    }

    @Override
    public void test_countTimeout() throws Exception {
        // Timeout granularity is too high. (one second)
    }

    @Override
    protected BigInteger expected(BigInteger bi) {
        // Used to detect that BigIntegerAdapter was selected.
        return bi.add(BigInteger.ONE);
    }

    @Override
    protected BigDecimal expected(BigDecimal bd) {
        return bd;
    }

    @Override
    protected Repository buildRepository(boolean isMaster) throws RepositoryException {
        return jdbcBuilder(isMaster).build();
    }

    private RepositoryBuilder jdbcBuilder(boolean isMaster) throws RepositoryException {
        JDBCRepositoryBuilder builder = new JDBCRepositoryBuilder();
        builder.setName("jdbc");
        builder.setAutoVersioningEnabled(true, null);
        builder.setMaster(isMaster);
        BasicDataSource ds = new BasicDataSource();
        builder.setDataSource(ds);

        builder.setSchemaResolver(new H2SchemaResolver());

        File dir = new File(TestUtilities.makeTestDirectory("jdbc"), "/h2");
        String url = "jdbc:h2:" + dir.getPath();
        ds.setDriverClassName("org.h2.Driver");
        ds.setUrl(url);
        ds.setUsername("sa");
        ds.setPassword("");

        return builder;
    }
}