package org.jgroups.tests; import org.jgroups.Global; import org.jgroups.JChannel; import org.jgroups.protocols.*; import org.jgroups.protocols.pbcast.NAKACK2; import org.jgroups.stack.Protocol; import org.jgroups.stack.ProtocolStack; import org.testng.Assert; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.net.InetAddress; import java.util.List; /** * Tests ProtocolStack.insertProtocol() and removeProtocol() * @author Bela Ban */ @Test(groups=Global.FUNCTIONAL,singleThreaded=true) public class ConfiguratorTest { protected JChannel ch; protected ProtocolStack stack; static final String props="UDP:PING:FD_ALL:pbcast.NAKACK2(xmit_interval=500):UNICAST3:MFC"; final String[] names={"MFC", "UNICAST3", "NAKACK2", "FD_ALL", "PING", "UDP"}; final String[] below={"MFC", "UNICAST3", "TRACE", "NAKACK2", "FD_ALL", "PING", "UDP"}; final String[] above={"MFC", "TRACE", "UNICAST3", "NAKACK2", "FD_ALL", "PING", "UDP"}; @BeforeMethod void setUp() throws Exception { ch=new JChannel(new UDP(), new PING(), new FD_ALL(), new NAKACK2().setValue("xmit_interval", 500), new UNICAST3(), new MFC()); stack=ch.getProtocolStack(); } public void testRemovalOfTop() throws Exception { Protocol prot=stack.removeProtocol("MFC"); assert prot != null; List<Protocol> protocols=stack.getProtocols(); Assert.assertEquals(5, protocols.size()); assert protocols.get(0).getName().endsWith("UNICAST3"); assert stack.getTopProtocol().getUpProtocol() != null; assert stack.getTopProtocol().getDownProtocol() != null; assert stack.getTopProtocol().getDownProtocol().getUpProtocol() != null; assert stack.getTopProtocol().getDownProtocol().getDownProtocol() != null; } public void testRemovalOfBottom() throws Exception { Protocol prot=stack.removeProtocol("UDP"); assert prot != null; List<Protocol> protocols=stack.getProtocols(); Assert.assertEquals(5, protocols.size()); assert protocols.get(protocols.size() -1).getName().endsWith("PING"); } public void testAddingAboveTop() throws Exception{ Protocol new_prot=new TRACE(); stack.insertProtocol(new_prot, ProtocolStack.Position.ABOVE, MFC.class); List<Protocol> protocols=stack.getProtocols(); Assert.assertEquals(7, protocols.size()); assert protocols.get(0).getName().endsWith("TRACE"); assert stack.getTopProtocol().getUpProtocol() != null; assert stack.getTopProtocol().getDownProtocol() != null; assert stack.getTopProtocol().getDownProtocol().getUpProtocol() != null; assert stack.getTopProtocol().getDownProtocol().getDownProtocol() != null; } @Test(expectedExceptions={IllegalArgumentException.class}) public void testAddingBelowBottom() throws Exception{ Protocol new_prot=new TRACE(); stack.insertProtocol(new_prot, ProtocolStack.Position.BELOW, UDP.class); } public void testInsertion() throws Exception { List<Protocol> protocols=stack.getProtocols(); assert protocols != null; Assert.assertEquals(6, protocols.size()); for(int i=0; i < names.length; i++) { String name=names[i]; Protocol p=protocols.get(i); Assert.assertEquals(name, p.getName()); } // insert below Protocol new_prot=(Protocol)Class.forName("org.jgroups.protocols.TRACE").newInstance(); stack.insertProtocol(new_prot, ProtocolStack.Position.BELOW, UNICAST3.class); protocols=stack.getProtocols(); Assert.assertEquals(7, protocols.size()); for(int i=0; i < below.length; i++) { String name=below[i]; Protocol p=protocols.get(i); Assert.assertEquals(name, p.getName()); } // remove Protocol prot=stack.removeProtocol("TRACE"); assert prot != null; protocols=stack.getProtocols(); Assert.assertEquals(6, protocols.size()); for(int i=0; i < names.length; i++) { String name=names[i]; Protocol p=protocols.get(i); Assert.assertEquals(name, p.getName()); } // insert above new_prot=(Protocol)Class.forName("org.jgroups.protocols.TRACE").newInstance(); stack.insertProtocol(new_prot, ProtocolStack.Position.ABOVE, UNICAST3.class); protocols=stack.getProtocols(); Assert.assertEquals(7, protocols.size()); for(int i=0; i < above.length; i++) { String name=above[i]; Protocol p=protocols.get(i); Assert.assertEquals(name, p.getName()); } } /** Tests that vars are substituted correctly when creating a channel programmatically (https://issues.jboss.org/browse/JGRP-1908) */ public void testProgrammaticCreationAndVariableSubstitution() throws Exception { System.setProperty(Global.EXTERNAL_PORT, "10000"); System.setProperty(Global.BIND_ADDR, "127.0.0.1"); JChannel channel=new JChannel( new SHARED_LOOPBACK() /* dummy stack */ ).name("A"); TP tp=channel.getProtocolStack().getTransport(); assert tp.getValue("external_port").equals(10000); assert tp.getValue("bind_addr").equals(InetAddress.getByName("127.0.0.1")); } }