diff --git a/components/net/sf/briar/transport/XorErasureEncoder.java b/components/net/sf/briar/transport/XorErasureEncoder.java
index 706f3147f..b0a529b64 100644
--- a/components/net/sf/briar/transport/XorErasureEncoder.java
+++ b/components/net/sf/briar/transport/XorErasureEncoder.java
@@ -21,8 +21,8 @@ class XorErasureEncoder implements ErasureEncoder {
byte[] src = f.getBuffer(), parity = set[n - 1].getBuffer();
int offset = 0;
for(int i = 0; i < n - 1; i++) {
- System.arraycopy(src, 0, set[i].getBuffer(), offset, length);
- for(int j = 0; j < length; j++) parity[j] ^= src[j];
+ System.arraycopy(src, offset, set[i].getBuffer(), 0, length);
+ for(int j = 0; j < length; j++) parity[j] ^= src[offset + j];
offset += length;
}
return set;
diff --git a/test/build.xml b/test/build.xml
index 3998eadb1..6c64adbf5 100644
--- a/test/build.xml
+++ b/test/build.xml
@@ -61,6 +61,7 @@
+
diff --git a/test/net/sf/briar/transport/XorErasureEncoderTest.java b/test/net/sf/briar/transport/XorErasureEncoderTest.java
new file mode 100644
index 000000000..e1ca00b3a
--- /dev/null
+++ b/test/net/sf/briar/transport/XorErasureEncoderTest.java
@@ -0,0 +1,41 @@
+package net.sf.briar.transport;
+
+import static org.junit.Assert.assertArrayEquals;
+import net.sf.briar.BriarTestCase;
+import net.sf.briar.api.transport.Segment;
+
+import org.junit.Test;
+
+public class XorErasureEncoderTest extends BriarTestCase {
+
+ @Test
+ public void testEncoding() {
+ // Create a 100-byte frame
+ Frame f = new Frame();
+ f.setLength(100);
+ byte[] b = f.getBuffer();
+ for(int i = 0; i < 100; i++) b[i] = (byte) i;
+ // Encode the frame
+ XorErasureEncoder e = new XorErasureEncoder(4);
+ Segment[] set = e.encodeFrame(f);
+ // There should be four pieces of 34 bytes each
+ assertEquals(4, set.length);
+ for(int i = 0; i < 4; i++) assertEquals(34, set[i].getLength());
+ // The first three pieces should contain the data, plus two zero bytes
+ byte[] b1 = set[0].getBuffer();
+ for(int i = 0; i < 34; i++) assertEquals(i, b1[i]);
+ byte[] b2 = set[1].getBuffer();
+ for(int i = 0; i < 34; i++) assertEquals(i + 34, b2[i]);
+ byte[] b3 = set[2].getBuffer();
+ for(int i = 0; i < 32; i++) assertEquals(i + 68, b3[i]);
+ assertEquals(0, b3[32]);
+ assertEquals(0, b3[33]);
+ // The fourth piece should be the XOR of the other three
+ byte[] b4 = set[3].getBuffer();
+ byte[] expected = new byte[34];
+ for(int i = 0; i < 34; i++) {
+ expected[i] = (byte) (b1[i] ^ b2[i] ^ b3[i]);
+ }
+ assertArrayEquals(expected, b4);
+ }
+}