/*
* 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 java.net.InetAddress;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import junit.framework.TestCase;
import org.jboss.ha.framework.server.JChannelFactory;
import org.jboss.ha.framework.server.ProtocolStackConfigInfo;
import org.jboss.ha.framework.server.managed.ProtocolDataProtocolStackConfigurator;
import org.jboss.logging.Logger;
import org.jgroups.Channel;
import org.jgroups.JChannel;
import org.jgroups.conf.ProtocolData;
import org.jgroups.conf.ProtocolParameter;
/**
* Tests JChannelFactory's handling of configuration overrides via
* @[link {@link JChannelFactory#setProtocolStackConfigurations(java.util.Map)}}
*
* @author Brian Stansberry
*/
public class JChannelFactoryOverrideUnitTestCase extends TestCase
{
private static final Logger log = Logger.getLogger(JChannelFactoryOverrideUnitTestCase.class);
private JChannelFactory factory;
private Channel channel1;
private Channel channel2;
private String jgroups_bind_addr;
/**
* Create a new JChannelFactoryUnitTestCase.
*
* @param name
*/
public JChannelFactoryOverrideUnitTestCase(String name)
{
super(name);
}
protected void setUp() throws Exception
{
super.setUp();
jgroups_bind_addr = System.getProperty("jgroups.bind_addr");
if (jgroups_bind_addr == null)
{
System.setProperty("jbosstest.cluster.node0", System.getProperty("jbosstest.cluster.node0", "localhost"));
}
factory = new JChannelFactory();
factory.setAssignLogicalAddresses(false);
factory.setNodeAddress(InetAddress.getByName("localhost"));
factory.setNamingServicePort(123);
factory.setExposeChannels(false);
factory.setManageReleasedThreadClassLoader(true);
}
protected void tearDown() throws Exception
{
super.tearDown();
if (jgroups_bind_addr == null)
System.clearProperty("jgroups.bind_addr");
if (channel1 != null && channel1.isOpen())
channel1.close();
if (channel2 != null && channel2.isOpen())
channel2.close();
if (factory != null)
{
factory.stop();
factory.destroy();
}
}
public void testOverrideAfterStart() throws Exception
{
overrideTest(true);
}
public void testOverrideBeforeStart() throws Exception
{
overrideTest(false);
}
private void overrideTest(boolean startBeforeOverride) throws Exception
{
factory.setMultiplexerConfig("cluster/channelfactory/stacks.xml");
if (startBeforeOverride)
{
factory.create();
factory.start();
}
Map<String, ProtocolStackConfigInfo> origMap = factory.getProtocolStackConfigurations();
Set<String> origKeys = new HashSet<String>(origMap.keySet());
ProtocolStackConfigInfo unshared1 = origMap.get("unshared1");
assertNotNull(unshared1);
ProtocolData[] origConfig = unshared1.getConfiguration();
assertNotNull(origConfig);
// Copy it off so we know it's unchanged for later assertion comparisons
origConfig = origConfig.clone();
ProtocolData origTransport = origConfig[0];
assertNotNull(origTransport);
ProtocolParameter[] origParams = origTransport.getParametersAsArray();
ProtocolParameter[] newParams = origParams.clone();
ProtocolData newTransport = new ProtocolData(origTransport.getProtocolName(), origTransport.getDescription(), origTransport.getClassName(), newParams);
ProtocolParameter overrideParam = new ProtocolParameter("max_bundle_size", "50000");
newTransport.override(new ProtocolParameter[]{overrideParam});
ProtocolData[] newConfig = origConfig.clone();
newConfig[0] = newTransport;
ProtocolStackConfigInfo updated = new ProtocolStackConfigInfo(unshared1.getName(), unshared1.getDescription(), new ProtocolDataProtocolStackConfigurator(newConfig));
Map<String, ProtocolStackConfigInfo> newMap = new HashMap<String, ProtocolStackConfigInfo>(origMap);
newMap.put("unshared1", updated);
ProtocolData[] addedConfig = origConfig.clone();
ProtocolStackConfigInfo added = new ProtocolStackConfigInfo("added", "added", new ProtocolDataProtocolStackConfigurator(addedConfig));
newMap.put("added", added);
assertTrue(newMap.containsKey("shared2"));
newMap.remove("shared2");
factory.setProtocolStackConfigurations(newMap);
if (startBeforeOverride == false)
{
factory.create();
factory.start();
}
Map<String, ProtocolStackConfigInfo> reread = factory.getProtocolStackConfigurations();
origKeys.remove("shared2");
origKeys.add("added");
assertEquals(origKeys, reread.keySet());
ProtocolStackConfigInfo addedInfo = reread.get("added");
assertEquals("added", addedInfo.getName());
assertEquals("added", addedInfo.getDescription());
ProtocolData[] readAdded = addedInfo.getConfiguration();
assertEquals(addedConfig.length, readAdded.length);
for (int i = 0; i < readAdded.length; i++)
{
assertEquals(addedConfig[i], readAdded[i]);
ProtocolParameter[] inputParams = addedConfig[i].getParametersAsArray();
ProtocolParameter[] outputParams = readAdded[i].getParametersAsArray();
assertEquals(inputParams.length, outputParams.length);
@SuppressWarnings("unchecked")
Map<String, ProtocolParameter> paramMap = readAdded[i].getParameters();
for (int j = 0; j < inputParams.length; j++)
{
ProtocolParameter param = paramMap.get(inputParams[j].getName());
assertNotNull(param);
assertEquals(inputParams[j].getValue(), param.getValue());
}
}
ProtocolStackConfigInfo updatedInfo = reread.get("unshared1");
assertEquals("unshared1", updatedInfo.getName());
ProtocolData[] readUpdated = updatedInfo.getConfiguration();
assertEquals(origConfig.length, readUpdated.length);
for (int i = 0; i < readUpdated.length; i++)
{
assertEquals(origConfig[i], readUpdated[i]);
ProtocolParameter[] inputParams = origConfig[i].getParametersAsArray();
ProtocolParameter[] outputParams = readUpdated[i].getParametersAsArray();
assertEquals(inputParams.length, outputParams.length);
@SuppressWarnings("unchecked")
Map<String, ProtocolParameter> paramMap = readUpdated[i].getParameters();
for (int j = 0; j < inputParams.length; j++)
{
String name = inputParams[j].getName();
ProtocolParameter param = paramMap.get(name);
assertNotNull(param);
if ("max_bundle_size".equals(name))
{
assertEquals("50000", param.getValue());
}
else
{
assertEquals(inputParams[j].getValue(), param.getValue());
}
}
}
// Validate that the overrides actuall affect created channels
channel1 = factory.createChannel("unshared1");
assertEquals("50000", ((JChannel) channel1).getProtocolStack().findProtocol("UDP").getProperties().get("max_bundle_size"));
channel2 = factory.createChannel("added");
assertEquals("64000", ((JChannel) channel2).getProtocolStack().findProtocol("UDP").getProperties().get("max_bundle_size"));
try
{
factory.createChannel("shared2");
fail("should not be able to create a channel for 'shared2'");
}
catch (IllegalArgumentException good) {}
}
}