Tests and bugfixes for XOR encoder and decoder.

This commit is contained in:
akwizgran
2012-01-20 19:09:27 +00:00
parent 74dd4e277f
commit 114ca203d8
6 changed files with 112 additions and 21 deletions

View File

@@ -61,6 +61,7 @@
<test name='net.sf.briar.transport.IncomingSegmentedEncryptionLayerTest'/>
<test name='net.sf.briar.transport.OutgoingEncryptionLayerImplTest'/>
<test name='net.sf.briar.transport.OutgoingSegmentedEncryptionLayerTest'/>
<test name='net.sf.briar.transport.XorErasureCodeTest'/>
<test name='net.sf.briar.transport.XorErasureDecoderTest'/>
<test name='net.sf.briar.transport.XorErasureEncoderTest'/>
<test name='net.sf.briar.util.ByteUtilsTest'/>

View File

@@ -0,0 +1,50 @@
package net.sf.briar.transport;
import static net.sf.briar.api.transport.TransportConstants.FRAME_HEADER_LENGTH;
import static net.sf.briar.api.transport.TransportConstants.MAC_LENGTH;
import java.util.Random;
import net.sf.briar.BriarTestCase;
import net.sf.briar.api.transport.Segment;
import static org.junit.Assert.assertArrayEquals;
import org.junit.Test;
public class XorErasureCodeTest extends BriarTestCase {
@Test
public void testEncodingAndDecodingWithAllSegments() throws Exception {
XorErasureEncoder e = new XorErasureEncoder(5);
XorErasureDecoder d = new XorErasureDecoder(5);
Frame f = new Frame(1234);
new Random().nextBytes(f.getBuffer());
int payload = 1234 - FRAME_HEADER_LENGTH - MAC_LENGTH;
HeaderEncoder.encodeHeader(f.getBuffer(), 0L, payload, 0);
f.setLength(1234);
Segment[] set = e.encodeFrame(f);
assertEquals(5, set.length);
Frame f1 = new Frame(1234);
assertTrue(d.decodeFrame(f1, set));
assertArrayEquals(f.getBuffer(), f1.getBuffer());
}
@Test
public void testEncodingAndDecodingWithMissingSegment() throws Exception {
XorErasureEncoder e = new XorErasureEncoder(5);
XorErasureDecoder d = new XorErasureDecoder(5);
Frame f = new Frame(1234);
new Random().nextBytes(f.getBuffer());
int payload = 1234 - FRAME_HEADER_LENGTH - MAC_LENGTH;
HeaderEncoder.encodeHeader(f.getBuffer(), 0L, payload, 0);
f.setLength(1234);
for(int i = 0; i < 5; i++) {
Segment[] set = e.encodeFrame(f);
assertEquals(5, set.length);
set[i] = null;
Frame f1 = new Frame(1234);
assertTrue(d.decodeFrame(f1, set));
assertArrayEquals(f.getBuffer(), f1.getBuffer());
}
}
}

View File

@@ -14,24 +14,15 @@ public class XorErasureDecoderTest extends BriarTestCase {
@Test
public void testMaximumLength() throws Exception {
XorErasureDecoder d = new XorErasureDecoder(5);
// A frame of the maximum length should be decoded successfully
Segment[] set = encodeEmptyFrame(MAX_FRAME_LENGTH / 4, 5);
XorErasureDecoder d = new XorErasureDecoder(5);
Frame f = new Frame();
assertTrue(d.decodeFrame(f, set));
// Check the header
byte[] b = f.getBuffer();
assertEquals(0L, HeaderEncoder.getFrameNumber(b));
int payload = MAX_FRAME_LENGTH - FRAME_HEADER_LENGTH - MAC_LENGTH;
assertEquals(payload, HeaderEncoder.getPayloadLength(b));
assertEquals(0, HeaderEncoder.getPaddingLength(b));
// Check the body
assertEquals(MAX_FRAME_LENGTH, f.getLength());
for(int i = FRAME_HEADER_LENGTH; i < MAX_FRAME_LENGTH; i++) {
assertEquals(0, b[i]);
}
checkFrame(f, MAX_FRAME_LENGTH);
// A frame larger than the maximum length should not be decoded
set = encodeEmptyFrame(MAX_FRAME_LENGTH / 4 + 1, 5);
f = new Frame();
try {
d.decodeFrame(f, set);
} catch(FormatException expected) {}
@@ -47,12 +38,35 @@ public class XorErasureDecoderTest extends BriarTestCase {
set[1].setLength(251);
// The frame should be decoded successfully
XorErasureDecoder d = new XorErasureDecoder(4);
Frame f = new Frame();
Frame f = new Frame(750);
assertTrue(d.decodeFrame(f, set));
// The minimum of the segments' lengths should have been used
assertEquals(750, f.getLength());
}
@Test
public void testDecodingWithMissingSegment() throws Exception {
XorErasureDecoder d = new XorErasureDecoder(4);
for(int i = 0; i < 4; i++) {
Segment[] set = encodeEmptyFrame(250, 4);
set[i] = null;
// The frame should be decoded successfully
Frame f = new Frame(750);
assertTrue(d.decodeFrame(f, set));
checkFrame(f, 750);
}
}
@Test
public void testDecodingWithTwoMissingSegments() throws Exception {
XorErasureDecoder d = new XorErasureDecoder(4);
Segment[] set = encodeEmptyFrame(250, 4);
set[0] = null;
set[1] = null;
Frame f = new Frame(750);
assertFalse(d.decodeFrame(f, set));
}
private Segment[] encodeEmptyFrame(int length, int n) {
Segment[] set = new Segment[n];
for(int i = 0; i < n; i++) {
@@ -64,4 +78,17 @@ public class XorErasureDecoderTest extends BriarTestCase {
HeaderEncoder.encodeHeader(set[n - 1].getBuffer(), 0L, payload, 0);
return set;
}
private void checkFrame(Frame f, int length) {
byte[] b = f.getBuffer();
assertEquals(0L, HeaderEncoder.getFrameNumber(b));
int payload = length - FRAME_HEADER_LENGTH - MAC_LENGTH;
assertEquals(payload, HeaderEncoder.getPayloadLength(b));
assertEquals(0, HeaderEncoder.getPaddingLength(b));
// Check the body
assertEquals(length, f.getLength());
for(int i = FRAME_HEADER_LENGTH; i < length; i++) {
assertEquals("" + i, 0, b[i]);
}
}
}