From 50ea30841ea25b2475980a5277a5f8cc2ed914af Mon Sep 17 00:00:00 2001 From: Christian Schneider Date: Thu, 5 Jan 2017 15:58:33 +0100 Subject: [PATCH] [AMQ-6546] More refactoring of karaf itests --- activemq-karaf-itest/pom.xml | 7 +- .../karaf/itest/AbstractFeatureTest.java | 133 ++++++++---------- .../karaf/itest/AbstractJmsFeatureTest.java | 80 ----------- .../itest/ActiveMQAMQPBrokerFeatureTest.java | 55 ++++---- .../itest/ActiveMQBrokerBlueprintTest.java | 24 +--- .../itest/ActiveMQBrokerFeatureTest.java | 129 +++++++++++------ .../ActiveMQBrokerNdCamelFeatureTest.java | 12 +- ...iveMQBrokerNdExternalCamelFeatureTest.java | 13 +- ...ActiveMQBrokerNdWebConsoleFeatureTest.java | 112 --------------- .../ActiveMQBrokerRuntimeConfigTest.java | 44 +++--- .../karaf/itest/ActiveMQClientBundleTest.java | 14 +- .../itest/ActiveMQClientFactoryTest.java | 4 +- .../activemq/karaf/itest/JMSTester.java | 121 ++++++++++++++++ .../karaf/itest/KarafShellHelper.java | 92 ++++++++++++ .../activemq/karaf/itest/ObrFeatureTest.java | 6 +- pom.xml | 2 +- 16 files changed, 439 insertions(+), 409 deletions(-) delete mode 100644 activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/AbstractJmsFeatureTest.java delete mode 100644 activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerNdWebConsoleFeatureTest.java create mode 100644 activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/JMSTester.java create mode 100644 activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/KarafShellHelper.java diff --git a/activemq-karaf-itest/pom.xml b/activemq-karaf-itest/pom.xml index 14c65ed5b8..4247f440d5 100644 --- a/activemq-karaf-itest/pom.xml +++ b/activemq-karaf-itest/pom.xml @@ -67,9 +67,8 @@ provided - commons-httpclient - commons-httpclient - 3.1 + org.apache.httpcomponents + httpclient org.ops4j.pax.exam @@ -121,7 +120,7 @@ features test - + junit diff --git a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/AbstractFeatureTest.java b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/AbstractFeatureTest.java index 95b3348da4..afebe6c160 100644 --- a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/AbstractFeatureTest.java +++ b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/AbstractFeatureTest.java @@ -16,6 +16,7 @@ */ package org.apache.activemq.karaf.itest; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.ops4j.pax.exam.CoreOptions.composite; import static org.ops4j.pax.exam.CoreOptions.maven; @@ -26,47 +27,44 @@ import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.keepRunti import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.logLevel; import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.replaceConfigurationFile; -import java.io.ByteArrayOutputStream; import java.io.File; -import java.io.PrintStream; -import java.security.PrivilegedAction; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.channels.FileChannel; import java.util.concurrent.Callable; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.FutureTask; import java.util.concurrent.TimeUnit; import javax.inject.Inject; -import javax.security.auth.Subject; import org.apache.karaf.features.FeaturesService; -import org.apache.karaf.jaas.boot.principal.RolePrincipal; -import org.apache.karaf.jaas.boot.principal.UserPrincipal; -import org.apache.karaf.shell.api.console.Session; import org.apache.karaf.shell.api.console.SessionFactory; import org.junit.After; import org.junit.Before; +import org.junit.runner.RunWith; import org.ops4j.pax.exam.MavenUtils; import org.ops4j.pax.exam.Option; import org.ops4j.pax.exam.ProbeBuilder; import org.ops4j.pax.exam.TestProbeBuilder; +import org.ops4j.pax.exam.junit.PaxExam; import org.ops4j.pax.exam.karaf.options.LogLevelOption; import org.ops4j.pax.exam.options.MavenUrlReference; import org.ops4j.pax.exam.options.UrlReference; +import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy; +import org.ops4j.pax.exam.spi.reactors.PerClass; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.Constants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@RunWith(PaxExam.class) +@ExamReactorStrategy(PerClass.class) public abstract class AbstractFeatureTest { private static final String KARAF_MAJOR_VERSION = "4.0.0"; public static final Logger LOG = LoggerFactory.getLogger(AbstractFeatureTest.class); public static final long ASSERTION_TIMEOUT = 30000L; - public static final long COMMAND_TIMEOUT = 30000L; - public static final String USER = "karaf"; - public static final String PASSWORD = "karaf"; public static final String RESOURCE_BASE = "src/test/resources/org/apache/activemq/karaf/itest/"; @Inject @@ -74,6 +72,9 @@ public abstract class AbstractFeatureTest { @Inject FeaturesService featuresService; + + @Inject + SessionFactory sessionFactory; @Before public void setUp() throws Exception { @@ -90,61 +91,6 @@ public abstract class AbstractFeatureTest { return probe; } - @Inject - SessionFactory sessionFactory; - - ExecutorService executor = Executors.newCachedThreadPool(); - - private String executeCommand(final String command, final Long timeout, final Boolean silent) { - String response; - final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - final PrintStream printStream = new PrintStream(byteArrayOutputStream); - final Session commandSession = sessionFactory.create(System.in, printStream, printStream); - commandSession.put("APPLICATION", System.getProperty("karaf.name", "root")); - commandSession.put("USER", USER); - FutureTask commandFuture = new FutureTask( - new Callable() { - @Override - public String call() { - - Subject subject = new Subject(); - subject.getPrincipals().add(new UserPrincipal("admin")); - subject.getPrincipals().add(new RolePrincipal("admin")); - subject.getPrincipals().add(new RolePrincipal("manager")); - subject.getPrincipals().add(new RolePrincipal("viewer")); - return Subject.doAs(subject, new PrivilegedAction() { - @Override - public String run() { - try { - if (!silent) { - System.out.println(command); - System.out.flush(); - } - commandSession.execute(command); - } catch (Exception e) { - e.printStackTrace(System.err); - } - printStream.flush(); - return byteArrayOutputStream.toString(); - } - }); - }}); - - try { - executor.submit(commandFuture); - response = commandFuture.get(timeout, TimeUnit.MILLISECONDS); - } catch (Exception e) { - e.printStackTrace(System.err); - response = "SHELL COMMAND TIMED OUT: "; - } - LOG.info("Execute: " + command + " - Response:" + response); - return response; - } - - protected String executeCommand(final String command) { - return executeCommand(command, COMMAND_TIMEOUT, false); - } - /** * Installs a feature and asserts that feature is properly installed. * @@ -174,7 +120,20 @@ public abstract class AbstractFeatureTest { throw new RuntimeException("Bundle " + symName + " not found"); } - public static Option configureBrokerStart(String xmlConfig) { + protected String executeCommand(String command) { + return KarafShellHelper.executeCommand(sessionFactory, command); + } + + protected void assertBrokerStarted() throws Exception { + withinReason(new Runnable() { + public void run() { + assertEquals("brokerName = amq-broker", executeCommand("activemq:list").trim()); + assertTrue(executeCommand("activemq:bstat").trim().contains("BrokerName = amq-broker")); + } + }); + } + + public static Option configureBrokerStart(String xmlConfig) { return composite( replaceConfigurationFile("etc/activemq.xml", new File(RESOURCE_BASE + xmlConfig + ".xml")), replaceConfigurationFile("etc/org.apache.activemq.server-default.cfg", @@ -209,7 +168,7 @@ public abstract class AbstractFeatureTest { return MavenUtils.getArtifactVersion("org.apache.camel.karaf", "apache-camel"); } - protected boolean withinReason(Callable callable) throws Throwable { + public static boolean withinReason(Callable callable) throws Exception { long max = System.currentTimeMillis() + ASSERTION_TIMEOUT; while (true) { try { @@ -225,7 +184,7 @@ public abstract class AbstractFeatureTest { } } - protected void withinReason(Runnable runable) throws Exception { + public static void withinReason(Runnable runable) { long max = System.currentTimeMillis() + ASSERTION_TIMEOUT; while (true) { try { @@ -233,7 +192,11 @@ public abstract class AbstractFeatureTest { return; } catch (Throwable t) { if (System.currentTimeMillis() < max) { - TimeUnit.SECONDS.sleep(1); + try { + TimeUnit.SECONDS.sleep(1); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } continue; } else { throw t; @@ -241,4 +204,30 @@ public abstract class AbstractFeatureTest { } } } + + @SuppressWarnings("resource") + public static void copyFile(File from, File to) throws IOException { + if (!to.exists()) { + System.err.println("Creating new file for: "+ to); + to.createNewFile(); + } + FileChannel in = new FileInputStream(from).getChannel(); + FileChannel out = new FileOutputStream(to).getChannel(); + try { + long size = in.size(); + long position = 0; + while (position < size) { + position += in.transferTo(position, 8192, out); + } + } finally { + try { + in.close(); + out.force(true); + out.close(); + } catch (Exception e) { + // ignore + } + } + } + } diff --git a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/AbstractJmsFeatureTest.java b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/AbstractJmsFeatureTest.java deleted file mode 100644 index 5e98b41888..0000000000 --- a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/AbstractJmsFeatureTest.java +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.activemq.karaf.itest; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.nio.channels.FileChannel; -import javax.jms.Connection; -import javax.jms.MessageConsumer; -import javax.jms.Session; -import javax.jms.TextMessage; -import org.apache.activemq.ActiveMQConnectionFactory; - -public abstract class AbstractJmsFeatureTest extends AbstractFeatureTest { - - @SuppressWarnings("resource") - public static void copyFile(File from, File to) throws IOException { - if (!to.exists()) { - System.err.println("Creating new file for: "+ to); - to.createNewFile(); - } - FileChannel in = new FileInputStream(from).getChannel(); - FileChannel out = new FileOutputStream(to).getChannel(); - try { - long size = in.size(); - long position = 0; - while (position < size) { - position += in.transferTo(position, 8192, out); - } - } finally { - try { - in.close(); - out.force(true); - out.close(); - } catch (Exception e) { - // ignore - } - } - } - - protected String consumeMessage(String nameAndPayload) throws Throwable { - Connection connection = getConnection(); - Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); - MessageConsumer consumer = session.createConsumer(session.createQueue(nameAndPayload)); - TextMessage message = (TextMessage) consumer.receive(10000); - System.err.println("message: " + message); - connection.close(); - return message.getText(); - } - - protected void produceMessage(String nameAndPayload) throws Throwable{ - Connection connection = getConnection(); - Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); - session.createProducer(session.createQueue(nameAndPayload)).send(session.createTextMessage(nameAndPayload)); - connection.close(); - } - - protected Connection getConnection() throws Exception { - ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(); - Connection connection = factory.createConnection(AbstractFeatureTest.USER, AbstractFeatureTest.PASSWORD); - connection.start(); - return connection; - } -} \ No newline at end of file diff --git a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQAMQPBrokerFeatureTest.java b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQAMQPBrokerFeatureTest.java index 51e9946a52..7ab943a946 100644 --- a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQAMQPBrokerFeatureTest.java +++ b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQAMQPBrokerFeatureTest.java @@ -19,18 +19,11 @@ package org.apache.activemq.karaf.itest; import javax.jms.Connection; import org.apache.qpid.jms.JmsConnectionFactory; -import org.junit.Ignore; import org.junit.Test; -import org.junit.runner.RunWith; import org.ops4j.pax.exam.Configuration; import org.ops4j.pax.exam.Option; -import org.ops4j.pax.exam.junit.PaxExam; -import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy; -import org.ops4j.pax.exam.spi.reactors.PerClass; -@RunWith(PaxExam.class) -@ExamReactorStrategy(PerClass.class) -public class ActiveMQAMQPBrokerFeatureTest extends ActiveMQBrokerFeatureTest { +public class ActiveMQAMQPBrokerFeatureTest extends AbstractFeatureTest { private static final Integer AMQP_PORT = 61636; @Configuration @@ -42,28 +35,30 @@ public class ActiveMQAMQPBrokerFeatureTest extends ActiveMQBrokerFeatureTest { }; } - @Override - protected Connection getConnection() throws Exception { - withinReason(new Runnable() { - public void run() { - getBundle("org.apache.qpid.jms.client"); - } - }); - - String amqpURI = "amqp://localhost:" + AMQP_PORT; - JmsConnectionFactory factory = new JmsConnectionFactory(amqpURI); - factory.setUsername(AbstractFeatureTest.USER); - factory.setPassword(AbstractFeatureTest.PASSWORD); - Connection connection = factory.createConnection(); - - connection.start(); - return connection; - } - - @Override - @Ignore @Test(timeout = 5 * 60 * 1000) - public void testTemporaryDestinations() throws Throwable { - // ignore until we have temporary destination are working in amqp + public void testProduceConsume() throws Throwable { + JMSTester tester = new JMSTester(getQPIDConnection()); + tester.produceAndConsume(sessionFactory); + tester.close(); } + + protected Connection getQPIDConnection() throws Exception { + assertBrokerStarted(); + assertQpidClient(); + + JmsConnectionFactory factory = new JmsConnectionFactory("amqp://localhost:" + AMQP_PORT); + factory.setUsername(KarafShellHelper.USER); + factory.setPassword(KarafShellHelper.PASSWORD); + Connection connection = factory.createConnection(); + connection.start(); + return connection; + } + + private void assertQpidClient() throws Exception { + withinReason(new Runnable() { + public void run() { + getBundle("org.apache.qpid.jms.client"); + } + }); + } } diff --git a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerBlueprintTest.java b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerBlueprintTest.java index 8fb4e0fd06..0009fb58aa 100644 --- a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerBlueprintTest.java +++ b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerBlueprintTest.java @@ -20,9 +20,6 @@ import static org.ops4j.pax.exam.CoreOptions.composite; import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.replaceConfigurationFile; import java.io.File; -import java.util.concurrent.Callable; - -import javax.jms.Connection; import org.junit.Test; import org.junit.runner.RunWith; @@ -31,7 +28,7 @@ import org.ops4j.pax.exam.Option; import org.ops4j.pax.exam.junit.PaxExam; @RunWith(PaxExam.class) -public class ActiveMQBrokerBlueprintTest extends AbstractJmsFeatureTest { +public class ActiveMQBrokerBlueprintTest extends AbstractFeatureTest { @Configuration public Option[] configure() { @@ -39,24 +36,17 @@ public class ActiveMQBrokerBlueprintTest extends AbstractJmsFeatureTest { { composite(super.configure("activemq", "activemq-blueprint")), replaceConfigurationFile("deploy/activemq-blueprint.xml", - new File("src/test/resources/org/apache/activemq/karaf/itest/activemq-blueprint.xml")) + new File(RESOURCE_BASE + "activemq-blueprint.xml")) }; } @Test public void test() throws Throwable { - withinReason(new Callable() { - - @Override - public Boolean call() throws Exception { - Connection con; - try { - con = getConnection(); - } catch (Throwable e) { - throw new RuntimeException(e); - } - con.close(); - return true; + withinReason(() ->new Runnable() { + public void run() { + JMSTester jms = new JMSTester(); + jms.produceAndConsume(sessionFactory); + jms.close(); } }); } diff --git a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerFeatureTest.java b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerFeatureTest.java index f9c2b79a25..c8e9d71922 100644 --- a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerFeatureTest.java +++ b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerFeatureTest.java @@ -16,30 +16,40 @@ */ package org.apache.activemq.karaf.itest; +import static org.junit.Assert.assertEquals; +import static org.ops4j.pax.exam.CoreOptions.mavenBundle; + +import java.io.IOException; +import java.net.URI; +import java.util.concurrent.Callable; + +import org.apache.http.client.CredentialsProvider; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.impl.client.BasicCredentialsProvider; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.util.EntityUtils; import org.junit.Test; -import org.junit.runner.RunWith; -import org.ops4j.pax.exam.Option; import org.ops4j.pax.exam.Configuration; -import org.ops4j.pax.exam.junit.PaxExam; +import org.ops4j.pax.exam.Option; import org.ops4j.pax.exam.options.WrappedUrlProvisionOption; -import javax.jms.Connection; -import javax.jms.Message; -import javax.jms.Session; -import javax.jms.TemporaryQueue; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -@RunWith(PaxExam.class) -public class ActiveMQBrokerFeatureTest extends AbstractJmsFeatureTest { +public class ActiveMQBrokerFeatureTest extends AbstractFeatureTest { + static final String WEB_CONSOLE_URL = "http://localhost:8181/activemqweb/"; @Configuration public static Option[] configure() { return new Option[] // { - configure("activemq"), // + configure("connector", "activemq-broker"), // + // To access web console + //mavenBundle("commons-codec", "commons-codec").versionAsInProject(), + mavenBundle("org.apache.httpcomponents", "httpcore-osgi").version("4.4.4"), + mavenBundle("org.apache.httpcomponents", "httpclient-osgi").version("4.5.2"), configureBrokerStart() }; } @@ -50,38 +60,69 @@ public class ActiveMQBrokerFeatureTest extends AbstractJmsFeatureTest { @Test(timeout=5 * 60 * 1000) public void test() throws Throwable { - - withinReason(new Runnable() { - public void run() { - assertEquals("brokerName = amq-broker", executeCommand("activemq:list").trim()); - assertTrue(executeCommand("activemq:bstat").trim().contains("BrokerName = amq-broker")); - } - }); - - // produce and consume - final String nameAndPayload = String.valueOf(System.currentTimeMillis()); - produceMessage(nameAndPayload); - - executeCommand("activemq:bstat").trim(); - - withinReason(new Runnable() { - public void run() { - assertEquals("JMS_BODY_FIELD:JMSText = " + nameAndPayload, executeCommand("activemq:browse --amqurl tcp://localhost:61616 --user karaf --password karaf -Vbody " + nameAndPayload).trim()); - } - }); - - assertEquals("got our message", nameAndPayload, consumeMessage(nameAndPayload)); + assertBrokerStarted(); + JMSTester jms = new JMSTester(); + jms.produceAndConsume(sessionFactory); + jms.tempSendReceive(); + jms.close(); } - @Test(timeout = 5 * 60 * 1000) - public void testTemporaryDestinations() throws Throwable { - Connection connection = getConnection(); - Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); - TemporaryQueue temporaryQueue = session.createTemporaryQueue(); - session.createProducer(temporaryQueue).send(session.createTextMessage("TEST")); - Message msg = session.createConsumer(temporaryQueue).receive(3000); - assertNotNull("Didn't receive the message", msg); - connection.close(); + private void produceMessageWebConsole(String nameAndPayload) throws Exception { + CredentialsProvider credsProvider = new BasicCredentialsProvider(); + credsProvider.setCredentials( + new org.apache.http.auth.AuthScope("httpbin.org", 80), + new org.apache.http.auth.UsernamePasswordCredentials(KarafShellHelper.USER, KarafShellHelper.PASSWORD)); + CloseableHttpClient client = HttpClientBuilder.create() // + .setDefaultCredentialsProvider(credsProvider) + .build(); + + System.err.println(executeCommand("activemq:bstat").trim()); + System.err.println("attempting to access web console.."); + + withinReason(new Callable() { + public Boolean call() throws Exception { + CloseableHttpResponse response = client.execute(new HttpGet(WEB_CONSOLE_URL + "index.jsp")); + return response.getStatusLine().getStatusCode() != 200; + } + }); + + System.err.println("attempting publish via web console.."); + + // need to first get the secret + CloseableHttpResponse response = client.execute(new HttpGet(WEB_CONSOLE_URL + "send.jsp")); + int code = response.getStatusLine().getStatusCode(); + assertEquals("getting send succeeded", 200, code); + + String secret = getSecret(EntityUtils.toString(response.getEntity())); + + URI sendUri = new URIBuilder(WEB_CONSOLE_URL + "sendMessage.action") // + .addParameter("secret", secret) // + .addParameter("JMSText", nameAndPayload) + .addParameter("JMSDestination", nameAndPayload) + .addParameter("JMSDestinationType", "queue") + .build(); + HttpPost post = new HttpPost(sendUri); + CloseableHttpResponse sendResponse = client.execute(post); + assertEquals("post succeeded, " + post, 302, sendResponse.getStatusLine().getStatusCode()); + System.err.println(executeCommand("activemq:bstat").trim()); + } + + private String getSecret(String response) throws IOException { + final String secretMarker = "")); + return secret; + } + + @Test + public void testSendReceiveWeb() throws Throwable { + assertBrokerStarted(); + JMSTester jms = new JMSTester(); + final String nameAndPayload = String.valueOf(System.currentTimeMillis()); + produceMessageWebConsole(nameAndPayload); + assertEquals("got our message", nameAndPayload, jms.consumeMessage(nameAndPayload)); + jms.tempSendReceive(); + jms.close(); } } diff --git a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerNdCamelFeatureTest.java b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerNdCamelFeatureTest.java index 7a8b001f2a..8f8f603190 100644 --- a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerNdCamelFeatureTest.java +++ b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerNdCamelFeatureTest.java @@ -31,7 +31,7 @@ import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.editConfi import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.replaceConfigurationFile; @RunWith(PaxExam.class) -public class ActiveMQBrokerNdCamelFeatureTest extends AbstractJmsFeatureTest { +public class ActiveMQBrokerNdCamelFeatureTest extends AbstractFeatureTest { @Configuration public static Option[] configure() { @@ -48,18 +48,18 @@ public class ActiveMQBrokerNdCamelFeatureTest extends AbstractJmsFeatureTest { public void test() throws Throwable { System.err.println(executeCommand("feature:list -i").trim()); assertFeatureInstalled("activemq"); - + assertBrokerStarted(); withinReason(new Runnable() { public void run() { getBundle("org.apache.activemq.activemq-camel"); - assertEquals("brokerName = amq-broker", executeCommand("activemq:list").trim()); - assertTrue(executeCommand("activemq:bstat").trim().contains("BrokerName = amq-broker")); assertTrue("we have camel consumers", executeCommand("activemq:dstat").trim().contains("camel_in")); } }); // produce and consume - produceMessage("camel_in"); - assertEquals("got our message", "camel_in", consumeMessage("camel_out")); + JMSTester jms = new JMSTester(); + jms.produceMessage("camel_in"); + assertEquals("got our message", "camel_in", jms.consumeMessage("camel_out")); + jms.close(); } } diff --git a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerNdExternalCamelFeatureTest.java b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerNdExternalCamelFeatureTest.java index 9434f0b8f1..b948ecc565 100644 --- a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerNdExternalCamelFeatureTest.java +++ b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerNdExternalCamelFeatureTest.java @@ -31,7 +31,7 @@ import org.ops4j.pax.exam.Option; //@RunWith(PaxExam.class) @Ignore -public class ActiveMQBrokerNdExternalCamelFeatureTest extends AbstractJmsFeatureTest { +public class ActiveMQBrokerNdExternalCamelFeatureTest extends AbstractFeatureTest { @Configuration public static Option[] configure() { @@ -51,16 +51,13 @@ public class ActiveMQBrokerNdExternalCamelFeatureTest extends AbstractJmsFeature installAndAssertFeature("camel"); installAndAssertFeature("activemq-camel"); + assertBrokerStarted(); withinReason(new Runnable() { public void run() { - assertEquals("brokerName = amq-broker", executeCommand("activemq:list").trim()); - assertTrue(executeCommand("activemq:bstat").trim().contains("BrokerName = amq-broker")); getBundle("org.apache.activemq.activemq-camel"); } }); - System.err.println(executeCommand("activemq:bstat").trim()); - // hot deploy the camel.xml file by copying it to the deploy directory String karafDir = System.getProperty("karaf.base"); System.err.println("Karaf is running in dir: " + karafDir); @@ -76,8 +73,10 @@ public class ActiveMQBrokerNdExternalCamelFeatureTest extends AbstractJmsFeature }); // produce and consume - produceMessage("camel_in"); - assertEquals("got our message", "camel_in", consumeMessage("camel_out")); + JMSTester tester = new JMSTester(); + tester.produceMessage("camel_in"); + assertEquals("got our message", "camel_in", tester.consumeMessage("camel_out")); + tester.close(); } } diff --git a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerNdWebConsoleFeatureTest.java b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerNdWebConsoleFeatureTest.java deleted file mode 100644 index ef09bf8168..0000000000 --- a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerNdWebConsoleFeatureTest.java +++ /dev/null @@ -1,112 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.activemq.karaf.itest; - -import java.util.concurrent.TimeUnit; -import org.apache.commons.httpclient.HttpClient; -import org.apache.commons.httpclient.UsernamePasswordCredentials; -import org.apache.commons.httpclient.auth.AuthScope; -import org.apache.commons.httpclient.methods.GetMethod; -import org.apache.commons.httpclient.methods.PostMethod; -import org.junit.Ignore; -import org.junit.runner.RunWith; -import org.ops4j.pax.exam.CoreOptions; -import org.ops4j.pax.exam.Option; -import org.ops4j.pax.exam.Configuration; -import org.ops4j.pax.exam.junit.PaxExam; - -import static org.junit.Assert.assertEquals; - -@RunWith(PaxExam.class) -@Ignore("Can fail sometimes. Old web-console is also @deprecated") -public class ActiveMQBrokerNdWebConsoleFeatureTest extends ActiveMQBrokerFeatureTest { - - static final String WEB_CONSOLE_URL = "http://localhost:8181/activemqweb/"; - - @Configuration - public static Option[] configure() { - return new Option[] // - { - CoreOptions.mavenBundle("commons-codec", "commons-codec").versionAsInProject(), - CoreOptions.mavenBundle("commons-httpclient", "commons-httpclient").versionAsInProject(), - configure("activemq-broker") - }; - } - - @Override - protected void produceMessage(String nameAndPayload) throws Exception { - HttpClient client = new HttpClient(); - client.getHttpConnectionManager().getParams().setConnectionTimeout(30000); - - // set credentials - client.getState().setCredentials( - new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT), - new UsernamePasswordCredentials(USER, PASSWORD) - ); - - System.err.println(executeCommand("activemq:bstat").trim()); - System.err.println("attempting to access web console.."); - - GetMethod get = new GetMethod(WEB_CONSOLE_URL + "index.jsp"); - get.setDoAuthentication(true); - - // Give console some time to start - boolean done = false; - int loop = 0; - while (!done && loop < 30) { - loop++; - try { - int code = client.executeMethod(get); - if (code > 399 && code < 500) { - // code 4xx we should retry - System.err.println("web console not accessible yet - status code " + code); - TimeUnit.SECONDS.sleep(1); - } else { - done = true; - } - } catch (Exception ignored) {} - } - assertEquals("get succeeded on " + get, 200, get.getStatusCode()); - - System.err.println("attempting publish via web console.."); - - // need to first get the secret - get = new GetMethod(WEB_CONSOLE_URL + "send.jsp"); - get.setDoAuthentication(true); - - int code = client.executeMethod(get); - assertEquals("get succeeded on " + get, 200, code); - - String response = get.getResponseBodyAsString(); - final String secretMarker = "")); - - PostMethod post = new PostMethod(WEB_CONSOLE_URL + "sendMessage.action"); - post.setDoAuthentication(true); - post.addParameter("secret", secret); - - post.addParameter("JMSText", nameAndPayload); - post.addParameter("JMSDestination", nameAndPayload); - post.addParameter("JMSDestinationType", "queue"); - - // execute the send - assertEquals("post succeeded, " + post, 302, client.executeMethod(post)); - - System.err.println(executeCommand("activemq:bstat").trim()); - } -} diff --git a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerRuntimeConfigTest.java b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerRuntimeConfigTest.java index 2785d06ddd..d34bf4ea3f 100644 --- a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerRuntimeConfigTest.java +++ b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerRuntimeConfigTest.java @@ -16,7 +16,6 @@ */ package org.apache.activemq.karaf.itest; -import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.editConfigurationFilePut; import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.replaceConfigurationFile; @@ -32,29 +31,23 @@ import org.ops4j.pax.exam.Option; import org.ops4j.pax.exam.junit.PaxExam; @RunWith(PaxExam.class) -public class ActiveMQBrokerRuntimeConfigTest extends AbstractJmsFeatureTest { +public class ActiveMQBrokerRuntimeConfigTest extends AbstractFeatureTest { - @Configuration - public static Option[] configure() { - return new Option[] // - { - configure("activemq"), - editConfigurationFilePut("etc/org.apache.activemq.server-default.cfg", "config.check", "false"), - replaceConfigurationFile("data/tmp/modified-config.xml", - new File(RESOURCE_BASE + "activemq-runtime-config-mod.xml")), - configureBrokerStart("activemq-runtime-config") - }; - } + @Configuration + public static Option[] configure() { + return new Option[] // + { // + configure("activemq"), // + editConfigurationFilePut("etc/org.apache.activemq.server-default.cfg", "config.check", "false"), + replaceConfigurationFile("data/tmp/modified-config.xml", + new File(RESOURCE_BASE + "activemq-runtime-config-mod.xml")), + configureBrokerStart("activemq-runtime-config") }; + } @Test(timeout = 2 * 60 * 1000) public void test() throws Throwable { - - withinReason(new Runnable() { - public void run() { - assertEquals("brokerName = amq-broker", executeCommand("activemq:list").trim()); - assertTrue("3MB limit", executeCommand("activemq:query").trim().contains("MemoryLimit = 3145728")); - } - }); + assertBrokerStarted(); + assertMemoryLimit("3145728"); // ensure update will be reflected in OS fs modified window TimeUnit.SECONDS.sleep(4); @@ -66,11 +59,14 @@ public class ActiveMQBrokerRuntimeConfigTest extends AbstractJmsFeatureTest { copyFile(new File(karafDir + "/data/tmp/modified-config.xml"), target); System.err.println("new mod at: " + new Date(target.lastModified())); - withinReason(new Runnable() { + assertMemoryLimit("4194304"); + } + + private void assertMemoryLimit(String limit) throws Exception { + withinReason(new Runnable() { public void run() { - assertTrue("4MB limit", executeCommand("activemq:query").trim().contains("MemoryLimit = 4194304")); + assertTrue("3MB limit", executeCommand("activemq:query").trim().contains("MemoryLimit = "+ limit)); } }); - - } + } } diff --git a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQClientBundleTest.java b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQClientBundleTest.java index e5d2be9871..d9a5dac1a5 100644 --- a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQClientBundleTest.java +++ b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQClientBundleTest.java @@ -26,13 +26,13 @@ import org.ops4j.pax.exam.junit.PaxExam; @RunWith(PaxExam.class) public class ActiveMQClientBundleTest extends AbstractFeatureTest { - @Configuration - public static Option[] configure() { - return new Option[] // - { - configure("activemq-client") - }; - } + @Configuration + public static Option[] configure() { + return new Option[] // + { // + configure("activemq-client") // + }; + } @Test(timeout = 2 * 60 * 1000) public void test() throws Exception { diff --git a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQClientFactoryTest.java b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQClientFactoryTest.java index 06688ff140..5425a1566f 100644 --- a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQClientFactoryTest.java +++ b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQClientFactoryTest.java @@ -32,7 +32,7 @@ import org.ops4j.pax.exam.Option; import org.ops4j.pax.exam.junit.PaxExam; @RunWith(PaxExam.class) -public class ActiveMQClientFactoryTest extends AbstractJmsFeatureTest { +public class ActiveMQClientFactoryTest extends AbstractFeatureTest { @Inject ConnectionFactory connectionFactory; @@ -45,7 +45,7 @@ public class ActiveMQClientFactoryTest extends AbstractJmsFeatureTest { { composite(super.configure("activemq", "activemq-broker", "activemq-cf")), replaceConfigurationFile("etc/org.apache.activemq.cfg", - new File("src/test/resources/org/apache/activemq/karaf/itest/org.apache.activemq-local.cfg")) + new File(RESOURCE_BASE + "org.apache.activemq-local.cfg")) }; } diff --git a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/JMSTester.java b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/JMSTester.java new file mode 100644 index 0000000000..dcb5e16d13 --- /dev/null +++ b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/JMSTester.java @@ -0,0 +1,121 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.activemq.karaf.itest; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.io.Closeable; + +import javax.jms.Connection; +import javax.jms.JMSException; +import javax.jms.Message; +import javax.jms.MessageConsumer; +import javax.jms.Session; +import javax.jms.TemporaryQueue; +import javax.jms.TextMessage; + +import org.apache.activemq.ActiveMQConnectionFactory; +import org.apache.karaf.shell.api.console.SessionFactory; + +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +public class JMSTester implements Closeable { + + private Connection connection; + + public JMSTester(Connection connection) { + this.connection = connection; + } + + public JMSTester() { + try { + ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(); + connection = factory.createConnection(KarafShellHelper.USER, KarafShellHelper.PASSWORD); + connection.start(); + } catch (JMSException e) { + throw new RuntimeException(e); + } + } + + public String consumeMessage(String nameAndPayload) { + try { + Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); + MessageConsumer consumer = session.createConsumer(session.createQueue(nameAndPayload)); + TextMessage message = (TextMessage) consumer.receive(10000); + System.err.println("message: " + message); + return message.getText(); + } catch (JMSException e) { + throw new RuntimeException(e); + } + } + + public void produceMessage(String nameAndPayload) { + try { + Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); + session.createProducer(session.createQueue(nameAndPayload)).send(session.createTextMessage(nameAndPayload)); + } catch (JMSException e) { + throw new RuntimeException(e); + } + } + + public void produceAndConsume(SessionFactory sf) { + final String nameAndPayload = String.valueOf(System.currentTimeMillis()); + produceMessage(nameAndPayload); + + KarafShellHelper.executeCommand(sf, "activemq:bstat").trim(); + + AbstractFeatureTest.withinReason(new Runnable() { + public void run() { + assertEquals("JMS_BODY_FIELD:JMSText = " + nameAndPayload, KarafShellHelper.executeCommand(sf, "activemq:browse --amqurl tcp://localhost:61616 --user karaf --password karaf -Vbody " + nameAndPayload).trim()); + } + }); + + assertEquals("got our message", nameAndPayload, consumeMessage(nameAndPayload)); + } + + public void tempSendReceive() throws JMSException { + Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); + TemporaryQueue temporaryQueue = session.createTemporaryQueue(); + session.createProducer(temporaryQueue).send(session.createTextMessage("TEST")); + Message msg = session.createConsumer(temporaryQueue).receive(3000); + assertNotNull("Didn't receive the message", msg); + + } + + public void close() { + try { + connection.close(); + } catch (JMSException e) { + throw new RuntimeException(e); + } + } +} \ No newline at end of file diff --git a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/KarafShellHelper.java b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/KarafShellHelper.java new file mode 100644 index 0000000000..3df542fe09 --- /dev/null +++ b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/KarafShellHelper.java @@ -0,0 +1,92 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.activemq.karaf.itest; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.security.PrivilegedAction; +import java.util.concurrent.Callable; +import java.util.concurrent.Executors; +import java.util.concurrent.FutureTask; +import java.util.concurrent.TimeUnit; + +import javax.security.auth.Subject; + +import org.apache.karaf.jaas.boot.principal.RolePrincipal; +import org.apache.karaf.jaas.boot.principal.UserPrincipal; +import org.apache.karaf.shell.api.console.Session; +import org.apache.karaf.shell.api.console.SessionFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class KarafShellHelper { + public static final Logger LOG = LoggerFactory.getLogger(KarafShellHelper.class); + + public static final String USER = "karaf"; + public static final String PASSWORD = "karaf"; + public static final long COMMAND_TIMEOUT = 30000L; + + public static String executeCommand(SessionFactory sessionFactory, final String command, final Long timeout, final Boolean silent) { + String response; + final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + final PrintStream printStream = new PrintStream(byteArrayOutputStream); + final Session commandSession = sessionFactory.create(System.in, printStream, printStream); + commandSession.put("APPLICATION", System.getProperty("karaf.name", "root")); + commandSession.put("USER", USER); + FutureTask commandFuture = new FutureTask( + new Callable() { + @Override + public String call() { + + Subject subject = new Subject(); + subject.getPrincipals().add(new UserPrincipal("admin")); + subject.getPrincipals().add(new RolePrincipal("admin")); + subject.getPrincipals().add(new RolePrincipal("manager")); + subject.getPrincipals().add(new RolePrincipal("viewer")); + return Subject.doAs(subject, new PrivilegedAction() { + @Override + public String run() { + try { + if (!silent) { + System.out.println(command); + System.out.flush(); + } + commandSession.execute(command); + } catch (Exception e) { + e.printStackTrace(System.err); + } + printStream.flush(); + return byteArrayOutputStream.toString(); + } + }); + }}); + + try { + Executors.newSingleThreadExecutor().submit(commandFuture); + response = commandFuture.get(timeout, TimeUnit.MILLISECONDS); + } catch (Exception e) { + e.printStackTrace(System.err); + response = "SHELL COMMAND TIMED OUT: "; + } + LOG.info("Execute: " + command + " - Response:" + response); + return response; + } + + public static String executeCommand(SessionFactory sessionFactory, final String command) { + return executeCommand(sessionFactory, command, COMMAND_TIMEOUT, false); + } +} diff --git a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ObrFeatureTest.java b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ObrFeatureTest.java index dba2333451..2e8a1c5283 100644 --- a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ObrFeatureTest.java +++ b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ObrFeatureTest.java @@ -68,7 +68,7 @@ public class ObrFeatureTest extends AbstractFeatureTest { @Test(timeout = 5 * 60 * 1000) public void testClientWithSpring32() throws Throwable { - testWithSpringVersion("3.2.14.RELEASE_1"); + testWithSpringVersion("3.2.17.RELEASE_1"); } @Test(timeout = 5 * 60 * 1000) @@ -78,12 +78,12 @@ public class ObrFeatureTest extends AbstractFeatureTest { @Test(timeout = 5 * 60 * 1000) public void testClientWithSpring41() throws Throwable { - testWithSpringVersion("4.1.7.RELEASE_2"); + testWithSpringVersion("4.1.9.RELEASE_1"); } @Test(timeout = 5 * 60 * 1000) public void testClientWithSpring42() throws Throwable { - testWithSpringVersion("4.2.2.RELEASE_1"); + testWithSpringVersion("4.2.8.RELEASE_1"); } private void testWithSpringVersion(String version) throws Exception, Throwable { diff --git a/pom.xml b/pom.xml index d8a0de75e3..be66c5ce44 100644 --- a/pom.xml +++ b/pom.xml @@ -89,7 +89,7 @@ 4.12 1.3 2.0 - 4.0.3 + 4.0.8 0.9 0.9 1.8