package org.corfudb.logReader;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import org.corfudb.format.Types;
import org.corfudb.infrastructure.ServerContext;
import org.corfudb.infrastructure.log.StreamLogFiles;
import org.corfudb.infrastructure.log.LogAddress;
import static org.junit.Assert.*;
import org.corfudb.protocols.wireprotocol.DataType;
import org.corfudb.protocols.wireprotocol.LogData;
import org.corfudb.util.serializer.Serializers;
import org.docopt.DocoptExitException;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
* Created by kjames88 on 3/1/17.
*/
public class logReaderTest {
public static String LOG_BASE_PATH = "/tmp/corfu-test";
public static String LOG_PATH = LOG_BASE_PATH + "/log";
private ServerContext getContext() {
Map<String,Object> configs = new HashMap();
configs.put("--log-path", LOG_BASE_PATH);
configs.put("--no-verify", false);
configs .put("--cache-heap-ratio", "0.5");
return new ServerContext(configs, null);
}
@Before
public void setUp() {
testUUID = UUID.randomUUID();
File fDir = new File(LOG_PATH);
fDir.mkdirs();
StreamLogFiles logfile = new StreamLogFiles(getContext(), false);
ByteBuf buf = ByteBufAllocator.DEFAULT.buffer();
Serializers.CORFU.serialize("Hello World".getBytes(), buf);
LogData data = new LogData(DataType.DATA, buf);
logfile.append(new LogAddress(new Long(0), testUUID), data);
buf.clear();
Serializers.CORFU.serialize("Happy Days".getBytes(), buf);
data = new LogData(DataType.DATA, buf);
logfile.append(new LogAddress(new Long(1), testUUID), data);
buf.clear();
Serializers.CORFU.serialize("Corfu test".getBytes(), buf);
data = new LogData(DataType.DATA, buf);
logfile.append(new LogAddress(new Long(2), testUUID), data);
logfile.close();
}
@After
public void tearDown() {
File fDir = new File(LOG_PATH);
String[] files = fDir.list();
for (String f : files) {
File f_del = new File(LOG_PATH + "/" + f);
f_del.delete();
}
fDir.delete();
fDir = new File(LOG_BASE_PATH);
fDir.delete();
}
@Test(expected = DocoptExitException.class)
public void TestArgumentsRequired() {
logReader reader = new logReader();
String[] args = {};
boolean ret = reader.init(args);
assertEquals(false, ret);
}
@Test
public void TestRecordCount() {
final int totalRecordCnt = 3;
logReader reader = new logReader();
String[] args = {"report", LOG_PATH + "/" + testUUID + "-0.log"};
int cnt = reader.run(args);
assertEquals(totalRecordCnt, cnt);
}
@Test
public void TestDisplayOne() {
logReader reader = new logReader();
String[] args = {"display", "--from=1", "--to=1", LOG_PATH + "/" + testUUID + "-0.log"};
reader.init(args);
try {
reader.openLogFile(0);
LogEntryExtended e = reader.nextRecord();
assertEquals(null, e);
e = reader.nextRecord();
assertNotEquals(null, e);
e = reader.nextRecord();
assertEquals(null, e);
} catch (IOException e) {
e.printStackTrace();
fail();
}
}
@Test
public void TestDisplayAll() {
logReader reader = new logReader();
String[] args = {"display", "--from=0", "--to=2", LOG_PATH + "/" + testUUID + "-0.log"};
reader.init(args);
try {
reader.openLogFile(0);
LogEntryExtended e = reader.nextRecord();
assertNotEquals(null, e);
e = reader.nextRecord();
assertNotEquals(null, e);
e = reader.nextRecord();
assertNotEquals(null, e);
} catch (IOException e) {
e.printStackTrace();
fail();
}
}
@Test
public void TestEraseOne() {
logReader reader = new logReader();
String[] args = {"erase", "--from=1", "--to=1", LOG_PATH + "/" + testUUID + "-0.log"};
reader.run(args);
// Read back the new modified log file and confirm the expected change
reader = new logReader();
args = new String[]{"display", LOG_PATH + "/" + testUUID + "-0.log.modified"};
reader.init(args);
try {
reader.openLogFile(0);
LogEntryExtended e = reader.nextRecord();
assertEquals(Types.DataType.DATA, e.getEntryBody().getDataType());
e = reader.nextRecord();
assertEquals(Types.DataType.HOLE, e.getEntryBody().getDataType());
e = reader.nextRecord();
assertEquals(Types.DataType.DATA, e.getEntryBody().getDataType());
} catch (IOException e) {
e.printStackTrace();
fail();
}
}
@Test
public void TestEraseTail() {
logReader reader = new logReader();
String[] args = {"erase", "--from=1", LOG_PATH + "/" + testUUID + "-0.log"};
reader.run(args);
// Read back the new modified log file and confirm the expected change
reader = new logReader();
args = new String[]{"display", LOG_PATH + "/" + testUUID + "-0.log.modified"};
reader.init(args);
try {
reader.openLogFile(0);
LogEntryExtended e = reader.nextRecord();
assertEquals(Types.DataType.DATA, e.getEntryBody().getDataType());
e = reader.nextRecord();
assertEquals(Types.DataType.HOLE, e.getEntryBody().getDataType());
e = reader.nextRecord();
assertEquals(Types.DataType.HOLE, e.getEntryBody().getDataType());
} catch (IOException e) {
e.printStackTrace();
fail();
}
}
private UUID testUUID;
}