diff --git a/spring-context/src/test/java/org/springframework/scripting/support/StandardScriptFactoryTests.java b/spring-context/src/test/java/org/springframework/scripting/support/StandardScriptFactoryTests.java deleted file mode 100644 index a3679ef6662..00000000000 --- a/spring-context/src/test/java/org/springframework/scripting/support/StandardScriptFactoryTests.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2002-2020 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 - * - * https://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.scripting.support; - -import java.util.Arrays; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.DisabledForJreRange; - -import org.springframework.aop.support.AopUtils; -import org.springframework.aop.target.dynamic.Refreshable; -import org.springframework.context.ApplicationContext; -import org.springframework.context.support.ClassPathXmlApplicationContext; -import org.springframework.scripting.Messenger; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.condition.JRE.JAVA_15; - -/** - * {@link StandardScriptFactory} (lang:std) tests for JavaScript. - * - * @author Juergen Hoeller - * @since 4.2 - */ -@DisabledForJreRange(min = JAVA_15) // Nashorn JavaScript engine removed in Java 15 -public class StandardScriptFactoryTests { - - @Test - public void testJsr223FromTagWithInterface() throws Exception { - ApplicationContext ctx = new ClassPathXmlApplicationContext("jsr223-with-xsd.xml", getClass()); - assertThat(Arrays.asList(ctx.getBeanNamesForType(Messenger.class)).contains("messengerWithInterface")).isTrue(); - Messenger messenger = (Messenger) ctx.getBean("messengerWithInterface"); - assertThat(AopUtils.isAopProxy(messenger)).isFalse(); - assertThat(messenger.getMessage()).isEqualTo("Hello World!"); - } - - @Test - public void testRefreshableJsr223FromTagWithInterface() throws Exception { - ApplicationContext ctx = new ClassPathXmlApplicationContext("jsr223-with-xsd.xml", getClass()); - assertThat(Arrays.asList(ctx.getBeanNamesForType(Messenger.class)).contains("refreshableMessengerWithInterface")).isTrue(); - Messenger messenger = (Messenger) ctx.getBean("refreshableMessengerWithInterface"); - assertThat(AopUtils.isAopProxy(messenger)).isTrue(); - boolean condition = messenger instanceof Refreshable; - assertThat(condition).isTrue(); - assertThat(messenger.getMessage()).isEqualTo("Hello World!"); - } - - @Test - public void testInlineJsr223FromTagWithInterface() throws Exception { - ApplicationContext ctx = new ClassPathXmlApplicationContext("jsr223-with-xsd.xml", getClass()); - assertThat(Arrays.asList(ctx.getBeanNamesForType(Messenger.class)).contains("inlineMessengerWithInterface")).isTrue(); - Messenger messenger = (Messenger) ctx.getBean("inlineMessengerWithInterface"); - assertThat(AopUtils.isAopProxy(messenger)).isFalse(); - assertThat(messenger.getMessage()).isEqualTo("Hello World!"); - } - -} diff --git a/spring-context/src/test/resources/org/springframework/scripting/support/Messenger.js b/spring-context/src/test/resources/org/springframework/scripting/support/Messenger.js deleted file mode 100644 index 5277c3c73ae..00000000000 --- a/spring-context/src/test/resources/org/springframework/scripting/support/Messenger.js +++ /dev/null @@ -1 +0,0 @@ -function getMessage() { return "Hello World!" } diff --git a/spring-context/src/test/resources/org/springframework/scripting/support/jsr223-with-xsd.xml b/spring-context/src/test/resources/org/springframework/scripting/support/jsr223-with-xsd.xml deleted file mode 100644 index 3346aa07884..00000000000 --- a/spring-context/src/test/resources/org/springframework/scripting/support/jsr223-with-xsd.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - function getMessage() { return "Hello World!" } - - - - diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/NashornScriptTemplateTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/NashornScriptTemplateTests.java deleted file mode 100644 index 3e6ce64a3f1..00000000000 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/NashornScriptTemplateTests.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright 2002-2020 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 - * - * https://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.web.reactive.result.view.script; - -import java.util.HashMap; -import java.util.Map; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.DisabledForJreRange; - -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.MediaType; -import org.springframework.http.codec.ServerCodecConfigurer; -import org.springframework.web.reactive.result.view.ZeroDemandResponse; -import org.springframework.web.server.ServerWebExchange; -import org.springframework.web.server.adapter.DefaultServerWebExchange; -import org.springframework.web.server.i18n.AcceptHeaderLocaleContextResolver; -import org.springframework.web.server.session.DefaultWebSessionManager; -import org.springframework.web.testfixture.http.server.reactive.MockServerHttpRequest; -import org.springframework.web.testfixture.http.server.reactive.MockServerHttpResponse; -import org.springframework.web.testfixture.server.MockServerWebExchange; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.condition.JRE.JAVA_15; - -/** - * Unit tests for pure JavaScript templates running on Nashorn engine. - * - * @author Sebastien Deleuze - */ -@DisabledForJreRange(min = JAVA_15) // Nashorn JavaScript engine removed in Java 15 -public class NashornScriptTemplateTests { - - @Test - public void renderTemplate() throws Exception { - Map model = new HashMap<>(); - model.put("title", "Layout example"); - model.put("body", "This is the body"); - String url = "org/springframework/web/reactive/result/view/script/nashorn/template.html"; - MockServerHttpResponse response = render(url, model, ScriptTemplatingConfiguration.class); - assertThat(response.getBodyAsString().block()).isEqualTo("Layout example

This is the body

"); - } - - @Test // SPR-13453 - public void renderTemplateWithUrl() throws Exception { - String url = "org/springframework/web/reactive/result/view/script/nashorn/template.html"; - Class configClass = ScriptTemplatingWithUrlConfiguration.class; - MockServerHttpResponse response = render(url, null, configClass); - assertThat(response.getBodyAsString().block()).isEqualTo(("Check url parameter

" + url + "

")); - } - - @Test // gh-22754 - public void subscribeWithoutDemand() throws Exception { - ZeroDemandResponse response = new ZeroDemandResponse(); - ServerWebExchange exchange = new DefaultServerWebExchange( - MockServerHttpRequest.get("/path").build(), response, - new DefaultWebSessionManager(), ServerCodecConfigurer.create(), - new AcceptHeaderLocaleContextResolver()); - - Map model = new HashMap<>(); - model.put("title", "Layout example"); - model.put("body", "This is the body"); - String viewUrl = "org/springframework/web/reactive/result/view/script/nashorn/template.html"; - ScriptTemplateView view = createViewWithUrl(viewUrl, ScriptTemplatingConfiguration.class); - view.render(model, null, exchange).subscribe(); - - response.cancelWrite(); - response.checkForLeaks(); - } - - private MockServerHttpResponse render(String viewUrl, Map model, - Class configuration) throws Exception { - - ScriptTemplateView view = createViewWithUrl(viewUrl, configuration); - MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/")); - view.renderInternal(model, MediaType.TEXT_HTML, exchange).block(); - return exchange.getResponse(); - } - - private ScriptTemplateView createViewWithUrl(String viewUrl, Class configuration) throws Exception { - AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); - ctx.register(configuration); - ctx.refresh(); - - ScriptTemplateView view = new ScriptTemplateView(); - view.setApplicationContext(ctx); - view.setUrl(viewUrl); - view.afterPropertiesSet(); - return view; - } - - - @Configuration - static class ScriptTemplatingConfiguration { - - @Bean - public ScriptTemplateConfigurer nashornConfigurer() { - ScriptTemplateConfigurer configurer = new ScriptTemplateConfigurer(); - configurer.setEngineName("nashorn"); - configurer.setScripts("org/springframework/web/reactive/result/view/script/nashorn/render.js"); - configurer.setRenderFunction("render"); - return configurer; - } - } - - - @Configuration - static class ScriptTemplatingWithUrlConfiguration { - - @Bean - public ScriptTemplateConfigurer nashornConfigurer() { - ScriptTemplateConfigurer configurer = new ScriptTemplateConfigurer(); - configurer.setEngineName("nashorn"); - configurer.setScripts("org/springframework/web/reactive/result/view/script/nashorn/render.js"); - configurer.setRenderFunction("renderWithUrl"); - return configurer; - } - } - -} diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/ScriptTemplateViewTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/ScriptTemplateViewTests.java deleted file mode 100644 index e583e4abbd2..00000000000 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/ScriptTemplateViewTests.java +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright 2002-2022 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 - * - * https://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.web.reactive.result.view.script; - -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; - -import javax.script.Invocable; -import javax.script.ScriptEngine; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.DisabledForJreRange; - -import org.springframework.beans.DirectFieldAccessor; -import org.springframework.context.ApplicationContextException; -import org.springframework.context.support.StaticApplicationContext; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; -import static org.assertj.core.api.InstanceOfAssertFactories.BOOLEAN; -import static org.junit.jupiter.api.condition.JRE.JAVA_15; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.mock; - -/** - * Unit tests for {@link ScriptTemplateView}. - * - * @author Sebastien Deleuze - */ -@DisabledForJreRange(min = JAVA_15) // Nashorn JavaScript engine removed in Java 15 -public class ScriptTemplateViewTests { - - private ScriptTemplateView view; - - private ScriptTemplateConfigurer configurer; - - private StaticApplicationContext context; - - - @BeforeEach - public void setup() { - this.configurer = new ScriptTemplateConfigurer(); - this.context = new StaticApplicationContext(); - this.context.getBeanFactory().registerSingleton("scriptTemplateConfigurer", this.configurer); - this.view = new ScriptTemplateView(); - } - - - @Test - public void missingTemplate() throws Exception { - this.context.refresh(); - this.view.setResourceLoaderPath("classpath:org/springframework/web/reactive/result/view/script/"); - this.view.setUrl("missing.txt"); - this.view.setEngine(mock(InvocableScriptEngine.class)); - this.configurer.setRenderFunction("render"); - this.view.setApplicationContext(this.context); - assertThat(this.view.checkResourceExists(Locale.ENGLISH)).isFalse(); - } - - @Test - public void missingScriptTemplateConfig() throws Exception { - assertThatExceptionOfType(ApplicationContextException.class).isThrownBy(() -> - this.view.setApplicationContext(new StaticApplicationContext())) - .withMessageContaining("ScriptTemplateConfig"); - } - - @Test - public void detectScriptTemplateConfigWithEngine() { - InvocableScriptEngine engine = mock(InvocableScriptEngine.class); - this.configurer.setEngine(engine); - this.configurer.setRenderObject("Template"); - this.configurer.setRenderFunction("render"); - this.configurer.setCharset(StandardCharsets.ISO_8859_1); - this.configurer.setSharedEngine(true); - - DirectFieldAccessor accessor = new DirectFieldAccessor(this.view); - this.view.setApplicationContext(this.context); - assertThat(accessor.getPropertyValue("engine")).isEqualTo(engine); - assertThat(accessor.getPropertyValue("renderObject")).isEqualTo("Template"); - assertThat(accessor.getPropertyValue("renderFunction")).isEqualTo("render"); - assertThat(accessor.getPropertyValue("defaultCharset")).isEqualTo(StandardCharsets.ISO_8859_1); - assertThat(accessor.getPropertyValue("sharedEngine")).asInstanceOf(BOOLEAN).isTrue(); - } - - @Test - public void detectScriptTemplateConfigWithEngineName() { - this.configurer.setEngineName("nashorn"); - this.configurer.setRenderObject("Template"); - this.configurer.setRenderFunction("render"); - - DirectFieldAccessor accessor = new DirectFieldAccessor(this.view); - this.view.setApplicationContext(this.context); - assertThat(accessor.getPropertyValue("engineName")).isEqualTo("nashorn"); - assertThat(accessor.getPropertyValue("engine")).isNotNull(); - assertThat(accessor.getPropertyValue("renderObject")).isEqualTo("Template"); - assertThat(accessor.getPropertyValue("renderFunction")).isEqualTo("render"); - assertThat(accessor.getPropertyValue("defaultCharset")).isEqualTo(StandardCharsets.UTF_8); - } - - @Test - public void customEngineAndRenderFunction() throws Exception { - ScriptEngine engine = mock(InvocableScriptEngine.class); - given(engine.get("key")).willReturn("value"); - this.view.setEngine(engine); - this.view.setRenderFunction("render"); - this.view.setApplicationContext(this.context); - engine = this.view.getEngine(); - assertThat(engine).isNotNull(); - assertThat(engine.get("key")).isEqualTo("value"); - DirectFieldAccessor accessor = new DirectFieldAccessor(this.view); - assertThat(accessor.getPropertyValue("renderObject")).isNull(); - assertThat(accessor.getPropertyValue("renderFunction")).isEqualTo("render"); - assertThat(accessor.getPropertyValue("defaultCharset")).isEqualTo(StandardCharsets.UTF_8); - } - - @Test - public void nonSharedEngine() throws Exception { - int iterations = 20; - this.view.setEngineName("nashorn"); - this.view.setRenderFunction("render"); - this.view.setSharedEngine(false); - this.view.setApplicationContext(this.context); - ExecutorService executor = Executors.newFixedThreadPool(4); - List> results = new ArrayList<>(); - for (int i = 0; i < iterations; i++) { - results.add(executor.submit(() -> view.getEngine() != null)); - } - assertThat(results.size()).isEqualTo(iterations); - for (int i = 0; i < iterations; i++) { - assertThat((boolean) results.get(i).get()).isTrue(); - } - executor.shutdown(); - } - - @Test - public void nonInvocableScriptEngine() throws Exception { - this.view.setEngine(mock(ScriptEngine.class)); - this.view.setApplicationContext(this.context); - } - - @Test - public void nonInvocableScriptEngineWithRenderFunction() throws Exception { - this.view.setEngine(mock(ScriptEngine.class)); - this.view.setRenderFunction("render"); - assertThatIllegalArgumentException().isThrownBy(() -> - this.view.setApplicationContext(this.context)); - } - - @Test - public void engineAndEngineNameBothDefined() { - this.view.setEngine(mock(InvocableScriptEngine.class)); - this.view.setEngineName("test"); - this.view.setRenderFunction("render"); - assertThatIllegalArgumentException().isThrownBy(() -> - this.view.setApplicationContext(this.context)) - .withMessageContaining("You should define either 'engine', 'engineSupplier' or 'engineName'."); - } - - @Test // gh-23258 - public void engineAndEngineSupplierBothDefined() { - ScriptEngine engine = mock(InvocableScriptEngine.class); - this.view.setEngineSupplier(() -> engine); - this.view.setEngine(engine); - this.view.setRenderFunction("render"); - assertThatIllegalArgumentException().isThrownBy(() -> - this.view.setApplicationContext(this.context)) - .withMessageContaining("You should define either 'engine', 'engineSupplier' or 'engineName'."); - } - - @Test // gh-23258 - public void engineNameAndEngineSupplierBothDefined() { - this.view.setEngineSupplier(() -> mock(InvocableScriptEngine.class)); - this.view.setEngineName("test"); - this.view.setRenderFunction("render"); - assertThatIllegalArgumentException().isThrownBy(() -> - this.view.setApplicationContext(this.context)) - .withMessageContaining("You should define either 'engine', 'engineSupplier' or 'engineName'."); - } - - @Test - public void engineSetterAndNonSharedEngine() { - this.view.setEngine(mock(InvocableScriptEngine.class)); - this.view.setRenderFunction("render"); - this.view.setSharedEngine(false); - assertThatIllegalArgumentException().isThrownBy(() -> - this.view.setApplicationContext(this.context)) - .withMessageContaining("sharedEngine"); - } - - @Test // gh-23258 - public void engineSupplierWithSharedEngine() { - this.configurer.setEngineSupplier(() -> mock(InvocableScriptEngine.class)); - this.configurer.setRenderObject("Template"); - this.configurer.setRenderFunction("render"); - this.configurer.setSharedEngine(true); - - DirectFieldAccessor accessor = new DirectFieldAccessor(this.view); - this.view.setApplicationContext(this.context); - ScriptEngine engine1 = this.view.getEngine(); - ScriptEngine engine2 = this.view.getEngine(); - assertThat(engine1).isNotNull(); - assertThat(engine2).isNotNull(); - assertThat(accessor.getPropertyValue("renderObject")).isEqualTo("Template"); - assertThat(accessor.getPropertyValue("renderFunction")).isEqualTo("render"); - assertThat(accessor.getPropertyValue("sharedEngine")).asInstanceOf(BOOLEAN).isTrue(); - } - - @SuppressWarnings("unchecked") - @Test // gh-23258 - public void engineSupplierWithNonSharedEngine() { - this.configurer.setEngineSupplier(() -> mock(InvocableScriptEngine.class)); - this.configurer.setRenderObject("Template"); - this.configurer.setRenderFunction("render"); - this.configurer.setSharedEngine(false); - - DirectFieldAccessor accessor = new DirectFieldAccessor(this.view); - this.view.setApplicationContext(this.context); - ScriptEngine engine1 = this.view.getEngine(); - ScriptEngine engine2 = this.view.getEngine(); - assertThat(engine1).isNotNull(); - assertThat(engine2).isNotNull(); - assertThat(accessor.getPropertyValue("renderObject")).isEqualTo("Template"); - assertThat(accessor.getPropertyValue("renderFunction")).isEqualTo("render"); - assertThat(accessor.getPropertyValue("sharedEngine")).asInstanceOf(BOOLEAN).isFalse(); - } - - private interface InvocableScriptEngine extends ScriptEngine, Invocable { - } - -} diff --git a/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/nashorn/render.js b/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/nashorn/render.js deleted file mode 100644 index f995bd5a9ba..00000000000 --- a/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/nashorn/render.js +++ /dev/null @@ -1,7 +0,0 @@ -function render(template, model) { - return template.replace("{{title}}", model.title).replace("{{body}}", model.body); -} - -function renderWithUrl(template, model, renderingContext) { - return template.replace("{{title}}", "Check url parameter").replace("{{body}}", renderingContext.url); -} diff --git a/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/nashorn/template.html b/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/nashorn/template.html deleted file mode 100644 index 9110e3181b0..00000000000 --- a/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/nashorn/template.html +++ /dev/null @@ -1 +0,0 @@ -{{title}}

{{body}}

\ No newline at end of file diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/NashornScriptTemplateTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/NashornScriptTemplateTests.java deleted file mode 100644 index e0ddf181397..00000000000 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/NashornScriptTemplateTests.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright 2002-2020 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 - * - * https://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.web.servlet.view.script; - -import java.util.HashMap; -import java.util.Map; - -import jakarta.servlet.ServletContext; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.DisabledForJreRange; - -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.testfixture.servlet.MockHttpServletRequest; -import org.springframework.web.testfixture.servlet.MockHttpServletResponse; -import org.springframework.web.testfixture.servlet.MockServletContext; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.condition.JRE.JAVA_15; -import static org.mockito.Mockito.mock; - -/** - * Unit tests for pure JavaScript templates running on Nashorn engine. - * - * @author Sebastien Deleuze - */ -@DisabledForJreRange(min = JAVA_15) // Nashorn JavaScript engine removed in Java 15 -public class NashornScriptTemplateTests { - - private WebApplicationContext webAppContext; - - private ServletContext servletContext; - - - @BeforeEach - public void setup() { - this.webAppContext = mock(WebApplicationContext.class); - this.servletContext = new MockServletContext(); - this.servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.webAppContext); - } - - @Test - public void renderTemplate() throws Exception { - Map model = new HashMap<>(); - model.put("title", "Layout example"); - model.put("body", "This is the body"); - String url = "org/springframework/web/servlet/view/script/nashorn/template.html"; - MockHttpServletResponse response = render(url, model, ScriptTemplatingConfiguration.class); - assertThat(response.getContentAsString()).isEqualTo("Layout example

This is the body

"); - } - - @Test // SPR-13453 - public void renderTemplateWithUrl() throws Exception { - String url = "org/springframework/web/servlet/view/script/nashorn/template.html"; - MockHttpServletResponse response = render(url, null, ScriptTemplatingWithUrlConfiguration.class); - assertThat(response.getContentAsString()).isEqualTo(("Check url parameter

" + url + "

")); - } - - private MockHttpServletResponse render(String viewUrl, Map model, - Class configuration) throws Exception { - - ScriptTemplateView view = createViewWithUrl(viewUrl, configuration); - MockHttpServletResponse response = new MockHttpServletResponse(); - MockHttpServletRequest request = new MockHttpServletRequest(); - view.renderMergedOutputModel(model, request, response); - return response; - } - - private ScriptTemplateView createViewWithUrl(String viewUrl, Class configuration) throws Exception { - AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); - ctx.register(configuration); - ctx.refresh(); - - ScriptTemplateView view = new ScriptTemplateView(); - view.setApplicationContext(ctx); - view.setUrl(viewUrl); - view.afterPropertiesSet(); - return view; - } - - - @Configuration - static class ScriptTemplatingConfiguration { - - @Bean - public ScriptTemplateConfigurer nashornConfigurer() { - ScriptTemplateConfigurer configurer = new ScriptTemplateConfigurer(); - configurer.setEngineName("nashorn"); - configurer.setScripts("org/springframework/web/servlet/view/script/nashorn/render.js"); - configurer.setRenderFunction("render"); - return configurer; - } - } - - - @Configuration - static class ScriptTemplatingWithUrlConfiguration { - - @Bean - public ScriptTemplateConfigurer nashornConfigurer() { - ScriptTemplateConfigurer configurer = new ScriptTemplateConfigurer(); - configurer.setEngineName("nashorn"); - configurer.setScripts("org/springframework/web/servlet/view/script/nashorn/render.js"); - configurer.setRenderFunction("renderWithUrl"); - return configurer; - } - } - -} diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/ScriptTemplateViewTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/ScriptTemplateViewTests.java deleted file mode 100644 index d546737cb80..00000000000 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/ScriptTemplateViewTests.java +++ /dev/null @@ -1,329 +0,0 @@ -/* - * Copyright 2002-2022 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 - * - * https://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.web.servlet.view.script; - -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; - -import javax.script.Invocable; -import javax.script.ScriptEngine; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.DisabledForJreRange; - -import org.springframework.beans.DirectFieldAccessor; -import org.springframework.context.ApplicationContextException; -import org.springframework.context.support.StaticApplicationContext; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.web.context.support.StaticWebApplicationContext; -import org.springframework.web.servlet.DispatcherServlet; -import org.springframework.web.testfixture.servlet.MockHttpServletRequest; -import org.springframework.web.testfixture.servlet.MockHttpServletResponse; -import org.springframework.web.testfixture.servlet.MockServletContext; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; -import static org.assertj.core.api.InstanceOfAssertFactories.BOOLEAN; -import static org.junit.jupiter.api.condition.JRE.JAVA_15; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.mock; - -/** - * Unit tests for {@link ScriptTemplateView}. - * - * @author Sebastien Deleuze - */ -@DisabledForJreRange(min = JAVA_15) // Nashorn JavaScript engine removed in Java 15 -public class ScriptTemplateViewTests { - - private ScriptTemplateView view; - - private ScriptTemplateConfigurer configurer; - - private StaticWebApplicationContext wac; - - - @BeforeEach - public void setup() { - this.configurer = new ScriptTemplateConfigurer(); - this.wac = new StaticWebApplicationContext(); - this.wac.getBeanFactory().registerSingleton("scriptTemplateConfigurer", this.configurer); - this.view = new ScriptTemplateView(); - } - - - @Test - public void missingTemplate() throws Exception { - MockServletContext servletContext = new MockServletContext(); - this.wac.setServletContext(servletContext); - this.wac.refresh(); - this.view.setResourceLoaderPath("classpath:org/springframework/web/servlet/view/script/"); - this.view.setUrl("missing.txt"); - this.view.setEngine(mock(InvocableScriptEngine.class)); - this.configurer.setRenderFunction("render"); - this.view.setApplicationContext(this.wac); - assertThat(this.view.checkResource(Locale.ENGLISH)).isFalse(); - } - - @Test - public void missingScriptTemplateConfig() { - assertThatExceptionOfType(ApplicationContextException.class).isThrownBy(() -> - this.view.setApplicationContext(new StaticApplicationContext())) - .withMessageContaining("ScriptTemplateConfig"); - } - - @Test - public void detectScriptTemplateConfigWithEngine() { - InvocableScriptEngine engine = mock(InvocableScriptEngine.class); - this.configurer.setEngine(engine); - this.configurer.setRenderObject("Template"); - this.configurer.setRenderFunction("render"); - this.configurer.setContentType(MediaType.TEXT_PLAIN_VALUE); - this.configurer.setCharset(StandardCharsets.ISO_8859_1); - this.configurer.setSharedEngine(true); - - DirectFieldAccessor accessor = new DirectFieldAccessor(this.view); - this.view.setApplicationContext(this.wac); - assertThat(accessor.getPropertyValue("engine")).isEqualTo(engine); - assertThat(accessor.getPropertyValue("renderObject")).isEqualTo("Template"); - assertThat(accessor.getPropertyValue("renderFunction")).isEqualTo("render"); - assertThat(accessor.getPropertyValue("contentType")).isEqualTo(MediaType.TEXT_PLAIN_VALUE); - assertThat(accessor.getPropertyValue("charset")).isEqualTo(StandardCharsets.ISO_8859_1); - assertThat(accessor.getPropertyValue("sharedEngine")).asInstanceOf(BOOLEAN).isTrue(); - } - - @Test - public void detectScriptTemplateConfigWithEngineName() { - this.configurer.setEngineName("nashorn"); - this.configurer.setRenderObject("Template"); - this.configurer.setRenderFunction("render"); - - DirectFieldAccessor accessor = new DirectFieldAccessor(this.view); - this.view.setApplicationContext(this.wac); - assertThat(accessor.getPropertyValue("engineName")).isEqualTo("nashorn"); - assertThat(accessor.getPropertyValue("engine")).isNotNull(); - assertThat(accessor.getPropertyValue("renderObject")).isEqualTo("Template"); - assertThat(accessor.getPropertyValue("renderFunction")).isEqualTo("render"); - assertThat(accessor.getPropertyValue("contentType")).isEqualTo(MediaType.TEXT_HTML_VALUE); - assertThat(accessor.getPropertyValue("charset")).isEqualTo(StandardCharsets.UTF_8); - } - - @Test - public void customEngineAndRenderFunction() { - ScriptEngine engine = mock(InvocableScriptEngine.class); - given(engine.get("key")).willReturn("value"); - this.view.setEngine(engine); - this.view.setRenderFunction("render"); - this.view.setApplicationContext(this.wac); - engine = this.view.getEngine(); - assertThat(engine).isNotNull(); - assertThat(engine.get("key")).isEqualTo("value"); - DirectFieldAccessor accessor = new DirectFieldAccessor(this.view); - assertThat(accessor.getPropertyValue("renderObject")).isNull(); - assertThat(accessor.getPropertyValue("renderFunction")).isEqualTo("render"); - assertThat(accessor.getPropertyValue("charset")).isEqualTo(StandardCharsets.UTF_8); - } - - @Test - public void nonSharedEngine() throws Exception { - int iterations = 20; - this.view.setEngineName("nashorn"); - this.view.setRenderFunction("render"); - this.view.setSharedEngine(false); - this.view.setApplicationContext(this.wac); - ExecutorService executor = Executors.newFixedThreadPool(4); - List> results = new ArrayList<>(); - for (int i = 0; i < iterations; i++) { - results.add(executor.submit(() -> view.getEngine() != null)); - } - assertThat(results.size()).isEqualTo(iterations); - for (int i = 0; i < iterations; i++) { - assertThat((boolean) results.get(i).get()).isTrue(); - } - executor.shutdown(); - } - - @Test - public void nonInvocableScriptEngine() { - this.view.setEngine(mock(ScriptEngine.class)); - this.view.setApplicationContext(this.wac); - } - - @Test - public void nonInvocableScriptEngineWithRenderFunction() { - this.view.setEngine(mock(ScriptEngine.class)); - this.view.setRenderFunction("render"); - assertThatIllegalArgumentException().isThrownBy(() -> - this.view.setApplicationContext(this.wac)); - } - - @Test - public void engineAndEngineNameBothDefined() { - this.view.setEngine(mock(InvocableScriptEngine.class)); - this.view.setEngineName("test"); - this.view.setRenderFunction("render"); - assertThatIllegalArgumentException().isThrownBy(() -> - this.view.setApplicationContext(this.wac)) - .withMessageContaining("You should define either 'engine', 'engineSupplier' or 'engineName'."); - } - - @Test // gh-23258 - public void engineAndEngineSupplierBothDefined() { - ScriptEngine engine = mock(InvocableScriptEngine.class); - this.view.setEngineSupplier(() -> engine); - this.view.setEngine(engine); - this.view.setRenderFunction("render"); - assertThatIllegalArgumentException().isThrownBy(() -> - this.view.setApplicationContext(this.wac)) - .withMessageContaining("You should define either 'engine', 'engineSupplier' or 'engineName'."); - } - - @Test // gh-23258 - public void engineNameAndEngineSupplierBothDefined() { - this.view.setEngineSupplier(() -> mock(InvocableScriptEngine.class)); - this.view.setEngineName("test"); - this.view.setRenderFunction("render"); - assertThatIllegalArgumentException().isThrownBy(() -> - this.view.setApplicationContext(this.wac)) - .withMessageContaining("You should define either 'engine', 'engineSupplier' or 'engineName'."); - } - - @Test - public void engineSetterAndNonSharedEngine() { - this.view.setEngine(mock(InvocableScriptEngine.class)); - this.view.setRenderFunction("render"); - this.view.setSharedEngine(false); - assertThatIllegalArgumentException().isThrownBy(() -> - this.view.setApplicationContext(this.wac)) - .withMessageContaining("sharedEngine"); - } - - @Test // SPR-14210 - public void resourceLoaderPath() throws Exception { - MockServletContext servletContext = new MockServletContext(); - this.wac.setServletContext(servletContext); - this.wac.refresh(); - MockHttpServletRequest request = new MockHttpServletRequest(); - request.setAttribute(DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.wac); - MockHttpServletResponse response = new MockHttpServletResponse(); - Map model = new HashMap<>(); - InvocableScriptEngine engine = mock(InvocableScriptEngine.class); - given(engine.invokeFunction(any(), any(), any(), any())).willReturn("foo"); - this.view.setEngine(engine); - this.view.setRenderFunction("render"); - this.view.setApplicationContext(this.wac); - this.view.setUrl("org/springframework/web/servlet/view/script/empty.txt"); - this.view.render(model, request, response); - assertThat(response.getContentAsString()).isEqualTo("foo"); - - response = new MockHttpServletResponse(); - this.view.setResourceLoaderPath("classpath:org/springframework/web/servlet/view/script/"); - this.view.setUrl("empty.txt"); - this.view.render(model, request, response); - assertThat(response.getContentAsString()).isEqualTo("foo"); - - response = new MockHttpServletResponse(); - this.view.setResourceLoaderPath("classpath:org/springframework/web/servlet/view/script"); - this.view.setUrl("empty.txt"); - this.view.render(model, request, response); - assertThat(response.getContentAsString()).isEqualTo("foo"); - } - - @Test // SPR-13379 - public void contentType() throws Exception { - MockServletContext servletContext = new MockServletContext(); - this.wac.setServletContext(servletContext); - this.wac.refresh(); - MockHttpServletRequest request = new MockHttpServletRequest(); - request.setAttribute(DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.wac); - MockHttpServletResponse response = new MockHttpServletResponse(); - Map model = new HashMap<>(); - this.view.setEngine(mock(InvocableScriptEngine.class)); - this.view.setRenderFunction("render"); - this.view.setResourceLoaderPath("classpath:org/springframework/web/servlet/view/script/"); - this.view.setUrl("empty.txt"); - this.view.setApplicationContext(this.wac); - - this.view.render(model, request, response); - assertThat(response.getHeader(HttpHeaders.CONTENT_TYPE)).isEqualTo((MediaType.TEXT_HTML_VALUE + ";charset=" + - StandardCharsets.UTF_8)); - - response = new MockHttpServletResponse(); - this.view.setContentType(MediaType.TEXT_PLAIN_VALUE); - this.view.render(model, request, response); - assertThat(response.getHeader(HttpHeaders.CONTENT_TYPE)).isEqualTo((MediaType.TEXT_PLAIN_VALUE + ";charset=" + - StandardCharsets.UTF_8)); - - response = new MockHttpServletResponse(); - this.view.setCharset(StandardCharsets.ISO_8859_1); - this.view.render(model, request, response); - assertThat(response.getHeader(HttpHeaders.CONTENT_TYPE)).isEqualTo((MediaType.TEXT_PLAIN_VALUE + ";charset=" + - StandardCharsets.ISO_8859_1)); - - } - - @Test // gh-23258 - public void engineSupplierWithSharedEngine() { - this.configurer.setEngineSupplier(() -> mock(InvocableScriptEngine.class)); - this.configurer.setRenderObject("Template"); - this.configurer.setRenderFunction("render"); - this.configurer.setSharedEngine(true); - - DirectFieldAccessor accessor = new DirectFieldAccessor(this.view); - this.view.setApplicationContext(this.wac); - ScriptEngine engine1 = this.view.getEngine(); - ScriptEngine engine2 = this.view.getEngine(); - assertThat(engine1).isNotNull(); - assertThat(engine2).isNotNull(); - assertThat(accessor.getPropertyValue("renderObject")).isEqualTo("Template"); - assertThat(accessor.getPropertyValue("renderFunction")).isEqualTo("render"); - assertThat(accessor.getPropertyValue("sharedEngine")).asInstanceOf(BOOLEAN).isTrue(); - } - - @Test // gh-23258 - public void engineSupplierWithNonSharedEngine() { - this.configurer.setEngineSupplier(() -> mock(InvocableScriptEngine.class)); - this.configurer.setRenderObject("Template"); - this.configurer.setRenderFunction("render"); - this.configurer.setSharedEngine(false); - - DirectFieldAccessor accessor = new DirectFieldAccessor(this.view); - this.view.setApplicationContext(this.wac); - ScriptEngine engine1 = this.view.getEngine(); - ScriptEngine engine2 = this.view.getEngine(); - assertThat(engine1).isNotNull(); - assertThat(engine2).isNotNull(); - assertThat(accessor.getPropertyValue("renderObject")).isEqualTo("Template"); - assertThat(accessor.getPropertyValue("renderFunction")).isEqualTo("render"); - assertThat(accessor.getPropertyValue("sharedEngine")).asInstanceOf(BOOLEAN).isFalse(); - } - - private interface InvocableScriptEngine extends ScriptEngine, Invocable { - } - -} diff --git a/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/nashorn/render.js b/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/nashorn/render.js deleted file mode 100644 index f995bd5a9ba..00000000000 --- a/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/nashorn/render.js +++ /dev/null @@ -1,7 +0,0 @@ -function render(template, model) { - return template.replace("{{title}}", model.title).replace("{{body}}", model.body); -} - -function renderWithUrl(template, model, renderingContext) { - return template.replace("{{title}}", "Check url parameter").replace("{{body}}", renderingContext.url); -} diff --git a/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/nashorn/template.html b/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/nashorn/template.html deleted file mode 100644 index 9110e3181b0..00000000000 --- a/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/nashorn/template.html +++ /dev/null @@ -1 +0,0 @@ -{{title}}

{{body}}

\ No newline at end of file