/*
* JBoss, Home of Professional Open Source.
* Copyright 2010, 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.statistics;
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.SUBSYSTEM;
import org.jboss.arquillian.container.test.api.RunAsClient;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.dmr.ModelNode;
import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Data source statistics testCase
*
* @author <a href="mailto:vrastsel@redhat.com">Vladimir Rastseluev</a>
*/
@RunWith(Arquillian.class)
@RunAsClient
public class DataSourcePoolStatisticsTestCase extends JcaStatisticsBase {
static int dsCount = 0;
static int xaDsCount = 0;
private ModelNode getDsAddress(int count, boolean xa) {
ModelNode address = new ModelNode();
address.add(SUBSYSTEM, "datasources");
address.add((xa ? "xa-" : "") + "data-source", getJndi(count, xa));
address.protect();
return address;
}
private ModelNode createDataSource(boolean xa, int minPoolSize, int maxPoolSize, boolean prefill) throws Exception {
ModelNode address;
String jndiName;
if (xa) {
xaDsCount++;
jndiName = getJndi(xaDsCount, xa);
address = getDsAddress(xaDsCount, xa);
} else {
dsCount++;
jndiName = getJndi(dsCount, xa);
address = getDsAddress(dsCount, xa);
}
ModelNode operation = new ModelNode();
operation.get(OP).set(ADD);
operation.get(OP_ADDR).set(address);
operation.get("jndi-name").set(jndiName);
operation.get("driver-name").set("h2");
operation.get("enabled").set("false");
if (!xa) { operation.get("connection-url").set("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE"); }
operation.get("min-pool-size").set(minPoolSize);
operation.get("max-pool-size").set(maxPoolSize);
operation.get("pool-prefill").set(prefill);
operation.get("user-name").set("sa");
operation.get("password").set("sa");
executeOperation(operation);
if (xa) {
final ModelNode xaDatasourcePropertiesAddress = address.clone();
xaDatasourcePropertiesAddress.add("xa-datasource-properties", "URL");
xaDatasourcePropertiesAddress.protect();
final ModelNode xaDatasourcePropertyOperation = new ModelNode();
xaDatasourcePropertyOperation.get(OP).set("add");
xaDatasourcePropertyOperation.get(OP_ADDR).set(xaDatasourcePropertiesAddress);
xaDatasourcePropertyOperation.get("value").set("jdbc:h2:mem:test");
executeOperation(xaDatasourcePropertyOperation);
}
operation = new ModelNode();
operation.get(OP).set("write-attribute");
operation.get("name").set("enabled");
operation.get("value").set(true);
operation.get(OP_ADDR).set(address);
executeOperation(operation);
reload();
return address;
}
@After
public void closeDataSources() throws Exception {
while (dsCount > 0) {
remove(getDsAddress(dsCount, false));
reload();
dsCount--;
}
while (xaDsCount > 0) {
remove(getDsAddress(xaDsCount, true));
reload();
xaDsCount--;
}
}
public String getJndi(int count, boolean xa) {
return "java:/datasources/" + (xa ? "Xa" : "") + "Ds" + String.valueOf(count);
}
@Test
public void testOneDs() throws Exception {
ModelNode ds1 = createDataSource(false, 0, 20, false);
testStatistics(ds1);
testStatisticsDouble(ds1);
}
@Test
public void testTwoDs() throws Exception {
ModelNode ds1 = createDataSource(false, 0, 10, false);
ModelNode ds2 = createDataSource(false, 0, 6, true);
testStatistics(ds1);
testStatistics(ds2);
testStatisticsDouble(ds1);
testStatisticsDouble(ds2);
testInterference(ds1, ds2);
testInterference(ds2, ds1);
}
@Test
public void testOneXaDs() throws Exception {
ModelNode ds1 = createDataSource(true, 0, 10, true);
testStatistics(ds1);
testStatisticsDouble(ds1);
}
@Test
public void testTwoXaDs() throws Exception {
ModelNode ds1 = createDataSource(true, 0, 1, false);
ModelNode ds2 = createDataSource(true, 0, 1, true);
testStatistics(ds1);
testStatistics(ds2);
testStatisticsDouble(ds1);
testStatisticsDouble(ds2);
testInterference(ds1, ds2);
testInterference(ds2, ds1);
}
@Test
public void testXaPlusDs() throws Exception {
ModelNode ds1 = createDataSource(false, 0, 3, false);
ModelNode ds2 = createDataSource(true, 0, 4, true);
testStatistics(ds1);
testStatistics(ds2);
testStatisticsDouble(ds1);
testStatisticsDouble(ds2);
testInterference(ds1, ds2);
testInterference(ds2, ds1);
}
@Override
public ModelNode translateFromConnectionToStatistics(ModelNode connectionNode) {
ModelNode statNode = connectionNode.clone();
statNode.add("statistics", "pool");
return statNode;
}
}