/*
|
* CDDL HEADER START
|
*
|
* The contents of this file are subject to the terms of the
|
* Common Development and Distribution License, Version 1.0 only
|
* (the "License"). You may not use this file except in compliance
|
* with the License.
|
*
|
* You can obtain a copy of the license at
|
* trunk/opends/resource/legal-notices/OpenDS.LICENSE
|
* or https://OpenDS.dev.java.net/OpenDS.LICENSE.
|
* See the License for the specific language governing permissions
|
* and limitations under the License.
|
*
|
* When distributing Covered Code, include this CDDL HEADER in each
|
* file and include the License file at
|
* trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
|
* add the following below this CDDL HEADER, with the fields enclosed
|
* by brackets "[]" replaced with your own identifying * information:
|
* Portions Copyright [yyyy] [name of copyright owner]
|
*
|
* CDDL HEADER END
|
*
|
*
|
* Portions Copyright 2006 Sun Microsystems, Inc.
|
*/
|
package org.opends.server.protocols.jmx;
|
|
import java.io.IOException;
|
import java.net.MalformedURLException;
|
import java.util.HashMap;
|
|
import javax.management.Attribute;
|
import javax.management.AttributeNotFoundException;
|
import javax.management.InstanceNotFoundException;
|
import javax.management.MBeanException;
|
import javax.management.MBeanServerConnection;
|
import javax.management.MalformedObjectNameException;
|
import javax.management.ObjectName;
|
import javax.management.ReflectionException;
|
import javax.management.remote.JMXConnector;
|
import javax.management.remote.JMXConnectorFactory;
|
import javax.management.remote.JMXServiceURL;
|
|
import org.opends.server.TestCaseUtils;
|
import org.opends.server.config.JMXMBean;
|
import org.opends.server.core.DirectoryException;
|
import org.opends.server.types.DN;
|
import org.testng.annotations.BeforeClass;
|
import org.testng.annotations.DataProvider;
|
import org.testng.annotations.Test;
|
import static org.testng.Assert.*;
|
|
/**
|
* A simple test for JMX connection establishment.
|
*
|
*/
|
public class JmxConnectTest extends JmxTestCase
|
{
|
/**
|
* Set up the environment for performing the tests in this suite.
|
*
|
* @throws Exception
|
* If the environment could not be set up.
|
*/
|
@BeforeClass
|
public void setUp() throws Exception
|
{
|
// Make sure that the server is up and running.
|
TestCaseUtils.startServer();
|
}
|
|
@DataProvider(name="simpleConnect")
|
Object[][] createCredentials()
|
{
|
return new Object[][] {
|
{"cn=directory manager", "password", true},
|
{"cn=directory manager", "wrongPassword", false},
|
{"cn=wrong user", "password", false},
|
{"invalid DN", "password", false},
|
{"cn=directory manager", null, false},
|
{null, "password", false},
|
{null, null, false},
|
};
|
}
|
|
/**
|
* That that simple (ot using SSL) connections to the JMX service are
|
* accepted when the given
|
* credentials are OK and refused when the credentials are invalid.
|
*
|
* @param user
|
* @param password
|
* @param expectedResult
|
* @throws Exception
|
*/
|
@Test(dataProvider="simpleConnect")
|
public void simpleConnect(String user, String password,
|
boolean expectedResult) throws Exception
|
{
|
JMXConnector jmxc = connect(user, password);
|
|
assertEquals((jmxc!= null), expectedResult);
|
}
|
|
@DataProvider(name="simpleGet")
|
Object[][] createNames()
|
{
|
return new Object[][] {
|
{"cn=JMX Connection Handler,cn=Connection Handlers,cn=config",
|
"ds-cfg-listen-port", new Long(1689)},
|
{"cn=JMX Connection Handler,cn=Connection Handlers,cn=config",
|
"objectclass", null},
|
{"cn=JMX Connection Handler,cn=Connection Handlers,cn=config",
|
"ds-cfg-ssl-cert-nickname", "adm-server-cert"},
|
};
|
}
|
|
/**
|
* Test simple JMX get.
|
*
|
* @throws Exception
|
*/
|
@Test(dataProvider="simpleGet")
|
public void simpleGet(String dn, String attributeName, Object value)
|
throws Exception
|
{
|
JMXConnector jmxc = connect("cn=directory manager", "password");
|
assertNotNull(jmxc);
|
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
|
|
// Get status of the JMX connection handler
|
String jmxName = JMXMBean.getJmxName(DN.decode(dn));
|
ObjectName name = ObjectName.getInstance(jmxName);
|
Attribute status = (Attribute) mbsc.getAttribute(name, attributeName);
|
|
if (value != null)
|
{
|
Object val = status.getValue();
|
assertEquals(val, value);
|
}
|
else
|
{
|
assertTrue(status == null);
|
}
|
}
|
|
/**
|
* Test that disabling JMX connection handler does its job by
|
* - opening a JMX connection
|
* - changing the JMX connection handler state to disable
|
* - trying to open a new JMX connection and check that it fails.
|
*
|
* @throws Exception
|
*/
|
@Test()
|
public void disable() throws Exception
|
{
|
JMXConnector jmxc = connect("cn=directory manager", "password");
|
assertNotNull(jmxc);
|
// This test can not pass at the moment
|
// because disabling JMX through JMX is not possible
|
// see Issue 620
|
// disableJmx(jmxc);
|
// JMXConnector jmxcDisabled = connect("cn=directory manager", "password");
|
// assertNull(jmxcDisabled);
|
}
|
|
/**
|
* Connect to the JMX service.
|
* @param user
|
* @param password
|
* @return
|
* @throws MalformedURLException
|
* @throws IOException
|
*/
|
private JMXConnector connect(String user, String password)
|
throws MalformedURLException, IOException
|
{
|
HashMap<String, String[]> env = new HashMap<String, String[]>();
|
|
// Provide the credentials required by the server to successfully
|
// perform user authentication
|
//
|
String[] credentials;
|
if ((user == null) && (password == null))
|
{
|
credentials = null;
|
}
|
else
|
credentials = new String[] { user , password };
|
env.put("jmx.remote.credentials", credentials);
|
|
// Create an RMI connector client and
|
// connect it to the RMI connector server
|
//
|
|
JMXServiceURL url = new JMXServiceURL(
|
"service:jmx:rmi:///jndi/rmi://localhost:1689/org.opends.server.protocols.jmx.client-unknown");
|
|
JMXConnector jmxc = null;
|
try
|
{
|
jmxc = JMXConnectorFactory.connect(url, env);
|
} catch (SecurityException e)
|
{}
|
return jmxc;
|
}
|
|
/**
|
* disable the JMX front-end thorugh JMX operation.
|
* @throws IOException
|
* @throws DirectoryException
|
* @throws NullPointerException
|
* @throws MalformedObjectNameException
|
* @throws ReflectionException
|
* @throws MBeanException
|
* @throws InstanceNotFoundException
|
* @throws AttributeNotFoundException
|
*
|
*/
|
private void disableJmx(JMXConnector jmxc)
|
throws Exception
|
{
|
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
|
|
// Get status of the JMX connection handler
|
String jmxName = JMXMBean.getJmxName(
|
DN.decode("cn=JMX Connection Handler,cn=Connection Handlers,cn=config"));
|
ObjectName name = ObjectName.getInstance(jmxName);
|
Attribute status = (Attribute) mbsc.getAttribute(name,
|
"ds-cfg-connection-handler-enabled");
|
if (status != null)
|
status.getValue();
|
Attribute attr = new Attribute("ds-cfg-connection-handler-enabled", false);
|
mbsc.setAttribute(name, attr);
|
status = (Attribute) mbsc.getAttribute(name,
|
"ds-cfg-connection-handler-enabled");
|
|
status = null;
|
}
|
}
|