blob: 87018c4149c9869110e51381aeac690f8ecca95f [file] [log] [blame]
package edu.uci.ics.asterix.test.aql;
import static org.junit.Assert.fail;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import edu.uci.ics.asterix.api.aqlj.client.AQLJClientDriver;
import edu.uci.ics.asterix.api.aqlj.client.IADMCursor;
import edu.uci.ics.asterix.api.aqlj.client.IAQLJConnection;
import edu.uci.ics.asterix.api.aqlj.client.IAQLJResult;
import edu.uci.ics.asterix.api.aqlj.common.AQLJException;
import edu.uci.ics.asterix.api.java.AsterixJavaClient;
import edu.uci.ics.asterix.common.exceptions.AsterixException;
import edu.uci.ics.asterix.om.base.IAObject;
import edu.uci.ics.asterix.om.types.ARecordType;
import edu.uci.ics.asterix.om.types.AbstractCollectionType;
import edu.uci.ics.asterix.om.types.IAType;
import edu.uci.ics.hyracks.api.client.IHyracksClientConnection;
public class TestsUtils {
private static final String EXTENSION_AQL_RESULT = "adm";
/**
* Probably does not work well with symlinks.
*/
public static boolean deleteRec(File path) {
if (path.isDirectory()) {
for (File f : path.listFiles()) {
if (!deleteRec(f)) {
return false;
}
}
}
return path.delete();
}
public static void runScriptAndCompareWithResult(IHyracksClientConnection hcc, File scriptFile, PrintWriter print,
File expectedFile, File actualFile) throws Exception {
Reader query = new BufferedReader(new FileReader(scriptFile));
AsterixJavaClient asterix = new AsterixJavaClient(hcc, query, print);
try {
asterix.compile(true, false, true, true, false, true, false);
} catch (AsterixException e) {
throw new Exception("Compile ERROR for " + scriptFile + ": " + e.getMessage(), e);
} finally {
query.close();
}
asterix.execute();
BufferedReader readerExpected = new BufferedReader(new FileReader(expectedFile));
BufferedReader readerActual = new BufferedReader(new FileReader(actualFile));
String lineExpected, lineActual;
int num = 1;
try {
while ((lineExpected = readerExpected.readLine()) != null) {
lineActual = readerActual.readLine();
// Assert.assertEquals(lineExpected, lineActual);
if (lineActual == null) {
throw new Exception("Result for " + scriptFile + " changed at line " + num + ":\n< " + lineExpected
+ "\n> ");
}
if (!lineExpected.split("Timestamp")[0].equals(lineActual.split("Timestamp")[0])) {
fail("Result for " + scriptFile + " changed at line " + num + ":\n< " + lineExpected + "\n> "
+ lineActual);
}
/*
* if (!equalStrings(lineExpected, lineActual)) { throw new
* Exception("Result for " + scriptFile + " changed at line " +
* num + ":\n< " + lineExpected + "\n> " + lineActual); }
*/
++num;
}
lineActual = readerActual.readLine();
// Assert.assertEquals(null, lineActual);
if (lineActual != null) {
throw new Exception("Result for " + scriptFile + " changed at line " + num + ":\n< \n> " + lineActual);
}
// actualFile.delete();
} finally {
readerExpected.close();
readerActual.close();
}
}
public static void runScriptAndCompareWithResultViaClientAPI(File scriptFile, PrintWriter print, File expectedFile,
File actualFile, int apiPort) throws Exception {
FileOutputStream fos = new FileOutputStream(actualFile);
String query = queryFromFile(scriptFile);
IAQLJConnection conn = null;
IAQLJResult res = null;
try {
conn = AQLJClientDriver.getConnection("localhost", apiPort, "Metadata");
res = conn.execute(query);
while (res.next()) {
leafPrint(conn, res, fos);
}
} catch (AQLJException e) {
e.printStackTrace();
} finally {
// be sure that we close the connection and the result cursor
if (res != null) {
res.close();
}
if (conn != null) {
conn.close();
}
}
fos.close();
BufferedReader readerExpected = new BufferedReader(new FileReader(expectedFile));
BufferedReader readerActual = new BufferedReader(new FileReader(actualFile));
String lineExpected, lineActual;
int num = 1;
try {
while ((lineExpected = readerExpected.readLine()) != null) {
lineActual = readerActual.readLine();
// Assert.assertEquals(lineExpected, lineActual);
if (lineActual == null) {
throw new Exception("Result for " + scriptFile + " changed at line " + num + ":\n< " + lineExpected
+ "\n> ");
}
if (!equalStrings(lineExpected, lineActual)) {
throw new Exception("Result for " + scriptFile + " changed at line " + num + ":\n< " + lineExpected
+ "\n> " + lineActual);
}
++num;
}
lineActual = readerActual.readLine();
// Assert.assertEquals(null, lineActual);
if (lineActual != null) {
throw new Exception("Result for " + scriptFile + " changed at line " + num + ":\n< \n> " + lineActual);
}
actualFile.delete();
} finally {
readerExpected.close();
readerActual.close();
}
}
public static void leafPrint(IAQLJConnection conn, IADMCursor c, FileOutputStream fos) throws AQLJException,
UnsupportedEncodingException, IOException {
IAType t;
IAObject o;
String fieldNames[];
IADMCursor cur;
o = c.get();
if (o == null) {
return;
}
t = o.getType();
if (t instanceof AbstractCollectionType) {
fos.write("AbstractCollectionType: \n".getBytes("UTF-8"));
cur = conn.createADMCursor();
c.position(cur);
while (cur.next()) {
leafPrint(conn, cur, fos);
}
} else if (t instanceof ARecordType) {
fos.write("ARecordType: \n".getBytes("UTF-8"));
fieldNames = ((ARecordType) t).getFieldNames();
for (int i = 0; i < fieldNames.length; i++) {
cur = conn.createADMCursor();
c.position(cur, fieldNames[i]);
fos.write(("field: " + fieldNames[i] + "\n").getBytes("UTF-8"));
leafPrint(conn, cur, fos);
}
} else {
fos.write((o.toString() + "\n").getBytes("UTF-8"));
}
}
private static String queryFromFile(File f) throws IOException {
FileInputStream fis = new FileInputStream(f);
try {
FileChannel fc = fis.getChannel();
MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
return Charset.forName("UTF-8").decode(bb).toString();
} finally {
fis.close();
}
}
private static boolean equalStrings(String s1, String s2) {
String[] rowsOne = s1.split("\n");
String[] rowsTwo = s2.split("\n");
if (rowsOne.length != rowsTwo.length)
return false;
for (int i = 0; i < rowsOne.length; i++) {
String row1 = rowsOne[i];
String row2 = rowsTwo[i];
if (row1.equals(row2))
continue;
String[] fields1 = row1.split(" ");
String[] fields2 = row2.split(" ");
for (int j = 0; j < fields1.length; j++) {
if (fields1[j].equals(fields2[j])) {
continue;
} else if (fields1[j].indexOf('.') < 0) {
return false;
} else {
fields1[j] = fields1[j].split(",")[0];
fields2[j] = fields2[j].split(",")[0];
Double double1 = Double.parseDouble(fields1[j]);
Double double2 = Double.parseDouble(fields2[j]);
float float1 = (float) double1.doubleValue();
float float2 = (float) double2.doubleValue();
if (Math.abs(float1 - float2) == 0)
continue;
else {
return false;
}
}
}
}
return true;
}
public static String aqlExtToResExt(String fname) {
int dot = fname.lastIndexOf('.');
return fname.substring(0, dot + 1) + EXTENSION_AQL_RESULT;
}
}