/* * JBoss, Home of Professional Open Source. * Copyright 2008, Red Hat Middleware LLC, 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.test.cluster.defaultcfg.test; import javax.management.MBeanServerConnection; import javax.management.ObjectName; import junit.framework.Test; import org.jboss.system.ServiceMBean; import org.jboss.test.JBossClusteredTestCase; /** * @author Brian Stansberry * */ public class HASingletonDeployerTestCase extends JBossClusteredTestCase { public static final String SINGLETON_DEPLOYER_ONAME = "jboss.ha:service=TestHASingletonDeployer"; public static final String SINGLETON_DEPLOYMENT = "jboss.system:service=HASingletonTestThreadPool"; public static final String SINGLETON_DEPLOYER = "test-deploy-hasingleton-jboss-beans.xml"; public static final String SINGLETON_BARRIER_ONAME = "jboss.ha:service=TestHASingletonDeployer,type=Barrier"; public static final Integer CREATED_STATE = new Integer(ServiceMBean.CREATED); public static final Integer STARTED_STATE = new Integer(ServiceMBean.STARTED); public static final Integer STOPPED_STATE = new Integer(ServiceMBean.STOPPED); public static final String STD_SINGLETON_DEPLOYER_ONAME = "jboss.ha:service=HASingletonDeployer"; public static final String STD_SINGLETON_BARRIER_ONAME = "jboss.ha:service=HASingletonDeployer,type=Barrier"; /** * Create a new ProfileRepositoryHASingletonDeployerTestCase. * * @param name */ public HASingletonDeployerTestCase(String name) { super(name); } public static Test suite() throws Exception { return getDeploySetup(HASingletonDeployerTestCase.class, SINGLETON_DEPLOYER); } /** * Accesses the test HASingletonDeployer beans deployed by the test wrapper * and validates that deployments are done on the master node and not on * the non-master. Also validates that a Barrier has reached the start * state on the master and not on the non-master. Then undeploys * the deployer on the master node and checks service failover. Then undeploys * on the other node and redeploys on node1, checking node1 became master * with the target services deployed and the Barrier started. Then deploys * on node0, confirming that node1 remained the master and node0 didn't * deploy the target services or bring a BARRIER to STARTED state. * * @throws Exception */ public void testHASingletonDeployer() throws Exception { MBeanServerConnection[] adaptors = getAdaptors(); boolean node0Master = isMaster(adaptors[0], false); assertFalse(node0Master == isMaster(adaptors[1], false)); int origMasterIndex = node0Master ? 0 : 1; int origNonMasterIndex = node0Master ? 1 : 0; assertTrue("singleton is not deployed on node " + origMasterIndex, isDeployed(SINGLETON_DEPLOYMENT, adaptors[origMasterIndex])); assertFalse("singleton is deployed on node " + origNonMasterIndex, isDeployed(SINGLETON_DEPLOYMENT, adaptors[origNonMasterIndex])); assertBarrierStatus(adaptors[0], node0Master, false); assertBarrierStatus(adaptors[1], !node0Master, false); undeploy(adaptors[origMasterIndex], SINGLETON_DEPLOYER); // The singleton is triggered asynchronously, so give it time to work sleep(2000); assertTrue(isDeployed(SINGLETON_DEPLOYMENT, adaptors[origNonMasterIndex])); assertFalse(isDeployed(SINGLETON_DEPLOYMENT, adaptors[origMasterIndex])); assertBarrierStatus(adaptors[origNonMasterIndex], true, false); assertFalse(isDeployed(SINGLETON_BARRIER_ONAME, adaptors[origMasterIndex])); undeploy(adaptors[origNonMasterIndex], SINGLETON_DEPLOYER); sleep(2000); assertFalse(isDeployed(SINGLETON_DEPLOYMENT, adaptors[0])); assertFalse(isDeployed(SINGLETON_DEPLOYMENT, adaptors[1])); assertFalse(isDeployed(SINGLETON_BARRIER_ONAME, adaptors[0])); assertFalse(isDeployed(SINGLETON_BARRIER_ONAME, adaptors[1])); deploy(adaptors[1], SINGLETON_DEPLOYER); sleep(2000); assertTrue(isDeployed(SINGLETON_DEPLOYMENT, adaptors[1])); assertFalse(isDeployed(SINGLETON_DEPLOYMENT, adaptors[0])); assertBarrierStatus(adaptors[1], true, false); assertFalse(isDeployed(SINGLETON_BARRIER_ONAME, adaptors[0])); deploy(adaptors[0], SINGLETON_DEPLOYER); sleep(2000); // per policy, node0 takes over as master assertTrue(isDeployed(SINGLETON_DEPLOYMENT, adaptors[origMasterIndex])); assertFalse(isDeployed(SINGLETON_DEPLOYMENT, adaptors[origNonMasterIndex])); assertBarrierStatus(adaptors[0], true, false); assertBarrierStatus(adaptors[1], false, false); } /** * Accesses the standard HASingletonDeployer beans, validating that one node * is the master and the other isn't, and that the HASingleto Barrier is * STARTED on the master and CREATED on the non-master. A basic check that * the "all" config is correct. JBAS-6363. * * @throws Exception */ public void testAllConfiguration() throws Exception { MBeanServerConnection[] adaptors = getAdaptors(); boolean node0Master = isMaster(adaptors[0], true); assertFalse(node0Master == isMaster(adaptors[1], true)); assertBarrierStatus(adaptors[0], node0Master, true); assertBarrierStatus(adaptors[1], !node0Master, true); } protected boolean isDeployed(String deployment, MBeanServerConnection server) throws Exception { return server.isRegistered(new ObjectName(deployment)); } private boolean isMaster(MBeanServerConnection server, boolean stdTest) { try { ObjectName oname = new ObjectName(stdTest ? STD_SINGLETON_DEPLOYER_ONAME : SINGLETON_DEPLOYER_ONAME); return ((Boolean) server.invoke(oname, "isMasterNode", new Object[]{}, new String[]{})).booleanValue(); } catch (Exception e) { throw new RuntimeException(e); } } private void assertBarrierStatus(MBeanServerConnection server, boolean isMaster, boolean stdTest) throws Exception { ObjectName oname = new ObjectName(stdTest ? STD_SINGLETON_BARRIER_ONAME : SINGLETON_BARRIER_ONAME); Integer state = (Integer) server.getAttribute(oname, "State"); if (isMaster) { assertEquals(STARTED_STATE, state); } else { assertTrue("State " + state + " is valid", CREATED_STATE.equals(state) || STOPPED_STATE.equals(state)); } } }