package org.infinispan.server.test.transport;
import static org.infinispan.server.test.util.ITestUtils.SERVER1_MGMT_PORT;
import static org.infinispan.server.test.util.ITestUtils.SERVER2_MGMT_PORT;
import static org.infinispan.server.test.util.ITestUtils.getAttribute;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.Scanner;
import javax.management.ObjectName;
import org.infinispan.arquillian.core.InfinispanResource;
import org.infinispan.arquillian.core.RemoteInfinispanServer;
import org.infinispan.arquillian.core.RunningServer;
import org.infinispan.arquillian.core.WithRunningServer;
import org.infinispan.arquillian.utils.MBeanServerConnectionProvider;
import org.infinispan.server.infinispan.spi.InfinispanSubsystem;
import org.jboss.arquillian.container.test.api.Config;
import org.jboss.arquillian.container.test.api.ContainerController;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Test the stack attribute of the transport element. The
* stack attribute is set to UDP.
*
* @author <a href="mailto:mgencur@redhat.com">Martin Gencur</a>
*/
@RunWith(Arquillian.class)
@WithRunningServer({@RunningServer(name = "transport-stack-tcp"), @RunningServer(name = "transport-stack-udp")})
public class TransportStackConfigurationIT {
@InfinispanResource("transport-stack-tcp")
RemoteInfinispanServer server1;
@InfinispanResource("transport-stack-udp")
RemoteInfinispanServer server2;
@ArquillianResource
ContainerController controller;
private MBeanServerConnectionProvider provider;
String udpProtocolMBean = "jgroups:type=protocol,cluster=\"cluster\",protocol=UDP";
String tcpProtocolMBean = "jgroups:type=protocol,cluster=\"cluster\",protocol=TCP";
/*
* When setting a stack attribute on <transport> config. element, there has to be a UDP protocol
* MBean available via JMX. Its attributes must match those in standalone.xml config file (in fact,
* these are default values taken from jgroups-defaults.xml configuration file in clustering/jgroups
* subsystem)
*/
@Test
public void testUDPStackAttributes() throws Exception {
provider = new MBeanServerConnectionProvider(server2.getHotrodEndpoint().getInetAddress().getHostName(), SERVER2_MGMT_PORT);
assertMBeanAttributes(provider, udpProtocolMBean);
}
/*
* When setting a stack attribute on <transport> config. element, there has to be a TCP protocol
* MBean available via JMX. Its attributes must match those in standalone.xml config file (in fact,
* these are default values taken from jgroups-defaults.xml configuration file in clustering/jgroups
* subsystem).
*/
@Test
public void testTCPStackAttributes() throws Exception {
provider = new MBeanServerConnectionProvider(server1.getHotrodEndpoint().getInetAddress().getHostName(), SERVER1_MGMT_PORT);
assertMBeanAttributes(provider, tcpProtocolMBean);
}
private void assertMBeanAttributes(MBeanServerConnectionProvider provider, String protocolMBean) throws Exception {
assertEquals(true, Boolean.parseBoolean(getAttribute(provider, protocolMBean, "log_discard_msgs")));
assertEquals(true, Boolean.parseBoolean(getAttribute(provider, protocolMBean, "thread_pool.enabled")));
assertEquals(0, Integer.parseInt(getAttribute(provider, protocolMBean, "thread_pool.min_threads")));
assertEquals(200, Integer.parseInt(getAttribute(provider, protocolMBean, "thread_pool.max_threads")));
assertEquals(60000, Integer.parseInt(getAttribute(provider, protocolMBean, "thread_pool.keep_alive_time")));
}
/*
* Dump service via JMX and find out whether test-infinispan-transport executor was picked up.
*/
@Ignore
@Test
public void testExecutorAttribute() throws Exception {
provider = new MBeanServerConnectionProvider(server1.getHotrodEndpoint().getInetAddress().getHostName(), SERVER1_MGMT_PORT);
final String dumpServicesBean = "jboss.msc:type=container,name=jboss-as";
final String dumpServicesOp = "dumpServicesToString";
String services = provider.getConnection().invoke(new ObjectName(dumpServicesBean), dumpServicesOp, null, null).toString();
assertTrue(isTestInfinispanTransportSpecified(services));
}
private boolean isTestInfinispanTransportSpecified(String services) {
Scanner s = new Scanner(services).useDelimiter("\n");
while (true) {
try {
String line = s.nextLine();
if (line.contains("Service \"jboss."+InfinispanSubsystem.SUBSYSTEM_NAME + ".clustered.config\"") &&
line.substring(line.indexOf("dependencies:")).contains("jboss.thread.executor.infinispan-transport")) {
return true;
}
} catch (Exception e) {
return false;
}
}
}
private void startContainerWithStack(String containerName, String nodeName, int portOffset, String stack) {
controller.start(containerName, new Config().add("javaVmArguments", System.getProperty("server.jvm.args")
+ " -Djboss.node.name=" + nodeName
+ " -Djboss.socket.binding.port-offset=" + portOffset
+ " -Djboss.default.jgroups.stack=" + stack
).map());
}
private void stopContainers(String... containerNames) {
for (String name : containerNames) {
controller.stop(name);
}
}
}