package org.jgroups.protocols;
import org.jgroups.*;
import org.jgroups.conf.ClassConfigurator;
import org.jgroups.protocols.pbcast.NAKACK2;
import org.jgroups.protocols.pbcast.NakAckHeader2;
import org.jgroups.stack.Protocol;
import org.jgroups.util.*;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
/**
* Tests the NAKACK protocol's REBROADCAST behavior
* @author Dennis Reed
*/
@Test(groups=Global.FUNCTIONAL,singleThreaded=true)
public class NAKACK_REBROADCAST_Test {
static final short NAKACK_ID=ClassConfigurator.getProtocolId(NAKACK2.class);
protected Address a1;
protected View view;
protected NAKACK2 nak;
protected MessageInterceptor interceptor;
@BeforeMethod
public void setUp() throws Exception {
a1=Util.createRandomAddress("A");
view=View.create(a1, 1, a1);
nak=new NAKACK2();
interceptor = new MessageInterceptor();
nak.setDownProtocol(interceptor);
TP transport=new TP() {
public boolean supportsMulticasting() {return false;}
public void sendMulticast(byte[] data, int offset, int length) throws Exception {}
public void sendUnicast(PhysicalAddress dest, byte[] data, int offset, int length) throws Exception {}
public String getInfo() {return null;}
public Object down(Event evt) {return null;}
public Object down(Message msg) {return null;}
protected PhysicalAddress getPhysicalAddress() {return null;}
public TimeScheduler getTimer() {return new TimeScheduler3();}
};
interceptor.setDownProtocol(transport);
nak.start();
Digest digest=new Digest(view.getMembersRaw(), new long[]{0, 0});
Event evt=new Event(Event.SET_DIGEST, digest);
nak.down(evt);
}
@Test
public void testRebroadcast() throws InterruptedException {
Digest digest=new Digest(view.getMembersRaw(), new long[]{2, 2});
Event evt=new Event(Event.REBROADCAST, digest);
nak.down(evt);
SeqnoList range = interceptor.getRange();
Assert.assertNotNull(range);
Assert.assertEquals(2, range.size());
for(long i: range)
Assert.assertTrue(i == 1 || i == 2);
}
@Test
public void testRebroadcastSingle() throws InterruptedException {
Digest digest=new Digest(view.getMembersRaw(), new long[]{1, 1});
Event evt=new Event(Event.REBROADCAST, digest);
nak.down(evt);
SeqnoList range = interceptor.getRange();
Assert.assertNotNull(range);
Assert.assertEquals(1, range.size());
for(long i: range)
Assert.assertTrue(i == 1);
}
static class MessageInterceptor extends Protocol {
private SeqnoList range;
public MessageInterceptor () {
}
public String getName () {
return "MessageInterceptor";
}
public Object down(Message msg) {
NakAckHeader2 hdr=msg.getHeader(NAKACK_ID);
if(hdr != null && hdr.getType() == NakAckHeader2.XMIT_REQ) {
try {
this.range=Util.streamableFromBuffer(SeqnoList.class, msg.getRawBuffer(), msg.getOffset(), msg.getLength());
}
catch(Exception e) {
e.printStackTrace();
}
}
return super.down(msg);
}
public SeqnoList getRange() {return this.range;}
}
}