package tap.formatter;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import adql.db.DBType;
import adql.db.DBType.DBDatatype;
import tap.ServiceConnection;
import tap.TAPExecutionReport;
import tap.TAPJob;
import tap.data.ResultSetTableIterator;
import tap.data.TableIterator;
import tap.db_testtools.CommandExecute;
import tap.db_testtools.DBTools;
import tap.metadata.TAPColumn;
import tap.parameters.TAPParameters;
import uk.ac.starlink.votable.DataFormat;
/**
* <p>Test the VOTableFormat function {@link VOTableFormat#writeResult(TableIterator, OutputStream, TAPExecutionReport, Thread)}.</p>
*
* <p>2 test ares done: 1 with an overflow and another without.</p>
*
* @author Grégory Mantelet (ARI)
* @version 2.1 (03/2017)
*/
public class TestVOTableFormat {
private static Connection conn;
private static ServiceConnection serviceConn;
private static TAPColumn[] resultingColumns;
private static File votableFile = new File("votable_test.xml");
@BeforeClass
public static void setUpBeforeClass() throws Exception{
DBTools.createTestDB();
conn = DBTools.createConnection("h2", null, null, DBTools.DB_TEST_PATH, DBTools.DB_TEST_USER, DBTools.DB_TEST_PWD);
serviceConn = new ServiceConnection4Test();
resultingColumns = new TAPColumn[4];
resultingColumns[0] = new TAPColumn("hip", new DBType(DBDatatype.VARCHAR));
resultingColumns[1] = new TAPColumn("ra", new DBType(DBDatatype.DOUBLE), "Right ascension", "deg", "pos.eq.ra", null);
resultingColumns[2] = new TAPColumn("deg", new DBType(DBDatatype.DOUBLE), "Declination", "deg", "pos.eq.dec", null);
resultingColumns[3] = new TAPColumn("vmag", new DBType(DBDatatype.DOUBLE), "V magnitude", "mag", "phot.mag;em.opt.V", null);
if (!votableFile.exists())
votableFile.createNewFile();
}
@AfterClass
public static void tearDownAfterClass() throws Exception{
DBTools.closeConnection(conn);
votableFile.delete();
DBTools.dropTestDB();
}
@Test
public void testWriteResult(){
ResultSet rs = null;
try{
rs = DBTools.select(conn, "SELECT hip, ra, dec, vmag FROM hipparcos LIMIT 10;");
HashMap<String,Object> tapParams = new HashMap<String,Object>(1);
tapParams.put(TAPJob.PARAM_MAX_REC, "100");
TAPParameters params = new TAPParameters(serviceConn, tapParams);
TAPExecutionReport report = new TAPExecutionReport("123456A", true, params);
report.resultingColumns = resultingColumns;
TableIterator it = new ResultSetTableIterator(rs);
VOTableFormat formatter = new VOTableFormat(serviceConn, DataFormat.TABLEDATA);
OutputStream output = new BufferedOutputStream(new FileOutputStream(votableFile));
formatter.writeResult(it, output, report, Thread.currentThread());
output.close();
// note: due to the pipe (|), we must call /bin/sh as a command whose the command to execute in is the "grep ... | wc -l":
assertEquals("10", CommandExecute.execute("grep \"<TR>\" \"" + votableFile.getAbsolutePath() + "\" | wc -l").trim());
assertEquals("0", CommandExecute.execute("grep \"<INFO name=\\\"QUERY_STATUS\\\" value=\\\"OVERFLOW\\\"/>\" \"" + votableFile.getAbsolutePath() + "\" | wc -l").trim());
}catch(Exception t){
t.printStackTrace();
fail("Unexpected exception!");
}finally{
if (rs != null){
try{
rs.close();
}catch(SQLException se){}
}
}
}
@Test
public void testWriteResultWithOverflow(){
ResultSet rs = null;
try{
rs = DBTools.select(conn, "SELECT hip, ra, dec, vmag FROM hipparcos LIMIT 10;");
HashMap<String,Object> tapParams = new HashMap<String,Object>(1);
tapParams.put(TAPJob.PARAM_MAX_REC, "5");
TAPParameters params = new TAPParameters(serviceConn, tapParams);
TAPExecutionReport report = new TAPExecutionReport("123456A", true, params);
report.resultingColumns = resultingColumns;
TableIterator it = new ResultSetTableIterator(rs);
VOTableFormat formatter = new VOTableFormat(serviceConn, DataFormat.TABLEDATA);
OutputStream output = new BufferedOutputStream(new FileOutputStream(votableFile));
formatter.writeResult(it, output, report, Thread.currentThread());
output.close();
// note: due to the pipe (|), we must call /bin/sh as a command whose the command to execute in is the "grep ... | wc -l":
assertEquals("5", CommandExecute.execute("grep \"<TR>\" \"" + votableFile.getAbsolutePath() + "\" | wc -l").trim());
assertEquals("1", CommandExecute.execute("grep \"<INFO name=\\\"QUERY_STATUS\\\" value=\\\"OVERFLOW\\\"/>\" \"" + votableFile.getAbsolutePath() + "\" | wc -l").trim());
}catch(Exception t){
t.printStackTrace();
fail("Unexpected exception!");
}finally{
if (rs != null){
try{
rs.close();
}catch(SQLException e){
System.err.println("Can not close the RESULTSET!");
e.printStackTrace();
}
}
}
}
}