/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU General Public License, version 3 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.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 2005 - 2008 Pentaho Corporation. All rights reserved.
*
*/
package org.pentaho.test.platform.engine.core;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.util.Properties;
import junit.framework.TestCase;
import org.pentaho.platform.api.engine.ILogger;
import org.pentaho.platform.api.engine.IPentahoSession;
import org.pentaho.platform.api.engine.ISolutionEngine;
import org.pentaho.platform.engine.core.messages.Messages;
import org.pentaho.platform.engine.core.system.PentahoSystem;
import org.pentaho.platform.engine.core.system.StandaloneApplicationContext;
import org.pentaho.platform.engine.core.system.StandaloneSession;
public class GenericPentahoTest extends TestCase {
private static final String SOLUTION_PATH = "solution.path"; //$NON-NLS-1$
private String solutionPath;
private static final String PROPERTIES_FILE_NAME = "testsettings.properties"; //$NON-NLS-1$
private static Properties properties = null;
public GenericPentahoTest(String arg0) {
super(arg0);
init();
}
public GenericPentahoTest() {
super();
init();
}
private void init() {
InputStream s = null;
// start with a default solution path
solutionPath = "test-src/solution"; //$NON-NLS-1$
try {
URL url = ClassLoader.getSystemResource(PROPERTIES_FILE_NAME);
if (url != null) {
s = url.openStream();
}
} catch (IOException e1) {
System.out.println("Error loding the properties file " + PROPERTIES_FILE_NAME); //$NON-NLS-1$
}
if (null != s) {
properties = new Properties();
try {
properties.load(s);
solutionPath = properties.getProperty(SOLUTION_PATH, null);
} catch (IOException e) {
System.out.println("Error loding the properties file " + PROPERTIES_FILE_NAME); //$NON-NLS-1$
}
}
}
public ISolutionEngine getSolutionEngine(String path) {
StandaloneApplicationContext applicationContext = new StandaloneApplicationContext(path, ""); //$NON-NLS-1$
if (!PentahoSystem.getInitializedOK()) {
PentahoSystem.init(applicationContext);
assertTrue("PentahoSystem did not initialize", PentahoSystem.getInitializedOK()); //$NON-NLS-1$
}
IPentahoSession session = new StandaloneSession("system"); //$NON-NLS-1$
ISolutionEngine solutionEngine = PentahoSystem.get( ISolutionEngine.class, session);
assertNotNull("SolutionEngine is null", solutionEngine); //$NON-NLS-1$
solutionEngine.setLoggingLevel(ILogger.ERROR);
solutionEngine.init(session);
try {
solutionEngine.setSession(session);
return solutionEngine;
} catch (Exception e) {
// we should not get here
e.printStackTrace();
assertTrue(e.getMessage(), false);
}
return null;
}
protected InputStream getInputStreamFromOutput(String testName, String extension) {
String path = PentahoSystem.getApplicationContext().getFileOutputPath("test/tmp/" + testName + extension); //$NON-NLS-1$
File f = new File(path);
if (f.exists()) {
try {
FileInputStream fis = new FileInputStream(f);
return fis;
} catch (Exception ignored) {
return null;
}
} else {
return null;
}
}
protected OutputStream getOutputStream(String testName, String extension) {
OutputStream outputStream = null;
try {
String tmpDir = PentahoSystem.getApplicationContext().getFileOutputPath("test/tmp"); //$NON-NLS-1$
File file = new File(tmpDir);
file.mkdirs();
String path = PentahoSystem.getApplicationContext().getFileOutputPath("test/tmp/" + testName + extension); //$NON-NLS-1$
outputStream = new FileOutputStream(path);
} catch (FileNotFoundException e) {
}
return outputStream;
}
public boolean compare(String testName, String extension) {
InputStream goldenStream = null;
InputStream tmpFileStream = null;
String filePath = PentahoSystem.getApplicationContext().getFileOutputPath("test/tmp/" + testName + extension); //$NON-NLS-1$
try {
File file = new File(filePath);
tmpFileStream = new FileInputStream(file);
} catch (Throwable e) {
// this gets caught in the assert below
}
assertNotNull(Messages.getInstance().getString("GenericTest.USER_TEST_FILE_INVALID", filePath), tmpFileStream); //$NON-NLS-1$
filePath = PentahoSystem.getApplicationContext().getFileOutputPath("test/golden/" + testName + extension); //$NON-NLS-1$
try {
File file = new File(filePath);
goldenStream = new FileInputStream(file);
} catch (Throwable e) {
// this gets caught in the assert below
}
assertNotNull(Messages.getInstance().getString("GenericTest.USER_TEST_FILE_INVALID", filePath), goldenStream); //$NON-NLS-1$
// compare the two files
int goldPos = 0;
int tmpPos = 0;
byte goldBuffer[] = new byte[2048];
byte tmpBuffer[] = new byte[2048];
int filePosition = 0;
try {
// read the start of both files
goldPos = goldenStream.read(goldBuffer);
tmpPos = tmpFileStream.read(tmpBuffer);
// assume lock-step
if (goldPos != tmpPos) {
System.out.println(Messages.getInstance().getString("GenericTest.USER_FILE_POINTERS_NOT_IN_STEP")); //$NON-NLS-1$
return false;
}
while (goldPos > 0 && tmpPos > 0) {
for (int index = 0; index < goldPos; index++) {
assertEquals(
Messages.getInstance().getString("GenericTest.USER_FILES_DIFFER", Integer.toString(filePosition + index)), goldBuffer[index], tmpBuffer[index]); //$NON-NLS-1$
}
filePosition += goldPos;
goldPos = goldenStream.read(goldBuffer);
tmpPos = tmpFileStream.read(tmpBuffer);
}
} catch (Exception e) {
return false;
}
return true;
}
public String getSolutionPath() {
return solutionPath;
}
}