| /** |
| * 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.aries.jmx; |
| |
| import static org.junit.Assert.assertNotNull; |
| import static org.ops4j.pax.exam.CoreOptions.composite; |
| import static org.ops4j.pax.exam.CoreOptions.junitBundles; |
| import static org.ops4j.pax.exam.CoreOptions.mavenBundle; |
| import static org.ops4j.pax.exam.CoreOptions.provision; |
| import static org.ops4j.pax.exam.CoreOptions.streamBundle; |
| import static org.ops4j.pax.exam.CoreOptions.systemProperty; |
| import static org.ops4j.pax.exam.CoreOptions.vmOption; |
| import static org.ops4j.pax.exam.CoreOptions.when; |
| import static org.ops4j.pax.tinybundles.core.TinyBundles.bundle; |
| import static org.ops4j.pax.tinybundles.core.TinyBundles.withBnd; |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.ByteArrayOutputStream; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.util.Properties; |
| import java.util.Set; |
| |
| import javax.inject.Inject; |
| import javax.management.MBeanServer; |
| import javax.management.MBeanServerInvocationHandler; |
| import javax.management.ObjectName; |
| |
| import org.apache.aries.jmx.test.MbeanServerActivator; |
| import org.junit.runner.RunWith; |
| import org.ops4j.pax.exam.Option; |
| import org.ops4j.pax.exam.junit.PaxExam; |
| import org.ops4j.pax.exam.options.MavenArtifactProvisionOption; |
| import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy; |
| import org.ops4j.pax.exam.spi.reactors.PerClass; |
| import org.osgi.framework.Bundle; |
| import org.osgi.framework.Constants; |
| import org.osgi.framework.ServiceReference; |
| |
| /** |
| * @version $Rev$ $Date$ |
| */ |
| @RunWith(PaxExam.class) |
| @ExamReactorStrategy(PerClass.class) |
| public abstract class AbstractIntegrationTest extends org.apache.aries.itest.AbstractIntegrationTest { |
| protected ServiceReference reference; |
| |
| @Inject |
| protected MBeanServer mbeanServer; |
| |
| public Option baseOptions() { |
| String localRepo = System.getProperty("maven.repo.local"); |
| if (localRepo == null) { |
| localRepo = System.getProperty("org.ops4j.pax.url.mvn.localRepository"); |
| } |
| return composite( |
| junitBundles(), |
| // this is how you set the default log level when using pax |
| // logging (logProfile) |
| systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("INFO"), |
| when(localRepo != null).useOptions(vmOption("-Dorg.ops4j.pax.url.mvn.localRepository=" + localRepo)) |
| ); |
| } |
| |
| protected Option jmxRuntime() { |
| return composite( |
| baseOptions(), |
| mavenBundle("org.osgi", "org.osgi.compendium").versionAsInProject(), |
| mavenBundle("org.apache.aries", "org.apache.aries.util").versionAsInProject(), |
| mavenBundle("org.apache.felix", "org.apache.felix.configadmin").versionAsInProject(), |
| mavenBundle("org.apache.aries.jmx", "org.apache.aries.jmx").versionAsInProject(), |
| mavenBundle("org.apache.aries.jmx", "org.apache.aries.jmx.core.whiteboard").versionAsInProject(), |
| mavenBundle("org.apache.aries.jmx", "org.apache.aries.jmx.api").versionAsInProject(), |
| mavenBundle("org.apache.aries.jmx", "org.apache.aries.jmx.whiteboard").versionAsInProject(), |
| mavenBundle("org.apache.aries.testsupport", "org.apache.aries.testsupport.unit").versionAsInProject(), |
| mbeanServerBundle() |
| ); |
| } |
| |
| protected Option mbeanServerBundle() { |
| return provision(bundle() |
| .add(MbeanServerActivator.class) |
| .set(Constants.BUNDLE_ACTIVATOR, MbeanServerActivator.class.getName()) |
| .build(withBnd())); |
| } |
| |
| protected Option bundlea() { |
| return provision(bundle() |
| .add(org.apache.aries.jmx.test.bundlea.Activator.class) |
| .add(org.apache.aries.jmx.test.bundlea.api.InterfaceA.class) |
| .add(org.apache.aries.jmx.test.bundlea.impl.A.class) |
| .set(Constants.BUNDLE_SYMBOLICNAME, "org.apache.aries.jmx.test.bundlea") |
| .set(Constants.BUNDLE_VERSION, "2.0.0") |
| .set(Constants.EXPORT_PACKAGE, "org.apache.aries.jmx.test.bundlea.api;version=2.0.0") |
| .set(Constants.IMPORT_PACKAGE, |
| "org.osgi.framework;version=1.5.0,org.osgi.util.tracker,org.apache.aries.jmx.test.bundleb.api;version=1.1.0;resolution:=optional" + |
| ",org.osgi.service.cm") |
| .set(Constants.BUNDLE_ACTIVATOR, |
| org.apache.aries.jmx.test.bundlea.Activator.class.getName()) |
| .build(withBnd())); |
| } |
| |
| protected Option bundleb() { |
| return provision(bundle() |
| .add(org.apache.aries.jmx.test.bundleb.Activator.class) |
| .add(org.apache.aries.jmx.test.bundleb.api.InterfaceB.class) |
| .add(org.apache.aries.jmx.test.bundleb.api.MSF.class) |
| .add(org.apache.aries.jmx.test.bundleb.impl.B.class) |
| .set(Constants.BUNDLE_SYMBOLICNAME,"org.apache.aries.jmx.test.bundleb") |
| .set(Constants.BUNDLE_VERSION, "1.0.0") |
| .set(Constants.EXPORT_PACKAGE,"org.apache.aries.jmx.test.bundleb.api;version=1.1.0") |
| .set(Constants.IMPORT_PACKAGE,"org.osgi.framework;version=1.5.0,org.osgi.util.tracker," + |
| "org.osgi.service.cm,org.apache.aries.jmx.test.fragmentc") |
| .set(Constants.BUNDLE_ACTIVATOR, |
| org.apache.aries.jmx.test.bundleb.Activator.class.getName()) |
| .build(withBnd())); |
| } |
| |
| protected Option fragmentc() { |
| return streamBundle(bundle() |
| .add(org.apache.aries.jmx.test.fragmentc.C.class) |
| .set(Constants.BUNDLE_SYMBOLICNAME, "org.apache.aries.jmx.test.fragc") |
| .set(Constants.FRAGMENT_HOST, "org.apache.aries.jmx.test.bundlea") |
| .set(Constants.EXPORT_PACKAGE, "org.apache.aries.jmx.test.fragmentc") |
| .build(withBnd())).noStart(); |
| } |
| |
| protected Option bundled() { |
| return provision(bundle() |
| .set(Constants.BUNDLE_SYMBOLICNAME, "org.apache.aries.jmx.test.bundled") |
| .set(Constants.BUNDLE_VERSION, "3.0.0") |
| .set(Constants.REQUIRE_BUNDLE, "org.apache.aries.jmx.test.bundlea;bundle-version=2.0.0") |
| .build(withBnd())); |
| } |
| |
| protected Option bundlee() { |
| return provision(bundle() |
| .set(Constants.BUNDLE_SYMBOLICNAME, "org.apache.aries.jmx.test.bundlee") |
| .set(Constants.BUNDLE_DESCRIPTION, "%desc") |
| .add("OSGI-INF/l10n/bundle.properties", getBundleProps("desc", "Description")) |
| .add("OSGI-INF/l10n/bundle_nl.properties", getBundleProps("desc", "Omschrijving")) |
| .build(withBnd())); |
| } |
| |
| private InputStream getBundleProps(String key, String value) { |
| try { |
| Properties p = new Properties(); |
| p.put(key, value); |
| ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
| p.store(baos, ""); |
| return new ByteArrayInputStream(baos.toByteArray()); |
| } catch (IOException e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| protected ObjectName waitForMBean(String name) { |
| return waitForMBean(name, 20); |
| } |
| |
| protected ObjectName waitForMBean(String name, int timeoutInSeconds) { |
| int i=0; |
| while (true) { |
| ObjectName queryName; |
| try { |
| queryName = new ObjectName(name.toString() + ",*"); |
| } catch (Exception e) { |
| throw new IllegalArgumentException("Invalid name " + name, e); |
| } |
| Set<ObjectName> result = mbeanServer.queryNames(queryName, null); |
| if (result.size() > 0) |
| return result.iterator().next(); |
| |
| if (i == timeoutInSeconds * 10) |
| throw new RuntimeException(name + " mbean is not available after waiting " + timeoutInSeconds + " seconds"); |
| |
| i++; |
| try { |
| Thread.sleep(100); |
| } catch (InterruptedException e) { |
| } |
| } |
| } |
| |
| protected <T> T getMBean(String name, Class<T> type) { |
| ObjectName objectName = waitForMBean(name); |
| return getMBean(objectName, type); |
| } |
| |
| protected <T> T getMBean(ObjectName objectName, Class<T> type) { |
| return MBeanServerInvocationHandler.newProxyInstance(mbeanServer, objectName, type, false); |
| } |
| |
| protected Bundle getBundleByName(String symName) { |
| Bundle b = context().getBundleByName(symName); |
| assertNotNull("Bundle " + symName + "should be installed", b); |
| return b; |
| } |
| } |