Skip to content
Snippets Groups Projects
Commit 74dd4e27 authored by akwizgran's avatar akwizgran
Browse files

Tests and bugfixes for XorErasureDecoder.

parent 2b737e7e
No related branches found
No related tags found
No related merge requests found
...@@ -23,7 +23,7 @@ class XorErasureDecoder implements ErasureDecoder { ...@@ -23,7 +23,7 @@ class XorErasureDecoder implements ErasureDecoder {
// All the pieces must have the same length - take the minimum // All the pieces must have the same length - take the minimum
int length = MAX_FRAME_LENGTH; int length = MAX_FRAME_LENGTH;
for(int i = 0; i < n; i++) { for(int i = 0; i < n; i++) {
if(set[i] == null) { if(set[i] != null) {
int len = set[i].getLength(); int len = set[i].getLength();
if(len < length) length = len; if(len < length) length = len;
} }
......
...@@ -61,6 +61,7 @@ ...@@ -61,6 +61,7 @@
<test name='net.sf.briar.transport.IncomingSegmentedEncryptionLayerTest'/> <test name='net.sf.briar.transport.IncomingSegmentedEncryptionLayerTest'/>
<test name='net.sf.briar.transport.OutgoingEncryptionLayerImplTest'/> <test name='net.sf.briar.transport.OutgoingEncryptionLayerImplTest'/>
<test name='net.sf.briar.transport.OutgoingSegmentedEncryptionLayerTest'/> <test name='net.sf.briar.transport.OutgoingSegmentedEncryptionLayerTest'/>
<test name='net.sf.briar.transport.XorErasureDecoderTest'/>
<test name='net.sf.briar.transport.XorErasureEncoderTest'/> <test name='net.sf.briar.transport.XorErasureEncoderTest'/>
<test name='net.sf.briar.util.ByteUtilsTest'/> <test name='net.sf.briar.util.ByteUtilsTest'/>
<test name='net.sf.briar.util.FileUtilsTest'/> <test name='net.sf.briar.util.FileUtilsTest'/>
......
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 static net.sf.briar.api.transport.TransportConstants.MAX_FRAME_LENGTH;
import net.sf.briar.BriarTestCase;
import net.sf.briar.api.FormatException;
import net.sf.briar.api.transport.Segment;
import static org.junit.Assert.assertArrayEquals;
import org.junit.Test;
public class XorErasureDecoderTest extends BriarTestCase {
@Test
public void testMaximumLength() throws Exception {
// 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]);
}
// A frame larger than the maximum length should not be decoded
set = encodeEmptyFrame(MAX_FRAME_LENGTH / 4 + 1, 5);
try {
d.decodeFrame(f, set);
} catch(FormatException expected) {}
}
@Test
public void testMinimumLengthIsUsed() throws Exception {
Segment[] set = encodeEmptyFrame(250, 4);
// Replace one of the pieces with a longer piece
byte[] b = set[1].getBuffer();
assertArrayEquals(new byte[250], b);
set[1] = new SegmentImpl(251);
set[1].setLength(251);
// The frame should be decoded successfully
XorErasureDecoder d = new XorErasureDecoder(4);
Frame f = new Frame();
assertTrue(d.decodeFrame(f, set));
// The minimum of the segments' lengths should have been used
assertEquals(750, f.getLength());
}
private Segment[] encodeEmptyFrame(int length, int n) {
Segment[] set = new Segment[n];
for(int i = 0; i < n; i++) {
set[i] = new SegmentImpl(length);
set[i].setLength(length);
}
int payload = length * (n - 1) - FRAME_HEADER_LENGTH - MAC_LENGTH;
HeaderEncoder.encodeHeader(set[0].getBuffer(), 0L, payload, 0);
HeaderEncoder.encodeHeader(set[n - 1].getBuffer(), 0L, payload, 0);
return set;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment