package org.jgroups.tests; import org.jgroups.Address; import org.jgroups.JChannel; import org.jgroups.protocols.*; import org.jgroups.protocols.pbcast.GMS; import org.jgroups.protocols.pbcast.NAKACK2; import org.jgroups.protocols.pbcast.STABLE; import org.jgroups.util.Util; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.lang.reflect.Method; import java.net.InetAddress; /** * Tests false suspicions and UNSUSPECT events (https://issues.jboss.org/browse/JGRP-1922) * @author Bela Ban * @since 3.6.4 */ @Test(singleThreaded=true) public class FalseSuspicionTest { protected static final int NUM=5; protected static final Method suspect_method; protected JChannel[] channels=new JChannel[NUM]; static { try { suspect_method=FD_SOCK.class.getDeclaredMethod("broadcastSuspectMessage", Address.class); suspect_method.setAccessible(true); } catch(NoSuchMethodException e) { throw new RuntimeException(e); } } @BeforeMethod protected void setup() throws Exception { for(int i=0; i < channels.length; i++) { channels[i]=create(String.valueOf(i+1)); channels[i].connect("FalseSuspicionTest"); } } @AfterMethod protected void destroy() {Util.close(channels);} public void testFalseSuspicion() throws Exception { JChannel e=channels[channels.length-1]; FD_SOCK fd_sock=(FD_SOCK)e.getProtocolStack().findProtocol(FD_SOCK.class); System.out.println("*** suspecting " + channels[1].getAddress()); suspect_method.invoke(fd_sock, channels[1].getAddress()); for(int i=0; i < 10; i++) { if(getTotalSuspectedMembers() == 0) break; Util.sleep(1000); } assert getTotalSuspectedMembers() == 0; } protected int getTotalSuspectedMembers() { int total=0; for(JChannel ch: channels) { FD_SOCK fd_sock=(FD_SOCK)ch.getProtocolStack().findProtocol(FD_SOCK.class); total+=fd_sock.getNumSuspectedMembers(); } return total; } protected JChannel create(String name) throws Exception { return new JChannel( new SHARED_LOOPBACK(), new SHARED_LOOPBACK_PING(), new FD_SOCK().setValue("bind_addr", InetAddress.getByName("127.0.0.1")), new VERIFY_SUSPECT(), new NAKACK2(), new UNICAST3(), new STABLE(), new GMS().joinTimeout(1000)).name(name); } }