package org.jgroups.tests; import org.jgroups.Global; import org.jgroups.JChannel; import org.jgroups.Message; import org.jgroups.blocks.MessageDispatcher; import org.jgroups.blocks.RequestHandler; import org.jgroups.blocks.RequestOptions; 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.stack.ProtocolStack; import org.jgroups.util.Buffer; import org.jgroups.util.Rsp; import org.jgroups.util.RspList; import org.jgroups.util.Util; import org.testng.annotations.Test; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; /** * Test the VERIFY_SUSPECT protocol combined with FD and DISCARD. * * @author Dan Berindei * @since 3.3 */ @Test(groups=Global.FUNCTIONAL) public class DynamicDiscardTest { private static final int NUM = 2; public void testLeaveDuringSend() throws Exception { final JChannel[] channels = new JChannel[NUM]; final MessageDispatcher[] dispatchers = new MessageDispatcher[NUM]; for(int i=0; i < NUM; i++) { channels[i]= new JChannel(new SHARED_LOOPBACK(), new SHARED_LOOPBACK_PING(), new MERGE3(), new FD().setValue("timeout", 1000).setValue("max_tries", 1), new NAKACK2(), new UNICAST3(), new STABLE(), new GMS(), new RSVP().setValue("ack_on_delivery", false) .setValue("throw_exception_on_timeout", false)); channels[i].setName(Character.toString((char) ('A' + i))); channels[i].setDiscardOwnMessages(true); dispatchers[i]=new MessageDispatcher(channels[i], new MyRequestHandler()); channels[i].connect("DynamicDiscardTest"); System.out.print(i + 1 + " "); } Util.waitUntilAllChannelsHaveSameView(10000, 1000, channels); // discard all messages (except those to self) DISCARD discard = new DISCARD(); channels[0].getProtocolStack().insertProtocol(discard, ProtocolStack.Position.ABOVE, TP.class); discard.setDiscardAll(true); // send a RSVP message byte[] data="message2".getBytes(); Buffer buf=new Buffer(data, 0, data.length); RspList<Object> rsps=dispatchers[0].castMessage(null, buf, RequestOptions.SYNC().timeout(5000) .flags(Message.Flag.RSVP, Message.Flag.OOB)); Rsp<Object> objectRsp=rsps.get(channels[1].getAddress()); assertFalse(objectRsp.wasReceived()); assertTrue(objectRsp.wasSuspected()); } private static class MyRequestHandler implements RequestHandler { @Override public Object handle(Message msg) throws Exception { System.out.println(String.format("Received message %s", msg)); return "bla"; } } }