/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU General Public License, version 2 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/gpl-2.0.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 General Public License for more details.
*
*
* Copyright 2006 - 2013 Pentaho Corporation. All rights reserved.
*/
package org.pentaho.test.platform.engine.core;
import org.pentaho.platform.api.engine.IActionCompleteListener;
import org.pentaho.platform.api.engine.ILogger;
import org.pentaho.platform.api.engine.IOutputHandler;
import org.pentaho.platform.api.engine.IParameterProvider;
import org.pentaho.platform.api.engine.IPentahoObjectFactory;
import org.pentaho.platform.api.engine.IPentahoSession;
import org.pentaho.platform.api.engine.IPentahoUrlFactory;
import org.pentaho.platform.api.engine.IRuntimeContext;
import org.pentaho.platform.api.engine.ISolutionEngine;
import org.pentaho.platform.api.repository.IContentItem;
import org.pentaho.platform.engine.core.messages.Messages;
import org.pentaho.platform.engine.core.output.SimpleOutputHandler;
import org.pentaho.platform.engine.core.solution.SimpleParameterProvider;
import org.pentaho.platform.engine.core.system.PathBasedSystemSettings;
import org.pentaho.platform.engine.core.system.PentahoSystem;
import org.pentaho.platform.engine.core.system.StandaloneApplicationContext;
import org.pentaho.platform.engine.core.system.StandaloneSession;
import org.pentaho.platform.engine.core.system.objfac.StandaloneSpringPentahoObjectFactory;
import org.pentaho.platform.engine.security.SecurityHelper;
import org.pentaho.platform.util.web.SimpleUrlFactory;
import org.pentaho.test.platform.engine.security.MockSecurityHelper;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.core.io.FileSystemResource;
import java.io.File;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* A Base class for platform integration tests. Uses Spring to populate required PentahoSystem dependencies (admin
* plugins, system listeners, object factory, system settings, etc) and uses the
* {@link StandaloneSpringPentahoObjectFactory} as the object factory implementation. Also inits the system.
*/
public class BaseTest extends GenericPentahoTest implements IActionCompleteListener, ILogger {
protected static final boolean debug = PentahoSystem.debug;
private int loggingLevel = ILogger.ERROR;
private boolean initOk = false;
private List<String> messages;
final String SYSTEM_FOLDER = "/system"; //$NON-NLS-1$
private IRuntimeContext context = null;
public BaseTest( String arg0 ) {
super( arg0 );
}
public BaseTest() {
super();
}
public List<String> getMessages() {
return messages;
}
public String getFullyQualifiedServerURL() {
return "http://localhost:8080/pentaho/"; //$NON-NLS-1$
}
@Override
public void setUp() {
// used by test repository impl such as FileSystemRepositoryFileDao
System.setProperty( "solution.root.dir", getSolutionPath() );
messages = TestManager.getMessagesList();
if ( messages == null ) {
messages = new ArrayList<String>();
}
if ( initOk ) {
return;
}
PentahoSystem.setSystemSettingsService( new PathBasedSystemSettings() );
if ( PentahoSystem.getApplicationContext() == null ) {
StandaloneApplicationContext applicationContext = new StandaloneApplicationContext( getSolutionPath(), "" ); //$NON-NLS-1$
// set the base url assuming there is a running server on port 8080
applicationContext.setFullyQualifiedServerURL( getFullyQualifiedServerURL() );
String inContainer = System.getProperty( "incontainer", "false" ); //$NON-NLS-1$ //$NON-NLS-2$
if ( inContainer.equalsIgnoreCase( "false" ) ) { //$NON-NLS-1$
// Setup simple-jndi for datasources
System.setProperty( "java.naming.factory.initial", "org.osjava.sj.SimpleContextFactory" ); //$NON-NLS-1$ //$NON-NLS-2$
System.setProperty( "org.osjava.sj.root", getSolutionPath() + "/system/simple-jndi" ); //$NON-NLS-1$ //$NON-NLS-2$
System.setProperty( "org.osjava.sj.delimiter", "/" ); //$NON-NLS-1$ //$NON-NLS-2$
}
ApplicationContext springApplicationContext = getSpringApplicationContext();
IPentahoObjectFactory pentahoObjectFactory = new StandaloneSpringPentahoObjectFactory();
pentahoObjectFactory.init( null, springApplicationContext );
PentahoSystem.registerObjectFactory( pentahoObjectFactory );
// force Spring to inject PentahoSystem, there has got to be a better way than this, perhaps an alternate way
// of
// initting spring's app context
springApplicationContext.getBean( "pentahoSystemProxy" ); //$NON-NLS-1$
// Initialize SecurityHelper with a mock for testing
SecurityHelper.setMockInstance( new MockSecurityHelper() );
initOk = PentahoSystem.init( applicationContext );
} else {
initOk = true;
}
assertTrue( Messages.getInstance().getString( "BaseTest.ERROR_0001_FAILED_INITIALIZATION" ), initOk ); //$NON-NLS-1$
}
private ApplicationContext getSpringApplicationContext() {
// todo
String[] fns =
{
"pentahoObjects.spring.xml", "adminPlugins.xml", "sessionStartupActions.xml", "systemListeners.xml", "pentahoSystemConfig.xml" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
GenericApplicationContext appCtx = new GenericApplicationContext();
XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader( appCtx );
for ( String fn : fns ) {
File f = new File( getSolutionPath() + SYSTEM_FOLDER + "/" + fn ); //$NON-NLS-1$
if ( f.exists() ) {
FileSystemResource fsr = new FileSystemResource( f );
xmlReader.loadBeanDefinitions( fsr );
}
}
String[] beanNames = appCtx.getBeanDefinitionNames();
System.out.println( "Loaded Beans: " ); //$NON-NLS-1$
for ( String n : beanNames ) {
System.out.println( "bean: " + n ); //$NON-NLS-1$
}
return appCtx;
}
protected Map getRequiredListeners() {
HashMap<String, String> listeners = new HashMap<String, String>();
listeners.put( "globalObjects", "globalObjects" ); //$NON-NLS-1$ //$NON-NLS-2$
return listeners;
}
public void actionComplete( IRuntimeContext runtimeContext ) {
}
@Override
public void tearDown() {
PentahoSystem.systemExitPoint();
initOk = false;
}
public static void shutdown() {
PentahoSystem.shutdown();
}
protected void startTest() {
/*
* Made this green-code because it wasn't currently being used for anything. But, it could come in handy at some
* point. MB
*
* Throwable th = new Throwable("Test"); //$NON-NLS-1$ StackTraceElement[] st = th.getStackTrace(); String name =
* st[1].getClassName() + "." + st[1].getMethodName(); //$NON-NLS-1$ String description =
* Messages.getInstance().getString(name + ".USER_DESCRIPTION"); //$NON-NLS-1$
*/
}
public void dispose() {
if ( context != null ) {
context.dispose();
}
}
protected void finishTest() {
dispose();
}
public IRuntimeContext run( String actionPath ) {
assertTrue( initOk );
SimpleParameterProvider parameterProvider = new SimpleParameterProvider();
return run( actionPath, parameterProvider );
}
public IRuntimeContext run( String actionPath, IParameterProvider parameterProvider ) {
return run( actionPath, parameterProvider, null, null );
}
public IOutputHandler getOutputHandler( OutputStream stream ) {
SimpleOutputHandler outputHandler = new SimpleOutputHandler( stream, false );
outputHandler.setOutputPreference( IOutputHandler.OUTPUT_TYPE_DEFAULT );
return outputHandler;
}
public IOutputHandler getOutputHandler( IContentItem contentItem ) {
SimpleOutputHandler outputHandler = new SimpleOutputHandler( contentItem, false );
outputHandler.setOutputPreference( IOutputHandler.OUTPUT_TYPE_DEFAULT );
return outputHandler;
}
public IPentahoSession sessionStartup( IPentahoSession session ) {
// Override to load startup actions. This returns an IPentahoSession
// so subclasses can create a mock authenticated user session for
// testing.
PentahoSystem.globalStartup( session );
return session;
}
public IRuntimeContext run( String actionPath, IParameterProvider parameterProvider, String testName,
String fileExtension ) {
assertTrue( initOk );
OutputStream outputStream = null;
if ( testName != null && fileExtension != null ) {
outputStream = getOutputStream( testName, fileExtension );
}
IOutputHandler outputHandler = null;
if ( outputStream != null ) {
outputHandler = getOutputHandler( outputStream );
} else {
outputHandler = getOutputHandler( (OutputStream) null );
}
String instanceId = null;
StandaloneSession initialSession =
new StandaloneSession( Messages.getInstance().getString( "BaseTest.DEBUG_JUNIT_SESSION" ) ); //$NON-NLS-1$
IPentahoSession session = sessionStartup( initialSession );
if ( outputHandler != null ) {
outputHandler.setSession( session );
}
return run( actionPath, instanceId, false, parameterProvider, outputHandler, session );
}
public IRuntimeContext run( String actionPath, String instanceId, boolean persisted,
IParameterProvider parameterProvider, IOutputHandler outputHandler, IPentahoSession session ) {
assertTrue( initOk );
ISolutionEngine solutionEngine = PentahoSystem.get( ISolutionEngine.class, session );
solutionEngine.setLoggingLevel( getLoggingLevel() );
solutionEngine.init( session );
return run( solutionEngine, actionPath, instanceId, persisted, parameterProvider, outputHandler );
}
public IRuntimeContext run( ISolutionEngine solutionEngine, String actionPath, String instanceId, boolean persisted,
IParameterProvider parameterProvider, IOutputHandler outputHandler ) {
assertTrue( initOk );
info( Messages.getInstance().getString( "BaseTest.INFO_START_TEST_MSG", actionPath ) ); //$NON-NLS-1$
info( actionPath );
String baseUrl = ""; //$NON-NLS-1$
HashMap<String, IParameterProvider> parameterProviderMap = new HashMap<String, IParameterProvider>();
parameterProviderMap.put( IParameterProvider.SCOPE_REQUEST, parameterProvider );
IPentahoUrlFactory urlFactory = new SimpleUrlFactory( baseUrl );
dispose();
context =
solutionEngine
.execute(
actionPath,
Messages.getInstance().getString( "BaseTest.DEBUG_JUNIT_TEST" ), false, true, instanceId, persisted, parameterProviderMap, outputHandler, this, urlFactory, messages ); //$NON-NLS-1$
info( Messages.getInstance().getString( "BaseTest.INFO_FINISH_TEST_MSG", actionPath ) ); //$NON-NLS-1$
// TODO compare message stack with saved version
// TODO perform comparisons between genereated content and golden copies
return context;
}
public int getLoggingLevel() {
return loggingLevel;
}
public void setLoggingLevel( int logLevel ) {
loggingLevel = logLevel;
}
public void trace( String message ) {
messages.add( Messages.getInstance().getString( "Message.USER_DEBUG", message, getClass().getName() ) ); //$NON-NLS-1$
}
public void debug( String message ) {
messages.add( Messages.getInstance().getString( "Message.USER_DEBUG", message, getClass().getName() ) ); //$NON-NLS-1$
}
public void info( String message ) {
messages.add( Messages.getInstance().getString( "Message.USER_INFO", message, getClass().getName() ) ); //$NON-NLS-1$
}
public void warn( String message ) {
messages.add( Messages.getInstance().getString( "Message.USER_WARNING", message, getClass().getName() ) ); //$NON-NLS-1$
}
public void error( String message ) {
messages.add( Messages.getInstance().getString( "Message.USER_ERROR", message, getClass().getName() ) ); //$NON-NLS-1$
}
public void fatal( String message ) {
messages.add( Messages.getInstance().getString( "Message.USER_ERROR", message, getClass().getName() ) ); //$NON-NLS-1$
}
public void trace( String message, Throwable error ) {
messages.add( Messages.getInstance().getString( "Message.USER_DEBUG", message, getClass().getName() ) ); //$NON-NLS-1$
}
public void debug( String message, Throwable error ) {
messages.add( Messages.getInstance().getString( "Message.USER_DEBUG", message, getClass().getName() ) ); //$NON-NLS-1$
}
public void info( String message, Throwable error ) {
messages.add( Messages.getInstance().getString( "Message.USER_INFO", message, getClass().getName() ) ); //$NON-NLS-1$
}
public void warn( String message, Throwable error ) {
messages.add( Messages.getInstance().getString( "Message.USER_WARNING", message, getClass().getName() ) ); //$NON-NLS-1$
}
public void error( String message, Throwable error ) {
messages.add( Messages.getInstance().getString( "Message.USER_ERROR", message, getClass().getName() ) ); //$NON-NLS-1$
}
public void fatal( String message, Throwable error ) {
messages.add( Messages.getInstance().getString( "Message.USER_ERROR", message, getClass().getName() ) ); //$NON-NLS-1$
}
public void testNothing() {
// test will be failed without it
assertTrue( true );
}
}