keycloak-aplcache

Adapter tests for Karaf: Fuse Example installation now done

11/6/2015 10:03:42 AM

Details

diff --git a/testsuite/integration-arquillian/tests/adapters/karaf/pom.xml b/testsuite/integration-arquillian/tests/adapters/karaf/pom.xml
index fc29132..55ad00c 100644
--- a/testsuite/integration-arquillian/tests/adapters/karaf/pom.xml
+++ b/testsuite/integration-arquillian/tests/adapters/karaf/pom.xml
@@ -13,7 +13,8 @@
     
     <properties>
         <karaf.version>3.0.3</karaf.version>
-        <karaf.home>${project.build.directory}/assembly</karaf.home>
+        <karaf.home>${containers.home}/apache-karaf-minimal-${karaf.version}</karaf.home>
+        <!--<karaf.home>${project.build.directory}/assembly</karaf.home>-->
                 
         <!--fuse examples expect auth server on 8080-->
         <auth.server.port.offset>0</auth.server.port.offset>
@@ -25,82 +26,57 @@
     </properties>
 
     <dependencies>
-        <!-- for karaf-maven-plugin -->
+
         <dependency>
-            <groupId>org.apache.karaf.features</groupId>
-            <artifactId>framework</artifactId>
+            <groupId>org.apache.karaf</groupId>
+            <artifactId>apache-karaf-minimal</artifactId>
             <version>${karaf.version}</version>
-            <type>kar</type>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.camel.karaf</groupId>
-            <artifactId>apache-camel</artifactId>
-            <version>2.12.5</version>
-            <classifier>features</classifier>
-            <type>xml</type>
-            <scope>runtime</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.cxf.karaf</groupId>
-            <artifactId>apache-cxf</artifactId>
-            <version>2.7.14</version>
-            <classifier>features</classifier>
-            <type>xml</type>
-            <scope>runtime</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.keycloak</groupId>
-            <artifactId>keycloak-osgi-features</artifactId>
-            <version>${project.version}</version>
-            <classifier>features</classifier>
-            <type>xml</type>
-            <scope>runtime</scope>
+            <type>zip</type>
         </dependency>
-        <dependency>
-            <groupId>org.keycloak.example.demo</groupId>
-            <artifactId>keycloak-fuse-example-features</artifactId>
-            <version>${project.version}</version>
-            <classifier>features</classifier>
-            <type>xml</type>
-            <scope>runtime</scope>
-        </dependency>
-        <!-- for arquillian -->
+
         <dependency>
             <groupId>org.jboss.arquillian.container</groupId>
             <artifactId>arquillian-container-karaf-managed</artifactId>
             <version>2.1.0.CR18</version>
         </dependency>
+        
         <dependency>
             <groupId>org.apache.aries.jmx</groupId>
             <artifactId>org.apache.aries.jmx</artifactId>
             <version>1.1.1</version>
         </dependency>
+        
     </dependencies>
     
     <build>
         <plugins>
+            
             <plugin>
-                <groupId>org.apache.karaf.tooling</groupId>
-                <artifactId>karaf-maven-plugin</artifactId>
-                <version>${karaf.version}</version>
-                <extensions>true</extensions>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
                 <executions>
                     <execution>
-                        <id>prepare-karaf-with-examples</id>
-                        <phase>generate-test-resources</phase>
+                        <id>unpack-karaf</id>
+                        <phase>generate-resources</phase>
                         <goals>
-                            <!-- creates custom karaf distro in ${project.build.directory}/assembly -->
-                            <goal>install-kars</goal>
+                            <goal>unpack</goal>
                         </goals>
+                        <configuration>
+                            <artifactItems>
+                                <artifactItem>
+                                    <groupId>org.apache.karaf</groupId>
+                                    <artifactId>apache-karaf-minimal</artifactId>
+                                    <version>${karaf.version}</version>
+                                    <type>zip</type>
+                                    <outputDirectory>${containers.home}</outputDirectory>
+                                </artifactItem>
+                            </artifactItems>
+                            <overWriteIfNewer>true</overWriteIfNewer>
+                        </configuration>
                     </execution>
                 </executions>
-                <configuration>
-                    <bootFeatures>
-                        <!-- this installs all fuse examples -->
-                        <feature>keycloak-fuse-example</feature>
-                    </bootFeatures>
-                </configuration>
             </plugin>
+
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-surefire-plugin</artifactId>
diff --git a/testsuite/integration-arquillian/tests/adapters/karaf/src/main/xslt/arquillian.xsl b/testsuite/integration-arquillian/tests/adapters/karaf/src/main/xslt/arquillian.xsl
index fabd47b..b6aa589 100644
--- a/testsuite/integration-arquillian/tests/adapters/karaf/src/main/xslt/arquillian.xsl
+++ b/testsuite/integration-arquillian/tests/adapters/karaf/src/main/xslt/arquillian.xsl
@@ -14,13 +14,24 @@
             <container qualifier="app-server-karaf" mode="manual" >
                 <configuration>
                     <property name="enabled">${app.server.karaf}</property>
-                    <property name="adapterImplClass">org.jboss.arquillian.container.osgi.karaf.managed.KarafManagedDeployableContainer</property>
+                    <!--<property name="adapterImplClass">org.jboss.arquillian.container.osgi.karaf.managed.KarafManagedDeployableContainer</property>-->
+                    <property name="adapterImplClass">org.keycloak.testsuite.arquillian.karaf.CustomKarafContainer</property>
                     <property name="autostartBundle">false</property>
                     <property name="karafHome">${karaf.home}</property>
                     <property name="javaVmArguments">-agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n ${adapter.test.props}</property>
                     <property name="jmxServiceURL">service:jmx:rmi://127.0.0.1:44444/jndi/rmi://127.0.0.1:1099/karaf-root</property>
                     <property name="jmxUsername">karaf</property>
-                    <property name="jmxPassword">karaf</property>            
+                    <property name="jmxPassword">karaf</property>          
+                   
+                    <!-- The following commands are performed by the CustomKarafContainer -->
+                    <property name="commandsAfterStart">
+                        feature:repo-add mvn:org.apache.camel.karaf/apache-camel/2.15.1/xml/features,
+                        feature:repo-add mvn:org.apache.cxf.karaf/apache-cxf/3.0.4/xml/features,
+                        feature:repo-add mvn:org.keycloak/keycloak-osgi-features/1.7.0.Final-SNAPSHOT/xml/features,
+                        feature:repo-add mvn:org.keycloak.example.demo/keycloak-fuse-example-features/1.7.0.Final-SNAPSHOT/xml/features,
+                        feature:install keycloak-fuse-example
+                    </property>
+                          
                 </configuration>
             </container>
     
diff --git a/testsuite/integration-arquillian/tests/adapters/karaf/src/main/xslt/arquillian-fuse.xsl b/testsuite/integration-arquillian/tests/adapters/karaf/src/main/xslt/arquillian-fuse.xsl
new file mode 100644
index 0000000..75aea2a
--- /dev/null
+++ b/testsuite/integration-arquillian/tests/adapters/karaf/src/main/xslt/arquillian-fuse.xsl
@@ -0,0 +1,45 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:xalan="http://xml.apache.org/xalan"
+                xmlns:a="http://jboss.org/schema/arquillian"
+                version="2.0"
+                exclude-result-prefixes="xalan a">
+
+    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" xalan:indent-amount="4" standalone="no"/>
+    <xsl:strip-space elements="*"/>
+
+    <xsl:template match="/a:arquillian">
+        <xsl:copy>
+            <xsl:apply-templates select="node()|@*"/>
+            
+            <container qualifier="app-server-karaf" mode="manual" >
+                <configuration>
+                    <property name="enabled">${app.server.karaf}</property>
+                    <property name="adapterImplClass">org.keycloak.testsuite.arquillian.karaf.CustomKarafContainer</property>
+                    <property name="autostartBundle">false</property>
+                    <property name="karafHome">${karaf.home}</property>
+                    <property name="javaVmArguments">-agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n ${adapter.test.props}</property>
+                    <property name="jmxServiceURL">service:jmx:rmi://127.0.0.1:44444/jndi/rmi://127.0.0.1:1099/karaf-root</property>
+                    <property name="jmxUsername">admin</property>
+                    <property name="jmxPassword">admin</property>          
+                    
+                    <property name="commandsAfterStart">
+                        features:addurl mvn:org.keycloak/keycloak-osgi-features/1.7.0.Final-SNAPSHOT/xml/features,
+                        features:addurl mvn:org.keycloak.example.demo/keycloak-fuse-example-features/1.7.0.Final-SNAPSHOT/xml/features,
+                        features:install keycloak-fuse-example
+                    </property>
+                    
+                </configuration>
+            </container>
+    
+        </xsl:copy>
+    </xsl:template>
+    
+
+    <xsl:template match="@*|node()">
+        <xsl:copy>
+            <xsl:apply-templates select="@*|node()" />
+        </xsl:copy>
+    </xsl:template>
+    
+
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/testsuite/integration-arquillian/tests/base/pom.xml b/testsuite/integration-arquillian/tests/base/pom.xml
index 6317df8..41038cd 100644
--- a/testsuite/integration-arquillian/tests/base/pom.xml
+++ b/testsuite/integration-arquillian/tests/base/pom.xml
@@ -16,6 +16,14 @@
         <exclude.account>-</exclude.account>
     </properties>
 
+    <dependencies>
+        <dependency>
+            <groupId>org.jboss.arquillian.container</groupId>
+            <artifactId>arquillian-container-karaf-managed</artifactId>
+            <version>2.1.0.CR18</version>
+        </dependency>
+    </dependencies>
+
     <build>
         <plugins>
             <plugin>
diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/ContainersTestEnricher.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/ContainersTestEnricher.java
index 6727108..9b68c43 100644
--- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/ContainersTestEnricher.java
+++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/ContainersTestEnricher.java
@@ -123,7 +123,8 @@ public class ContainersTestEnricher {
      */
     private void checkServerLog() throws IOException {
         Container container = containers.removeFirst();
-        if (!container.getName().equals("auth-server-undertow")) {
+        if (container.getName().equals("auth-server-wildfly")
+                || container.getName().matches("auth-server-eap.")) {
             String jbossHomePath = container.getContainerConfiguration().getContainerProperties().get("jbossHome");
             log.debug("jbossHome: " + jbossHomePath + "\n");
 
@@ -133,8 +134,8 @@ public class ContainersTestEnricher {
                     = serverLogContent.contains("ERROR")
                     || serverLogContent.contains("SEVERE")
                     || serverLogContent.contains("Exception ");
-                    //There is expected string "Exception" in server log: Adding provider 
-                    //singleton org.keycloak.services.resources.ModelExceptionMapper
+            //There is expected string "Exception" in server log: Adding provider 
+            //singleton org.keycloak.services.resources.ModelExceptionMapper
 
             if (containsError) {
                 throw new RuntimeException(container.getName() + ": Server log contains ERROR.");
diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/karaf/CustomKarafContainer.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/karaf/CustomKarafContainer.java
new file mode 100644
index 0000000..fb90f83
--- /dev/null
+++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/karaf/CustomKarafContainer.java
@@ -0,0 +1,105 @@
+package org.keycloak.testsuite.arquillian.karaf;
+
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanServerConnection;
+import javax.management.ObjectName;
+import org.jboss.arquillian.container.osgi.jmx.ObjectNameFactory;
+import org.jboss.arquillian.container.osgi.karaf.managed.KarafManagedDeployableContainer;
+import org.jboss.arquillian.container.spi.client.container.LifecycleException;
+import org.jboss.logging.Logger;
+
+/**
+ *
+ * @author tkyjovsk
+ */
+public class CustomKarafContainer extends KarafManagedDeployableContainer<CustomKarafContainerConfiguration> {
+
+    protected final Logger log = Logger.getLogger(this.getClass());
+
+    private CustomKarafContainerConfiguration config;
+
+    protected MBeanServerConnection mbeanServer = null;
+    protected ObjectName feature;
+
+    @Override
+    public void start() throws LifecycleException {
+        super.start();
+        executePostStartCommands();
+    }
+
+    @Override
+    public void setup(CustomKarafContainerConfiguration config) {
+        super.setup(config);
+        this.config = config;
+    }
+
+    @Override
+    public Class<CustomKarafContainerConfiguration> getConfigurationClass() {
+        return CustomKarafContainerConfiguration.class;
+    }
+
+    protected void executePostStartCommands() throws LifecycleException {
+        try {
+            mbeanServer = getMBeanServerConnection(500, TimeUnit.MILLISECONDS);
+        } catch (TimeoutException ex) {
+            throw new LifecycleException("JMX connection timed out.");
+        }
+
+        try {
+
+            feature = ObjectNameFactory.create("org.apache.karaf:type=feature,name=root");
+            try {
+                mbeanServer.getObjectInstance(feature);
+            } catch (InstanceNotFoundException infe) {
+                try {
+                    feature = ObjectNameFactory.create("org.apache.karaf:type=features,name=root");
+                    mbeanServer.getObjectInstance(feature);
+                } catch (InstanceNotFoundException infe2) {
+                    throw new RuntimeException("Feature MBean not found on server.");
+                }
+            }
+
+            featureMBean = getMBeanProxy(mbeanServer, feature, FeatureMBean.class, 30, TimeUnit.SECONDS);
+
+            log.info("Executing karaf after-start commands");
+            for (String command : config.getCommandsAfterStartAsArray()) {
+                String cmd = command.trim().split(" ")[0].trim();
+                String param = command.trim().split(" ")[1].trim();
+                log.info(String.format("command: %s, param: %s", cmd, param));
+                if (cmd.equals("feature:repo-add") || cmd.equals("features:addurl")) {
+                    featureMBean.addRepository(param);
+                } else if (cmd.equals("feature:repo-remove") || cmd.equals("features:removeurl")) {
+                    featureMBean.removeRepository(param);
+                } else if (cmd.equals("feature:install") || cmd.equals("features:install")) {
+                    featureMBean.installFeature(param);
+                } else if (cmd.equals("feature:uninstall") || cmd.equals("features:uninstall")) {
+                    featureMBean.uninstallFeature(param);
+                } else {
+                    throw new RuntimeException(String.format("Unsupported command: '%s'. "
+                            + "Supported commands on Karaf: 'feature:repo-add', 'feature:install'\n"
+                            + "Supported commands on Fuse: 'features:addurl', 'features:install'", cmd));
+                }
+            }
+        } catch (IOException | RuntimeException | TimeoutException ex) {
+            stop();
+            throw new LifecycleException("Error when executing karaf post-start commands.", ex);
+        }
+    }
+
+    FeatureMBean featureMBean;
+
+    public interface FeatureMBean {
+
+        public void addRepository(String repository);
+
+        public void removeRepository(String repository);
+
+        public void installFeature(String feature);
+
+        public void uninstallFeature(String feature);
+    }
+
+}
diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/karaf/CustomKarafContainerConfiguration.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/karaf/CustomKarafContainerConfiguration.java
new file mode 100644
index 0000000..05d063c
--- /dev/null
+++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/karaf/CustomKarafContainerConfiguration.java
@@ -0,0 +1,25 @@
+package org.keycloak.testsuite.arquillian.karaf;
+
+import org.jboss.arquillian.container.osgi.karaf.managed.KarafManagedContainerConfiguration;
+
+/**
+ *
+ * @author tkyjovsk
+ */
+public class CustomKarafContainerConfiguration extends KarafManagedContainerConfiguration {
+
+    private String commandsAfterStart;
+
+    public String getCommandsAfterStart() {
+        return commandsAfterStart;
+    }
+
+    public String[] getCommandsAfterStartAsArray() {
+        return getCommandsAfterStart().trim().split(",");
+    }
+
+    public void setCommandsAfterStart(String commandsAfterStart) {
+        this.commandsAfterStart = commandsAfterStart;
+    }
+
+}
diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/KeycloakArquillianExtension.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/KeycloakArquillianExtension.java
index a987a16..969f8fc 100644
--- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/KeycloakArquillianExtension.java
+++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/KeycloakArquillianExtension.java
@@ -10,6 +10,7 @@ import org.jboss.arquillian.graphene.location.CustomizableURLResourceProvider;
 import org.jboss.arquillian.test.spi.enricher.resource.ResourceProvider;
 import org.jboss.arquillian.test.spi.execution.TestExecutionDecider;
 import org.keycloak.testsuite.arquillian.jira.JiraTestExecutionDecider;
+import org.keycloak.testsuite.arquillian.karaf.CustomKarafContainer;
 import org.keycloak.testsuite.arquillian.migration.MigrationTestExecutionDecider;
 import org.keycloak.testsuite.arquillian.undertow.CustomUndertowContainer;
 
@@ -34,7 +35,8 @@ public class KeycloakArquillianExtension implements LoadableExtension {
                 .observer(ContainersTestEnricher.class);
 
         builder
-                .service(DeployableContainer.class, CustomUndertowContainer.class);
+                .service(DeployableContainer.class, CustomUndertowContainer.class)
+                .service(DeployableContainer.class, CustomKarafContainer.class);
 
         builder
                 .service(TestExecutionDecider.class, JiraTestExecutionDecider.class)
diff --git a/testsuite/integration-arquillian/tests/pom.xml b/testsuite/integration-arquillian/tests/pom.xml
index 074a08a..b339d11 100644
--- a/testsuite/integration-arquillian/tests/pom.xml
+++ b/testsuite/integration-arquillian/tests/pom.xml
@@ -340,6 +340,32 @@
                     <artifactId>infinispan-core</artifactId>
                 </dependency>
                 
+                <dependency>
+                    <groupId>jline</groupId>
+                    <artifactId>jline</artifactId>
+                    <version>2.12</version>
+                </dependency>
+                <dependency>
+                    <groupId>org.apache.sshd</groupId>
+                    <artifactId>sshd-core</artifactId>
+                    <version>0.12.0</version>
+                </dependency>
+                <dependency>
+                    <groupId>org.apache.karaf.shell</groupId>
+                    <artifactId>org.apache.karaf.shell.console</artifactId>
+                    <version>3.0.3</version>
+                </dependency>
+                <dependency>
+                    <groupId>org.apache.karaf</groupId>
+                    <artifactId>org.apache.karaf.client</artifactId>
+                    <version>3.0.3</version>
+                </dependency>  
+                <dependency>
+                    <groupId>org.apache.aries.jmx</groupId>
+                    <artifactId>org.apache.aries.jmx</artifactId>
+                    <version>1.1.1</version>
+                </dependency>             
+                
             </dependencies>
             <build>
                 <plugins>