package org.limewire.rudp;
import junit.framework.Test;
import org.limewire.util.BaseTestCase;
/**
* Tests the SequenceNumberExtender class.
*/
public final class SequenceNumberExtenderTest extends BaseTestCase {
/*
* Constructs the test.
*/
public SequenceNumberExtenderTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(SequenceNumberExtenderTest.class);
}
/**
* Runs this test individually.
*/
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
/**
* Test that increments remain in sync with a full long being incremented
* and with the values being mapped down to 2 byte sequenceNumbers.
*
* @throws Exception if an error occurs
*/
public void testSequenceNumberIncrements() throws Exception {
// Init the extender
SequenceNumberExtender extender = new SequenceNumberExtender();
// Make sure that the sequence remains in sync with prior number
// and its own extended value - test up to 100000000
long finalValue = 10000000;
long lastiand;
long iand = -1;
lastiand = 0;
for (long i = 1; i <= finalValue; i++) {
// Shrink the sequenceNumber down to 2 bytes
iand = i & 0xffff;
// Extend the sequenceNumber back to 8 bytes
iand = extender.extendSequenceNumber((iand));
assertEquals("Previous sequence number plus 1 isn't current one",
lastiand + 1, iand);
assertEquals(i, iand);
lastiand = iand;
}
assertEquals(finalValue, iand);
}
public void testOutOfOrderNumber() {
SequenceNumberExtender extender = new SequenceNumberExtender();
for (long i = 0; i < 0x3FFF; i++)
assertEquals(i, extender.extendSequenceNumber(i));
assertEquals(0x3FFF, extender.extendSequenceNumber(0x3FFF));
for (long i = 0x3FFF + 1; i < 0x7FFF - 4; i++)
assertEquals(i, extender.extendSequenceNumber(i));
assertEquals(0x7FFF + 1, extender.extendSequenceNumber(0x7FFF + 1));
assertEquals(0x7FFF - 3, extender.extendSequenceNumber(0x7FFF - 3));
}
public void testOutOfOrderNumbers() {
SequenceNumberExtender extender = new SequenceNumberExtender();
for (int i = 1; i < 0xFFFFFF; i++) {
long extendedI = extender.extendSequenceNumber((i & 0xFFFF));
long outOfOrder = Math.max(i - 3, 1);
long extendedOutOfOrder = extender
.extendSequenceNumber((outOfOrder & 0xFFFF));
assertEquals(i, extendedI);
assertEquals(outOfOrder, extendedOutOfOrder);
assertEquals(i, extender.extendSequenceNumber((i & 0xFFFF)));
}
}
public void testLargeValues() {
SequenceNumberExtender extender = new SequenceNumberExtender();
assertEquals(0x3FFF, extender.extendSequenceNumber(0x3FFF));
assertEquals(0x3FFF, extender.extendSequenceNumber(0x3FFF));
assertEquals(0xFFFF, extender.extendSequenceNumber(0xFFFF));
assertEquals(0x10000, extender.extendSequenceNumber(0x0000));
}
}