package com.codecademy.eventhub.list;
import com.codecademy.eventhub.base.Schema;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import java.nio.ByteBuffer;
public class DmaListTest {
@Rule
public TemporaryFolder folder = new TemporaryFolder();
@Test
public void testAll() throws Exception {
int numRecordsPerFile = 2;
int cacheSize = 1;
String directory = folder.newFolder().getCanonicalPath();
DmaList<MetaData> list = DmaList.build(MetaData.getSchema(), directory, numRecordsPerFile, cacheSize);
MetaData[] metaDatas = new MetaData[] {
new MetaData(1, new byte[] { 0b00000000, 0, 0, 0, 0b00101010, 0, 0, 0, 0b00110011, 0, 0, 0, 0b00000001 } ),
new MetaData(3, new byte[] { 0b00000010, 0, 0, 0, 0b00101101, 0, 0, 0, 0b01001100, 0, 0, 0, 0b00100001 } ),
new MetaData(5, new byte[] { 0b00000100, 0, 0, 0, 0b00100101, 0, 0, 0, 0b01010101, 0, 0, 0, 0b01000001 } ),
new MetaData(7, new byte[] { 0b01000100, 0, 0, 0, 0b01101110, 0, 0, 0, 0b00011110, 0, 0, 0, 0b01000101 } )
};
for (int i = 0; i < metaDatas.length - 1; i++) {
list.add(metaDatas[i]);
}
for (int i = 0; i < metaDatas.length - 1; i++) {
Assert.assertEquals(metaDatas[i].getUserId(), list.get(i).getUserId());
Assert.assertArrayEquals(metaDatas[i].getLocation(), list.get(i).getLocation());
}
list.close();
list = DmaList.build(MetaData.getSchema(), directory, numRecordsPerFile, cacheSize);
list.add(metaDatas[3]);
for (int i = 0; i < metaDatas.length; i++) {
Assert.assertEquals(metaDatas[i].getUserId(), list.get(i).getUserId());
Assert.assertArrayEquals(metaDatas[i].getLocation(), list.get(i).getLocation());
}
list.update(2, metaDatas[3]);
Assert.assertEquals(metaDatas[3].getUserId(), list.get(2).getUserId());
Assert.assertArrayEquals(metaDatas[3].getLocation(), list.get(2).getLocation());
Assert.assertEquals(metaDatas.length, list.getMaxId());
}
private static class MetaData {
private final long userId;
private final byte[] location;
public MetaData(long userId, byte[] location) {
this.userId = userId;
this.location = location;
}
public long getUserId() {
return userId;
}
public byte[] getLocation() {
return location;
}
public static Schema<MetaData> getSchema() {
return new MetaDataSchema();
}
private static class MetaDataSchema implements Schema<MetaData> {
@Override
public int getObjectSize() {
return 8 + 13 + 4;
}
@Override
public byte[] toBytes(MetaData metaData) {
ByteBuffer byteBuffer = ByteBuffer.allocate(getObjectSize());
byteBuffer.putLong(metaData.userId)
.put(metaData.location);
return byteBuffer.array();
}
@Override
public MetaData fromBytes(byte[] bytes) {
ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);
long userId = byteBuffer.getLong();
byte[] location = new byte[13];
byteBuffer.get(location);
return new MetaData(userId, location);
}
}
}
}