/****************************************************************************** * Copyright (c) 2006, 2010 VMware Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Apache License v2.0 which accompanies this distribution. * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html and the Apache License v2.0 * is available at http://www.opensource.org/licenses/apache2.0.php. * You may elect to redistribute this code under either of these licenses. * * Contributors: * VMware Inc. *****************************************************************************/ package org.eclipse.gemini.blueprint.test.parsing; import java.lang.reflect.Field; import java.util.jar.Manifest; import javax.print.event.PrintEvent; import junit.framework.TestCase; import org.eclipse.gemini.blueprint.test.AbstractConfigurableBundleCreatorTests; import org.eclipse.gemini.blueprint.test.parsing.packageA.BaseClassFromAnotherPackageTest; import org.eclipse.gemini.blueprint.test.parsing.packageB.BaseClassFromAnotherPackageAndBundleTest; import org.eclipse.gemini.blueprint.test.parsing.packageC.TestInDifferentPackageThenItsParentsTest; import org.eclipse.gemini.blueprint.test.parsing.packageZ.FinalTestClassTest; import org.osgi.framework.Constants; import org.springframework.util.ObjectUtils; /** * Integration that checks if the class hierarchy is properly parsed. Note this test doesn't run in OSGi, it just * invokes the bytecode parsing. * * @author Costin Leau * */ public class DifferentParentsInDifferentBundlesTest extends TestCase { public void testCheckBaseClassesHierarchy() throws Exception { // create class // make sure the packaging puts some of the tests parent in a different class TestInDifferentPackageThenItsParentsTest test = new TestInDifferentPackageThenItsParentsTest() { }; String importPackage = getImportPackage(test); // check parent package // parent in a different bundle assertTrue("missing parent package not considered", contains(importPackage, BaseClassFromAnotherPackageAndBundleTest.class.getPackage().getName())); // parent in a different package but the same bundle (i.e. no import) assertFalse("contained parent not considered", contains(importPackage, BaseClassFromAnotherPackageTest.class .getPackage().getName())); // check present parent dependencies assertTrue("contained parent dependencies not considered", contains(importPackage, "javax.imageio")); } public void testSuperClassInterfacesConsidered() throws Exception { FinalTestClassTest test = new FinalTestClassTest() { }; String importPackage = getImportPackage(test); // check test interface package assertTrue("interface present on the test class ignored", contains(importPackage, "javax.swing.text")); // check super class interface package assertTrue("interface present on the test class ignored", contains(importPackage, "javax.security.auth.callback")); // check super class interface package assertTrue("interface present on superclass ignored", contains(importPackage, "javax.print")); } public void testAnonymousInnerClasses() throws Exception { FinalTestClassTest test = new FinalTestClassTest() { @Override public int getOffset() { PrintEvent pe = new PrintEvent(new Object()) { }; return pe.hashCode(); } }; String importPackage = getImportPackage(test); } private Manifest getParsedManifestFor(CaseWithVisibleMethodsBaseTest testCase) throws Exception { System.out.println(ObjectUtils.nullSafeToString(testCase.getBundleContentPattern())); Field jarSettings = AbstractConfigurableBundleCreatorTests.class.getDeclaredField("jarSettings"); // initialize settings jarSettings.setAccessible(true); jarSettings.set(null, testCase.getSettings()); Manifest mf = testCase.getManifest(); return mf; } private String getImportPackage(CaseWithVisibleMethodsBaseTest test) throws Exception { Manifest mf = getParsedManifestFor(test); String importPackage = mf.getMainAttributes().getValue(Constants.IMPORT_PACKAGE); // System.out.println("import package value is " + importPackage); return importPackage; } private boolean contains(String text, String item) { return text.indexOf(item) > -1; } }