/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright (c) 2000 - 2013 Pentaho Corporation and Contributors...
* All rights reserved.
*/
package org.pentaho.reporting.engine.classic.core.testsupport;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintStream;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.sql.SQLException;
import javax.naming.spi.NamingManager;
import javax.swing.table.TableModel;
import junit.framework.TestCase;
import org.pentaho.reporting.engine.classic.core.ClassicEngineBoot;
import org.pentaho.reporting.engine.classic.core.DataFactory;
import org.pentaho.reporting.engine.classic.core.DataFactoryDesignTimeSupport;
import org.pentaho.reporting.engine.classic.core.DataRow;
import org.pentaho.reporting.engine.classic.core.MasterReport;
import org.pentaho.reporting.engine.classic.core.ParameterDataRow;
import org.pentaho.reporting.engine.classic.core.ReportDataFactoryException;
import org.pentaho.reporting.engine.classic.core.SubReport;
import org.pentaho.reporting.engine.classic.core.designtime.datafactory.DesignTimeDataFactoryContext;
import org.pentaho.reporting.engine.classic.core.modules.misc.tablemodel.TableModelInfo;
import org.pentaho.reporting.engine.classic.core.modules.parser.bundle.writer.BundleWriter;
import org.pentaho.reporting.engine.classic.core.modules.parser.bundle.writer.BundleWriterException;
import org.pentaho.reporting.engine.classic.core.util.CloseableTableModel;
import org.pentaho.reporting.libraries.base.util.DebugLog;
import org.pentaho.reporting.libraries.base.util.MemoryByteArrayOutputStream;
import org.pentaho.reporting.libraries.base.util.ObjectUtilities;
import org.pentaho.reporting.libraries.repository.ContentIOException;
import org.pentaho.reporting.libraries.resourceloader.Resource;
import org.pentaho.reporting.libraries.resourceloader.ResourceException;
import org.pentaho.reporting.libraries.resourceloader.ResourceManager;
public abstract class DataSourceTestBase extends TestCase
{
public DataSourceTestBase()
{
}
public DataSourceTestBase(final String name)
{
super(name);
}
public void setUp() throws Exception
{
ClassicEngineBoot.getInstance().start();
if (NamingManager.hasInitialContextFactoryBuilder() == false)
{
NamingManager.setInitialContextFactoryBuilder(new DebugJndiContextFactoryBuilder());
}
}
protected void runSerialize(final String[][] queriesAndResults) throws Exception
{
if (queriesAndResults.length == 0)
{
return;
}
for (int i = 0; i < queriesAndResults.length; i++)
{
final String query = queriesAndResults[i][0];
final String resultFile = queriesAndResults[i][1];
DebugLog.log("Executing query " + query);
final DataFactory dataFactory = createDataFactory(query);
final ByteArrayOutputStream bo = new ByteArrayOutputStream();
final ObjectOutputStream out = new ObjectOutputStream(bo);
out.writeObject(dataFactory);
final ObjectInputStream oin = new ObjectInputStream(new ByteArrayInputStream(bo.toByteArray()));
final DataFactory e2 = (DataFactory) oin.readObject();
assertNotNull(e2); // cannot assert equals, as this is not implemented ...
initializeDataFactory(e2);
final String queryResult = performQueryTest(e2);
compareLineByLine(resultFile, queryResult);
}
}
protected void runDerive(final String[][] queriesAndResults) throws Exception
{
if (queriesAndResults.length == 0)
{
return;
}
for (int i = 0; i < queriesAndResults.length; i++)
{
final String query = queriesAndResults[i][0];
final String resultFile = queriesAndResults[i][1];
final DataFactory dataFactory = createDataFactory(query);
final DataFactory e2 = dataFactory.derive();
assertNotNull(e2); // cannot assert equals, as this is not implemented ...
initializeDataFactory(e2);
final String queryResult = performQueryTest(e2);
compareLineByLine(resultFile, queryResult);
}
}
protected void runSaveAndLoadForSubReports(final String[][] queriesAndResults) throws Exception
{
if (queriesAndResults.length == 0)
{
return;
}
for (int i = 0; i < queriesAndResults.length; i++)
{
final String query = queriesAndResults[i][0];
final String resultFile = queriesAndResults[i][1];
final DataFactory dataFactory = createDataFactory(query);
SubReport subReport = new SubReport();
subReport.setDataFactory(dataFactory);
final MasterReport report = new MasterReport();
report.getReportHeader().addSubReport(subReport);
final MemoryByteArrayOutputStream bout = new MemoryByteArrayOutputStream();
BundleWriter.writeReportToZipStream(report, bout);
final ResourceManager mgr = new ResourceManager();
mgr.registerDefaults();
final Resource resource = mgr.createDirectly(bout.toByteArray(), MasterReport.class);
final MasterReport r2 = (MasterReport) resource.getResource();
final SubReport sr2 = r2.getReportHeader().getSubReport(0);
final DataFactory e2 = sr2.getDataFactory();
assertNotNull(e2); // cannot assert equals, as this is not implemented ...
initializeDataFactory(e2);
final String queryResult = performQueryTest(e2);
compareLineByLine(resultFile, queryResult);
}
}
protected void runSaveAndLoad(final String[][] queriesAndResults) throws Exception
{
if (queriesAndResults.length == 0)
{
return;
}
for (int i = 0; i < queriesAndResults.length; i++)
{
final String query = queriesAndResults[i][0];
final String resultFile = queriesAndResults[i][1];
final DataFactory dataFactory = createDataFactory(query);
final DataFactory e2 = loadAndSaveOnReport(dataFactory);
assertNotNull(e2); // cannot assert equals, as this is not implemented ...
initializeDataFactory(e2);
final String queryResult = performQueryTest(e2);
compareLineByLine(resultFile, queryResult);
}
}
public static DataFactory loadAndSaveOnReport(final DataFactory dataFactory) throws IOException, BundleWriterException, ContentIOException, ResourceException
{
final MasterReport report = new MasterReport();
report.setDataFactory(dataFactory);
final MemoryByteArrayOutputStream bout = new MemoryByteArrayOutputStream();
BundleWriter.writeReportToZipStream(report, bout);
final ResourceManager mgr = new ResourceManager();
mgr.registerDefaults();
final Resource resource = mgr.createDirectly(bout.toByteArray(), MasterReport.class);
final MasterReport r2 = (MasterReport) resource.getResource();
return r2.getDataFactory();
}
protected void runTest(final String[][] queriesAndResults) throws Exception
{
for (int i = 0; i < queriesAndResults.length; i++)
{
final String query = queriesAndResults[i][0];
final String resultFile = queriesAndResults[i][1];
final DataFactory dataFactory = createDataFactory(query);
initializeDataFactory(dataFactory);
final String queryResult = performQueryTest(dataFactory);
compareLineByLine(resultFile, queryResult);
}
}
public void runGenerate(final String[][] queriesAndResults) throws Exception
{
for (int i = 0; i < queriesAndResults.length; i++)
{
final String query = queriesAndResults[i][0];
final String resultFile = queriesAndResults[i][1];
final DataFactory dataFactory = createDataFactory(query);
initializeDataFactory(dataFactory);
generate(dataFactory, resultFile);
}
}
protected void runTestDesignTime(final String[][] queriesAndResults) throws Exception
{
for (int i = 0; i < queriesAndResults.length; i++)
{
final String[] queriesAndResult = queriesAndResults[i];
final String query = queriesAndResult[0];
final String resultFile = queriesAndResult[2];
final DataFactoryDesignTimeSupport dataFactory = (DataFactoryDesignTimeSupport) createDataFactory(query);
initializeDataFactory(dataFactory);
final String queryResult = performDesignTimeTest(dataFactory);
compareLineByLine(resultFile, queryResult);
}
}
public void runGenerateDesignTime(final String[][] queriesAndResults) throws Exception
{
for (int i = 0; i < queriesAndResults.length; i++)
{
final String[] queriesAndResult = queriesAndResults[i];
final String query = queriesAndResult[0];
final String resultFile = queriesAndResult[2];
final DataFactoryDesignTimeSupport dataFactory = (DataFactoryDesignTimeSupport) createDataFactory(query);
initializeDataFactory(dataFactory);
generateDesignTime(dataFactory, resultFile);
}
}
protected void generate(final DataFactory dataFactory,
final String resultFile) throws ReportDataFactoryException, SQLException, IOException
{
final String queryResult = performQueryTest(dataFactory);
final String packageName = getClass().getPackage().getName();
final String pathName = packageName.replace(".", "/");
final File file = new File(getTestDirectory() + "/" + pathName + "/" + resultFile);
System.out.println("Generating test result: " + file.getAbsolutePath());
final FileOutputStream fout = new FileOutputStream(file);
try
{
fout.write(queryResult.getBytes("UTF-8"));
}
finally
{
fout.close();
}
}
protected void generateDesignTime(final DataFactoryDesignTimeSupport dataFactory,
final String resultFile) throws ReportDataFactoryException, SQLException, IOException
{
final String queryResult = performDesignTimeTest(dataFactory);
final String packageName = getClass().getPackage().getName();
final String pathName = packageName.replace(".", "/");
final File file = new File(getTestDirectory() + "/" + pathName + "/" + resultFile);
System.out.println("Generating test result: " + file.getAbsolutePath());
final FileOutputStream fout = new FileOutputStream(file);
try
{
fout.write(queryResult.getBytes("UTF-8"));
}
finally
{
fout.close();
}
}
protected String getTestDirectory()
{
return "test";
}
protected void initializeDataFactory(final DataFactory dataFactory) throws ReportDataFactoryException
{
dataFactory.initialize(new DesignTimeDataFactoryContext());
}
protected abstract DataFactory createDataFactory(final String query) throws ReportDataFactoryException;
protected void compareLineByLine(final String sourceFile, final String resultText) throws IOException
{
final BufferedReader resultReader = new BufferedReader(new StringReader(resultText));
final InputStream stream = ObjectUtilities.getResourceRelativeAsStream(sourceFile, getClass());
if (stream == null)
{
throw new NullPointerException("Cannot locate resource '" + sourceFile + "' with context " + getClass());
}
final BufferedReader compareReader = new BufferedReader(new InputStreamReader
(stream, "UTF-8"));
try
{
int line = 1;
String lineResult = resultReader.readLine();
String lineSource = compareReader.readLine();
while (lineResult != null && lineSource != null)
{
assertEquals("Failure in line " + line + " (file: " + sourceFile + ")", lineSource, lineResult);
line += 1;
lineResult = resultReader.readLine();
lineSource = compareReader.readLine();
}
assertNull("Extra lines encountered in live-result " + line + " (file: " + sourceFile + ")", lineResult);
assertNull("Extra lines encountered in recorded result " + line + " (file: " + sourceFile + ")", lineSource);
}
finally
{
resultReader.close();
compareReader.close();
}
}
protected String getLogicalQueryForNextTest()
{
return "default";
}
protected String performQueryTest(final DataFactory dataFactory) throws SQLException, ReportDataFactoryException
{
final ByteArrayOutputStream sw = new ByteArrayOutputStream();
try
{
final PrintStream ps = new PrintStream(sw, true, "UTF-8");
final TableModel tableModel = dataFactory.queryData(getLogicalQueryForNextTest(), getParameterForNextTest());
generateCompareText(ps, tableModel);
if (tableModel instanceof CloseableTableModel)
{
final CloseableTableModel ctm = (CloseableTableModel) tableModel;
ctm.close();
}
return sw.toString("UTF-8");
}
catch (UnsupportedEncodingException e)
{
throw new ReportDataFactoryException("If UTF-8 is not supported, we are in trouble.");
}
finally
{
dataFactory.close();
}
}
protected String performDesignTimeTest(final DataFactoryDesignTimeSupport dataFactory) throws SQLException, ReportDataFactoryException
{
final ByteArrayOutputStream sw = new ByteArrayOutputStream();
try
{
final PrintStream ps = new PrintStream(sw, true, "UTF-8");
final TableModel tableModel = dataFactory.queryDesignTimeStructure(getLogicalQueryForNextTest(), getParameterForNextTest());
generateCompareText(ps, tableModel);
if (tableModel instanceof CloseableTableModel)
{
final CloseableTableModel ctm = (CloseableTableModel) tableModel;
ctm.close();
}
return sw.toString("UTF-8");
}
catch (UnsupportedEncodingException e)
{
throw new ReportDataFactoryException("If UTF-8 is not supported, we are in trouble.");
}
finally
{
dataFactory.close();
}
}
protected void generateCompareText(final PrintStream ps, final TableModel tableModel)
{
TableModelInfo.printTableModel(tableModel, ps);
TableModelInfo.printTableMetaData(tableModel, ps);
TableModelInfo.printTableCellAttributes(tableModel, ps);
TableModelInfo.printTableModelContents(tableModel, ps);
}
protected DataRow getParameterForNextTest()
{
return new ParameterDataRow();
}
public static void assertNotEquals(final String message, final Object o1, final Object o2)
{
if (o1 == o2)
{
fail(message);
}
if (o1 != null && o2 == null)
{
return;
}
if (o1 == null)
{
return;
}
if (o1.equals(o2))
{
fail(message);
}
}
}