ARTEMIS-521 - OSGi support - add unit test ARTEMIS-521 - OSGi support - move unit test to integration tests
Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/e994eda3 Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/e994eda3 Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/e994eda3 Branch: refs/heads/master Commit: e994eda356c677a979020c280acfeb4f65bf203b Parents: 6204aaa Author: Dejan Bosanac <[email protected]> Authored: Thu May 19 13:56:00 2016 +0200 Committer: jbertram <[email protected]> Committed: Thu May 19 11:53:31 2016 -0500 ---------------------------------------------------------------------- artemis-features/pom.xml | 1 + .../src/main/resources/features.xml | 16 +- docs/user-manual/en/karaf.md | 2 +- pom.xml | 35 ++- tests/integration-tests/pom.xml | 55 ++++- .../integration/karaf/ArtemisFeatureTest.java | 242 +++++++++++++++++++ 6 files changed, 328 insertions(+), 23 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/e994eda3/artemis-features/pom.xml ---------------------------------------------------------------------- diff --git a/artemis-features/pom.xml b/artemis-features/pom.xml index ea07a24..805beb1 100644 --- a/artemis-features/pom.xml +++ b/artemis-features/pom.xml @@ -67,6 +67,7 @@ <artifact> <file>target/classes/features.xml</file> <type>xml</type> + <classifier>features</classifier> </artifact> <artifact> <file>target/classes/artemis.xml</file> http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/e994eda3/artemis-features/src/main/resources/features.xml ---------------------------------------------------------------------- diff --git a/artemis-features/src/main/resources/features.xml b/artemis-features/src/main/resources/features.xml index 82d4cfc..0a88f80 100644 --- a/artemis-features/src/main/resources/features.xml +++ b/artemis-features/src/main/resources/features.xml @@ -43,23 +43,23 @@ <configfile finalname="etc/artemis.xml">mvn:org.apache.activemq/artemis-features/${pom.version}/xml/artemis</configfile> <bundle>mvn:org.apache.geronimo.specs/geronimo-jms_2.0_spec/${geronimo.jms.2.spec.version}</bundle> - <bundle>mvn:com.google.guava/guava/18.0</bundle> + <bundle>mvn:com.google.guava/guava/${guava.version}</bundle> <bundle>mvn:io.netty/netty-codec-http/${netty.version}</bundle> - <bundle>mvn:commons-beanutils/commons-beanutils/1.9.2</bundle> - <bundle>mvn:commons-collections/commons-collections/3.2.2</bundle> + <bundle>mvn:commons-beanutils/commons-beanutils/${commons.beanutils.version}</bundle> + <bundle>mvn:commons-collections/commons-collections/${commons.collections.version}</bundle> - <bundle>mvn:org.jboss.logging/jboss-logging/3.3.0.Final</bundle> - <bundle>mvn:org.jgroups/jgroups/3.6.0.Final</bundle> + <bundle>mvn:org.jboss.logging/jboss-logging/${jboss.logging.version}</bundle> + <bundle>mvn:org.jgroups/jgroups/${jgroups.version}</bundle> <bundle>mvn:org.apache.activemq/artemis-native/${pom.version}</bundle> <bundle>mvn:org.apache.activemq/artemis-server-osgi/${pom.version}</bundle> </feature> <feature name="artemis-amqp" version="${pom.version}"> + <feature prerequisite="true">wrap</feature> <feature>artemis-core</feature> - <bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.qpid/0.32_1</bundle> - <bundle>wrap:mvn:org.apache.qpid/proton-j/0.10</bundle> - <bundle>wrap:mvn:org.apache.qpid/proton-jms/0.10</bundle> + <bundle>wrap:mvn:org.apache.qpid/proton-j/${proton.version}</bundle> + <bundle>wrap:mvn:org.apache.qpid/qpid-jms-client/${qpid.jms.version}</bundle> <bundle>mvn:org.apache.activemq/artemis-proton-plug/${pom.version}</bundle> <bundle>mvn:org.apache.activemq/artemis-amqp-protocol/${pom.version}</bundle> </feature> http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/e994eda3/docs/user-manual/en/karaf.md ---------------------------------------------------------------------- diff --git a/docs/user-manual/en/karaf.md b/docs/user-manual/en/karaf.md index 5da4ac7..2b6e8a6 100644 --- a/docs/user-manual/en/karaf.md +++ b/docs/user-manual/en/karaf.md @@ -2,6 +2,6 @@ Apache ActiveMQ Artemis can be installed on Apache Karaf (4.x or later) using the following commands from the Karaf shell: - feature:repo-add mvn:org.apache.activemq/artemis-features/1.3.0-SNAPSHOT/xml + feature:repo-add mvn:org.apache.activemq/artemis-features/1.3.0-SNAPSHOT/xml/features feature:install artemis http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/e994eda3/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index ed33038..eef50be 100644 --- a/pom.xml +++ b/pom.xml @@ -68,10 +68,23 @@ <properties> <!-- base url for site deployment. See distribution management for full url. Override this in settings.xml for staging --> <staging.siteURL>scp://people.apache.org/x1/www/activemq.apache.org</staging.siteURL> - <netty.version>4.0.32.Final</netty.version> + + <activemq5-version>5.12.0</activemq5-version> + <apache.derby.version>10.11.1.1</apache.derby.version> + <commons.beanutils.version>1.9.2</commons.beanutils.version> + <commons.collections.version>3.2.2</commons.collections.version> + <fuse.mqtt.client.version>1.10</fuse.mqtt.client.version> + <guava.version>18.0</guava.version> + <jboss.logging.version>3.3.0.Final</jboss.logging.version> <jetty.version>9.2.11.v20150529</jetty.version> - <slf4j.version>1.7.12</slf4j.version> + <jgroups.version>3.6.8.Final</jgroups.version> <maven.assembly.plugin.version>2.4</maven.assembly.plugin.version> + <netty.version>4.0.32.Final</netty.version> + <proton.version>0.12.1</proton.version> + <resteasy.version>3.0.16.Final</resteasy.version> + <slf4j.version>1.7.12</slf4j.version> + <qpid.jms.version>0.9.0</qpid.jms.version> + <activemq.version.versionName>${project.version}</activemq.version.versionName> <activemq.version.majorVersion>1</activemq.version.majorVersion> <activemq.version.minorVersion>0</activemq.version.minorVersion> @@ -81,11 +94,7 @@ <ActiveMQ-Version> ${project.version}(${activemq.version.incrementingVersion}) </ActiveMQ-Version> - <resteasy.version>3.0.16.Final</resteasy.version> - <proton.version>0.12.0</proton.version> - <activemq5-version>5.12.0</activemq5-version> - <fuse.mqtt.client.version>1.10</fuse.mqtt.client.version> - <apache.derby.version>10.11.1.1</apache.derby.version> + <skipUnitTests>true</skipUnitTests> <skipJmsTests>true</skipJmsTests> <skipExtraTests>true</skipExtraTests> @@ -223,7 +232,7 @@ <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections-testframework</artifactId> - <version>3.2.2</version> + <version>${commons.collections.version}</version> <!-- License: Apache 2.0 --> </dependency> <!-- ## End Test Dependencies ## --> @@ -295,13 +304,13 @@ <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> - <version>18.0</version> + <version>${guava.version}</version> <!-- License: Apache 2.0 --> </dependency> <dependency> <groupId>org.jboss.logging</groupId> <artifactId>jboss-logging</artifactId> - <version>3.3.0.Final</version> + <version>${jboss.logging.version}</version> <!-- License: Apache 2.0 --> </dependency> <dependency> @@ -326,7 +335,7 @@ <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> - <version>3.2.2</version> + <version>${commons.collections.version}</version> <!-- License: Apache 2.0 --> </dependency> @@ -379,7 +388,7 @@ <dependency> <groupId>org.jgroups</groupId> <artifactId>jgroups</artifactId> - <version>3.6.8.Final</version> + <version>${jgroups.version}</version> <!-- License: Apache 2.0 --> </dependency> <dependency> @@ -527,7 +536,7 @@ <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> - <version>1.9.2</version> + <version>${commons.beanutils.version}</version> <!-- License: Apache 2.0 --> </dependency> http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/e994eda3/tests/integration-tests/pom.xml ---------------------------------------------------------------------- diff --git a/tests/integration-tests/pom.xml b/tests/integration-tests/pom.xml index 38ac4c2..e3106fc 100644 --- a/tests/integration-tests/pom.xml +++ b/tests/integration-tests/pom.xml @@ -28,6 +28,8 @@ <properties> <activemq.basedir>${project.basedir}/../..</activemq.basedir> + <karaf.version>4.0.3</karaf.version> + <pax.exam.version>4.7.0</pax.exam.version> <vertx.version>2.1.2</vertx.version> <vertx.testtools.version>2.0.3-final</vertx.testtools.version> </properties> @@ -143,6 +145,12 @@ <artifactId>artemis-hornetq-protocol</artifactId> <version>${project.version}</version> </dependency> + <dependency> + <groupId>org.apache.activemq</groupId> + <artifactId>artemis-features</artifactId> + <version>${project.version}</version> + <type>pom</type> + </dependency> <!-- MQTT Deps --> <dependency> @@ -194,7 +202,7 @@ <dependency> <groupId>org.apache.qpid</groupId> <artifactId>qpid-jms-client</artifactId> - <version>0.7.0</version> + <version>${qpid.jms.version}</version> </dependency> <dependency> <groupId>org.apache.qpid</groupId> @@ -285,6 +293,38 @@ </exclusion> </exclusions> </dependency> + + <!-- karaf test --> + + <dependency> + <groupId>org.ops4j.pax.exam</groupId> + <artifactId>pax-exam-container-karaf</artifactId> + <version>${pax.exam.version}</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.ops4j.pax.exam</groupId> + <artifactId>pax-exam-junit4</artifactId> + <version>${pax.exam.version}</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.apache.geronimo.specs</groupId> + <artifactId>geronimo-atinject_1.0_spec</artifactId> + <version>1.0</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.apache.karaf</groupId> + <artifactId>apache-karaf</artifactId> + <version>${karaf.version}</version> + <type>tar.gz</type> + </dependency> + <dependency> + <groupId>org.apache.karaf.shell</groupId> + <artifactId>org.apache.karaf.shell.console</artifactId> + <version>${karaf.version}</version> + </dependency> </dependencies> <build> @@ -319,6 +359,19 @@ <argLine>-Djgroups.bind_addr=::1 ${activemq-surefire-argline}</argLine> </configuration> </plugin> + <plugin> + <groupId>org.apache.servicemix.tooling</groupId> + <artifactId>depends-maven-plugin</artifactId> + <version>1.2</version> + <executions> + <execution> + <id>generate-depends-file</id> + <goals> + <goal>generate-depends-file</goal> + </goals> + </execution> + </executions> + </plugin> </plugins> </build> http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/e994eda3/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/ArtemisFeatureTest.java ---------------------------------------------------------------------- diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/ArtemisFeatureTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/ArtemisFeatureTest.java new file mode 100644 index 0000000..e7594cc --- /dev/null +++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/ArtemisFeatureTest.java @@ -0,0 +1,242 @@ +/** + * 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.artemis.tests.integration.karaf; + +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.apache.log4j.Logger; +import org.apache.qpid.jms.JmsConnectionFactory; +import org.junit.Assert; +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.ProbeBuilder; +import org.ops4j.pax.exam.TestProbeBuilder; +import org.ops4j.pax.exam.junit.PaxExam; +import org.ops4j.pax.exam.karaf.options.KarafDistributionOption; +import org.ops4j.pax.exam.karaf.options.LogLevelOption; +import org.ops4j.pax.exam.options.UrlReference; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.Constants; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.util.tracker.ServiceTracker; + +import javax.inject.Inject; +import javax.security.auth.Subject; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.PrintStream; +import java.security.PrivilegedAction; +import java.util.ArrayList; +import java.util.Arrays; +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 static org.ops4j.pax.exam.CoreOptions.maven; +import static org.ops4j.pax.exam.CoreOptions.mavenBundle; +import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.editConfigurationFilePut; +import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.features; +import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.karafDistributionConfiguration; +import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.logLevel; + +@RunWith(PaxExam.class) +public class ArtemisFeatureTest extends Assert { + + private static Logger LOG = Logger.getLogger(ArtemisFeatureTest.class.getName()); + + @Inject + BundleContext bundleContext; + + @Inject + SessionFactory sessionFactory; + + ExecutorService executor = Executors.newCachedThreadPool(); + + 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"; + + @ProbeBuilder + public TestProbeBuilder probeConfiguration(TestProbeBuilder probe) { + probe.setHeader(Constants.DYNAMICIMPORT_PACKAGE, "*,org.ops4j.pax.exam.options.*,org.apache.felix.service.*;status=provisional"); + return probe; + } + + @Configuration + public static Option[] configure() { + return configure("artemis"); + } + + public static Option[] configure(String... features) { + + ArrayList<String> f = new ArrayList<String>(); + f.addAll(Arrays.asList(features)); + + Option[] options = + new Option[]{ + karafDistributionConfiguration().frameworkUrl( + maven().groupId("org.apache.karaf").artifactId("apache-karaf").type("tar.gz").versionAsInProject()) + .unpackDirectory(new File("target/paxexam/unpack/")), + + KarafDistributionOption.keepRuntimeFolder(), + logLevel(LogLevelOption.LogLevel.INFO), + editConfigurationFilePut("etc/config.properties", "karaf.startlevel.bundle", "50"), + //debugConfiguration("5005", true), + features(getArtemisMQKarafFeatureUrl(), f.toArray(new String[f.size()]))}; + + return options; + } + + public static UrlReference getArtemisMQKarafFeatureUrl() { + String type = "xml/features"; + UrlReference urlReference = mavenBundle().groupId("org.apache.activemq"). + artifactId("artemis-features").versionAsInProject().type(type); + LOG.info("FeatureURL: " + urlReference.getURL()); + return urlReference; + } + + @Test(timeout = 5 * 60 * 1000) + public void test() throws Throwable { + executeCommand("bundle:list"); + + withinReason(new Callable<Boolean>() { + @Override + public Boolean call() throws Exception { + assertTrue("artemis bundle installed", verifyBundleInstalled("artemis-server-osgi")); + return true; + } + }); + + Object service = waitForService("(objectClass=org.apache.activemq.artemis.core.server.ActiveMQServer)", 30000); + assertNotNull(service); + LOG.info("have service " + service); + + executeCommand("service:list -n"); + + String amqpURI = "amqp://localhost:5672"; + JmsConnectionFactory factory = new JmsConnectionFactory(amqpURI); + factory.setUsername(USER); + factory.setPassword(PASSWORD); + + //TODO fix security settings and test sending/receiving messages + /* + Connection connection = factory.createConnection(); + connection.start();*/ + } + + protected 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<String> commandFuture = new FutureTask<String>( + new Callable<String>() { + @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<String>() { + @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); + } + + protected boolean withinReason(Callable<Boolean> callable) throws Throwable { + long max = System.currentTimeMillis() + ASSERTION_TIMEOUT; + while (true) { + try { + return callable.call(); + } + catch (Throwable t) { + if (System.currentTimeMillis() < max) { + TimeUnit.SECONDS.sleep(1); + continue; + } + else { + throw t; + } + } + } + } + + public boolean verifyBundleInstalled(final String bundleName) throws Exception { + boolean found = false; + for (Bundle bundle : bundleContext.getBundles()) { + LOG.debug("Checking: " + bundle.getSymbolicName()); + if (bundle.getSymbolicName().contains(bundleName)) { + found = true; + break; + } + } + return found; + } + + protected Object waitForService(String filter, long timeout) throws InvalidSyntaxException, InterruptedException { + ServiceTracker<Object, Object> st = new ServiceTracker<Object, Object>(bundleContext, bundleContext.createFilter(filter), null); + try { + st.open(); + return st.waitForService(timeout); + } + finally { + st.close(); + } + } +}
