org.springextensions.db4o.Db4oTransactionManagerTest.java Source code

Java tutorial

Introduction

Here is the source code for org.springextensions.db4o.Db4oTransactionManagerTest.java

Source

/*
 * Copyright 2005-2011 the original author or authors.
 *
 * 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 org.springextensions.db4o;

import org.springframework.transaction.InvalidIsolationLevelException;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.transaction.support.TransactionTemplate;
import org.testng.Assert;
import org.testng.annotations.Test;

import com.db4o.ObjectContainer;
import com.db4o.ext.ExtObjectContainer;

import static org.mockito.Mockito.*;

/**
 * @author Costin Leau
 * @author olli
 */
public class Db4oTransactionManagerTest {

    @Test
    public void testTransactionCommit() throws Exception {
        final ExtObjectContainer container = mock(ExtObjectContainer.class);
        when(container.identity()).thenReturn(null);

        PlatformTransactionManager tm = new Db4oTransactionManager(container);
        TransactionTemplate tt = new TransactionTemplate(tm);

        Assert.assertTrue(!TransactionSynchronizationManager.hasResource(container), "Has no container");
        Assert.assertTrue(!TransactionSynchronizationManager.isSynchronizationActive(),
                "JTA synchronizations not active");

        tt.execute(new TransactionCallbackWithoutResult() {
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                Assert.assertTrue(TransactionSynchronizationManager.hasResource(container), "Has thread session");
                Db4oTemplate template = new Db4oTemplate(container);
                template.identity();
            }
        });

        Assert.assertTrue(!TransactionSynchronizationManager.hasResource(container), "Has no container");
        Assert.assertTrue(!TransactionSynchronizationManager.isSynchronizationActive(),
                "JTA synchronizations not active");

        verify(container).commit();
    }

    @Test
    public void testTransactionRollback() throws Exception {
        final ExtObjectContainer container = mock(ExtObjectContainer.class);
        when(container.identity()).thenReturn(null);
        when(container.ext()).thenReturn(container);

        PlatformTransactionManager tm = new Db4oTransactionManager(container);
        TransactionTemplate tt = new TransactionTemplate(tm);

        Assert.assertTrue(!TransactionSynchronizationManager.hasResource(container), "Has no container");
        Assert.assertTrue(!TransactionSynchronizationManager.isSynchronizationActive(),
                "JTA synchronizations not active");

        try {
            tt.execute(new TransactionCallbackWithoutResult() {
                protected void doInTransactionWithoutResult(TransactionStatus status) {
                    Assert.assertTrue(TransactionSynchronizationManager.hasResource(container),
                            "Has thread session");
                    Db4oTemplate template = new Db4oTemplate(container);
                    template.execute(new Db4oCallback() {
                        public Object doInDb4o(ObjectContainer cont) {
                            cont.ext().identity();
                            throw new RuntimeException();
                        }

                    });
                }
            });
        } catch (RuntimeException e) {
            // it's okay
        }

        Assert.assertTrue(!TransactionSynchronizationManager.hasResource(container), "Has no container");
        Assert.assertTrue(!TransactionSynchronizationManager.isSynchronizationActive(),
                "JTA synchronizations not active");

        verify(container).rollback();
    }

    @Test
    public void testTransactionRollbackOnly() throws Exception {
        final ExtObjectContainer container = mock(ExtObjectContainer.class);
        when(container.identity()).thenReturn(null);
        when(container.ext()).thenReturn(container);

        PlatformTransactionManager tm = new Db4oTransactionManager(container);
        TransactionTemplate tt = new TransactionTemplate(tm);

        Assert.assertTrue(!TransactionSynchronizationManager.hasResource(container), "Has no container");
        Assert.assertTrue(!TransactionSynchronizationManager.isSynchronizationActive());

        try {
            tt.execute(new TransactionCallbackWithoutResult() {
                protected void doInTransactionWithoutResult(TransactionStatus status) {
                    Assert.assertTrue(TransactionSynchronizationManager.hasResource(container),
                            "Has thread session");
                    Db4oTemplate template = new Db4oTemplate(container);
                    template.execute(new Db4oCallback() {
                        public Object doInDb4o(ObjectContainer cont) {
                            cont.ext().identity();
                            return null;
                        }

                    });
                    status.setRollbackOnly();
                }
            });
        } catch (RuntimeException e) {
            // it's okay
        }

        Assert.assertTrue(!TransactionSynchronizationManager.hasResource(container), "Has no container");
        Assert.assertTrue(!TransactionSynchronizationManager.isSynchronizationActive(),
                "JTA synchronizations not active");

        verify(container).rollback();
    }

    @Test
    public void testInvalidIsolation() throws Exception {
        final ExtObjectContainer container = mock(ExtObjectContainer.class);

        PlatformTransactionManager tm = new Db4oTransactionManager(container);
        TransactionTemplate tt = new TransactionTemplate(tm);

        Assert.assertTrue(!TransactionSynchronizationManager.hasResource(container), "Has no container");
        Assert.assertTrue(!TransactionSynchronizationManager.isSynchronizationActive(),
                "JTA synchronizations not active");

        tt.setIsolationLevel(TransactionDefinition.ISOLATION_SERIALIZABLE);
        try {
            tt.execute(new TransactionCallbackWithoutResult() {
                protected void doInTransactionWithoutResult(TransactionStatus status) {
                    Assert.assertTrue(TransactionSynchronizationManager.hasResource(container),
                            "Has thread session");
                    Db4oTemplate template = new Db4oTemplate(container);
                    template.execute(new Db4oCallback() {
                        public Object doInDb4o(ObjectContainer cont) {
                            return null;
                        }
                    });
                }
            });
            Assert.fail("Should have thrown InvalidIsolationLevelException");
        } catch (InvalidIsolationLevelException e) {
            // it's okay
        }

        Assert.assertTrue(!TransactionSynchronizationManager.hasResource(container), "Has no container");
        Assert.assertTrue(!TransactionSynchronizationManager.isSynchronizationActive(),
                "JTA synchronizations not active");

        // TODO verify(container)....; exception thrown?
    }

}