blob: de6d1e528a23b43b65c2c6687b9a3abff8daada3 [file] [log] [blame]
package org.eclipse.gemini.mgmt.framework;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.net.MalformedURLException;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanException;
import javax.management.MBeanServer;
import javax.management.MBeanServerConnection;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.ReflectionException;
import javax.management.openmbean.CompositeData;
import javax.management.openmbean.TabularData;
import javax.management.openmbean.TabularDataSupport;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import org.junit.Test;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.startlevel.BundleStartLevel;
import org.osgi.jmx.framework.BundleStateMBean;
import org.eclipse.gemini.mgmt.Activator;
import org.eclipse.gemini.mgmt.framework.internal.OSGiBundle;
import org.eclipse.gemini.mgmt.framework.BundleState;
import org.eclipse.gemini.mgmt.internal.BundleUtil;
public class BundleStateTest {
@Test
public void nameAndVersionTest() throws Exception {
BundleContext bc = FrameworkUtil.getBundle(Activator.class).getBundleContext();
ServiceReference<MBeanServer> ref = bc.getServiceReference(MBeanServer.class);
if (ref == null) {
bc.registerService(MBeanServer.class.getCanonicalName(), ManagementFactory.getPlatformMBeanServer(), null);
}
CompositeData bundleInfo;
String symbolicName;
String version;
Object key;
Object[] keysArray;
Bundle bundle;
int mask = BundleState.SYMBOLIC_NAME + BundleState.IDENTIFIER + BundleState.VERSION;
long start = System.currentTimeMillis();
TabularDataSupport table = jmxInvokeListBundles(mask);
long end = System.currentTimeMillis();
assertTrue((end - start) < 1000);
Set<?> keys = table.keySet();
Iterator<?> iter = keys.iterator();
while (iter.hasNext()) {
key = iter.next();
keysArray = ((Collection<?>) key).toArray();
bundleInfo = (CompositeData) table.get(keysArray);
symbolicName = (String) bundleInfo.get(BundleStateMBean.SYMBOLIC_NAME);
version = (String) bundleInfo.get(BundleStateMBean.VERSION);
bundle = bc.getBundle((Long) keysArray[0]);
assertEquals(symbolicName, bundle.getSymbolicName());
assertEquals(version, bundle.getVersion().toString());
}
}
@SuppressWarnings("unchecked")
@Test
public void fullMaskTest() throws Exception {
CompositeData bundleInfo;
String location;
String symbolicName;
String version;
int startLevel;
String state;
long lastModified;
boolean persistenlyStarted;
boolean removalPending;
boolean required;
boolean fragment;
Long[] registeredServices;
Long[] servicesInUse;
Map<String, CompositeData> headers;
String[] exportedPackages;
String[] importedPackages;
Long[] fragments;
Long[] hosts;
Long[] requiringBundles;
Long[] requiredBundles;
Object key;
Object[] keysArray;
Bundle bundle;
int mask = BundleState.LOCATION + BundleState.IDENTIFIER
+ BundleState.SYMBOLIC_NAME + BundleState.VERSION
+ BundleState.START_LEVEL + BundleState.STATE
+ BundleState.LAST_MODIFIED + BundleState.PERSISTENTLY_STARTED
+ BundleState.REMOVAL_PENDING + BundleState.REQUIRED
+ BundleState.FRAGMENT + BundleState.REGISTERED_SERVICES
+ BundleState.SERVICES_IN_USE + BundleState.HEADERS
+ BundleState.EXPORTED_PACKAGES + BundleState.IMPORTED_PACKAGES
+ BundleState.FRAGMENTS + BundleState.HOSTS
+ BundleState.REQUIRING_BUNDLES + BundleState.REQUIRED_BUNDLES;
TabularDataSupport table = jmxInvokeListBundles(mask);
Set<?> keys = table.keySet();
Iterator<?> iter = keys.iterator();
BundleContext bc = FrameworkUtil.getBundle(BundleState.class).getBundleContext();
while (iter.hasNext()) {
key = iter.next();
keysArray = ((Collection<?>) key).toArray();
bundleInfo = (CompositeData) table.get(keysArray);
location = (String) bundleInfo.get(BundleStateMBean.LOCATION);
symbolicName = (String) bundleInfo.get(BundleStateMBean.SYMBOLIC_NAME);
version = (String) bundleInfo.get(BundleStateMBean.VERSION);
startLevel = ((Integer) bundleInfo.get(BundleStateMBean.START_LEVEL)).intValue();
state = (String) bundleInfo.get(BundleStateMBean.STATE);
lastModified = ((Long) bundleInfo.get(BundleStateMBean.LAST_MODIFIED)).longValue();
persistenlyStarted = ((Boolean) bundleInfo.get(BundleStateMBean.PERSISTENTLY_STARTED)).booleanValue();
removalPending = ((Boolean) bundleInfo.get(BundleStateMBean.REMOVAL_PENDING)).booleanValue();
required = ((Boolean) bundleInfo.get(BundleStateMBean.REQUIRED)).booleanValue();
fragment = ((Boolean) bundleInfo.get(BundleStateMBean.FRAGMENT)).booleanValue();
registeredServices = (Long[]) bundleInfo.get(BundleStateMBean.REGISTERED_SERVICES);
servicesInUse = (Long[]) bundleInfo.get(BundleStateMBean.SERVICES_IN_USE);
headers = (Map<String, CompositeData>) bundleInfo.get(BundleStateMBean.HEADERS);
exportedPackages = (String[]) bundleInfo.get(BundleStateMBean.EXPORTED_PACKAGES);
importedPackages = (String[]) bundleInfo.get(BundleStateMBean.IMPORTED_PACKAGES);
fragments = (Long[]) bundleInfo.get(BundleStateMBean.FRAGMENTS);
hosts = (Long[]) bundleInfo.get(BundleStateMBean.HOSTS);
requiringBundles = (Long[]) bundleInfo.get(BundleStateMBean.REQUIRING_BUNDLES);
requiredBundles = (Long[]) bundleInfo.get(BundleStateMBean.REQUIRED_BUNDLES);
bundle = bc.getBundle((Long) keysArray[0]);
assertEquals(location, bundle.getLocation());
assertEquals(symbolicName, bundle.getSymbolicName());
assertEquals(version, bundle.getVersion().toString());
assertEquals(startLevel, bundle.adapt(BundleStartLevel.class).getStartLevel());
assertEquals(state, stateToString(bundle.getState()));
assertEquals(lastModified, bundle.getLastModified());
assertEquals(persistenlyStarted, BundleUtil.isBundlePersistentlyStarted(bundle));
assertEquals(removalPending, BundleUtil.isRemovalPending(bundle));
assertEquals(required, BundleUtil.isRequired(bundle));
assertEquals(fragment, BundleUtil.isBundleFragment(bundle));
long[] rs = new long[registeredServices.length];
for (int i = 0; i < registeredServices.length; i++) {
rs[i] = registeredServices[i].longValue();
}
long[] rs2 = BundleUtil.serviceIds(bundle.getRegisteredServices());
Arrays.sort(rs);
Arrays.sort(rs2);
assertTrue(Arrays.equals(rs, rs2));
long[] siu = new long[servicesInUse.length];
for (int i = 0; i < servicesInUse.length; i++) {
siu[i] = servicesInUse[i].longValue();
}
Arrays.sort(siu);
long[] siu2 = BundleUtil.serviceIds(bundle.getServicesInUse());
Arrays.sort(siu2);
assertTrue(Arrays.equals(siu, siu2));
assertEquals((TabularData) headers, OSGiBundle.headerTable(BundleUtil.getBundleHeaders(bundle)));
String[] exportedPackages2 = BundleUtil.getBundleExportedPackages(bundle);
Arrays.sort(exportedPackages);
Arrays.sort(exportedPackages2);
assertTrue(Arrays.equals(exportedPackages, exportedPackages2));
String[] importedPackages2 = BundleUtil.getBundleImportedPackages(bundle);
Arrays.sort(importedPackages);
Arrays.sort(importedPackages2);
assertTrue(Arrays.equals(importedPackages, importedPackages2));
long[] frags = new long[fragments.length];
for (int i = 0; i < fragments.length; i++) {
frags[i] = fragments[i].longValue();
}
Arrays.sort(frags);
long[] frags2 = BundleUtil.getBundleFragments(bundle);
Arrays.sort(frags2);
assertTrue(Arrays.equals(frags, frags2));
long[] hst = new long[hosts.length];
for (int i = 0; i < hosts.length; i++) {
hst[i] = hosts[i].longValue();
}
Arrays.sort(hst);
long[] hst2 = BundleUtil.getBundleHosts(bundle);
Arrays.sort(hst2);
assertTrue(Arrays.equals(hst, hst2));
long[] reqB = new long[requiringBundles.length];
for (int i = 0; i < requiringBundles.length; i++) {
reqB[i] = requiringBundles[i].longValue();
}
Arrays.sort(reqB);
long[] reqB2 = BundleUtil.getRequiringBundles(bundle);
Arrays.sort(reqB2);
assertTrue(Arrays.equals(reqB, reqB2));
long[] requiredB = new long[requiredBundles.length];
for (int i = 0; i < requiredBundles.length; i++) {
requiredB[i] = requiredBundles[i].longValue();
}
Arrays.sort(requiredB);
long[] requiredB2 = BundleUtil.getRequiredBundles(bundle);
Arrays.sort(requiredB2);
assertTrue(Arrays.equals(requiredB, requiredB2));
}
}
@Test
public void randomMaskTest() throws Exception {
CompositeData bundleInfo;
String version;
String state;
long lastModified;
boolean persistenlyStarted;
boolean removalPending;
Long[] registeredServices;
Long[] servicesInUse;
String[] exportedPackages;
String[] importedPackages;
Long[] hosts;
Long[] requiringBundles;
Object key;
Object[] keysArray;
Bundle bundle;
int mask = BundleState.IDENTIFIER + BundleState.VERSION
+ BundleState.STATE + BundleState.LAST_MODIFIED
+ BundleState.PERSISTENTLY_STARTED + BundleState.REMOVAL_PENDING
+ BundleState.REGISTERED_SERVICES + BundleState.SERVICES_IN_USE
+ BundleState.EXPORTED_PACKAGES + BundleState.IMPORTED_PACKAGES
+ BundleState.HOSTS + BundleState.REQUIRING_BUNDLES;
TabularDataSupport table = jmxInvokeListBundles(mask);
Set<?> keys = table.keySet();
Iterator<?> iter = keys.iterator();
BundleContext bc = FrameworkUtil.getBundle(BundleState.class).getBundleContext();
while (iter.hasNext()) {
key = iter.next();
keysArray = ((Collection<?>) key).toArray();
bundleInfo = (CompositeData) table.get(keysArray);
version = (String) bundleInfo.get(BundleStateMBean.VERSION);
state = (String) bundleInfo.get(BundleStateMBean.STATE);
lastModified = ((Long) bundleInfo.get(BundleStateMBean.LAST_MODIFIED)).longValue();
persistenlyStarted = ((Boolean) bundleInfo.get(BundleStateMBean.PERSISTENTLY_STARTED)).booleanValue();
removalPending = ((Boolean) bundleInfo.get(BundleStateMBean.REMOVAL_PENDING)).booleanValue();
registeredServices = (Long[]) bundleInfo.get(BundleStateMBean.REGISTERED_SERVICES);
servicesInUse = (Long[]) bundleInfo.get(BundleStateMBean.SERVICES_IN_USE);
exportedPackages = (String[]) bundleInfo.get(BundleStateMBean.EXPORTED_PACKAGES);
importedPackages = (String[]) bundleInfo.get(BundleStateMBean.IMPORTED_PACKAGES);
hosts = (Long[]) bundleInfo.get(BundleStateMBean.HOSTS);
requiringBundles = (Long[]) bundleInfo.get(BundleStateMBean.REQUIRING_BUNDLES);
bundle = bc.getBundle((Long) keysArray[0]);
assertEquals(version, bundle.getVersion().toString());
assertEquals(state, stateToString(bundle.getState()));
assertEquals(lastModified, bundle.getLastModified());
assertEquals(persistenlyStarted, BundleUtil.isBundlePersistentlyStarted(bundle));
assertEquals(removalPending, BundleUtil.isRemovalPending(bundle));
long[] rs = new long[registeredServices.length];
for (int i = 0; i < registeredServices.length; i++) {
rs[i] = registeredServices[i].longValue();
}
long[] rs2 = BundleUtil.serviceIds(bundle.getRegisteredServices());
Arrays.sort(rs);
Arrays.sort(rs2);
assertTrue(Arrays.equals(rs, rs2));
long[] siu = new long[servicesInUse.length];
for (int i = 0; i < servicesInUse.length; i++) {
siu[i] = servicesInUse[i].longValue();
}
Arrays.sort(siu);
long[] siu2 = BundleUtil.serviceIds(bundle.getServicesInUse());
Arrays.sort(siu2);
assertTrue(Arrays.equals(siu, siu2));
String[] exportedPackages2 = BundleUtil.getBundleExportedPackages(bundle);
Arrays.sort(exportedPackages);
Arrays.sort(exportedPackages2);
assertTrue(Arrays.equals(exportedPackages, exportedPackages2));
String[] importedPackages2 = BundleUtil.getBundleImportedPackages(bundle);
Arrays.sort(importedPackages);
Arrays.sort(importedPackages2);
assertTrue(Arrays.equals(importedPackages, importedPackages2));
long[] hst = new long[hosts.length];
for (int i = 0; i < hosts.length; i++) {
hst[i] = hosts[i].longValue();
}
Arrays.sort(hst);
long[] hst2 = BundleUtil.getBundleHosts(bundle);
Arrays.sort(hst2);
assertTrue(Arrays.equals(hst, hst2));
long[] reqB = new long[requiringBundles.length];
for (int i = 0; i < requiringBundles.length; i++) {
reqB[i] = requiringBundles[i].longValue();
}
Arrays.sort(reqB);
long[] reqB2 = BundleUtil.getRequiringBundles(bundle);
Arrays.sort(reqB2);
assertTrue(Arrays.equals(reqB, reqB2));
}
}
private TabularDataSupport jmxInvokeListBundles(int mask)
throws MalformedURLException, IOException,
MalformedObjectNameException, InstanceNotFoundException,
MBeanException, ReflectionException {
JMXConnector connector;
String url = "service:jmx:rmi:///jndi/rmi://localhost:21045/jmxrmi";
JMXServiceURL jmxURL = new JMXServiceURL(url);
connector = JMXConnectorFactory.connect(jmxURL);
MBeanServerConnection connection = connector.getMBeanServerConnection();
ObjectName name = new ObjectName(CustomBundleStateMBean.OBJECTNAME);
TabularDataSupport table = (TabularDataSupport) connection.invoke(name,
"listBundles", new Object[] { new Integer(mask) },
new String[] { "int" });
return table;
}
@Test
public void illegalMaskTest() throws Exception {
// CompositeData bundleInfo;
// String version;
// String state;
// long lastModified;
// boolean persistenlyStarted;
// boolean removalPending;
// Long[] registeredServices;
// Long[] servicesInUse;
// String[] exportedPackages;
// String[] importedPackages;
// Long[] hosts;
// Long[] requiringBundles;
// Object key;
// Object[] keysArray;
// Bundle bundle;
int mask = 1048576;
try {
@SuppressWarnings("unused")
TabularDataSupport table = jmxInvokeListBundles(mask);
fail("Expected exception did not occur!");
} catch (Exception e) {
assertTrue(e.getCause() instanceof IllegalArgumentException);
}
}
private String stateToString(int state) {
String strState = null;
switch (state) {
case 1:
strState = "UNINSTALLED";
break;
case 2:
strState = "INSTALLED";
break;
case 4:
strState = "RESOLVED";
break;
case 8:
strState = "STARTING";
break;
case 16:
strState = "STOPPING";
break;
case 32:
strState = "ACTIVE";
break;
default:
strState = "UNKNOWN";
break;
}
return strState;
}
}