1 8 9 package test.javax.management.remote; 10 11 import java.io.IOException ; 12 import java.net.MalformedURLException ; 13 import java.security.AccessController ; 14 import java.util.Collections ; 15 import java.util.HashSet ; 16 import java.util.Map ; 17 import java.util.Set ; 18 import javax.management.Attribute ; 19 import javax.management.AttributeList ; 20 import javax.management.AttributeNotFoundException ; 21 import javax.management.InstanceNotFoundException ; 22 import javax.management.MBeanException ; 23 import javax.management.MBeanInfo ; 24 import javax.management.MBeanServer ; 25 import javax.management.MBeanServerConnection ; 26 import javax.management.MBeanServerFactory ; 27 import javax.management.ObjectInstance ; 28 import javax.management.ObjectName ; 29 import javax.management.RuntimeMBeanException ; 30 import javax.management.remote.JMXAuthenticator ; 31 import javax.management.remote.JMXConnector ; 32 import javax.management.remote.JMXConnectorFactory ; 33 import javax.management.remote.JMXConnectorServer ; 34 import javax.management.remote.JMXConnectorServerFactory ; 35 import javax.management.remote.JMXPrincipal ; 36 import javax.management.remote.JMXServiceURL ; 37 import javax.security.auth.Subject ; 38 39 import test.MX4JTestCase; 40 41 44 public abstract class JMXConnectorInvocationTestCase extends MX4JTestCase 45 { 46 private JMXConnectorServer connectorServer; 47 48 public JMXConnectorInvocationTestCase(String name) 49 { 50 super(name); 51 } 52 53 public abstract JMXServiceURL createJMXConnectorServerAddress() throws MalformedURLException ; 54 55 public abstract Map getEnvironment(); 56 57 private MBeanServerConnection getMBeanServerConnection(MBeanServer server) throws IOException 58 { 59 JMXServiceURL url = createJMXConnectorServerAddress(); 60 connectorServer = JMXConnectorServerFactory.newJMXConnectorServer(url, getEnvironment(), server); 61 connectorServer.start(); 62 sleep(5000); 63 JMXConnector connector = JMXConnectorFactory.connect(connectorServer.getAddress(), getEnvironment()); 64 return connector.getMBeanServerConnection(); 65 } 66 67 protected void tearDown() throws Exception 68 { 69 if (connectorServer != null) connectorServer.stop(); 70 sleep(5000); 71 } 72 73 public void testCallToMBeanServerWithAttributeNotFoundException() throws Exception 74 { 75 MBeanServerConnection mbsc = getMBeanServerConnection(newMBeanServer()); 76 try 77 { 78 mbsc.getAttribute(new ObjectName ("JMImplementation:type=MBeanServerDelegate"), "dummy"); 80 fail(); 81 } 82 catch (AttributeNotFoundException e) 83 { 84 } 85 } 86 87 public void testCallToMBeanServerWithInstanceNotFoundException() throws Exception 88 { 89 MBeanServerConnection mbsc = getMBeanServerConnection(newMBeanServer()); 90 try 91 { 92 mbsc.getAttribute(new ObjectName (":type=dummy"), "ImplementationVersion"); 94 fail(); 95 } 96 catch (InstanceNotFoundException x) 97 { 98 } 99 } 100 101 public void testCreateMBeanWith3Params() throws Exception 102 { 103 MBeanServerConnection mbsc = getMBeanServerConnection(newMBeanServer()); 104 ObjectName name = ObjectName.getInstance("", "test", "invocation"); 105 ObjectInstance instance = mbsc.createMBean(Support.class.getName(), name, null); 106 assertNotNull(instance); 107 } 108 109 public void testCreateMBeanWith5Params() throws Exception 110 { 111 MBeanServerConnection mbsc = getMBeanServerConnection(newMBeanServer()); 112 String value = "mx4j"; 113 ObjectName name = ObjectName.getInstance("", "test", "invocation"); 114 ObjectInstance instance = mbsc.createMBean(Support.class.getName(), name, null, new Object []{value}, new String []{String .class.getName()}); 115 assertNotNull(instance); 116 117 String result = (String )mbsc.getAttribute(name, "Name"); 119 assertEquals(result, value); 120 } 121 122 public void testGetAttribute() throws Exception 123 { 124 MBeanServerConnection mbsc = getMBeanServerConnection(newMBeanServer()); 125 String value = "mx4j"; 126 ObjectName name = ObjectName.getInstance("", "test", "invocation"); 127 ObjectInstance instance = mbsc.createMBean(Support.class.getName(), name, null, new Object []{value}, new String []{String .class.getName()}); 128 assertNotNull(instance); 129 130 String result = (String )mbsc.getAttribute(name, "Name"); 132 assertEquals(result, value); 133 } 134 135 public void testGetAttributes() throws Exception 136 { 137 MBeanServerConnection mbsc = getMBeanServerConnection(newMBeanServer()); 138 String value = "mx4j"; 139 ObjectName name = ObjectName.getInstance("", "test", "invocation"); 140 ObjectInstance instance = mbsc.createMBean(Support.class.getName(), name, null, new Object []{value}, new String []{String .class.getName()}); 141 assertNotNull(instance); 142 143 String attribute = "Name"; 145 String [] attributes = new String []{attribute}; 146 AttributeList result = mbsc.getAttributes(name, attributes); 147 assertNotNull(result); 148 assertEquals(result.size(), attributes.length); 149 assertEquals(((Attribute )result.get(0)).getName(), attribute); 150 assertEquals(((Attribute )result.get(0)).getValue(), value); 151 } 152 153 public void testGetDefaultDomain() throws Exception 154 { 155 String domain = "DOMAIN"; 156 MBeanServer server = MBeanServerFactory.newMBeanServer(domain); 157 MBeanServerConnection mbsc = getMBeanServerConnection(server); 158 159 String defaultDomain = mbsc.getDefaultDomain(); 160 assertEquals(defaultDomain, domain); 161 } 162 163 public void testGetDomains() throws Exception 164 { 165 MBeanServerConnection mbsc = getMBeanServerConnection(newMBeanServer()); 166 167 String [] domains = mbsc.getDomains(); 168 if (domains.length < 1) fail(); 169 } 170 171 public void testGetMBeanCount() throws Exception 172 { 173 MBeanServerConnection mbsc = getMBeanServerConnection(newMBeanServer()); 174 175 Integer count = mbsc.getMBeanCount(); 176 if (count.intValue() < 1) fail(); 177 } 178 179 public void testGetMBeanInfo() throws Exception 180 { 181 MBeanServerConnection mbsc = getMBeanServerConnection(newMBeanServer()); 182 183 ObjectName name = ObjectName.getInstance("JMImplementation", "type", "MBeanServerDelegate"); 184 MBeanInfo info = mbsc.getMBeanInfo(name); 185 assertNotNull(info); 186 if (info.getAttributes().length < 1) fail(); 187 } 188 189 public void testGetObjectInstance() throws Exception 190 { 191 MBeanServerConnection mbsc = getMBeanServerConnection(newMBeanServer()); 192 ObjectName name = ObjectName.getInstance("", "test", "invocation"); 193 ObjectInstance instance = mbsc.createMBean(Support.class.getName(), name, null); 194 assertNotNull(instance); 195 196 ObjectInstance result = mbsc.getObjectInstance(name); 197 assertNotNull(result); 198 assertEquals(result, instance); 199 } 200 201 public void testInvoke() throws Exception 202 { 203 MBeanServerConnection mbsc = getMBeanServerConnection(newMBeanServer()); 204 ObjectName name = ObjectName.getInstance("", "test", "invocation"); 205 ObjectInstance instance = mbsc.createMBean(Support.class.getName(), name, null); 206 assertNotNull(instance); 207 208 String value = "value"; 209 String result = (String )mbsc.invoke(name, "echo", new Object []{value}, new String []{String .class.getName()}); 210 assertNotNull(result); 211 assertEquals(result, value); 212 } 213 214 public void testInvokeThrowsCustomException() throws Exception 215 { 216 MBeanServerConnection mbsc = getMBeanServerConnection(newMBeanServer()); 217 ObjectName name = ObjectName.getInstance("", "test", "invocation"); 218 ObjectInstance instance = mbsc.createMBean(Support.class.getName(), name, null); 219 assertNotNull(instance); 220 221 try 222 { 223 mbsc.invoke(name, "throwCustomException", null, null); 224 } 225 catch (MBeanException x) 226 { 227 Exception xx = x.getTargetException(); 228 if (xx != null && xx.getClass() != SupportException.class) fail(); 229 } 230 } 231 232 public void testInvokeThrowsRuntimeException() throws Exception 233 { 234 MBeanServerConnection mbsc = getMBeanServerConnection(newMBeanServer()); 235 ObjectName name = ObjectName.getInstance("", "test", "invocation"); 236 ObjectInstance instance = mbsc.createMBean(Support.class.getName(), name, null); 237 assertNotNull(instance); 238 239 try 240 { 241 mbsc.invoke(name, "throwRuntimeException", null, null); 242 } 243 catch (RuntimeMBeanException x) 244 { 245 Exception xx = x.getTargetException(); 246 if (xx != null && xx.getClass() != IllegalArgumentException .class) fail(); 247 } 248 } 249 250 public void testIsInstanceOf() throws Exception 251 { 252 MBeanServerConnection mbsc = getMBeanServerConnection(newMBeanServer()); 253 ObjectName name = ObjectName.getInstance("", "test", "invocation"); 254 ObjectInstance instance = mbsc.createMBean(Support.class.getName(), name, null); 255 assertNotNull(instance); 256 257 boolean isInstanceOf = mbsc.isInstanceOf(name, Support.class.getName()); 258 if (!isInstanceOf) fail("Class"); 259 260 isInstanceOf = mbsc.isInstanceOf(name, SupportMBean.class.getName()); 261 if (!isInstanceOf) fail("Interface"); 262 } 263 264 public void testIsRegistered() throws Exception 265 { 266 MBeanServerConnection mbsc = getMBeanServerConnection(newMBeanServer()); 267 ObjectName name = ObjectName.getInstance("", "test", "invocation"); 268 ObjectInstance instance = mbsc.createMBean(Support.class.getName(), name, null); 269 assertNotNull(instance); 270 271 boolean isRegistered = mbsc.isRegistered(name); 272 if (!isRegistered) fail(); 273 } 274 275 public void testQueryMBeansNullNull() throws Exception 276 { 277 MBeanServerConnection mbsc = getMBeanServerConnection(newMBeanServer()); 278 279 Set mbeans = mbsc.queryMBeans(null, null); 280 assertNotNull(mbeans); 281 if (mbeans.size() < 1) fail(); 282 } 283 284 public void testQueryMBeansObjectNameNull() throws Exception 285 { 286 MBeanServerConnection mbsc = getMBeanServerConnection(newMBeanServer()); 287 288 Set mbeans = mbsc.queryMBeans(ObjectName.getInstance("JMImplementation:*"), null); 289 assertNotNull(mbeans); 290 if (mbeans.size() < 1) fail(); 291 } 292 293 public void testQueryMBeansObjectNameQueryExp() throws Exception 294 { 295 MBeanServerConnection mbsc = getMBeanServerConnection(newMBeanServer()); 296 297 Set mbeans = mbsc.queryMBeans(ObjectName.getInstance("JMImplementation:*"), new ObjectName ("*:type=MBeanServerDelegate")); 298 assertNotNull(mbeans); 299 if (mbeans.size() != 1) fail(); 300 } 301 302 public void testSetAttribute() throws Exception 303 { 304 MBeanServerConnection mbsc = getMBeanServerConnection(newMBeanServer()); 305 ObjectName name = ObjectName.getInstance("", "test", "invocation"); 306 ObjectInstance instance = mbsc.createMBean(Support.class.getName(), name, null); 307 assertNotNull(instance); 308 309 String attribute = "Name"; 310 String value = "mx4j"; 311 mbsc.setAttribute(name, new Attribute (attribute, value)); 312 313 String result = (String )mbsc.getAttribute(name, attribute); 314 assertEquals(result, value); 315 } 316 317 public void testSetAttributes() throws Exception 318 { 319 MBeanServerConnection mbsc = getMBeanServerConnection(newMBeanServer()); 320 ObjectName name = ObjectName.getInstance("", "test", "invocation"); 321 ObjectInstance instance = mbsc.createMBean(Support.class.getName(), name, null); 322 assertNotNull(instance); 323 324 String attribute = "Name"; 325 String value = "mx4j"; 326 AttributeList attributes = new AttributeList (); 327 attributes.add(new Attribute (attribute, value)); 328 AttributeList result = mbsc.setAttributes(name, attributes); 329 assertNotNull(result); 330 assertEquals(result, attributes); 331 } 332 333 public void testUnregisterMBean() throws Exception 334 { 335 MBeanServerConnection mbsc = getMBeanServerConnection(newMBeanServer()); 336 ObjectName name = ObjectName.getInstance("", "test", "invocation"); 337 ObjectInstance instance = mbsc.createMBean(Support.class.getName(), name, null); 338 assertNotNull(instance); 339 340 mbsc.unregisterMBean(name); 341 if (mbsc.isRegistered(name)) fail(); 342 } 343 344 public void testAuthenticatedInvoke() throws Exception 345 { 346 final String principalName = "authenticatedPrincipal"; 347 348 JMXServiceURL url = createJMXConnectorServerAddress(); 349 Map serverEnv = getEnvironment(); 350 serverEnv.put(JMXConnectorServer.AUTHENTICATOR, new JMXAuthenticator () 351 { 352 public Subject authenticate(Object credentials) throws SecurityException 353 { 354 Set principals = new HashSet (); 355 principals.add(new JMXPrincipal (principalName)); 356 return new Subject (true, principals, Collections.EMPTY_SET, Collections.EMPTY_SET); 357 } 358 }); 359 360 JMXConnectorServer cntorServer = null; 361 try 362 { 363 cntorServer = JMXConnectorServerFactory.newJMXConnectorServer(url, serverEnv, newMBeanServer()); 364 cntorServer.start(); 365 366 Map clientEnv = getEnvironment(); 367 clientEnv.put(JMXConnector.CREDENTIALS, new String [0]); 368 369 JMXConnector cntor = JMXConnectorFactory.connect(cntorServer.getAddress(), clientEnv); 370 MBeanServerConnection mbsc = cntor.getMBeanServerConnection(); 371 372 ObjectName name = ObjectName.getInstance("", "test", "invocation"); 373 ObjectInstance instance = mbsc.createMBean(Support.class.getName(), name, null); 374 assertNotNull(instance); 375 376 Boolean result = (Boolean )mbsc.invoke(name, "authenticated", new Object []{principalName}, new String []{String .class.getName()}); 377 assertTrue(result.booleanValue()); 378 } 379 finally 380 { 381 if (cntorServer != null) cntorServer.stop(); 382 } 383 } 384 385 public void testDelegatedInvoke() throws Exception 386 { 387 JMXServiceURL url = createJMXConnectorServerAddress(); 388 Map serverEnv = getEnvironment(); 389 serverEnv.put(JMXConnectorServer.AUTHENTICATOR, new JMXAuthenticator () 390 { 391 public Subject authenticate(Object credentials) throws SecurityException 392 { 393 Set principals = new HashSet (); 394 principals.add(new JMXPrincipal ("authenticatedPrincipal")); 395 return new Subject (true, principals, Collections.EMPTY_SET, Collections.EMPTY_SET); 396 } 397 }); 398 JMXConnectorServer cntorServer = null; 399 try 400 { 401 cntorServer = JMXConnectorServerFactory.newJMXConnectorServer(url, serverEnv, newMBeanServer()); 402 cntorServer.start(); 403 404 Map clientEnv = getEnvironment(); 405 clientEnv.put(JMXConnector.CREDENTIALS, new String [0]); 406 407 JMXConnector cntor = JMXConnectorFactory.connect(cntorServer.getAddress(), clientEnv); 408 Set principals = new HashSet (); 409 String delegatedName = "delegatedPrincipal"; 410 principals.add(new JMXPrincipal (delegatedName)); 411 Subject delegate = new Subject (true, principals, Collections.EMPTY_SET, Collections.EMPTY_SET); 412 MBeanServerConnection mbsc = cntor.getMBeanServerConnection(delegate); 413 414 ObjectName name = ObjectName.getInstance("", "test", "invocation"); 415 ObjectInstance instance = mbsc.createMBean(Support.class.getName(), name, null); 416 assertNotNull(instance); 417 418 Boolean result = (Boolean )mbsc.invoke(name, "delegated", new Object []{delegatedName}, new String []{String .class.getName()}); 419 assertTrue(result.booleanValue()); 420 } 421 finally 422 { 423 if (cntorServer != null) cntorServer.stop(); 424 } 425 } 426 427 public static class SupportException extends Exception 428 { 429 } 430 431 public interface SupportMBean 432 { 433 public String getName(); 434 435 public void setName(String name); 436 437 public void throwCustomException() throws SupportException; 438 439 public void throwRuntimeException() throws IllegalArgumentException ; 440 441 public String echo(String argument); 442 443 public boolean authenticated(String name); 444 445 public boolean delegated(String name); 446 } 447 448 public static class Support implements SupportMBean 449 { 450 private String name; 451 452 public Support() 453 { 454 } 455 456 public Support(String name) 457 { 458 this.name = name; 459 } 460 461 public String getName() 462 { 463 return name; 464 } 465 466 public void setName(String name) 467 { 468 this.name = name; 469 } 470 471 public void throwCustomException() throws SupportException 472 { 473 throw new SupportException(); 474 } 475 476 public void throwRuntimeException() throws IllegalArgumentException 477 { 478 throw new IllegalArgumentException (); 479 } 480 481 public String echo(String argument) 482 { 483 return argument; 484 } 485 486 public boolean authenticated(String name) 487 { 488 Subject subject = Subject.getSubject(AccessController.getContext()); 489 if (subject == null) return false; 490 Set principals = subject.getPrincipals(); 491 return principals.contains(new JMXPrincipal (name)); 492 } 493 494 public boolean delegated(String name) 495 { 496 Subject subject = Subject.getSubject(AccessController.getContext()); 497 if (subject == null) return false; 498 Set principals = subject.getPrincipals(); 499 return principals.contains(new JMXPrincipal (name)); 500 } 501 } 502 } 503 | Popular Tags |