/*
* 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 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;
import javax.naming.spi.NamingManager;
import javax.swing.table.TableModel;
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;
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 );
}
}
}