/* * Licensed 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 com.addthis.basis.jmx; import java.lang.management.ManagementFactory; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.UUID; import javax.management.MBeanServer; import javax.management.ObjectName; import javax.management.StandardMBean; import junit.framework.TestCase; public class MBeanUtilsTest extends TestCase { MBeanServer server; public void setUp() throws Exception { server = ManagementFactory.getPlatformMBeanServer(); } public void testParse() { String d = UUID.randomUUID().toString(); List<String> p = new LinkedList<String>(); for (int i = 0; i < 10; i++) { p.add(UUID.randomUUID().toString()); } StringBuffer str = new StringBuffer(); str.append(d).append(":"); for (int i = 0; i < p.size(); i++) { if (i > 0) { str.append(","); } str.append("key-" + i).append("=").append(p.get(i)); } ObjectName n = MBeanUtils.parseName(str.toString()); assertNotNull(n); assertEquals(d, n.getDomain()); for (int i = 0; i < p.size(); i++) { assertEquals(p.get(i), n.getKeyProperty("key-" + i)); } } public void testBuild() { String d = UUID.randomUUID().toString(); List<String> p = new LinkedList<String>(); for (int i = 0; i < 10; i++) { p.add(UUID.randomUUID().toString()); } StringBuffer str = new StringBuffer(); str.append(d).append(":"); for (int i = 0; i < p.size(); i++) { if (i > 0) { str.append(","); } str.append("key-" + i).append("=").append(p.get(i)); } Object[] args = new Object[2 * p.size()]; for (int i = 0; i < args.length; i += 2) { args[i] = "key-" + i / 2; args[i + 1] = p.get(i / 2); } assertEquals(str.toString(), MBeanUtils.buildName(d, args).toString()); } public void testSupports() throws Exception { ObjectName n = new ObjectName("foo:id=" + UUID.randomUUID().toString()); Impl s = new Impl(); server.registerMBean(new StandardMBean(s, Ifc2.class), n); assertTrue(MBeanUtils.supports(n, Ifc2.class)); assertTrue(MBeanUtils.supports(n, CopyOfIfc2.class)); } public void testProxy() throws Exception { ObjectName n = new ObjectName("foo:id=" + UUID.randomUUID().toString()); Impl s = new Impl(); server.registerMBean(new StandardMBean(s, Ifc1.class), n); Ifc1 s1 = MBeanUtils.createProxy(getClass().getClassLoader(), n, Ifc1.class); assertNotNull(s1); assertEquals(s.foo, s1.getfoo()); assertEquals(s.bar, s1.getBar()); assertEquals("ab", s1.cat("a", "b")); Ifc1 s2 = MBeanUtils.createProxy(getClass().getClassLoader(), n, Ifc1.class); assertNotNull(s2); assertEquals(s.foo, s2.getfoo()); assertEquals(s.bar, s2.getBar()); assertEquals("ab", s2.cat("a", "b")); } public void testDynamic() throws Exception { ObjectName n = new ObjectName("foo:id=" + UUID.randomUUID().toString()); Impl s = new Impl(); server.registerMBean(MBeanUtils.createDynamicMBean(s, Arrays.<Class<?>>asList(Ifc1.class, Ifc2.class), null), n); Ifc1 s1 = MBeanUtils.createProxy(getClass().getClassLoader(), n, Ifc1.class); assertNotNull(s1); assertEquals(s.foo, s1.getfoo()); assertEquals(s.bar, s1.getBar()); assertEquals("ab", s1.cat("a", "b")); Ifc2 s2 = MBeanUtils.createProxy(getClass().getClassLoader(), n, Ifc2.class); assertNotNull(s2); s2.setBar("blah"); assertEquals("blah", s.bar); assertEquals("blah", s1.getBar()); assertEquals("ab", s2.cat("ab")); } public static interface Ifc1 { public String getfoo(); public String getBar(); public String cat(String s1, String s2); } public static interface Ifc2 { public void setBar(String bar); public String cat(String s1); } public static interface CopyOfIfc2 { public void setBar(String bar); public String cat(String s1); } public static class Impl implements Ifc1, Ifc2 { public String foo = UUID.randomUUID().toString(); public String bar = UUID.randomUUID().toString(); @Override public String cat(String s1) { return s1; } @Override public String cat(String s1, String s2) { return s1 + s2; } @Override public String getBar() { return bar; } @Override public String getfoo() { return foo; } @Override public void setBar(String bar) { this.bar = bar; } } }