Package org.milyn.db

Source Code of org.milyn.db.JndiDataSourceTest

/*
* Milyn - Copyright (C) 2006 - 2010
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License (version 2.1) as published
* by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE.
*
* See the GNU Lesser General Public License for more details:
* http://www.gnu.org/licenses/lgpl.txt
*/

package org.milyn.db;

import junit.framework.TestCase;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.milyn.Smooks;
import org.milyn.container.ExecutionContext;
import org.milyn.event.report.HtmlReportGenerator;
import org.milyn.payload.StringSource;
import org.mockejb.jndi.MockContextFactory;
import org.mockito.Mock;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import org.mockito.MockitoAnnotations;

import javax.naming.InitialContext;
import javax.sql.DataSource;
import javax.transaction.Status;
import javax.transaction.UserTransaction;
import javax.xml.transform.Source;
import java.sql.Connection;

/**
* Unit test for {@link JndiDataSource}.
*
* @author <a href="mailto:maurice.zeijen@smies.com">maurice.zeijen@smies.com</a>
*/
public class JndiDataSourceTest extends TestCase {

    public Source source;

    @Mock
    private DataSource dataSource;

    @Mock
    private UserTransaction transaction;

    @Mock
    private Connection connection;

    private static boolean REPORT = false;


    public void test_jndi_autoCommit() throws Exception {

        when(connection.getAutoCommit()).thenReturn(false);

        executeSmooks("jndi_autocommit", "test_jndi_autoCommit", REPORT);

        verify(dataSource).getConnection();
        verify(connection).setAutoCommit(true);
        verify(connection).close();

        verify(connection, never()).commit();
        verify(connection, never()).rollback();
    }

    public void test_jndi() throws Exception {

        when(connection.getAutoCommit()).thenReturn(true);

        executeSmooks("jndi", "test_jndi", REPORT);

        verify(dataSource).getConnection();
        verify(connection).setAutoCommit(false);
        verify(connection).commit();
        verify(connection).close();

        verify(connection, never()).rollback();
    }


    public void test_jndi_exception() throws Exception {

        when(connection.getAutoCommit()).thenReturn(false);

        executeSmooksWithException("jndi_exception", "test_jndi_exception", REPORT);

        verify(dataSource).getConnection();
        verify(connection).rollback();
        verify(connection).close();

        verify(connection, never()).setAutoCommit(false);
        verify(connection, never()).commit();
    }

    public void test_jta_new_transaction() throws Exception {

        when(connection.getAutoCommit()).thenReturn(true);
        when(transaction.getStatus()).thenReturn(Status.STATUS_NO_TRANSACTION);

        executeSmooks("jta", "test_jta_new_transaction", REPORT);

        verify(dataSource, atLeastOnce()).getConnection();
        verify(transaction).begin();
        verify(connection).setAutoCommit(false);
        verify(transaction).commit();
        verify(connection).close();

        verify(transaction, never()).rollback();
        verify(connection, never()).commit();
        verify(connection, never()).rollback();

    }

    public void test_jta_existing_transaction() throws Exception {

        when(connection.getAutoCommit()).thenReturn(false);
        when(transaction.getStatus()).thenReturn(Status.STATUS_ACTIVE);

        executeSmooks("jta", "test_jta_existing_transaction", REPORT);

        verify(dataSource, atLeastOnce()).getConnection();
        verify(connection).close();

        verify(transaction, never()).begin();
        verify(transaction, never()).commit();
        verify(transaction, never()).rollback();
        verify(connection, never()).setAutoCommit(false);
        verify(connection, never()).commit();
        verify(connection, never()).rollback();

    }

    public void test_jta_exception() throws Exception {

        when(connection.getAutoCommit()).thenReturn(false);
        when(transaction.getStatus()).thenReturn(Status.STATUS_NO_TRANSACTION);

        executeSmooksWithException("jta_exception", "test_jta_exception", REPORT);

        verify(dataSource, atLeastOnce()).getConnection();
        verify(transaction).begin();
        verify(transaction).rollback();
        verify(connection).close();

        verify(transaction, never()).commit();
        verify(transaction, never()).setRollbackOnly();
        verify(connection, never()).setAutoCommit(false);
        verify(connection, never()).commit();
        verify(connection, never()).rollback();

    }

    public void test_jta_existing_transaction_exception() throws Exception {

        when(connection.getAutoCommit()).thenReturn(false);
        when(transaction.getStatus()).thenReturn(Status.STATUS_ACTIVE);

        executeSmooksWithException("jta_exception", "test_jta_existing_transaction_exception", REPORT);

        verify(dataSource, atLeastOnce()).getConnection();
        verify(transaction).setRollbackOnly();
        verify(connection).close();

        verify(transaction, never()).begin();
        verify(transaction, never()).commit();
        verify(transaction, never()).rollback();
        verify(connection, never()).setAutoCommit(false);
        verify(connection, never()).commit();
        verify(connection, never()).rollback();

    }

    public void test_jta_set_autocommit_not_allowed() throws Exception {
        when(transaction.getStatus()).thenReturn(Status.STATUS_ACTIVE);

        executeSmooks("jta_set_autocommit_not_allowed", "test_jta_set_autocommit_not_allowed", REPORT);

        verify(dataSource, atLeastOnce()).getConnection();
        verify(connection).close();

        verify(connection, never()).setAutoCommit(false);
        verify(connection, never()).getAutoCommit();
    }

    public void test_jta_missing_transaction() {

        try {
            executeSmooks("jta_missing_transaction", "test_jta_missing_transaction", REPORT);
        } catch (Exception e) {
            assertEquals("The transactionJndi attribute must be set when the JTA transaction manager is set.", ExceptionUtils.getCause(e).getMessage());

            return;
        }
        fail("Exception was not thrown to indicate that the transactionJndi wasn't set.");
    }

    public void test_external() throws Exception {

        when(connection.getAutoCommit()).thenReturn(true);

        executeSmooks("external", "external", true);

        verify(dataSource).getConnection();
        verify(connection).setAutoCommit(false);
        verify(connection).close();

        verify(connection, never()).commit();
        verify(connection, never()).rollback();
    }

    public void test_external_autocommit() throws Exception {

        when(connection.getAutoCommit()).thenReturn(false);

        executeSmooks("external_autocommit", "test_external_autocommit", REPORT);

        verify(dataSource).getConnection();
        verify(connection).setAutoCommit(true);
        verify(connection).close();

        verify(connection, never()).commit();
        verify(connection, never()).rollback();
    }

    public void test_external_set_autocommit_not_allowed() throws Exception {

        executeSmooks("external_set_autocommit_not_allowed", "test_external_set_autocommit_not_allowed", true);

        verify(dataSource).getConnection();
        verify(connection).close();

        verify(connection, never()).getAutoCommit();
        verify(connection, never()).setAutoCommit(true);
        verify(connection, never()).commit();
        verify(connection, never()).rollback();
    }

    public void test_external_exception() throws Exception {

        when(connection.getAutoCommit()).thenReturn(false);

        executeSmooksWithException("external_exception", "test_external_exception", REPORT);

        verify(dataSource).getConnection();
        verify(connection).close();

        verify(connection, never()).setAutoCommit(false);
        verify(connection, never()).rollback();
        verify(connection, never()).commit();
    }

    private void executeSmooks(String profile, String testName, boolean report) throws Exception {

        Smooks smooks = new Smooks(getClass().getResourceAsStream("jndi-ds-lifecycle.xml"));

        ExecutionContext ec = smooks.createExecutionContext(profile);

        if (report) {
            ec.setEventListener(new HtmlReportGenerator("target/report/" + testName + ".html"));
        }

        smooks.filterSource(ec, source);
    }

    private void executeSmooksWithException(String profile, String testName, boolean report) throws Exception {
        try {
            executeSmooks(profile, testName, report);
        } catch (Exception e) {
        }
        return;
    }

    @Override
    protected void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
        MockContextFactory.setAsInitial();

        source = new StringSource("<root><a /><b /></root>");

        InitialContext context = new InitialContext();
        context.bind("java:/mockDS", dataSource);
        context.bind("java:/mockTransaction", transaction);

        when(dataSource.getConnection()).thenReturn(connection);

    }

    @Override
    protected void tearDown() throws Exception {
        MockContextFactory.revertSetAsInitial();
    }
}
TOP

Related Classes of org.milyn.db.JndiDataSourceTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.