/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.components.script.execution.testutils;
import java.io.IOException;
import junit.framework.Assert;
import org.easymock.EasyMock;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import de.rcenvironment.components.script.common.ScriptComponentConstants;
import de.rcenvironment.components.script.common.registry.ScriptExecutor;
import de.rcenvironment.components.script.common.registry.ScriptExecutorFactoryRegistry;
import de.rcenvironment.components.script.execution.ScriptComponent;
import de.rcenvironment.core.component.api.ComponentConstants;
import de.rcenvironment.core.component.api.ComponentException;
import de.rcenvironment.core.component.datamanagement.api.ComponentDataManagementService;
import de.rcenvironment.core.component.execution.api.Component;
import de.rcenvironment.core.component.execution.api.ComponentContext;
import de.rcenvironment.core.component.executor.SshExecutorConstants;
import de.rcenvironment.core.component.testutils.ComponentContextMock;
import de.rcenvironment.core.component.testutils.ComponentTestWrapper;
import de.rcenvironment.core.datamodel.api.DataType;
import de.rcenvironment.core.datamodel.api.TypedDatumFactory;
import de.rcenvironment.core.datamodel.api.TypedDatumService;
import de.rcenvironment.core.scripting.ScriptingService;
import de.rcenvironment.core.scripting.testutils.ScriptingServiceStubFactory;
import de.rcenvironment.core.utils.common.TempFileServiceAccess;
import de.rcenvironment.core.utils.scripting.ScriptLanguage;
/**
*
* Integration test for {@link ScriptComponent}.
*
* @author Sascha Zur
*/
public class ScriptComponentTest {
private static final String PRINT_TEST = "print test";
private static final String FALSE = "false";
private static final String TRUE = "true";
/**
* Expected exception if script/validation fails.
*/
@Rule
public ExpectedException scriptException = ExpectedException.none();
private ComponentTestWrapper component;
private ComponentContextMock context;
private TypedDatumFactory typedDatumFactory;
private ScriptComponent componentInstance;
/**
* Common setup.
*
* @throws IOException e
*/
@Before
public void setUp() throws IOException {
context = new ComponentContextMock();
componentInstance = new ScriptComponent();
component = new ComponentTestWrapper(componentInstance, context);
TempFileServiceAccess.setupUnitTestEnvironment();
typedDatumFactory = context.getService(TypedDatumService.class).getFactory();
ComponentDataManagementService componentDataManagementServiceMock = EasyMock.createMock(ComponentDataManagementService.class);
context.addService(ScriptingService.class, ScriptingServiceStubFactory.createDefaultInstance());
context.addService(ComponentDataManagementService.class, componentDataManagementServiceMock);
}
/**
* Common cleanup.
*/
@After
public void tearDown() {
component.tearDown(Component.FinalComponentState.FINISHED);
component.dispose();
}
/**
* Tests behavior of script component lifecycle.
*
* @throws ComponentException on unexpected component failures.
*/
@Test
public void testScriptComponentLifecycle() throws ComponentException {
ScriptExecutorFactoryRegistry scriptExecutorService = EasyMock.createMock(ScriptExecutorFactoryRegistry.class);
ScriptExecutor executor = EasyMock.createMock(ScriptExecutor.class);
EasyMock.expect(scriptExecutorService.requestScriptExecutor(ScriptLanguage.Jython)).andReturn(executor);
EasyMock.replay(scriptExecutorService);
context.addService(ScriptExecutorFactoryRegistry.class, scriptExecutorService);
EasyMock.expect(executor.prepareExecutor(context)).andReturn(true);
try {
executor.prepareNewRun(ScriptLanguage.Jython, PRINT_TEST, null);
} catch (ComponentException e) {
Assert.fail();
}
executor.runScript();
EasyMock.expect(executor.postRun()).andReturn(true);
executor.deleteTempFiles();
executor.reset();
executor.deleteTempFiles();
EasyMock.replay(executor);
context.addSimulatedInput("", "", DataType.Float, false, null);
context.setInputValue("", typedDatumFactory.createFloat(3.0));
context.setConfigurationValue(SshExecutorConstants.CONFIG_KEY_SCRIPT, PRINT_TEST);
context.setConfigurationValue(ScriptComponentConstants.SCRIPT_LANGUAGE, ScriptLanguage.Jython.name());
component.start();
component.processInputs();
component.reset();
}
/**
* Tests behavior of script component history data item.
*
* @throws ComponentException on unexpected component failures.
* @throws IOException if data management fails
*/
@Test
public void testScriptComponentHistoryDataItemTrue() throws ComponentException, IOException {
testScriptComponentHistoryDataItem(TRUE);
}
/**
* Tests behavior of script component history data item.
*
* @throws ComponentException on unexpected component failures.
* @throws IOException if data management fails
*/
@Test
public void testScriptComponentHistoryDataItemFalse() throws ComponentException, IOException {
testScriptComponentHistoryDataItem(FALSE);
}
private void testScriptComponentHistoryDataItem(String dataItemActive) throws ComponentException, IOException {
ScriptExecutorFactoryRegistry scriptExecutorService = EasyMock.createMock(ScriptExecutorFactoryRegistry.class);
ScriptExecutor executor = EasyMock.createNiceMock(ScriptExecutor.class);
EasyMock.expect(scriptExecutorService.requestScriptExecutor(EasyMock.anyObject(ScriptLanguage.class))).andReturn(executor)
.anyTimes();
EasyMock.replay(scriptExecutorService);
EasyMock.expect(executor.prepareExecutor(EasyMock.anyObject(ComponentContext.class))).andReturn(true).anyTimes();
EasyMock.expect(executor.postRun()).andReturn(true).anyTimes();
EasyMock.replay(executor);
context.addService(ScriptExecutorFactoryRegistry.class, scriptExecutorService);
context.addSimulatedInput("", "", DataType.Float, false, null);
context.setInputValue("", typedDatumFactory.createFloat(3.0));
context.setConfigurationValue(ScriptComponentConstants.SCRIPT_LANGUAGE, ScriptLanguage.Jython.name());
context.setConfigurationValue(ComponentConstants.CONFIG_KEY_STORE_DATA_ITEM, dataItemActive);
context.setConfigurationValue(SshExecutorConstants.CONFIG_KEY_SCRIPT, PRINT_TEST);
if (dataItemActive.equals(TRUE)) {
ComponentDataManagementService componentDataManagementServiceMock = context.getService(ComponentDataManagementService.class);
EasyMock.expect(componentDataManagementServiceMock.createTaggedReferenceFromString(context, PRINT_TEST)).andReturn("A");
EasyMock.replay(componentDataManagementServiceMock);
}
component.start();
component.processInputs();
if (dataItemActive.equals(TRUE)) {
Assert.assertNotNull(context.getHistoryDataItem());
} else {
Assert.assertNull(context.getHistoryDataItem());
}
}
}