diff options
| author | Jesse Morgan <jesse@jesterpm.net> | 2015-03-06 09:20:37 -0800 | 
|---|---|---|
| committer | Jesse Morgan <jesse@jesterpm.net> | 2015-03-06 09:20:37 -0800 | 
| commit | e9133156ea8dcefbd4b19d89c15ad6e2c01cf86d (patch) | |
| tree | 9ba19f13f6def1efb65aab269794aa3e17837b64 /src/test/java/com/amazon/carbonado/repo | |
| parent | 0edce12e20fd305216985e71b8c10952fbc4709c (diff) | |
| parent | 49a379b36abd512ebb6fa61ba973f64c0513e614 (diff) | |
Adding tests for the JDBCTransactionManager.
Diffstat (limited to 'src/test/java/com/amazon/carbonado/repo')
| -rw-r--r-- | src/test/java/com/amazon/carbonado/repo/jdbc/TestJDBCTransactionManager.java | 160 | 
1 files changed, 160 insertions, 0 deletions
diff --git a/src/test/java/com/amazon/carbonado/repo/jdbc/TestJDBCTransactionManager.java b/src/test/java/com/amazon/carbonado/repo/jdbc/TestJDBCTransactionManager.java new file mode 100644 index 0000000..e149295 --- /dev/null +++ b/src/test/java/com/amazon/carbonado/repo/jdbc/TestJDBCTransactionManager.java @@ -0,0 +1,160 @@ +/* + * Copyright 2008-2015 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 com.amazon.carbonado.*; + +import java.sql.Connection; +import java.sql.SQLException; + +import junit.framework.TestCase; +import junit.framework.TestSuite; + +import static org.easymock.EasyMock.*; + +/** + * Tests for the JDBCTransactionManager. + * + * These tests mock out everything except the JDBCTransactionManager and + * JDBCTransaction. + * + * @author Jesse Morgan + */ +public class TestJDBCTransactionManager extends TestCase { +    public static void main(String[] args) { +        junit.textui.TestRunner.run(suite()); +    } + +    public static TestSuite suite() { +        TestSuite suite = new TestSuite(); +        suite.addTestSuite(TestJDBCTransactionManager.class); +        return suite; +    } + +    private JDBCRepository mMockRepository; +    private Connection mMockConnection; + +    /** +     * Default Test Constructor. +     */ +    public TestJDBCTransactionManager(String name) { +        super(name); +    } + +    /** +     * Setup Mocks for the test. +     */ +    @Override +    protected void setUp() throws Exception { +        super.setUp(); + +        mMockConnection = createMock(Connection.class); + +        mMockRepository = createMock(JDBCRepository.class); +        expect(mMockRepository.getConnectionForTxn(anyObject(IsolationLevel.class))) +            .andReturn(mMockConnection) +            .anyTimes(); + +        expect(mMockRepository.getExceptionTransformer()) +            .andReturn(new JDBCExceptionTransformer()) +            .anyTimes(); +    } + +    /** +     * Verify aborting a transaction rolls back and closes the connection. +     */ +    public void testAbortTransaction() throws Exception { +        // Expected Results +        mMockConnection.rollback(); +        mMockRepository.closeConnection(mMockConnection); +        replayAll(); + +        // Run Test +        JDBCTransactionManager txnManager = new JDBCTransactionManager(mMockRepository); +        JDBCTransaction t = txnManager.createTxn(null, IsolationLevel.READ_COMMITTED); +        txnManager.abortTxn(t); + +        // Verify Results +        verifyAll(); +    } + +    /** +     * Test that aborting a transaction closes the connection, even if an exception is thrown. +     */ +    public void testAbortTransactionWhenThrows() throws Exception { +        // Expected Results +        mMockConnection.rollback(); +        expectLastCall().andThrow(new SQLException()); +        mMockRepository.closeConnection(mMockConnection); +        replayAll(); + +        // Run Test +        JDBCTransactionManager txnManager = new JDBCTransactionManager(mMockRepository); +        JDBCTransaction t = txnManager.createTxn(null, IsolationLevel.READ_COMMITTED); + +        try { +            txnManager.abortTxn(t); +            fail("Should have thrown."); +        } catch (PersistException e) { +            // Expected. +        } + +        // Verify Results +        verifyAll(); +    } + +    /** +     * Test that aborting a transaction closes the connection, even if the repository is null. +     */ +    public void testAbortTransactionWhenRepositoryClosed() throws Exception { +        // Expected Results +        mMockConnection.rollback(); +        mMockConnection.close(); +        replayAll(); + +        // Create a txn. +        JDBCTransactionManager txnManager = new JDBCTransactionManager(mMockRepository); +        JDBCTransaction t = txnManager.createTxn(null, IsolationLevel.READ_COMMITTED); + +        // "Close" the repository. +        mMockRepository = null; +        System.gc(); + +        // Abort should still close the connection. +        txnManager.abortTxn(t); + +        // Verify Results +        verify(mMockConnection); +    } + +    /** +     * Prepare all the mocks to be replayed. +     */ +    private void replayAll() { +        replay(mMockRepository, mMockConnection); +    } + +    /** +     * Verify all the mocks. +     */ +    private void verifyAll() { +        verify(mMockRepository, mMockConnection); +    } + +}  | 
