/* * Copyright 2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.batch.item.support; import org.junit.BeforeClass; import org.junit.Test; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import javax.script.ScriptEngineFactory; import javax.script.ScriptEngineManager; import java.util.ArrayList; import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assume.assumeTrue; /** * <p> * Test cases around {@link org.springframework.batch.item.support.ScriptItemProcessor}. * </p> * * @author Chris Schaefer * @since 3.1 */ public class ScriptItemProcessorTests { private static List<String> availableLanguages = new ArrayList<String>(); @BeforeClass public static void populateAvailableEngines() { List<ScriptEngineFactory> scriptEngineFactories = new ScriptEngineManager().getEngineFactories(); for (ScriptEngineFactory scriptEngineFactory : scriptEngineFactories) { availableLanguages.addAll(scriptEngineFactory.getNames()); } } @Test public void testJavascriptScriptSourceSimple() throws Exception { assumeTrue(languageExists("javascript")); ScriptItemProcessor<String, Object> scriptItemProcessor = new ScriptItemProcessor<String, Object>(); scriptItemProcessor.setScriptSource("item.toUpperCase();", "javascript"); scriptItemProcessor.afterPropertiesSet(); assertEquals("Incorrect transformed value", "SS", scriptItemProcessor.process("ss")); } @Test public void testJavascriptScriptSourceFunction() throws Exception { assumeTrue(languageExists("javascript")); ScriptItemProcessor<String, Object> scriptItemProcessor = new ScriptItemProcessor<String, Object>(); scriptItemProcessor.setScriptSource("function process(item) { return item.toUpperCase(); } process(item);", "javascript"); scriptItemProcessor.afterPropertiesSet(); assertEquals("Incorrect transformed value", "SS", scriptItemProcessor.process("ss")); } @Test public void testJRubyScriptSourceSimple() throws Exception { assumeTrue(languageExists("jruby")); ScriptItemProcessor<String, Object> scriptItemProcessor = new ScriptItemProcessor<String, Object>(); scriptItemProcessor.setScriptSource("$item.upcase", "jruby"); scriptItemProcessor.afterPropertiesSet(); assertEquals("Incorrect transformed value", "SS", scriptItemProcessor.process("ss")); } @Test public void testJRubyScriptSourceMethod() throws Exception { assumeTrue(languageExists("jruby")); ScriptItemProcessor<String, Object> scriptItemProcessor = new ScriptItemProcessor<String, Object>(); scriptItemProcessor.setScriptSource("def process(item) $item.upcase end \n process($item)", "jruby"); scriptItemProcessor.afterPropertiesSet(); assertEquals("Incorrect transformed value", "SS", scriptItemProcessor.process("ss")); } @Test public void testBeanShellScriptSourceSimple() throws Exception { assumeTrue(languageExists("bsh")); ScriptItemProcessor<String, Object> scriptItemProcessor = new ScriptItemProcessor<String, Object>(); scriptItemProcessor.setScriptSource("item.toUpperCase();", "bsh"); scriptItemProcessor.afterPropertiesSet(); assertEquals("Incorrect transformed value", "SS", scriptItemProcessor.process("ss")); } @Test public void testBeanShellScriptSourceFunction() throws Exception { assumeTrue(languageExists("bsh")); ScriptItemProcessor<String, Object> scriptItemProcessor = new ScriptItemProcessor<String, Object>(); scriptItemProcessor.setScriptSource("String process(String item) { return item.toUpperCase(); } process(item);", "bsh"); scriptItemProcessor.afterPropertiesSet(); assertEquals("Incorrect transformed value", "SS", scriptItemProcessor.process("ss")); } @Test public void testGroovyScriptSourceSimple() throws Exception { assumeTrue(languageExists("groovy")); ScriptItemProcessor<String, Object> scriptItemProcessor = new ScriptItemProcessor<String, Object>(); scriptItemProcessor.setScriptSource("item.toUpperCase();", "groovy"); scriptItemProcessor.afterPropertiesSet(); assertEquals("Incorrect transformed value", "SS", scriptItemProcessor.process("ss")); } @Test public void testGroovyScriptSourceMethod() throws Exception { assumeTrue(languageExists("groovy")); ScriptItemProcessor<String, Object> scriptItemProcessor = new ScriptItemProcessor<String, Object>(); scriptItemProcessor.setScriptSource("def process(item) { return item.toUpperCase() } \n process(item)", "groovy"); scriptItemProcessor.afterPropertiesSet(); assertEquals("Incorrect transformed value", "SS", scriptItemProcessor.process("ss")); } @Test public void testJavascriptScriptSimple() throws Exception { assumeTrue(languageExists("javascript")); Resource resource = new ClassPathResource("org/springframework/batch/item/support/processor-test-simple.js"); ScriptItemProcessor<String, Object> scriptItemProcessor = new ScriptItemProcessor<String, Object>(); scriptItemProcessor.setScript(resource); scriptItemProcessor.afterPropertiesSet(); assertEquals("Incorrect transformed value", "SS", scriptItemProcessor.process("ss")); } @Test(expected = IllegalStateException.class) public void testNoScriptSet() throws Exception { ScriptItemProcessor<String, Object> scriptItemProcessor = new ScriptItemProcessor<String, Object>(); scriptItemProcessor.afterPropertiesSet(); } @Test(expected = IllegalStateException.class) public void testScriptSourceAndScriptResourceSet() throws Exception { ScriptItemProcessor<String, Object> scriptItemProcessor = new ScriptItemProcessor<String, Object>(); scriptItemProcessor.setScriptSource("blah", "blah"); scriptItemProcessor.setScript(new ClassPathResource("blah")); scriptItemProcessor.afterPropertiesSet(); } @Test(expected = IllegalStateException.class) public void testNoScriptSetWithoutInitBean() throws Exception { ScriptItemProcessor<String, Object> scriptItemProcessor = new ScriptItemProcessor<String, Object>(); scriptItemProcessor.process("blah"); } @Test(expected = IllegalArgumentException.class) public void testScriptSourceWithNoLanguage() throws Exception { ScriptItemProcessor<String, Object> scriptItemProcessor = new ScriptItemProcessor<String, Object>(); scriptItemProcessor.setScriptSource("function process(item) { return item.toUpperCase(); } process(item);", null); scriptItemProcessor.afterPropertiesSet(); } @Test public void testItemBindingNameChange() throws Exception { assumeTrue(languageExists("javascript")); ScriptItemProcessor<String, Object> scriptItemProcessor = new ScriptItemProcessor<String, Object>(); scriptItemProcessor.setItemBindingVariableName("someOtherVarName"); scriptItemProcessor.setScriptSource("function process(param) { return param.toUpperCase(); } process(someOtherVarName);", "javascript"); scriptItemProcessor.afterPropertiesSet(); assertEquals("Incorrect transformed value", "SS", scriptItemProcessor.process("ss")); } private boolean languageExists(String engineName) { return availableLanguages.contains(engineName); } }