package org.jboss.as.test.manualmode.jca.connectionlistener;
import static org.junit.Assert.assertNotNull;
import java.sql.SQLException;
import javax.naming.NamingException;
import org.jboss.arquillian.container.test.api.ContainerController;
import org.jboss.arquillian.container.test.api.Deployer;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.jboss.as.arquillian.api.ServerSetup;
import org.jboss.as.test.manualmode.ejb.Util;
import org.jboss.as.test.shared.util.AssumeTestGroupUtil;
import org.jboss.jca.adapters.jdbc.spi.listener.ConnectionListener;
import org.jboss.logging.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Simple connection listener {@link ConnectionListener} test case.
*
* @author <a href="mailto:hsvabek@redhat.com">Hynek Svabek</a>
*/
@RunWith(Arquillian.class)
@ServerSetup(value = {AbstractTestsuite.TestCaseSetup.class})
public class ConnectionListenerTestCase extends AbstractTestsuite {
private static final Logger log = Logger.getLogger(ConnectionListenerTestCase.class);
@ArquillianResource
private ContainerController controller;
@ArquillianResource
private Deployer deployer;
@BeforeClass
public static void beforeClass() {
AssumeTestGroupUtil.assumeInvocationTestsEnabled();
}
@Before
public void init() throws Exception {
this.context = Util.createNamingContext();
}
@After
public void after() throws Exception {
this.context.close();
}
/**
* Test: insert record in transaction and then rollback
*
* @throws Exception
*/
@Test
public void testConnListenerWithRollback() throws Exception {
testConnListenerTest(DEP_1, false);
}
/**
* Test: insert record in transaction and then rollback
*
* @throws Exception
*/
@Test
public void testConnListenerXaWithRollback() throws Exception {
testConnListenerTest(DEP_1_XA, true);
}
/**
* Test: insert record in transaction and then rollback
*
* @throws Exception
*/
@Test
public void testConnListener2WithRollback() throws Exception {
testConnListener2Test(DEP_2, false);
}
/**
* Test: insert record in transaction and then rollback
*
* @throws Exception
*/
@Test
public void testConnListener2XaWithRollback() throws Exception {
testConnListener2Test(DEP_2_XA, true);
}
/**
* Test: insert record in transaction
*
* @throws Exception
*/
@Test
public void testConnListener3WithoutRollback() throws Exception {
testConnListener3Test(DEP_3, false);
}
/**
* Test: insert record in transaction
*
* @throws Exception
*/
@Test
public void testConnListener3XaWithoutRollback() throws Exception {
testConnListener3Test(DEP_3_XA, true);
}
private void testConnListenerTest(String deployment, boolean useXaDatasource) throws NamingException, SQLException {
try {
if (!controller.isStarted(CONTAINER)) {
controller.start(CONTAINER);
}
deployer.deploy(deployment);
JpaTestSlsbRemote bean = lookup(JpaTestSlsbRemote.class, JpaTestSlsb.class, deployment);
assertNotNull(bean);
bean.initDataSource(useXaDatasource);
bean.assertRecords(0);
bean.insertRecord();
bean.insertRecord();
bean.insertRecord();
bean.insertRecord();
bean.insertRecord();
bean.assertRecords(5);
bean.insertRecord();
bean.insertRecord(true);
bean.insertRecord(true);
bean.assertRecords(6);
bean.assertRecords(6);
/*
* Activated count - Every new connection creates new activated record, rollback -> remove this record..
* Passivated count - After connection.close() is invoked passivatedConnectionListener, rollback doesn't remove passivated record -> it is created after rollback
*/
bean.assertExactCountOfRecords(6, 11, 12);
} finally {
close(deployment);
}
}
private void testConnListener2Test(String deployment, boolean useXaDatasource) throws SQLException, NamingException {
try {
if (!controller.isStarted(CONTAINER)) {
controller.start(CONTAINER);
}
deployer.deploy(deployment);
JpaTestSlsbRemote bean = lookup(JpaTestSlsbRemote.class, JpaTestSlsb.class, deployment);
assertNotNull(bean);
bean.initDataSource(useXaDatasource);
bean.insertRecord();
bean.insertRecord();
bean.insertRecord(true);
/*
* Activated count - we need open connection for select (in assertExactCountOfRecords...) 1 extra activated record is inserted... -> 3
* Passivated count - rollback remove Activated record, but not passivated -> it is created after rollback
*/
bean.assertExactCountOfRecords(2, 3, 3);
} finally {
close(deployment);
}
}
private void testConnListener3Test(String deployment, boolean useXaDatasource) throws Exception {
try {
if (!controller.isStarted(CONTAINER)) {
controller.start(CONTAINER);
}
deployer.deploy(deployment);
JpaTestSlsbRemote bean = lookup(JpaTestSlsbRemote.class, JpaTestSlsb.class, deployment);
assertNotNull(bean);
bean.insertRecord();
bean.insertRecord();
bean.insertRecord();
bean.insertRecord();
bean.insertRecord();
/*
* Activated count - we need open connection for select (in assertExactCountOfRecords...) -> 1 extra activated record is inserted... -> 6
*/
bean.assertExactCountOfRecords(5, 6, 5);
} finally {
close(deployment);
}
}
private void close(String deploymentName) {
try {
if (!controller.isStarted(CONTAINER)) {
controller.start(CONTAINER);
}
} catch (Exception e) {
log.warn(e.getMessage());
}
try {
deployer.undeploy(deploymentName);
} catch (Exception e) {
log.warn(e.getMessage());
}
try {
if (controller.isStarted(CONTAINER)) {
controller.stop(CONTAINER);
}
} catch (Exception e) {
log.warn(e.getMessage());
}
}
}