You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by cl...@apache.org on 2019/05/04 03:11:04 UTC

[activemq-artemis] branch master updated: NO-JIRA Fixing JMX Test

This is an automated email from the ASF dual-hosted git repository.

clebertsuconic pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git


The following commit(s) were added to refs/heads/master by this push:
     new b5b2cc9  NO-JIRA Fixing JMX Test
     new ac89471  This closes #2659
b5b2cc9 is described below

commit b5b2cc98b02e43101fb7449f59afc9c3f74f31e5
Author: Clebert Suconic <cl...@apache.org>
AuthorDate: Thu May 2 15:08:03 2019 -0400

    NO-JIRA Fixing JMX Test
    
    This test has been failing as part of the main testsuite
    and it should really be a smoke test as it is using a real test.
    so, I'm moving it as smoke-test
---
 .../server/management/ManagementConnector.java     |   1 +
 .../tests/integration/jmx/JmxConnectionTest.java   | 162 ---------------------
 tests/smoke-tests/pom.xml                          |  19 +++
 .../src/main/resources/servers/jmx/management.xml} |  23 +--
 .../artemis/tests/smoke/jmx/JmxConnectionTest.java | 123 ++++++++++++++++
 5 files changed, 155 insertions(+), 173 deletions(-)

diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementConnector.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementConnector.java
index 36113c6..1f53d49 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementConnector.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementConnector.java
@@ -59,6 +59,7 @@ public class ManagementConnector implements ActiveMQComponent {
 
       connectorServerFactory = new ConnectorServerFactory();
       connectorServerFactory.setServer(mbeanServer);
+      System.out.println("ServiceURL::" + configuration.getServiceUrl());
       connectorServerFactory.setServiceUrl(configuration.getServiceUrl());
       connectorServerFactory.setRmiServerHost(configuration.getConnectorHost());
       connectorServerFactory.setObjectName(new ObjectName(configuration.getObjectName()));
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/jmx/JmxConnectionTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/jmx/JmxConnectionTest.java
deleted file mode 100644
index 416dfcc..0000000
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/jmx/JmxConnectionTest.java
+++ /dev/null
@@ -1,162 +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
- * <br>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <br>
- * 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.jmx;
-
-import com.sun.jmx.remote.internal.ProxyRef;
-import org.apache.activemq.artemis.cli.Artemis;
-import org.apache.activemq.artemis.cli.commands.Run;
-import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import sun.rmi.server.UnicastRef;
-import sun.rmi.transport.LiveRef;
-
-import javax.management.remote.JMXConnector;
-import javax.management.remote.JMXConnectorFactory;
-import javax.management.remote.JMXServiceURL;
-import javax.management.remote.rmi.RMIConnection;
-import javax.management.remote.rmi.RMIConnector;
-import java.io.File;
-import java.lang.reflect.Field;
-import java.nio.file.Files;
-import java.nio.file.StandardCopyOption;
-import java.rmi.server.RemoteObject;
-import java.rmi.server.RemoteRef;
-import java.util.concurrent.TimeUnit;
-
-/**
- * This test checks JMX connection to Artemis with both necessary ports set up so that it's easier to tunnel through
- * firewalls.
- */
-public class JmxConnectionTest extends ActiveMQTestBase {
-
-   private static final String MANAGEMENT_XML = "/jmx-test-management.xml";
-
-   // Make sure these values are always the same as in the MANAGEMENT_XML configuration file
-   private static final String JMX_SERVER_HOSTNAME = "127.0.0.1";
-   private static final int JMX_SERVER_PORT = 10099;
-   private static final int RMI_REGISTRY_PORT = 10098;
-
-   @Override
-   @Before
-   public void setUp() throws Exception {
-
-      super.setUp();
-
-      /* This needs to be disabled because otherwise there would be a lot of complains about Artemis' own running threads
-       * and I suppose that this kind of leaks is most likely tested somewhere else.
-       */
-      disableCheckThread();
-
-      // Artemis instance dir
-      File instanceDir = new File(temporaryFolder.getRoot(), "instance");
-
-      // Create new Artemis instance
-      Run.setEmbedded(true);
-      Artemis.main("create", instanceDir.getAbsolutePath(), "--silent", "--no-fsync", "--no-autotune",
-              "--no-web", "--no-amqp-acceptor", "--no-mqtt-acceptor", "--no-stomp-acceptor", "--no-hornetq-acceptor");
-
-      // Configure (this is THE subject of testing)
-      File managementConfigFile = new File(instanceDir, "etc/management.xml");
-      Files.copy(getClass().getResourceAsStream(MANAGEMENT_XML), managementConfigFile.toPath(),
-              StandardCopyOption.REPLACE_EXISTING);
-
-      // Point the server to the instance directory
-      System.setProperty("artemis.instance", instanceDir.getAbsolutePath());
-
-      // Without this, the RMI server would bind to the default interface IP (the user's local IP mostly)
-      System.setProperty("java.rmi.server.hostname", JMX_SERVER_HOSTNAME);
-
-      // Enable guest login module (dunno why this isn't automatic)
-      System.setProperty("java.security.auth.login.config", instanceDir.getAbsolutePath() + "/etc/login.config");
-
-      // Run Artemis server
-      Artemis.internalExecute("run");
-   }
-
-   @Test
-   public void testJmxConnection() throws Exception {
-
-      // I don't specify both ports here manually on purpose. See actual RMI registry connection port extraction below.
-      String urlString = "service:jmx:rmi:///jndi/rmi://" + JMX_SERVER_HOSTNAME + ":" + JMX_SERVER_PORT + "/jmxrmi";
-
-      JMXServiceURL url = new JMXServiceURL(urlString);
-      JMXConnector jmxConnector;
-
-      try {
-         jmxConnector = JMXConnectorFactory.connect(url);
-         logAndSystemOut("Successfully connected to: " + urlString);
-      } catch (Exception e) {
-         logAndSystemOut("JMX connection failed: " + urlString, e);
-         Assert.fail(e.getMessage());
-         return;
-      }
-
-      try {
-
-         /* Now I need to extract the RMI registry port to make sure it's equal to the configured one. It's gonna be
-          * messy because I have to use reflection to reach the information.
-          */
-
-         Assert.assertTrue(jmxConnector instanceof RMIConnector);
-
-         // 1. RMIConnector::connection is expected to be RMIConnectionImpl_Stub
-         Field connectionField = RMIConnector.class.getDeclaredField("connection");
-         connectionField.setAccessible(true);
-         RMIConnection rmiConnection = (RMIConnection) connectionField.get(jmxConnector);
-
-         // 2. RMIConnectionImpl_Stub extends RemoteStub which extends RemoteObject
-         Assert.assertTrue(rmiConnection instanceof RemoteObject);
-         RemoteObject remoteObject = (RemoteObject) rmiConnection;
-
-         // 3. RemoteObject::getRef is hereby expected to return ProxyRef
-         RemoteRef remoteRef = remoteObject.getRef();
-         Assert.assertTrue(remoteRef instanceof ProxyRef);
-         ProxyRef proxyRef = (ProxyRef) remoteRef;
-
-         // 4. ProxyRef::ref is expected to contain UnicastRef (UnicastRef2 resp.)
-         Field refField = ProxyRef.class.getDeclaredField("ref");
-         refField.setAccessible(true);
-         remoteRef = (RemoteRef) refField.get(proxyRef);
-         Assert.assertTrue(remoteRef instanceof UnicastRef);
-
-         // 5. UnicastRef::getLiveRef returns LiveRef
-         LiveRef liveRef = ((UnicastRef) remoteRef).getLiveRef();
-
-         // 6. LiveRef::getPort is expected to be the same as the RMI registry port configured via management.xml
-         /* Accidentally, it can happen that even with the RMI registry port unconfigured the randomly selected port
-          * will be the same as expected by the test which will make it succeed. But it's highly unlikely.
-          */
-         Assert.assertEquals(RMI_REGISTRY_PORT, liveRef.getPort());
-
-      } finally {
-         jmxConnector.close();
-      }
-   }
-
-   @After
-   @Override
-   public void tearDown() throws Exception {
-      Artemis.internalExecute("stop");
-      Run.latchRunning.await(5, TimeUnit.SECONDS);
-      super.tearDown();
-   }
-
-}
diff --git a/tests/smoke-tests/pom.xml b/tests/smoke-tests/pom.xml
index 4c72161..2c75f6b 100644
--- a/tests/smoke-tests/pom.xml
+++ b/tests/smoke-tests/pom.xml
@@ -206,6 +206,25 @@
                      <instance>${basedir}/target/maxConsumers</instance>
                   </configuration>
                </execution>
+               <execution>
+                  <phase>test-compile</phase>
+                  <id>create-createJMX</id>
+                  <goals>
+                     <goal>create</goal>
+                  </goals>
+                  <configuration>
+                     <configuration>${basedir}/target/classes/servers/jmx</configuration>
+                     <allowAnonymous>true</allowAnonymous>
+                     <user>admin</user>
+                     <password>admin</password>
+                     <instance>${basedir}/target/jmx</instance>
+                     <args>
+                        <!-- this is needed to run the server remotely -->
+                        <arg>--java-options</arg>
+                        <arg>-Djava.rmi.server.hostname=localhost</arg>
+                     </args>
+                  </configuration>
+               </execution>
 
             </executions>
             <dependencies>
diff --git a/tests/integration-tests/src/test/resources/jmx-test-management.xml b/tests/smoke-tests/src/main/resources/servers/jmx/management.xml
similarity index 74%
rename from tests/integration-tests/src/test/resources/jmx-test-management.xml
rename to tests/smoke-tests/src/main/resources/servers/jmx/management.xml
index ac5ba6d..f62611e 100644
--- a/tests/integration-tests/src/test/resources/jmx-test-management.xml
+++ b/tests/smoke-tests/src/main/resources/servers/jmx/management.xml
@@ -16,25 +16,26 @@
   ~ limitations under the License.
   -->
 <management-context xmlns="http://activemq.org/schema">
-   <connector connector-port="10099" connector-host="127.0.0.1" rmi-registry-port="10098" />
+   <!-- carai -->
+   <connector connector-port="10099" connector-host="localhost" rmi-registry-port="10098" />
    <authorisation>
       <whitelist>
          <entry domain="hawtio"/>
       </whitelist>
       <default-access>
-         <access method="list*" roles="${role}"/>
-         <access method="get*" roles="${role}"/>
-         <access method="is*" roles="${role}"/>
-         <access method="set*" roles="${role}"/>
-         <access method="*" roles="${role}"/>
+         <access method="list*" roles="amq"/>
+         <access method="get*" roles="amq"/>
+         <access method="is*" roles="amq"/>
+         <access method="set*" roles="amq"/>
+         <access method="*" roles="amq"/>
       </default-access>
       <role-access>
          <match domain="org.apache.activemq.artemis">
-            <access method="list*" roles="${role}"/>
-            <access method="get*" roles="${role}"/>
-            <access method="is*" roles="${role}"/>
-            <access method="set*" roles="${role}"/>
-            <access method="*" roles="${role}"/>
+            <access method="list*" roles="amq"/>
+            <access method="get*" roles="amq"/>
+            <access method="is*" roles="amq"/>
+            <access method="set*" roles="amq"/>
+            <access method="*" roles="amq"/>
          </match>
          <!--example of how to configure a specific object-->
          <!--<match domain="org.apache.activemq.artemis" key="subcomponent=queues">
diff --git a/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/jmx/JmxConnectionTest.java b/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/jmx/JmxConnectionTest.java
new file mode 100644
index 0000000..bb21c92
--- /dev/null
+++ b/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/jmx/JmxConnectionTest.java
@@ -0,0 +1,123 @@
+/*
+ * 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
+ * <br>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <br>
+ * 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.smoke.jmx;
+
+import javax.management.remote.JMXConnector;
+import javax.management.remote.JMXConnectorFactory;
+import javax.management.remote.JMXServiceURL;
+import javax.management.remote.rmi.RMIConnection;
+import javax.management.remote.rmi.RMIConnector;
+import java.lang.reflect.Field;
+import java.rmi.server.RemoteObject;
+import java.rmi.server.RemoteRef;
+
+import com.sun.jmx.remote.internal.ProxyRef;
+import org.apache.activemq.artemis.tests.smoke.common.SmokeTestBase;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import sun.rmi.server.UnicastRef;
+import sun.rmi.transport.LiveRef;
+
+/**
+ * This test checks JMX connection to Artemis with both necessary ports set up so that it's easier to tunnel through
+ * firewalls.
+ */
+public class JmxConnectionTest extends SmokeTestBase {
+
+   // This test will use a smoke created by the pom on this project (smoke-tsts)
+
+   private static final String JMX_SERVER_HOSTNAME = "localhost";
+   private static final int JMX_SERVER_PORT = 10099;
+   private static final int RMI_REGISTRY_PORT = 10098;
+
+   public static final String SERVER_NAME_0 = "jmx";
+
+   @Before
+   public void before() throws Exception {
+      cleanupData(SERVER_NAME_0);
+      disableCheckThread();
+      startServer(SERVER_NAME_0, 0, 30000);
+   }
+
+   @Test
+   public void testJmxConnection() throws Throwable {
+      try {
+
+         // Without this, the RMI server would bind to the default interface IP (the user's local IP mostly)
+         System.setProperty("java.rmi.server.hostname", JMX_SERVER_HOSTNAME);
+
+         // I don't specify both ports here manually on purpose. See actual RMI registry connection port extraction below.
+         String urlString = "service:jmx:rmi:///jndi/rmi://" + JMX_SERVER_HOSTNAME + ":" + JMX_SERVER_PORT + "/jmxrmi";
+
+         JMXServiceURL url = new JMXServiceURL(urlString);
+         JMXConnector jmxConnector;
+
+         try {
+            jmxConnector = JMXConnectorFactory.connect(url);
+            System.out.println("Successfully connected to: " + urlString);
+         } catch (Exception e) {
+            jmxConnector = null;
+            e.printStackTrace();
+            Assert.fail(e.getMessage());
+         }
+
+         try {
+
+         /* Now I need to extract the RMI registry port to make sure it's equal to the configured one. It's gonna be
+          * messy because I have to use reflection to reach the information.
+          */
+
+            Assert.assertTrue(jmxConnector instanceof RMIConnector);
+
+            // 1. RMIConnector::connection is expected to be RMIConnectionImpl_Stub
+            Field connectionField = RMIConnector.class.getDeclaredField("connection");
+            connectionField.setAccessible(true);
+            RMIConnection rmiConnection = (RMIConnection) connectionField.get(jmxConnector);
+
+            // 2. RMIConnectionImpl_Stub extends RemoteStub which extends RemoteObject
+            Assert.assertTrue(rmiConnection instanceof RemoteObject);
+            RemoteObject remoteObject = (RemoteObject) rmiConnection;
+
+            // 3. RemoteObject::getRef is hereby expected to return ProxyRef
+            RemoteRef remoteRef = remoteObject.getRef();
+            Assert.assertTrue(remoteRef instanceof ProxyRef);
+            ProxyRef proxyRef = (ProxyRef) remoteRef;
+
+            // 4. ProxyRef::ref is expected to contain UnicastRef (UnicastRef2 resp.)
+            Field refField = ProxyRef.class.getDeclaredField("ref");
+            refField.setAccessible(true);
+            remoteRef = (RemoteRef) refField.get(proxyRef);
+            Assert.assertTrue(remoteRef instanceof UnicastRef);
+
+            // 5. UnicastRef::getLiveRef returns LiveRef
+            LiveRef liveRef = ((UnicastRef) remoteRef).getLiveRef();
+
+            Assert.assertEquals(RMI_REGISTRY_PORT, liveRef.getPort());
+
+         } finally {
+            jmxConnector.close();
+         }
+      } catch (Throwable e) {
+         e.printStackTrace();
+         throw e;
+      }
+   }
+
+
+}