Repository: incubator-geode Updated Branches: refs/heads/feature/GEODE-17-2 3e2ae3330 -> dc7d73e71
GEODE-17: clean up MXBeanCreationRule Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/dc7d73e7 Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/dc7d73e7 Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/dc7d73e7 Branch: refs/heads/feature/GEODE-17-2 Commit: dc7d73e71a3eb8e649532f15299ef76b32e553b9 Parents: 3e2ae33 Author: Jinmei Liao <jil...@pivotal.io> Authored: Mon Mar 7 09:59:39 2016 -0800 Committer: Jinmei Liao <jil...@pivotal.io> Committed: Mon Mar 7 09:59:39 2016 -0800 ---------------------------------------------------------------------- .../CacheServerMBeanSecurityJUnitTest.java | 2 +- .../internal/security/MXBeanCreationRule.java | 71 +++++--------------- .../junit/rules/DescribedExternalResource.java | 64 ++++++++++++++++++ 3 files changed, 83 insertions(+), 54 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/dc7d73e7/geode-core/src/test/java/com/gemstone/gemfire/management/internal/security/CacheServerMBeanSecurityJUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/com/gemstone/gemfire/management/internal/security/CacheServerMBeanSecurityJUnitTest.java b/geode-core/src/test/java/com/gemstone/gemfire/management/internal/security/CacheServerMBeanSecurityJUnitTest.java index e9e8942..ee388e1 100644 --- a/geode-core/src/test/java/com/gemstone/gemfire/management/internal/security/CacheServerMBeanSecurityJUnitTest.java +++ b/geode-core/src/test/java/com/gemstone/gemfire/management/internal/security/CacheServerMBeanSecurityJUnitTest.java @@ -43,7 +43,7 @@ public class CacheServerMBeanSecurityJUnitTest { private CacheServerMXBean cacheServerMXBean; @Rule - public MXBeanCreationRule<CacheServerMXBean> mxRule = new MXBeanCreationRule(jmxManagerPort, CacheServerMXBean.class); + public MXBeanCreationRule<CacheServerMXBean> mxRule = new MXBeanCreationRule(jmxManagerPort, CacheServerMXBean.class, "GemFire:service=CacheServer,*"); @ClassRule public static RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties(); http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/dc7d73e7/geode-core/src/test/java/com/gemstone/gemfire/management/internal/security/MXBeanCreationRule.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/com/gemstone/gemfire/management/internal/security/MXBeanCreationRule.java b/geode-core/src/test/java/com/gemstone/gemfire/management/internal/security/MXBeanCreationRule.java index 4662a8d..03dcf9b 100644 --- a/geode-core/src/test/java/com/gemstone/gemfire/management/internal/security/MXBeanCreationRule.java +++ b/geode-core/src/test/java/com/gemstone/gemfire/management/internal/security/MXBeanCreationRule.java @@ -16,9 +16,8 @@ */ package com.gemstone.gemfire.management.internal.security; -import org.junit.rules.ExternalResource; +import com.gemstone.gemfire.test.junit.rules.DescribedExternalResource; import org.junit.runner.Description; -import org.junit.runners.model.Statement; import javax.management.JMX; import javax.management.MBeanServerConnection; @@ -36,53 +35,25 @@ import java.util.Map; * * @param <T> The type of MBean which will be returned. */ -public class MXBeanCreationRule<T> extends ExternalResource { +public class MXBeanCreationRule<T> extends DescribedExternalResource { private final int jmxServerPort; - private Class<T> proxyClass; + private final Class<T> proxyClass; + private final String objectName; private JMXConnector jmxConnector; private ObjectName beanObjectName; private MBeanServerConnection mbeanServer; - private static class JMXConfigurationStatement extends Statement { - - private final Description description; - private final Statement base; - private final MXBeanCreationRule mxRule; - - JMXConfigurationStatement(Statement base, Description description, MXBeanCreationRule rule) { - this.description = description; - this.base = base; - this.mxRule = rule; - } - - @Override - public void evaluate() throws Throwable { - mxRule.createConnection(getUser(), getPassword()); - try { - base.evaluate(); - } finally { - mxRule.close(); - } - } - - private String getUser() { - return description.getAnnotation(JMXConnectionConfiguration.class).user(); - } - - private String getPassword() { - return description.getAnnotation(JMXConnectionConfiguration.class).password(); - } - } /** * Rule constructor * @param port The JMX server port to connect to * @param proxyClass The class for which a proxy MBean will be created */ - public MXBeanCreationRule(int port, Class<T> proxyClass) { + public MXBeanCreationRule(int port, Class<T> proxyClass, String objectName) { this.jmxServerPort = port; this.proxyClass = proxyClass; + this.objectName = objectName; } /** @@ -93,11 +64,9 @@ public class MXBeanCreationRule<T> extends ExternalResource { return JMX.newMBeanProxy(mbeanServer, beanObjectName, proxyClass); } - private void close() throws Exception{ - jmxConnector.close(); - } - - private void createConnection(String user, String password) throws Exception { + protected void before(Description description) throws Throwable { + String user = description.getAnnotation(JMXConnectionConfiguration.class).user(); + String password = description.getAnnotation(JMXConnectionConfiguration.class).password(); Map<String, String[]> env = new HashMap<>(); env.put(JMXConnector.CREDENTIALS, new String[] {user, password}); JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:" + jmxServerPort + "/jmxrmi"); @@ -105,22 +74,18 @@ public class MXBeanCreationRule<T> extends ExternalResource { jmxConnector = JMXConnectorFactory.connect(url, env); mbeanServer = jmxConnector.getMBeanServerConnection(); - ObjectName objectNamePattern = lookupObjectName(); - ObjectInstance bean = (ObjectInstance) mbeanServer.queryMBeans(objectNamePattern, null).toArray()[0]; + ObjectInstance bean = (ObjectInstance) mbeanServer.queryMBeans(ObjectName.getInstance(objectName), null).toArray()[0]; beanObjectName = bean.getObjectName(); } - private ObjectName lookupObjectName() throws Exception { - switch (proxyClass.getName()) { - case "com.gemstone.gemfire.management.CacheServerMXBean": - return(ObjectName.getInstance("GemFire:service=CacheServer,*")); - default: - throw new RuntimeException("Unknown MBean class: " + proxyClass.getName()); - } + /** + * Override to tear down your specific external resource. + */ + protected void after(Description description) throws Throwable { + jmxConnector.close(); + jmxConnector = null; + mbeanServer = null; + beanObjectName = null; } - @Override - public Statement apply(Statement base, Description description) { - return new JMXConfigurationStatement(base, description, this); - } } http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/dc7d73e7/geode-junit/src/main/java/com/gemstone/gemfire/test/junit/rules/DescribedExternalResource.java ---------------------------------------------------------------------- diff --git a/geode-junit/src/main/java/com/gemstone/gemfire/test/junit/rules/DescribedExternalResource.java b/geode-junit/src/main/java/com/gemstone/gemfire/test/junit/rules/DescribedExternalResource.java new file mode 100644 index 0000000..543b7fc --- /dev/null +++ b/geode-junit/src/main/java/com/gemstone/gemfire/test/junit/rules/DescribedExternalResource.java @@ -0,0 +1,64 @@ +/* + * 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. + */ + +/** + * this class extends the capability of JUnit's ExternalResource in that + * it provides a Description object in the before and after methods, so that + * the implementation would have access to the annotation of the test methods + */ +package com.gemstone.gemfire.test.junit.rules; + +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; + +public class DescribedExternalResource implements TestRule { + public Statement apply(Statement base, Description description) { + return statement(base, description); + } + + private Statement statement(final Statement base, final Description description) { + return new Statement() { + @Override + public void evaluate() throws Throwable { + before(description); + try { + base.evaluate(); + } finally { + after(description); + } + } + }; + } + + + /** + * Override to set up your specific external resource. + * + * @throws Throwable if setup fails (which will disable {@code after} + */ + protected void before(Description description) throws Throwable { + // do nothing + } + + /** + * Override to tear down your specific external resource. + */ + protected void after(Description description) throws Throwable { + // do nothing + } +}