package org.jgroups.tests; import org.jgroups.Address; import org.jgroups.Global; import org.jgroups.stack.DefaultRetransmitter; import org.jgroups.stack.ExponentialInterval; import org.jgroups.stack.RangeBasedRetransmitter; import org.jgroups.stack.Retransmitter; import org.jgroups.util.*; import org.testng.Assert; import org.testng.annotations.*; import java.util.ArrayList; import java.util.Collections; import java.util.List; @Test(groups=Global.FUNCTIONAL,sequential=true,dataProvider="createRetransmitter") public class RetransmitterTest { private final Address sender=Util.createRandomAddress(); private TimeScheduler timer; @BeforeClass void createTimer() { timer=new MockTimeScheduler(); } @AfterClass void destroyTimer() { timer.stop(); } @DataProvider(name="createRetransmitter") protected Retransmitter[][] createRetransmitter() { Retransmitter range_based_retransmitter=new RangeBasedRetransmitter(sender, new MyXmitter(), timer); Retransmitter old_retransmitter=new DefaultRetransmitter(sender, new MyXmitter(), timer); range_based_retransmitter.setRetransmitTimeouts(new ExponentialInterval(1000)); range_based_retransmitter.reset(); old_retransmitter.setRetransmitTimeouts(new ExponentialInterval(1000)); old_retransmitter.reset(); return new Retransmitter[][] { {old_retransmitter}, {range_based_retransmitter} }; } @Test(dataProvider="createRetransmitter") public void testNoEntry(Retransmitter xmitter) { int size=xmitter.size(); System.out.println("xmitter: " + xmitter); Assert.assertEquals(0, size); } @Test(dataProvider="createRetransmitter") public void testSingleEntry(Retransmitter xmitter) { xmitter.add(1, 1); int size=xmitter.size(); System.out.println("xmitter: " + xmitter); Assert.assertEquals(1, size); } @Test(dataProvider="createRetransmitter") public void testEntry(Retransmitter xmitter) { xmitter.add(1, 10); int size=xmitter.size(); System.out.println("xmitter: " + xmitter); Assert.assertEquals(10, size); } @Test(dataProvider="createRetransmitter") public void testMultipleEntries(Retransmitter xmitter) { xmitter.add(1, 10); int size=xmitter.size(); System.out.println("xmitter: " + xmitter); Assert.assertEquals(10, size); xmitter.add(12,13); size=xmitter.size(); System.out.println("xmitter: " + xmitter); Assert.assertEquals(12, size); xmitter.remove(5); size=xmitter.size(); System.out.println("xmitter: " + xmitter); Assert.assertEquals(11, size); xmitter.remove(13); size=xmitter.size(); System.out.println("xmitter: " + xmitter); Assert.assertEquals(10, size); xmitter.remove(1); size=xmitter.size(); System.out.println("xmitter: " + xmitter); Assert.assertEquals(9, size); xmitter.remove(13); size=xmitter.size(); System.out.println("xmitter: " + xmitter); Assert.assertEquals(9, size); xmitter.remove(12); size=xmitter.size(); System.out.println("xmitter: " + xmitter); Assert.assertEquals(8, size); for(int i=8; i >= 0; i--) xmitter.remove(i); size=xmitter.size(); System.out.println("xmitter: " + xmitter); Assert.assertEquals(2, size); xmitter.remove(10); size=xmitter.size(); System.out.println("xmitter: " + xmitter); Assert.assertEquals(1, size); xmitter.remove(9); size=xmitter.size(); System.out.println("xmitter: " + xmitter); Assert.assertEquals(0, size); } /** * Note that we do not have overlapping ranges due to the way {@link org.jgroups.stack.NakReceiverWindow} adds * missing messages ! * @param xmitter */ @Test(dataProvider="createRetransmitter") public void testRanges(Retransmitter xmitter) { xmitter.add(100, 200); xmitter.add(300, 400); System.out.println("xmitter (" + xmitter.getClass().getCanonicalName() + "): " + xmitter); assert xmitter.size() == 202 : "size was " + xmitter.size(); } @Test(dataProvider="createRetransmitter") public void testAddAndRemoveIndividualSeqnos(Retransmitter xmitter) { int NUM=100; List<Long> seqnos=new ArrayList<Long>(NUM); for(long i=1; i <= NUM; i++) { seqnos.add(i); xmitter.add(i, i); } System.out.println("xmitter = " + xmitter); assert xmitter.size() == NUM; Collections.shuffle(seqnos); while(!seqnos.isEmpty()) { long seqno=seqnos.remove(0); xmitter.remove(seqno); } System.out.println("xmitter = " + xmitter); assert xmitter.size() == 0 : "expected size of 0, but size is " + xmitter.size(); } @Test(dataProvider="createRetransmitter") public void testAddAndRemoveRanges(Retransmitter xmitter) { int NUM=100; List<Long> seqnos=new ArrayList<Long>(NUM); for(long i=1; i <= NUM; i++) seqnos.add(i); xmitter.add(1, NUM); System.out.println("xmitter = " + xmitter); assert xmitter.size() == NUM; Collections.shuffle(seqnos); while(!seqnos.isEmpty()) { long seqno=seqnos.remove(0); xmitter.remove(seqno); } System.out.println("xmitter = " + xmitter); assert xmitter.size() == 0 : "expected size of 0, but size is " + xmitter.size(); } static class MyXmitter implements Retransmitter.RetransmitCommand { public void retransmit(long first_seqno, long last_seqno, Address sender) { } } }