/******************************************************************************* * Copyright (c) 2011 SAP AG * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Hristo Iliev, SAP AG - initial contribution ******************************************************************************/ package org.eclipse.virgo.kernel.osgicommand.management.test; import org.eclipse.virgo.kernel.test.AbstractKernelIntegrationTest; import org.junit.Test; import javax.management.JMException; import javax.management.MBeanServer; import javax.management.ObjectName; import java.lang.management.ManagementFactory; import java.util.List; import java.util.Map; import java.util.Set; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; /** * Test for testing Class loading support mBean */ public class ClassLoadingSupportMBeanTests extends AbstractKernelIntegrationTest { private final MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); private final ObjectName objectName; { try { objectName = new ObjectName("org.eclipse.virgo.kernel:type=Classloading"); } catch (JMException jme) { throw new RuntimeException(jme); } } private static final String CLASS_NAME = ClassLoadingSupportMBeanTests.class.getName(); private static final String PACKAGE_NAME = ClassLoadingSupportMBeanTests.class.getPackage().getName(); private static final String CLASS_NAME_PATH = CLASS_NAME.replace(".", "/") + ".class"; private static final String SYSTEM_PACKAGE_NAME = "org.osgi.framework"; @Test @SuppressWarnings("unchecked") public void testGetBundlesContainingResource() throws JMException { Map<List<String>, List<String>> result = (Map<List<String>, List<String>>) mBeanServer.invoke(objectName, "getBundlesContainingResource", new Object[]{CLASS_NAME_PATH}, new String[]{String.class.getName()}); assertEquals("Incorrect number of bundles " + result + " contain the test class [" + CLASS_NAME_PATH + "]", 1, result.size()); assertTrue("Bundles " + result + " do not contain class [" + CLASS_NAME_PATH + "]", containsBundleSymbolicName(result.keySet(), super.context.getBundle().getSymbolicName())); assertTrue("Bundle " + super.context.getBundle().getSymbolicName() + " does not contain resource [" + CLASS_NAME_PATH + "]", result.toString().contains(CLASS_NAME_PATH)); } @Test @SuppressWarnings("unchecked") public void testGetBundlesLoadingClass() throws JMException { Map<List<String>, List<String>> result = (Map<List<String>, List<String>>) mBeanServer.invoke(objectName, "getBundlesLoadingClass", new Object[]{CLASS_NAME}, new String[]{String.class.getName()}); assertEquals("Incorrect number of bundles " + result + " can load the test class [" + CLASS_NAME + "]", 2, result.size()); assertTrue("Bundles " + result + " do not contain class [" + CLASS_NAME + "]", containsBundleSymbolicName(result.keySet(), super.context.getBundle().getSymbolicName())); } @Test @SuppressWarnings("unchecked") public void testGetBundlesExportingPackage() throws JMException { List<List<String>> result = (List<List<String>>) mBeanServer.invoke(objectName, "getBundlesExportingPackage", new Object[]{SYSTEM_PACKAGE_NAME}, new String[]{String.class.getName()}); assertEquals("No bundle " + result + " exports the test package [" + SYSTEM_PACKAGE_NAME + "]", 1, result.size()); assertEquals("System bundle [[" + result.get(0).get(0) + "] [" + result.get(0).get(1) + "]] does not contain test package [" + SYSTEM_PACKAGE_NAME + "]", "0", result.get(0).get(0)); result = (List<List<String>>) mBeanServer.invoke(objectName, "getBundlesExportingPackage", new Object[]{PACKAGE_NAME}, new String[]{String.class.getName()}); assertEquals("At least one bundle " + result + " exports the test package [" + PACKAGE_NAME + "]", 0, result.size()); } @Test public void testTryToLoadClassFromBundleWithId() throws JMException { long firstUserRegionBundleId = super.context.getBundles()[0].getBundleId(); String firstUserRegionBundleSN = super.context.getBundles()[0].getSymbolicName(); long testBundleId = super.context.getBundle().getBundleId(); boolean result = (Boolean) mBeanServer.invoke(objectName, "tryToLoadClassFromBundle", new Object[]{CLASS_NAME, testBundleId}, new String[]{String.class.getName(), long.class.getName()}); assertTrue("This test bundle [" + testBundleId + "] cannot load [" + CLASS_NAME + "]", result); result = (Boolean) mBeanServer.invoke(objectName, "tryToLoadClassFromBundle", new Object[]{CLASS_NAME, firstUserRegionBundleId}, new String[]{String.class.getName(), long.class.getName()}); assertTrue("Bundle with ID [" + firstUserRegionBundleId + "] and symbolic name [" + firstUserRegionBundleSN + "] can load [" + CLASS_NAME + "]", result); } private boolean containsBundleSymbolicName(Set<List<String>> set, String bundleSymbolicName) { for (List<String> bundleInformation : set) { if (bundleInformation.get(1).equals(bundleSymbolicName)) { return true; } } return false; } }