package org.araqne.logdb.query.parser;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import org.araqne.logdb.QueryContext;
import org.araqne.logdb.QueryParseException;
import org.araqne.logdb.QueryParserService;
import org.araqne.logdb.Session;
import org.araqne.logdb.impl.FunctionRegistryImpl;
import org.araqne.logdb.query.command.CheckTable;
import org.araqne.logdb.query.engine.QueryParserServiceImpl;
import org.araqne.logstorage.LogTableRegistry;
import org.araqne.storage.crypto.BlockCipher;
import org.araqne.storage.crypto.LogCryptoException;
import org.araqne.storage.crypto.LogCryptoService;
import org.araqne.storage.crypto.MacBuilder;
import org.araqne.storage.crypto.PkiCipher;
import org.junit.Before;
import org.junit.Test;
public class CheckTableParserTest {
private QueryParserService queryParserService;
@Before
public void setup() {
QueryParserServiceImpl p = new QueryParserServiceImpl();
p.setFunctionRegistry(new FunctionRegistryImpl());
queryParserService = p;
}
@Test
public void checkAll() {
String query = "checktable";
CheckTable c = parse(query);
assertEquals(3, c.getTableNames().size());
assertTrue(c.getTableNames().contains("secure_log"));
assertTrue(c.getTableNames().contains("secure_event"));
assertTrue(c.getTableNames().contains("text_log"));
assertNull(c.getFrom());
assertNull(c.getTo());
assertEquals("checktable", c.toString());
}
@Test
public void checkAll2() {
CheckTable c = parse("checktable *");
assertEquals(3, c.getTableNames().size());
assertTrue(c.getTableNames().contains("secure_log"));
assertTrue(c.getTableNames().contains("secure_event"));
assertTrue(c.getTableNames().contains("text_log"));
assertNull(c.getFrom());
assertNull(c.getTo());
assertEquals("checktable *", c.toString());
}
@Test
public void checkSomeTables() {
String query = "checktable text_log, secure_log";
CheckTable c = parse(query);
assertEquals(2, c.getTableNames().size());
assertTrue(c.getTableNames().contains("secure_log"));
assertTrue(c.getTableNames().contains("text_log"));
assertNull(c.getFrom());
assertNull(c.getTo());
assertEquals(query, c.toString());
}
@Test
public void checkWildMatch() {
String query = "checktable secure_*";
CheckTable c = parse(query);
assertEquals(2, c.getTableNames().size());
assertTrue(c.getTableNames().contains("secure_log"));
assertTrue(c.getTableNames().contains("secure_event"));
assertNull(c.getFrom());
assertNull(c.getTo());
assertEquals(query, c.toString());
}
@Test
public void checkFromTo() {
String query = "checktable from=20130806 to=20130808 secure_*";
CheckTable c = parse(query);
SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
assertEquals(2, c.getTableNames().size());
assertTrue(c.getTableNames().contains("secure_log"));
assertTrue(c.getTableNames().contains("secure_event"));
assertEquals("20130806", df.format(c.getFrom()));
assertEquals("20130808", df.format(c.getTo()));
assertEquals(query, c.toString());
}
@Test
public void testError11101() {
String query = "checktable from=1007 to=20130808 secure_*";
try {
parse(query);
fail();
} catch (QueryParseException e) {
if (e.isDebugMode()) {
System.out.println("query " + query);
System.out.println(e.getMessage());
}
assertEquals("11101", e.getType());
assertEquals(11, e.getStartOffset());
assertEquals(19, e.getEndOffset());
}
}
@Test
public void testError11102() {
String query = "checktable from=20141007 to=2014 secure_*";
try {
parse(query);
fail();
} catch (QueryParseException e) {
if (e.isDebugMode()) {
System.out.println("query " + query);
System.out.println(e.getMessage());
}
assertEquals("11102", e.getType());
assertEquals(25, e.getStartOffset());
assertEquals(31, e.getEndOffset());
}
}
private CheckTable parse(String query) {
LogTableRegistry tableRegistry = mock(LogTableRegistry.class);
when(tableRegistry.getTableNames()).thenReturn(Arrays.asList("secure_log", "secure_event", "text_log"));
CheckTableParser parser = new CheckTableParser(tableRegistry, null, null, new LogCryptoService() {
@Override
public PkiCipher newPkiCipher(PublicKey publicKey, PrivateKey privateKey) throws LogCryptoException {
// TODO Auto-generated method stub
return null;
}
@Override
public PkiCipher newPkiCipher(PublicKey publicKey) throws LogCryptoException {
// TODO Auto-generated method stub
return null;
}
@Override
public MacBuilder newMacBuilder(String algorithm, byte[] digestKey) throws LogCryptoException {
// TODO Auto-generated method stub
return null;
}
@Override
public BlockCipher newBlockCipher(String algorithm, byte[] cipherKey) throws LogCryptoException {
// TODO Auto-generated method stub
return null;
}
});
parser.setQueryParserService(queryParserService);
CheckTable c = (CheckTable) parser.parse(getContext(), query);
return c;
}
private QueryContext getContext() {
Session session = mock(Session.class);
when(session.isAdmin()).thenReturn(true);
QueryContext ctx = new QueryContext(session);
return ctx;
}
}