package org.jboss.resteasy.test.spring.deployment; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.protocol.HttpClientContext; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.HttpException; import org.apache.http.client.methods.HttpGet; import org.apache.http.HttpStatus; import org.apache.http.util.EntityUtils; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.container.test.api.OperateOnDeployment; import org.jboss.arquillian.container.test.api.RunAsClient; import org.jboss.arquillian.junit.Arquillian; import org.jboss.resteasy.plugins.spring.SpringContextLoaderListener; import org.jboss.resteasy.test.spring.deployment.resource.TestResource; import org.jboss.resteasy.utils.PortProviderUtil; import org.jboss.resteasy.utils.TestUtil; import org.jboss.resteasy.utils.TestUtilSpring; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.exporter.ZipExporter; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.context.ApplicationContext; /** * @tpSubChapter Spring * @tpChapter Integration tests - dependencies included in deployment * @tpTestCaseDetails Tests adding spring as resource root in deployment * @tpSince RESTEasy 3.0.16 */ @RunWith(Arquillian.class) @RunAsClient public class AddSpringResteasyAsResourceRootTest { private CloseableHttpClient client; private String deploymentName; private static String deploymentWithoutSpringMvcDispatcherOrListenerSpringIncluded = "deploymentWithoutSpringMvcDispatcherOrListenerSpringIncluded"; private static String deploymentWithSpringContextLoaderListenerSpringIncluded = "deploymentWithSpringContextLoaderListenerSpringIncluded"; private static String deploymentWithSpringMvcDispatcherSpringIncluded = "deploymentWithSpringMvcDispatcherSpringIncluded"; @Before public void before() throws Exception { client = HttpClients.createDefault(); } /** * @tpTestDetails Add spring libraries into the deployment. Deployment is configured with SpringMVC Dispatcher Servlet. * @tpPassCrit The application is successfully deployed, resource is available, and Spring classes are on the path. * @tpSince RESTEasy 3.0.16 */ @Test @OperateOnDeployment("dep3") public void testDeploymentWithSpringMvcDispatcherAddsResourceRoot() throws Exception { deploymentName = deploymentWithSpringMvcDispatcherSpringIncluded; assertResponse(deploymentName); Assert.assertTrue("Spring classes are not available in deployment", springClassesAreAvailableToDeployment(deploymentName)); Assert.assertTrue("Resteasy Spring classes are not available in deployment", resteasySpringClassesAreAvailableToDeployment(deploymentName)); } @Deployment(name = "dep3") private static WebArchive createDeploymentWithSpringMvcDispatcher() { WebArchive archive = ShrinkWrap.create(WebArchive.class, deploymentWithSpringMvcDispatcherSpringIncluded + ".war") .addClass(TestResource.class) .addAsWebInfResource(AddSpringResteasyAsResourceRootTest.class.getPackage(), "mvc-dispatcher-servlet/web.xml", "web.xml") .addAsWebInfResource(AddSpringResteasyAsResourceRootTest.class.getPackage(), "mvc-dispatcher-servlet/mvc-dispatcher-servlet.xml", "mvc-dispatcher-servlet.xml") .addAsWebInfResource(AddSpringResteasyAsResourceRootTest.class.getPackage(), "mvc-dispatcher-servlet/applicationContext.xml", "applicationContext.xml"); TestUtilSpring.addSpringLibraries(archive); archive.as(ZipExporter.class).exportTo(new File("target", deploymentWithSpringMvcDispatcherSpringIncluded + ".war"), true); return archive; } /** * @tpTestDetails Add spring libraries into the deployment. Deployment is configured with Spring context loader listener. * @tpPassCrit The application is successfully deployed, resource is available, and Spring classes are on the path. * @tpSince RESTEasy 3.0.16 */ @Test @OperateOnDeployment("dep2") public void testDeploymentWithSpringContextLoaderListenerAddsResourceRoot() throws Exception { deploymentName = deploymentWithSpringContextLoaderListenerSpringIncluded; assertResponse(deploymentName); Assert.assertTrue("Spring classes are not available in deployment", springClassesAreAvailableToDeployment(deploymentName)); Assert.assertTrue("Resteasy Spring classes are not available in deployment", resteasySpringClassesAreAvailableToDeployment(deploymentName)); } @Deployment(name = "dep2") private static Archive<?> createDeploymentWithSpringContextLoaderListener() { WebArchive archive = ShrinkWrap.create(WebArchive.class, deploymentWithSpringContextLoaderListenerSpringIncluded + ".war") .addClass(TestResource.class) .addAsWebInfResource(AddSpringResteasyAsResourceRootTest.class.getPackage(), "web.xml", "web.xml") .addAsWebInfResource(AddSpringResteasyAsResourceRootTest.class.getPackage(), "applicationContext.xml", "applicationContext.xml"); TestUtilSpring.addSpringLibraries(archive); archive.as(ZipExporter.class).exportTo(new File("target", deploymentWithSpringContextLoaderListenerSpringIncluded + ".war"), true); return archive; } /** * @tpTestDetails Add spring libraries into the deployment. Deployment is configured without Spring context loader listener or * MVC dispatcher. * @tpPassCrit The application is successfully deployed, resource is available, and Spring classes are on the path. * @tpSince RESTEasy 3.0.16 */ @Test @OperateOnDeployment("dep1") public void testDeploymentWithoutSpringMvcDispatcherOrListenerDoesNotAddResourceRoot() throws Exception { deploymentName = deploymentWithoutSpringMvcDispatcherOrListenerSpringIncluded; assertResponse(deploymentName); Assert.assertTrue("Spring classes are not available in deployment", springClassesAreAvailableToDeployment(deploymentName)); Assert.assertFalse("Resteasy Spring classes are available in deployment, which is not expected", resteasySpringClassesAreAvailableToDeployment(deploymentName)); } @Deployment(name = "dep1") private static Archive<?> createDeploymentWithoutSpringMvcDispatcherOrListener() { WebArchive archive = TestUtil.prepareArchive(deploymentWithoutSpringMvcDispatcherOrListenerSpringIncluded); archive.addAsWebInfResource(AddSpringResteasyAsResourceRootTest.class.getPackage(), "web-no-mvc-no-listener.xml", "web.xml") .addAsWebInfResource(AddSpringResteasyAsResourceRootTest.class.getPackage(), "applicationContext.xml", "applicationContext.xml"); TestUtilSpring.addSpringLibraries(archive); archive.as(ZipExporter.class).exportTo(new File("target", deploymentWithoutSpringMvcDispatcherOrListenerSpringIncluded + ".war"), true); return TestUtil.finishContainerPrepare(archive, null, TestResource.class); } private boolean resteasySpringClassesAreAvailableToDeployment(String deploymentName) throws IOException, HttpException { return isClassAvailableToDeployment(deploymentName, SpringContextLoaderListener.class); } private boolean isClassAvailableToDeployment(String deploymentName, Class<?> clazz) throws IOException, HttpException { String className = clazz.getName(); String CONTEXT_URL = PortProviderUtil.generateURL("/", deploymentName); HttpGet httpget = new HttpGet(CONTEXT_URL + TestResource.LOAD_CLASS_PATH + "?" + TestResource.CLASSNAME_PARAM + "=" + className); try { String responseString = new String(); HttpClientContext context = HttpClientContext.create(); CloseableHttpResponse response = client.execute(httpget, context); HttpEntity entity = response.getEntity(); if (entity != null) { responseString = EntityUtils.toString(entity, StandardCharsets.UTF_8); } return (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) && (className.equals(responseString)); } finally { httpget.releaseConnection(); } } private boolean springClassesAreAvailableToDeployment(String deploymentName) throws IOException, HttpException { return isClassAvailableToDeployment(deploymentName, ApplicationContext.class); } private void assertResponse(String deploymentName) throws IOException, HttpException { String CONTEXT_URL = PortProviderUtil.generateURL("/", deploymentName); HttpGet httpget = new HttpGet(CONTEXT_URL + TestResource.TEST_PATH); HttpClientContext context = HttpClientContext.create(); CloseableHttpResponse response = client.execute(httpget, context); Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode()); HttpEntity entity = response.getEntity(); String responseString = EntityUtils.toString(entity, StandardCharsets.UTF_8); Assert.assertEquals("The server resource didn't send correct response", TestResource.TEST_RESPONSE, responseString); httpget.releaseConnection(); } /* private static void addSpringLibraries(WebArchive archive, String springVersion) { if (springDependenciesInDeployment()) { archive.addAsLibraries(resolveSpringDependencies(springVersion)); } else { // you need to use the 'meta-inf' attribute to import the contents of meta-inf so spring can find the correct namespace handlers if (isDefinedSystemProperty("use-jboss-deployment-structure")) { archive.addAsManifestResource("jboss-deployment-structure.xml"); } else { archive.addAsManifestResource(new StringAsset("Dependencies: org.springframework.spring meta-inf\n"), "MANIFEST.MF"); } } } private static File[] resolveSpringDependencies(String springVersion) { MavenUtil mavenUtil; mavenUtil = MavenUtil.create(true); List<File> runtimeDependencies = new ArrayList<>(); try { runtimeDependencies.addAll(mavenUtil.createMavenGavRecursiveFiles("org.springframework:spring-core:" + springVersion)); runtimeDependencies.addAll(mavenUtil.createMavenGavRecursiveFiles("org.springframework:spring-web:" + springVersion)); runtimeDependencies.addAll(mavenUtil.createMavenGavRecursiveFiles("org.springframework:spring-webmvc:" + springVersion)); } catch (Exception e) { throw new RuntimeException("Unable to get artifacts from maven via Aether library", e); } File[] dependencies = runtimeDependencies.toArray(new File []{}); return dependencies; } private static boolean springDependenciesInDeployment() { return true; } private static String getSpringVersion() { return readSystemProperty("version.org.springframework", defaultSpringVersion); } private static String readSystemProperty(String name, String defaultValue) { String value = System.getProperty(name); return (value == null) ? defaultValue : value; } private static boolean isDefinedSystemProperty(String name) { String value = System.getProperty(name); return (value != null); }*/ }