blob: c5a324da4575cd1ffe425ed2d9ee189d6134a95f [file] [log] [blame]
/*
* 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.
*/
package org.apache.karaf.decanter.collector.jmx;
import org.junit.*;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.service.component.ComponentContext;
import org.osgi.service.component.ComponentInstance;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventAdmin;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.management.*;
import javax.management.remote.*;
import java.net.ServerSocket;
import java.rmi.registry.LocateRegistry;
import java.util.Dictionary;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
public class TestProtocol {
private final static Logger LOGGER = LoggerFactory.getLogger(TestProtocol.class);
private static String jmxRMIServiceURL;
private static String jmxMPServiceURL;
private static JMXConnectorServer rmiConnectorServer;
private static JMXConnectorServer jmxmpConnectorServer;
private static MBeanServer mBeanServer;
@BeforeClass
public static void setup() throws Exception {
// Allocate random ports
ServerSocket serverSocket = new ServerSocket(0);
int rmiPort = serverSocket.getLocalPort();
serverSocket.close();
serverSocket = new ServerSocket(0);
int mpPort = serverSocket.getLocalPort();
serverSocket.close();
jmxRMIServiceURL = "service:jmx:rmi:///jndi/rmi://localhost:" + rmiPort + "/decanter";
jmxMPServiceURL = "service:jmx:jmxmp://localhost:" + mpPort;
LOGGER.info("Using JMX service URL: {}", jmxRMIServiceURL);
JMXServiceURL serviceURL = new JMXServiceURL(jmxRMIServiceURL);
LOGGER.info("Creating the RMI registry");
LocateRegistry.createRegistry(rmiPort);
LOGGER.info("Creating MBeanServer");
mBeanServer = MBeanServerFactory.createMBeanServer();
LOGGER.info("Creating RMI connector server");
rmiConnectorServer = JMXConnectorServerFactory.newJMXConnectorServer(serviceURL, null, mBeanServer);
rmiConnectorServer.start();
LOGGER.info("Creating JMXMP connector server");
jmxmpConnectorServer = JMXConnectorServerFactory.newJMXConnectorServer(new JMXServiceURL("jmxmp", null, mpPort), null, mBeanServer);
jmxmpConnectorServer.start();
ObjectName testObjectName = new ObjectName("decanter.test:type=test");
StandardMBean testMBean = new StandardMBean(new TestMBeanImpl(), TestMBean.class);
LOGGER.info("Registering MBeanTest");
mBeanServer.registerMBean(testMBean, testObjectName);
}
@Test
public void rmiTest() throws Exception {
JmxCollector collector = new JmxCollector();
ComponentContextMock componentContextMock = new ComponentContextMock();
componentContextMock.getProperties().put("type", "jmx-test");
componentContextMock.getProperties().put("url", jmxRMIServiceURL);
DispatcherMock dispatcherMock = new DispatcherMock();
collector.dispatcher = dispatcherMock;
collector.activate(componentContextMock);
collector.run();
Event event = dispatcherMock.getPostedEvents().get(0);
Assert.assertEquals("decanter/collect/jmx/jmx-test/decanter/test", event.getTopic());
Assert.assertEquals("Test", event.getProperty("Test"));
Assert.assertEquals("decanter.test:type=test", event.getProperty("ObjectName"));
Assert.assertEquals(jmxRMIServiceURL, event.getProperty("url"));
}
@Test
public void jmxmpTest() throws Exception {
JmxCollector collector = new JmxCollector();
ComponentContextMock componentContextMock = new ComponentContextMock();
componentContextMock.getProperties().put("type", "jmx-test");
componentContextMock.getProperties().put("url", jmxMPServiceURL);
DispatcherMock dispatcherMock = new DispatcherMock();
collector.dispatcher = dispatcherMock;
collector.activate(componentContextMock);
collector.run();
Event event = dispatcherMock.getPostedEvents().get(0);
Assert.assertEquals("decanter/collect/jmx/jmx-test/decanter/test", event.getTopic());
Assert.assertEquals("Test", event.getProperty("Test"));
Assert.assertEquals("decanter.test:type=test", event.getProperty("ObjectName"));
Assert.assertEquals(jmxMPServiceURL, event.getProperty("url"));
}
@AfterClass
public static void teardown() throws Exception {
rmiConnectorServer.stop();
jmxmpConnectorServer.stop();
}
private class ComponentContextMock implements ComponentContext {
private Properties properties;
public ComponentContextMock() {
this.properties = new Properties();
}
@Override
public Dictionary getProperties() {
return properties;
}
@Override
public Object locateService(String s) {
return null;
}
@Override
public <S> S locateService(String s, ServiceReference<S> serviceReference) {
return null;
}
@Override
public Object[] locateServices(String s) {
return new Object[0];
}
@Override
public BundleContext getBundleContext() {
return null;
}
@Override
public Bundle getUsingBundle() {
return null;
}
@Override
public ComponentInstance getComponentInstance() {
return null;
}
@Override
public void enableComponent(String s) {
}
@Override
public void disableComponent(String s) {
}
@Override
public ServiceReference<?> getServiceReference() {
return null;
}
}
private class DispatcherMock implements EventAdmin {
private List<Event> postedEvents = new LinkedList<>();
private List<Event> sentEvents = new LinkedList<>();
@Override
public void postEvent(Event event) {
postedEvents.add(event);
}
@Override
public void sendEvent(Event event) {
sentEvents.add(event);
}
public List<Event> getPostedEvents() {
return this.postedEvents;
}
public List<Event> getSentEvents() {
return this.sentEvents;
}
}
public interface TestMBean {
String getTest() throws MBeanException;
}
public static class TestMBeanImpl implements TestMBean {
@Override
public String getTest() throws MBeanException {
return "Test";
}
}
}