package peergos.server.tests;
import org.junit.*;
import org.junit.runner.*;
import org.junit.runners.*;
import peergos.shared.cbor.*;
import peergos.shared.user.fs.*;
import peergos.shared.util.*;
import java.io.*;
import java.util.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
@RunWith(Parameterized.class)
public class FragmenterTest {
private static Random random = new Random(666);
private final Fragmenter fragmenter;
public FragmenterTest(Fragmenter fragmenter) {
this.fragmenter = fragmenter;
}
@Parameterized.Parameters(name = "{0}")
public static Collection<Object[]> parameters() {
return Arrays.asList(new Object[][]{
{new SplitFragmenter()},
{new ErasureFragmenter(ErasureFragmenter.ERASURE_ORIGINAL, ErasureFragmenter.ERASURE_ALLOWED_FAILURES)}
});
}
@Test
public void testSeries() throws IOException {
for (int i = 1; i < 10; i++) {
int length = random.nextInt(Chunk.MAX_SIZE);
byte[] b = new byte[length];
test(b);
}
}
@Test
public void testBoundary() throws IOException {
List<Integer> sizes = Arrays.asList(Fragment.MAX_LENGTH, 2 * Fragment.MAX_LENGTH);
for (Integer size : sizes) {
byte[] b = new byte[size];
test(b);
}
}
private void test(byte[] input) throws IOException {
random.nextBytes(input);
byte[][] split = fragmenter.split(input);
for (byte[] bytes : split) {
int length = bytes.length;
assertTrue(length > 0);
assertTrue(length <= Fragment.MAX_LENGTH);
}
byte[] recombine = fragmenter.recombine(split, input.length);
assertTrue("recombine(split(input)) = input", Arrays.equals(input, recombine));
}
@Test
public void serializationTest() throws IOException {
byte[] raw = fragmenter.serialize();
Fragmenter deserialize = Fragmenter.fromCbor(CborObject.fromByteArray(raw));
assertEquals(fragmenter, deserialize);
}
}