/* * JBoss, Home of Professional Open Source. * Copyright 2015, Red Hat, Inc., and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.as.test.integration.jca.datasource; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ADD; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP_ADDR; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.REMOVE; import static org.jboss.as.test.shared.integration.ejb.security.PermissionUtils.createPermissionsXmlAsset; import java.sql.Connection; import javax.annotation.Resource; import javax.sql.DataSource; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.as.arquillian.api.ServerSetup; import org.jboss.as.arquillian.container.ManagementClient; import org.jboss.as.test.integration.jca.JcaMgmtBase; import org.jboss.as.test.integration.jca.JcaMgmtServerSetupTask; import org.jboss.as.test.integration.jca.JcaTestsUtil; import org.jboss.as.test.integration.management.ManagementOperations; import org.jboss.as.test.integration.management.base.AbstractMgmtTestBase; import org.jboss.as.test.integration.management.base.ContainerResourceMgmtTestBase; import org.jboss.as.test.integration.management.jca.DsMgmtTestBase; import org.jboss.as.test.integration.management.util.MgmtOperationException; import org.jboss.dmr.ModelNode; import org.jboss.remoting3.security.RemotingPermission; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.StringAsset; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; /** * Running tests on data-source in non-jta mode. * * @author <a href="mailto:lgao@redhat.com>Lin Gao</a> */ @RunWith(Arquillian.class) @ServerSetup(DatasourceNonCcmTestCase.DatasourceServerSetupTask.class) public class DatasourceNonCcmTestCase extends JcaMgmtBase { private static final String NON_TX_DS_NAME = "NonJTADS"; private static final String TX_DS_NAME = "JTADS"; @ArquillianResource private ManagementClient managementClient; static class DatasourceServerSetupTask extends JcaMgmtServerSetupTask { boolean debug = false; @Override protected void doSetup(ManagementClient managementClient) throws Exception { ModelNode address = new ModelNode(); address.add("subsystem", "jca"); address.add("cached-connection-manager", "cached-connection-manager"); ModelNode operation = new ModelNode(); operation.get(OP_ADDR).set(address); operation.get(OP).set("read-attribute"); operation.get("name").set("debug"); ModelNode result = managementClient.getControllerClient().execute(operation); if (result.hasDefined("debug")) { debug = result.require("debug").asBoolean(); } operation = new ModelNode(); operation.get(OP_ADDR).set(address); operation.get(OP).set("write-attribute"); operation.get("name").set("debug"); operation.get("value").set("true"); managementClient.getControllerClient().execute(operation); // set up a DS setupDs(managementClient, NON_TX_DS_NAME, false); setupDs(managementClient, TX_DS_NAME, true); reload(); } private void setupDs(ManagementClient managementClient, String dsName, boolean jta) throws Exception { Datasource ds = Datasource.Builder(dsName).build(); ModelNode address = new ModelNode(); address.add("subsystem", "datasources"); address.add("data-source", dsName); ModelNode operation = new ModelNode(); operation.get(OP).set(ADD); operation.get(OP_ADDR).set(address); operation.get("jndi-name").set(ds.getJndiName()); operation.get("use-java-context").set("true"); operation.get("driver-name").set(ds.getDriverName()); operation.get("enabled").set("true"); operation.get("user-name").set(ds.getUserName()); operation.get("password").set(ds.getPassword()); operation.get("jta").set(jta); operation.get("use-ccm").set("true"); operation.get("connection-url").set(ds.getConnectionUrl()); managementClient.getControllerClient().execute(operation); } @Override public void tearDown(ManagementClient managementClient, String containerId) throws Exception { ModelNode address = new ModelNode(); address.add("subsystem", "jca"); address.add("cached-connection-manager", "cached-connection-manager"); ModelNode operation = new ModelNode(); operation.get(OP_ADDR).set(address); operation.get(OP).set("write-attribute"); operation.get("name").set("debug"); operation.get("value").set(debug); managementClient.getControllerClient().execute(operation); // remove the DS removeDs(managementClient, NON_TX_DS_NAME); removeDs(managementClient, TX_DS_NAME); reload(); } private void removeDs(ManagementClient managementClient, String dsName) throws Exception { ModelNode address = new ModelNode(); address.add("subsystem", "datasources"); address.add("data-source", dsName); ModelNode operation = new ModelNode(); operation.get(OP).set(REMOVE); operation.get(OP_ADDR).set(address); managementClient.getControllerClient().execute(operation); } } @Resource(mappedName = "java:jboss/datasources/" + NON_TX_DS_NAME) private DataSource nonTXDS; @Resource(mappedName = "java:jboss/datasources/" + TX_DS_NAME) private DataSource txDS; @Deployment public static Archive<?> getDeployment() { JavaArchive jar = ShrinkWrap.create(JavaArchive.class, "dummy.jar"); jar.addClasses( DatasourceNonCcmTestCase.class, Datasource.class, JcaMgmtBase.class, ManagementOperations.class, ContainerResourceMgmtTestBase.class, AbstractMgmtTestBase.class, JcaMgmtServerSetupTask.class, MgmtOperationException.class, DsMgmtTestBase.class, JcaTestsUtil.class); jar.addAsManifestResource(new StringAsset( "Dependencies: javax.inject.api,org.jboss.as.connector," + "org.jboss.as.controller, " + "org.jboss.dmr,org.jboss.as.cli, " + "org.jboss.staxmapper, " + "org.jboss.ironjacamar.impl, " + "org.jboss.ironjacamar.jdbcadapters, " + "org.jboss.remoting3\n" ), "MANIFEST.MF"); jar.addAsManifestResource(createPermissionsXmlAsset( new RemotingPermission("createEndpoint"), new RemotingPermission("connect") ), "permissions.xml"); return jar; } @Test public void testNonJTADS() throws Exception { Assert.assertNotNull(nonTXDS); Connection c1 = nonTXDS.getConnection(); Assert.assertNotNull(c1); Assert.assertEquals(1, getNumberOfConnections(false)); Connection c2 = nonTXDS.getConnection(); Assert.assertNotNull(c2); Assert.assertEquals(2, getNumberOfConnections(false)); c1.close(); Assert.assertEquals(1, getNumberOfConnections(false)); c2.close(); Assert.assertEquals(0, getNumberOfConnections(false)); } @Test public void testJTADS() throws Exception { Assert.assertNotNull(txDS); Connection c1 = txDS.getConnection(); Assert.assertNotNull(c1); Assert.assertEquals(1, getNumberOfConnections(true)); Connection c2 = txDS.getConnection(); Assert.assertNotNull(c2); Assert.assertEquals(2, getNumberOfConnections(true)); c1.close(); Assert.assertEquals(1, getNumberOfConnections(true)); c2.close(); Assert.assertEquals(0, getNumberOfConnections(true)); } private int getNumberOfConnections(boolean tx) throws Exception { ModelNode address = new ModelNode(); address.add("subsystem", "jca"); address.add("cached-connection-manager", "cached-connection-manager"); ModelNode operation = new ModelNode(); operation.get(OP_ADDR).set(address); operation.get(OP).set("get-number-of-connections"); ModelNode result = managementClient.getControllerClient().execute(operation).get("result"); ModelNode txNode = result.get("TX"); ModelNode nonTxNode = result.get("NonTX"); if (tx) { if (txNode.isDefined()) { return txNode.asInt(); } } else { if (nonTxNode.isDefined()) { return nonTxNode.asInt(); } } return 0; } }