package uk.ac.imperial.lsds.seepworker.core.input;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.ByteChannel;
import java.util.Properties;
import org.junit.Test;
import uk.ac.imperial.lsds.seep.api.data.ITuple;
import uk.ac.imperial.lsds.seep.api.data.OTuple;
import uk.ac.imperial.lsds.seep.api.data.Schema;
import uk.ac.imperial.lsds.seep.api.data.Schema.SchemaBuilder;
import uk.ac.imperial.lsds.seep.api.data.Type;
import uk.ac.imperial.lsds.seepworker.WorkerConfig;
import uk.ac.imperial.lsds.seep.testutils.MockChannel;
public class InputBufferTest {
@Test
public void test() {
String queueLength = "100";
int tuples = Integer.parseInt(queueLength);
InputBuffer ib = createInputBufferWith(queueLength, tuples);
Schema s = SchemaBuilder.getInstance().newField(Type.INT, "a").newField(Type.INT, "b").newField(Type.INT, "c").build();
ITuple iData = new ITuple(s);
for(int i = 0; i < tuples; i++) {
byte[] data = OTuple.create(s, new String[]{"a", "b", "c"}, new Object[]{i, i+1, i+2});
ib.pushData(data);
}
for(int i = 0; i < tuples; i++) {
byte[] data = ib.read(0);
iData.setData(data);
System.out.println(iData.getInt("a") +" "+ iData.getInt("b")+ " "+iData.getInt("c"));
}
assert(true);
}
@Test
public void testThroughChannel() {
String queueLength = "100";
int tuples = Integer.parseInt(queueLength);
InputBuffer ib = createInputBufferWith(queueLength, tuples);
Schema s = SchemaBuilder.getInstance().newField(Type.INT, "a").newField(Type.INT, "b").newField(Type.INT, "c").build();
ITuple iData = new ITuple(s);
byte[] srcData = OTuple.getWireBytes(s, new String[]{"a", "b", "c"}, new Object[]{1, 0, 1});
// Write to channel
ByteBuffer b = ByteBuffer.allocate(tuples * srcData.length);
MockChannel channel = new MockChannel(b);
System.out.println("Channel with capacity: " + channel.capacity());
for(int i = 0; i < tuples; i++) {
ByteBuffer backup = ByteBuffer.wrap(srcData);
try {
channel.write(backup);
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// Prepare channel for read
channel.flip();
// Read from channel to internal queue
while(channel.hasRemaining()) {
ib.readFrom(channel);
}
// Read from internal queue
for(int i = 0; i < tuples; i++) {
byte[] data = ib.read(0);
if(data == null) {
System.out.println("data is null");
}
iData.setData(data);
System.out.println(iData.getInt("a") +" "+ iData.getInt("b")+ " "+iData.getInt("c"));
}
assert(true);
}
private InputBuffer createInputBufferWith(String queueLength, int tuples){
Properties p = new Properties();
p.setProperty(WorkerConfig.MASTER_IP, "");
p.setProperty(WorkerConfig.PROPERTIES_FILE, "");
p.setProperty(WorkerConfig.SIMPLE_INPUT_QUEUE_LENGTH, queueLength);
WorkerConfig wc = new WorkerConfig(p);
InputBuffer ib = InputBuffer.makeInputBufferFor(wc, null);
return ib;
}
}