/* * 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. */ package org.pentaho.test.platform.engine.services; import java.io.ByteArrayOutputStream; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import org.pentaho.platform.api.engine.IActionParameter; import org.pentaho.platform.api.engine.IOutputHandler; import org.pentaho.platform.api.engine.IParameterProvider; import org.pentaho.platform.api.engine.IPentahoSession; import org.pentaho.platform.api.engine.IRuntimeContext; import org.pentaho.platform.api.engine.ISolutionEngine; import org.pentaho.platform.engine.core.output.SimpleOutputHandler; import org.pentaho.platform.engine.core.solution.SimpleParameterProvider; import org.pentaho.platform.engine.core.system.StandaloneSession; import org.pentaho.platform.util.web.SimpleUrlFactory; import org.pentaho.test.platform.engine.core.BaseTest; @SuppressWarnings({"all"}) public class PojoComponentTest extends BaseTest { private static final String SOLUTION_PATH = "test-src/solution"; public String getSolutionPath() { return SOLUTION_PATH; } public static boolean doneCalled = false; public static boolean executeCalled = false; public static boolean validateCalled = false; public static boolean setSessionCalled = false; public static boolean setLoggerCalled = false; public static boolean setResourceInputStreamCalled = false; public static boolean setActionSequenceResourceCalled = false; public void testSimplePojoInput() { startTest(); ISolutionEngine solutionEngine = ServiceTestHelper.getSolutionEngine(); try { String xactionStr = ServiceTestHelper.getXAction( SOLUTION_PATH, "test/pojo/pojo1a.xaction" ); PojoComponentTest.doneCalled = false; PojoComponentTest.setSessionCalled = false; PojoComponentTest.setLoggerCalled = false; TestPojo1.int1 = 0; TestPojo1.int2 = null; SimpleParameterProvider inputs = new SimpleParameterProvider(); inputs.setParameter( "int2", new Integer( 22 ) ); inputs.setParameter( "bool2", new Boolean( true ) ); inputs.setParameter( "long2", new Long( 99 ) ); inputs.setParameter( "bigdecimal", new BigDecimal( "77.7" ) ); inputs.setParameter( "float2", new Float( 44.4 ) ); inputs.setParameter( "double2", new Double( 66.6 ) ); Map providers = new HashMap(); providers.put( IParameterProvider.SCOPE_REQUEST, inputs); IRuntimeContext runtimeContext = solutionEngine.execute( xactionStr, "test1a.xaction", "empty action sequence test", false, true, null, false, providers, null, null, new SimpleUrlFactory(""), new ArrayList()); //$NON-NLS-1$ //$NON-NLS-2$ assertNotNull( "RuntimeContext is null", runtimeContext ); IActionParameter param = runtimeContext.getOutputParameter( "output1" ); assertNotNull( "param is null", param ); assertEquals( "setting is wrong", "value1", TestPojo1.setting1 ); assertEquals( "setting is wrong", "value2", TestPojo1.setting2 ); assertEquals( "setting is wrong", null, TestPojo1.setting3 ); assertEquals( "param is wrong", "abcdeabcde", param.getValue() ); assertEquals( "setInt2 failed", new Integer(22), TestPojo1.int2 ); assertEquals( "setBoolean2 failed", new Boolean(true), TestPojo1.bool2 ); assertEquals( "setLong2 failed", new Long(99), TestPojo1.long2 ); assertEquals( "setBigDecimal failed", new BigDecimal("77.7"), TestPojo1.bigDecimal ); assertEquals( "setFloat2 failed", "44.4", TestPojo1.float2.toString() ); assertEquals( "setDouble2 failed", "66.6", TestPojo1.double2.toString() ); assertTrue( "done() was not called", PojoComponentTest.doneCalled ); assertTrue( "setSession() was not called", PojoComponentTest.setSessionCalled ); assertTrue( "setLogger() was not called", PojoComponentTest.setLoggerCalled ); assertEquals( "Action sequence execution failed", runtimeContext.getStatus(), IRuntimeContext.RUNTIME_STATUS_SUCCESS ); } catch (Exception e) { // we should not get here e.printStackTrace(); assertTrue( e.getMessage(), false ); } finishTest(); } public void testSimplePojoInputFormat2() { // test the alternate action definition format startTest(); ISolutionEngine solutionEngine = ServiceTestHelper.getSolutionEngine(); try { String xactionStr = ServiceTestHelper.getXAction( SOLUTION_PATH, "test/pojo/pojo1-alternate.xaction" ); PojoComponentTest.doneCalled = false; PojoComponentTest.setSessionCalled = false; PojoComponentTest.setLoggerCalled = false; TestPojo1.int1 = 0; TestPojo1.int2 = null; SimpleParameterProvider inputs = new SimpleParameterProvider(); inputs.setParameter( "int2", new Integer( 22 ) ); inputs.setParameter( "bool2", new Boolean( true ) ); inputs.setParameter( "long2", new Long( 99 ) ); inputs.setParameter( "bigdecimal", new BigDecimal( "77.7" ) ); inputs.setParameter( "float2", new Float( 44.4 ) ); inputs.setParameter( "double2", new Double( 66.6 ) ); Map providers = new HashMap(); providers.put( IParameterProvider.SCOPE_REQUEST, inputs); IRuntimeContext runtimeContext = solutionEngine.execute( xactionStr, "test1a.xaction", "empty action sequence test", false, true, null, false, providers, null, null, new SimpleUrlFactory(""), new ArrayList()); //$NON-NLS-1$ //$NON-NLS-2$ assertNotNull( "RuntimeContext is null", runtimeContext ); IActionParameter param = runtimeContext.getOutputParameter( "output1" ); assertNotNull( "param is null", param ); assertEquals( "setting is wrong", "value1", TestPojo1.setting1 ); assertEquals( "setting is wrong", "value2", TestPojo1.setting2 ); assertEquals( "setting is wrong", null, TestPojo1.setting3 ); assertEquals( "param is wrong", "abcdeabcde", param.getValue() ); assertEquals( "setInt2 failed", new Integer(22), TestPojo1.int2 ); assertEquals( "setBoolean2 failed", new Boolean(true), TestPojo1.bool2 ); assertEquals( "setLong2 failed", new Long(99), TestPojo1.long2 ); assertEquals( "setBigDecimal failed", new BigDecimal("77.7"), TestPojo1.bigDecimal ); assertEquals( "setFloat2 failed", "44.4", TestPojo1.float2.toString() ); assertEquals( "setDouble2 failed", "66.6", TestPojo1.double2.toString() ); assertTrue( "done() was not called", PojoComponentTest.doneCalled ); assertTrue( "setSession() was not called", PojoComponentTest.setSessionCalled ); assertTrue( "setLogger() was not called", PojoComponentTest.setLoggerCalled ); assertEquals( "Action sequence execution failed", runtimeContext.getStatus(), IRuntimeContext.RUNTIME_STATUS_SUCCESS ); } catch (Exception e) { // we should not get here e.printStackTrace(); assertTrue( e.getMessage(), false ); } finishTest(); } public void testSimplePojoSettings() { startTest(); ISolutionEngine solutionEngine = ServiceTestHelper.getSolutionEngine(); try { String xactionStr = ServiceTestHelper.getXAction( SOLUTION_PATH, "test/pojo/pojo1b.xaction" ); PojoComponentTest.doneCalled = false; IRuntimeContext runtimeContext = solutionEngine.execute( xactionStr, "pojo1b.xaction", "empty action sequence test", false, true, null, false, new HashMap(), null, null, new SimpleUrlFactory(""), new ArrayList()); //$NON-NLS-1$ //$NON-NLS-2$ IActionParameter param = runtimeContext.getOutputParameter( "output1" ); assertNotNull( "RuntimeContext is null", runtimeContext ); assertTrue( "done() was not called", PojoComponentTest.doneCalled ); assertEquals( "setInt1 failed", 11, TestPojo1.int1 ); assertEquals( "setInt2 failed", new Integer(22), TestPojo1.int2 ); assertEquals( "setBoolean1 failed", true, TestPojo1.bool1 ); assertEquals( "setBoolean2 failed", new Boolean(true), TestPojo1.bool2 ); assertEquals( "setLong1 failed", 88, TestPojo1.long1 ); assertEquals( "setLong2 failed", new Long(99), TestPojo1.long2 ); assertEquals( "setBigDecimal failed", new BigDecimal("77.7"), TestPojo1.bigDecimal ); assertEquals( "setFloat1 failed", "33.3", Float.toString(TestPojo1.float1) ); assertEquals( "setFloat2 failed", "44.4", TestPojo1.float2.toString() ); assertEquals( "setDouble1 failed", "55.5", Double.toString(TestPojo1.double1) ); assertEquals( "setDouble2 failed", "66.6", TestPojo1.double2.toString() ); assertEquals( "Action sequence execution failed", runtimeContext.getStatus(), IRuntimeContext.RUNTIME_STATUS_SUCCESS ); } catch (Exception e) { // we should not get here e.printStackTrace(); assertTrue( e.getMessage(), false ); } finishTest(); } public void testSimplestCase() { startTest(); ISolutionEngine solutionEngine = ServiceTestHelper.getSolutionEngine(); try { String xactionStr = ServiceTestHelper.getXAction( SOLUTION_PATH, "test/pojo/pojo4.xaction" ); PojoComponentTest.doneCalled = false; IRuntimeContext runtimeContext = solutionEngine.execute( xactionStr, "pojo4.xaction", "empty action sequence test", false, true, null, false, new HashMap(), null, null, new SimpleUrlFactory(""), new ArrayList()); //$NON-NLS-1$ //$NON-NLS-2$ IActionParameter param = runtimeContext.getOutputParameter( "output1" ); assertNotNull( "RuntimeContext is null", runtimeContext ); assertNotNull( "param is null", param ); assertEquals( "abcdeabcde", param.getValue().toString() ); assertEquals( "done() was called", false, PojoComponentTest.doneCalled ); assertEquals( "Action sequence execution failed", runtimeContext.getStatus(), IRuntimeContext.RUNTIME_STATUS_SUCCESS ); } catch (Exception e) { // we should not get here e.printStackTrace(); assertTrue( e.getMessage(), false ); } finishTest(); } public void testRuntimeInputsAndOutputs() { startTest(); ISolutionEngine solutionEngine = ServiceTestHelper.getSolutionEngine(); try { String xactionStr = ServiceTestHelper.getXAction( SOLUTION_PATH, "test/pojo/pojo5.xaction" ); IRuntimeContext runtimeContext = solutionEngine.execute( xactionStr, "pojo5.xaction", "empty action sequence test", false, true, null, false, new HashMap(), null, null, new SimpleUrlFactory(""), new ArrayList()); //$NON-NLS-1$ //$NON-NLS-2$ assertNotNull( "RuntimeContext is null", runtimeContext ); assertEquals( "Action sequence execution failed", runtimeContext.getStatus(), IRuntimeContext.RUNTIME_STATUS_SUCCESS ); IActionParameter param = runtimeContext.getOutputParameter( "output1" ); assertNotNull( "param is null", param ); assertEquals( "hello", param.getValue().toString() ); param = runtimeContext.getOutputParameter( "output2" ); assertNotNull( "param is null", param ); assertEquals( "world", param.getValue().toString() ); } catch (Exception e) { // we should not get here e.printStackTrace(); assertTrue( e.getMessage(), false ); } finishTest(); } public void testMissingClassSetting() { startTest(); ISolutionEngine solutionEngine = ServiceTestHelper.getSolutionEngine(); try { String xactionStr = ServiceTestHelper.getXAction( SOLUTION_PATH, "test/pojo/pojo-bad1.xaction" ); PojoComponentTest.doneCalled = false; PojoComponentTest.executeCalled = false; PojoComponentTest.validateCalled = false; IRuntimeContext runtimeContext = solutionEngine.execute( xactionStr, "test", "invalid class setting test", false, true, null, false, new HashMap(), null, null, new SimpleUrlFactory(""), new ArrayList()); //$NON-NLS-1$ //$NON-NLS-2$ assertNotNull( "RuntimeContext is null", runtimeContext ); assertEquals( "execute was called", false, PojoComponentTest.executeCalled ); assertEquals( "validate was called", false, PojoComponentTest.validateCalled ); assertEquals( "Action sequence validation succeeded", runtimeContext.getStatus(), IRuntimeContext.RUNTIME_CONTEXT_VALIDATE_FAIL ); } catch (Exception e) { // we should not get here e.printStackTrace(); assertTrue( e.getMessage(), false ); } finishTest(); } public void testBadClassSetting() { startTest(); ISolutionEngine solutionEngine = ServiceTestHelper.getSolutionEngine(); try { String xactionStr = ServiceTestHelper.getXAction( SOLUTION_PATH, "test/pojo/pojo-bad2.xaction" ); PojoComponentTest.doneCalled = false; PojoComponentTest.executeCalled = false; PojoComponentTest.validateCalled = false; IRuntimeContext runtimeContext = solutionEngine.execute( xactionStr, "test", "invalid class setting test", false, true, null, false, new HashMap(), null, null, new SimpleUrlFactory(""), new ArrayList()); //$NON-NLS-1$ //$NON-NLS-2$ assertNotNull( "RuntimeContext is null", runtimeContext ); assertEquals( "execute was called", false, PojoComponentTest.executeCalled ); assertEquals( "validate was called", false, PojoComponentTest.validateCalled ); assertEquals( "Action sequence validation succeeded", runtimeContext.getStatus(), IRuntimeContext.RUNTIME_CONTEXT_VALIDATE_FAIL ); } catch (Exception e) { // we should not get here e.printStackTrace(); assertTrue( e.getMessage(), false ); } finishTest(); } public void testBadValidate() { startTest(); ISolutionEngine solutionEngine = ServiceTestHelper.getSolutionEngine(); try { String xactionStr = ServiceTestHelper.getXAction( SOLUTION_PATH, "test/pojo/pojo-bad3.xaction" ); PojoComponentTest.doneCalled = false; PojoComponentTest.executeCalled = false; PojoComponentTest.validateCalled = false; IRuntimeContext runtimeContext = solutionEngine.execute( xactionStr, "test", "invalid class setting test", false, true, null, false, new HashMap(), null, null, new SimpleUrlFactory(""), new ArrayList()); //$NON-NLS-1$ //$NON-NLS-2$ assertNotNull( "RuntimeContext is null", runtimeContext ); assertEquals( "execute was called", false, PojoComponentTest.executeCalled ); assertEquals( "validate was not called", true, PojoComponentTest.validateCalled ); assertEquals( "Action sequence execution succeeded", runtimeContext.getStatus(), IRuntimeContext.RUNTIME_STATUS_FAILURE ); } catch (Exception e) { // we should not get here e.printStackTrace(); assertTrue( e.getMessage(), false ); } finishTest(); } /** * Test that unused parameters being passed in do not impact the running of the PojoComponent. * A warning is written to the log for user feedback on execution. */ public void testUnusedInput() { startTest(); ISolutionEngine solutionEngine = ServiceTestHelper.getSolutionEngine(); try { String xactionStr = ServiceTestHelper.getXAction( SOLUTION_PATH, "test/pojo/pojo-bad4.xaction" ); PojoComponentTest.doneCalled = false; PojoComponentTest.executeCalled = false; PojoComponentTest.validateCalled = false; IRuntimeContext runtimeContext = solutionEngine.execute( xactionStr, "test", "invalid class setting test", false, true, null, false, new HashMap(), null, null, new SimpleUrlFactory(""), new ArrayList()); //$NON-NLS-1$ //$NON-NLS-2$ assertNotNull( "RuntimeContext is null", runtimeContext ); assertEquals( "Action sequence succeeded", IRuntimeContext.RUNTIME_STATUS_SUCCESS, runtimeContext.getStatus() ); } catch (Exception e) { // we should not get here e.printStackTrace(); assertTrue( e.getMessage(), false ); } finishTest(); } public void testBadOutput() { startTest(); ISolutionEngine solutionEngine = ServiceTestHelper.getSolutionEngine(); try { String xactionStr = ServiceTestHelper.getXAction( SOLUTION_PATH, "test/pojo/pojo-bad5.xaction" ); PojoComponentTest.doneCalled = false; PojoComponentTest.executeCalled = false; PojoComponentTest.validateCalled = false; IRuntimeContext runtimeContext = solutionEngine.execute( xactionStr, "test", "invalid class setting test", false, true, null, false, new HashMap(), null, null, new SimpleUrlFactory(""), new ArrayList()); //$NON-NLS-1$ //$NON-NLS-2$ assertNotNull( "RuntimeContext is null", runtimeContext ); assertEquals( "Action sequence succeeded", runtimeContext.getStatus(), IRuntimeContext.RUNTIME_STATUS_FAILURE ); } catch (Exception e) { // we should not get here e.printStackTrace(); assertTrue( e.getMessage(), false ); } finishTest(); } public void testStreamingPojo() { String instanceId = null; ByteArrayOutputStream out = new ByteArrayOutputStream(); SimpleOutputHandler outputHandler = new SimpleOutputHandler(out, false); outputHandler.setOutputPreference(IOutputHandler.OUTPUT_TYPE_DEFAULT); startTest(); IPentahoSession session = new StandaloneSession("system"); ISolutionEngine solutionEngine = ServiceTestHelper.getSolutionEngine(); if (outputHandler != null) { outputHandler.setSession(session); } try { String xactionStr = ServiceTestHelper.getXAction( SOLUTION_PATH, "test/pojo/pojo2.xaction" ); PojoComponentTest.setActionSequenceResourceCalled = false; IRuntimeContext runtimeContext = solutionEngine.execute( xactionStr, "test1.xaction", "empty action sequence test", false, true, null, false, new HashMap(), outputHandler, null, new SimpleUrlFactory(""), new ArrayList()); //$NON-NLS-1$ //$NON-NLS-2$ IActionParameter param = runtimeContext.getOutputParameter( "outputstream" ); assertNotNull( "RuntimeContext is null", runtimeContext ); assertEquals( "Action sequence execution failed", runtimeContext.getStatus(), IRuntimeContext.RUNTIME_STATUS_SUCCESS ); assertTrue( "setResource was not called", PojoComponentTest.setResourceInputStreamCalled ); assertTrue( "setResource was not called", PojoComponentTest.setActionSequenceResourceCalled ); } catch (Exception e) { // we should not get here e.printStackTrace(); assertTrue( e.getMessage(), false ); } String output = new String( out.toByteArray() ); assertEquals( "outputstream", "abcdeabcde", output ); finishTest(); } }