package freenet.client;
import junit.framework.Assert;
import junit.framework.TestCase;
import freenet.support.TestProperty;
import com.onionnetworks.fec.FECCode;
import com.onionnetworks.fec.FECCodeFactory;
import com.onionnetworks.fec.FECMath;
import com.onionnetworks.fec.PureCode;
import com.onionnetworks.util.Buffer;
import com.onionnetworks.util.Util;
public class CodeTest extends TestCase {
public static FECMath fecMath = new FECMath(8);
public static final int KK = 192;
public static final int PACKET_SIZE = 4096;
/**
* Creates k packets of size sz of random data, encodes them, and tries to decode. Index
* contains the permutation entry.
*/
private static final void encodeDecode(FECCode encode, FECCode decode, int index[]) {
byte[] src = new byte[KK * PACKET_SIZE];
Util.rand.nextBytes(src);
Buffer[] srcBufs = new Buffer[KK];
for (int i = 0; i < srcBufs.length; i++)
srcBufs[i] = new Buffer(src, i * PACKET_SIZE, PACKET_SIZE);
byte[] repair = new byte[KK * PACKET_SIZE];
Buffer[] repairBufs = new Buffer[KK];
for (int i = 0; i < repairBufs.length; i++) {
repairBufs[i] = new Buffer(repair, i * PACKET_SIZE, PACKET_SIZE);
}
encode.encode(srcBufs, repairBufs, index);
decode.decode(repairBufs, index);
for (int i = 0; i < src.length; i++)
Assert.assertEquals(src[i], repair[i]);
}
public void testBenchmark() {
if(!TestProperty.BENCHMARK) return;
int lim = fecMath.gfSize + 1;
FECCode maybeNative = FECCodeFactory.getDefault().createFECCode(KK, lim);
FECCode pureCode = new PureCode(KK, lim);
int[] index = new int[KK];
for (int i = 0; i < KK; i++)
index[i] = lim - i - 1;
byte[] src = new byte[KK * PACKET_SIZE];
Util.rand.nextBytes(src);
Buffer[] srcBufs = new Buffer[KK];
for (int i = 0; i < srcBufs.length; i++)
srcBufs[i] = new Buffer(src, i * PACKET_SIZE, PACKET_SIZE);
byte[] repair = new byte[KK * PACKET_SIZE];
Buffer[] repairBufs = new Buffer[KK];
for (int i = 0; i < repairBufs.length; i++) {
repairBufs[i] = new Buffer(repair, i * PACKET_SIZE, PACKET_SIZE);
}
int[] indexBackup = new int[index.length];
System.arraycopy(index,0,indexBackup,0,index.length);
System.out.println("Getting ready for benchmarking encode()");
long t1 = System.currentTimeMillis();
maybeNative.encode(srcBufs, repairBufs, index);
long t2 = System.currentTimeMillis();
pureCode.encode(srcBufs, repairBufs, indexBackup);
long t3 = System.currentTimeMillis();
float dNativeEncode = t2 - t1;
float dPureEncode = t3 - t2;
Buffer[] repairBufs2 = repairBufs.clone();
System.arraycopy(repairBufs, 0, repairBufs2, 0, repairBufs.length);
System.out.println("Getting ready for benchmarking decode()");
t1 = System.currentTimeMillis();
maybeNative.decode(repairBufs, index);
t2 = System.currentTimeMillis();
pureCode.decode(repairBufs2, indexBackup);
t3 = System.currentTimeMillis();
float dNativeDecode = t2 - t1;
float dPureDecode = t3 - t2;
System.out.println(maybeNative);
System.out.println(pureCode);
System.out.println("Native code took "+dNativeEncode+"ms whereas java's code took "+dPureEncode+"ms to encode()");
System.out.println("Native code took "+dNativeDecode+"ms whereas java's code took "+dPureDecode+"ms to decode()");
}
public void testSimpleRev() {
int lim = fecMath.gfSize + 1;
FECCode code = FECCodeFactory.getDefault().createFECCode(KK, lim);
FECCode code2 = new PureCode(KK, lim);
int[] index = new int[KK];
for (int i = 0; i < KK; i++)
index[i] = lim - i - 1;
encodeDecode(code, code2, index);
encodeDecode(code2, code, index);
}
public void testSimple() {
int lim = fecMath.gfSize + 1;
FECCode code = FECCodeFactory.getDefault().createFECCode(KK, lim);
FECCode code2 = new PureCode(KK, lim);
int[] index = new int[KK];
for (int i = 0; i < KK; i++)
index[i] = KK - i;
encodeDecode(code, code2, index);
encodeDecode(code2, code, index);
}
public void testShifted() {
int lim = fecMath.gfSize + 1;
FECCode code = FECCodeFactory.getDefault().createFECCode(KK, lim);
FECCode code2 = new PureCode(KK, lim);
int[] index = new int[KK];
int max_i0 = KK / 2;
if (max_i0 + KK > lim)
max_i0 = lim - KK;
for (int s = max_i0 - 2; s <= max_i0; s++) {
for (int i = 0; i < KK; i++)
index[i] = i + s;
encodeDecode(code, code2, index);
encodeDecode(code2, code, index);
}
}
}