/*!
* 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) 2002-2016 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.reporting.platform.plugin.async;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.junit.Test;
import org.pentaho.platform.engine.core.system.PentahoSessionHolder;
import org.pentaho.platform.engine.core.system.StandaloneSession;
import org.pentaho.reporting.engine.classic.core.ClassicEngineBoot;
import org.pentaho.reporting.engine.classic.core.MasterReport;
import org.pentaho.reporting.engine.classic.core.event.ReportProgressEvent;
import org.pentaho.reporting.engine.classic.core.event.ReportProgressListener;
import org.pentaho.reporting.engine.classic.core.layout.output.ReportProcessorThreadHolder;
import org.pentaho.reporting.libraries.base.config.ModifiableConfiguration;
import org.pentaho.reporting.libraries.resourceloader.ResourceManager;
import org.pentaho.reporting.platform.plugin.output.FastCSVOutput;
import java.io.File;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
public class AsyncReportStatusListenerTest {
public static final String STUB =
"AsyncReportStatusListener{path='', uuid=370c1ff4-06de-4b32-b966-f7bd8c2da7b2, status=QUEUED, progress=0, page=0,"
+ " totalPages=0, generatedPage=0, activity='null', row=0, firstPageMode=true, mimeType='', "
+ "errorMessage='370c1ff4-06de-4b32-b966-f7bd8c2da7b2'}";
public static final String STUV_UUID = "370c1ff4-06de-4b32-b966-f7bd8c2da7b2";
@Test
public void isFirstPageMode() throws Exception {
final ModifiableConfiguration edConf = ClassicEngineBoot.getInstance().getEditableConfig();
edConf.setConfigProperty( "org.pentaho.reporting.platform.plugin.output.FirstPageMode", "true" );
final AsyncReportStatusListener listener =
new AsyncReportStatusListener( "", UUID.randomUUID(), "", Collections.<ReportProgressListener>emptyList() );
assertTrue( listener.isFirstPageMode() );
edConf.setConfigProperty( "org.pentaho.reporting.platform.plugin.output.FirstPageMode", "false" );
final AsyncReportStatusListener listener2 =
new AsyncReportStatusListener( "", UUID.randomUUID(), "", Collections.<ReportProgressListener>emptyList() );
assertFalse( listener2.isFirstPageMode() );
}
@Test
public void isScheduled() throws Exception {
final AsyncReportStatusListener listener =
new AsyncReportStatusListener( "", UUID.randomUUID(), "", Collections.<ReportProgressListener>emptyList() );
assertFalse( listener.isScheduled() );
listener.setStatus( AsyncExecutionStatus.PRE_SCHEDULED );
assertFalse( listener.isScheduled() );
listener.setStatus( AsyncExecutionStatus.SCHEDULED );
assertTrue( listener.isScheduled() );
}
@Test
public void reportProcessingFinished() throws Exception {
final ReportProgressListener progressListener = mock( ReportProgressListener.class );
final AsyncReportStatusListener listener =
new AsyncReportStatusListener( "", UUID.randomUUID(), "",
Collections.singletonList( progressListener ) );
final ReportProgressEvent event = mock( ReportProgressEvent.class );
listener.reportProcessingFinished( event );
verify( progressListener, times( 1 ) ).reportProcessingFinished( event );
//listener should not update status to finished
assertFalse( AsyncExecutionStatus.FINISHED.equals( listener.getState().getStatus() ) );
}
@Test
public void setStatus() throws Exception {
final AsyncReportStatusListener listener =
new AsyncReportStatusListener( "", UUID.randomUUID(), "", Collections.<ReportProgressListener>emptyList() );
listener.setStatus( null );
listener.setStatus( AsyncExecutionStatus.QUEUED );
assertEquals( AsyncExecutionStatus.QUEUED, listener.getState().getStatus() );
listener.setStatus( AsyncExecutionStatus.FINISHED );
assertEquals( AsyncExecutionStatus.FINISHED, listener.getState().getStatus() );
listener.setStatus( AsyncExecutionStatus.CANCELED );
assertEquals( AsyncExecutionStatus.CANCELED, listener.getState().getStatus() );
listener.setStatus( AsyncExecutionStatus.FINISHED );
assertEquals( AsyncExecutionStatus.CANCELED, listener.getState().getStatus() );
}
@Test
public void updateGenerationStatus() throws Exception {
final AsyncReportStatusListener listener =
new AsyncReportStatusListener( "", UUID.randomUUID(), "", Collections.<ReportProgressListener>emptyList() );
listener.setRequestedPage( 500 );
listener.updateGenerationStatus( 500 );
assertEquals( 0, listener.getRequestedPage() );
}
@Test
public void testErrorMessage() {
final AsyncReportStatusListener listener =
new AsyncReportStatusListener( "", UUID.randomUUID(), "", Collections.<ReportProgressListener>emptyList() );
final String errorMessage = UUID.randomUUID().toString();
listener.setErrorMessage( errorMessage );
assertEquals( errorMessage, listener.getState().getErrorMessage() );
}
@Test
public void testAllActivities() {
final AsyncReportStatusListener listener =
new AsyncReportStatusListener( "", UUID.randomUUID(), "", Collections.<ReportProgressListener>emptyList() );
final Map<Integer, String> activities = new HashMap<>();
activities.put( ReportProgressEvent.COMPUTING_LAYOUT, "AsyncComputingLayoutTitle" );
activities.put( ReportProgressEvent.PRECOMPUTING_VALUES, "AsyncPrecomputingValuesTitle" );
activities.put( ReportProgressEvent.PAGINATING, "AsyncPaginatingTitle" );
activities.put( ReportProgressEvent.GENERATING_CONTENT, "AsyncGeneratingContentTitle" );
activities.put( 100500, "" );
for ( final Map.Entry<Integer, String> entry : activities.entrySet() ) {
listener.reportProcessingUpdate(
new ReportProgressEvent( this, entry.getKey(), 0, 0, 0, 0, 0, 0 ) );
assertEquals( entry.getValue(), listener.getState().getActivity() );
}
}
@Test
public void testTostring() {
final ModifiableConfiguration edConf = ClassicEngineBoot.getInstance().getEditableConfig();
edConf.setConfigProperty( "org.pentaho.reporting.platform.plugin.output.FirstPageMode", "true" );
final AsyncReportStatusListener listener =
new AsyncReportStatusListener( "", UUID.fromString( STUV_UUID ), "",
Collections.<ReportProgressListener>emptyList() );
listener.setErrorMessage( STUV_UUID );
assertEquals( STUB, listener.toString() );
edConf.setConfigProperty( "org.pentaho.reporting.platform.plugin.output.FirstPageMode", "false" );
}
@Test
public void testCallbacks() {
final ReportProgressListener mock = mock( ReportProgressListener.class );
final AsyncReportStatusListener listener =
new AsyncReportStatusListener( "", UUID.fromString( STUV_UUID ), "",
Collections.singletonList( mock ) );
final ReportProgressEvent event = mock( ReportProgressEvent.class );
listener.reportProcessingStarted( event );
listener.reportProcessingUpdate( event );
listener.reportProcessingFinished( event );
verify( mock, times( 1 ) ).reportProcessingStarted( event );
verify( mock, times( 1 ) ).reportProcessingUpdate( event );
verify( mock, times( 1 ) ).reportProcessingFinished( event );
}
@Test
public void testIsQueryLimitReached() throws Exception {
final AsyncReportStatusListener listener =
new AsyncReportStatusListener( "", UUID.randomUUID(), "", Collections.<ReportProgressListener>emptyList() );
listener.setIsQueryLimitReached( true );
assertTrue( listener.getState().getIsQueryLimitReached() );
}
@Test
public void testUpdateNoProcessor() throws Exception {
assertNull( ReportProcessorThreadHolder.getProcessor() );
final AsyncReportStatusListener listener =
new AsyncReportStatusListener( "", UUID.randomUUID(), "", Collections.<ReportProgressListener>emptyList() );
listener.cancel();
listener
.reportProcessingUpdate( new ReportProgressEvent( this, ReportProgressEvent.PAGINATING, 0, 0, 0, 0, 0, 0 ) );
assertEquals( "AsyncPaginatingTitle", listener.getState().getActivity() );
}
@Test
public void limitReached() throws Exception {
final AsyncReportStatusListener asyncReportStatusListener =
new AsyncReportStatusListener( "target/test/resource/solution/test/reporting/limit10.prpt", UUID.randomUUID(), "text/csv",
Collections.emptyList() );
try {
ClassicEngineBoot.getInstance().start();
ReportListenerThreadHolder.setListener( asyncReportStatusListener );
PentahoSessionHolder.setSession( new StandaloneSession() );
final FastCSVOutput fastCSVOutput = new FastCSVOutput();
final File file = new File( "target/test/resource/solution/test/reporting/limit10.prpt" );
final MasterReport report =
(MasterReport) new ResourceManager().createDirectly( file.getPath(), MasterReport.class ).getResource();
fastCSVOutput.generate( report, 1, new ByteArrayOutputStream(), 1 );
assertTrue( asyncReportStatusListener.isQueryLimitReached() );
assertEquals( 10, asyncReportStatusListener.getTotalRows() );
} finally {
ReportProcessorThreadHolder.clear();
PentahoSessionHolder.removeSession();
}
}
}