/* * 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.test.blueprint; import static org.junit.Assert.assertEquals; import static org.ops4j.pax.exam.CoreOptions.composite; import static org.ops4j.pax.exam.CoreOptions.mavenBundle; import java.util.Arrays; import javax.inject.Inject; import javax.management.MBeanServerInvocationHandler; import javax.management.ObjectName; import javax.management.openmbean.TabularData; import org.apache.aries.jmx.AbstractIntegrationTest; import org.apache.aries.jmx.blueprint.BlueprintMetadataMBean; import org.apache.aries.jmx.blueprint.BlueprintStateMBean; import org.apache.aries.jmx.test.blueprint.framework.BeanPropertyValidator; import org.apache.aries.jmx.test.blueprint.framework.BeanValidator; import org.apache.aries.jmx.test.blueprint.framework.BlueprintEventValidator; import org.apache.aries.jmx.test.blueprint.framework.CollectionValidator; import org.apache.aries.jmx.test.blueprint.framework.MapEntryValidator; import org.apache.aries.jmx.test.blueprint.framework.RefValidator; import org.apache.aries.jmx.test.blueprint.framework.ReferenceListValidator; import org.apache.aries.jmx.test.blueprint.framework.ReferenceListenerValidator; import org.apache.aries.jmx.test.blueprint.framework.ReferenceValidator; import org.apache.aries.jmx.test.blueprint.framework.RegistrationListenerValidator; import org.apache.aries.jmx.test.blueprint.framework.ServiceValidator; import org.apache.aries.jmx.test.blueprint.framework.ValueValidator; import org.junit.Before; import org.junit.Test; import org.ops4j.pax.exam.Configuration; import org.ops4j.pax.exam.CoreOptions; import org.ops4j.pax.exam.Option; import org.ops4j.pax.exam.util.Filter; import org.osgi.framework.Bundle; import org.osgi.framework.Constants; import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceReference; import org.osgi.service.blueprint.container.BlueprintContainer; public class BlueprintMBeanTest extends AbstractIntegrationTest { @Inject @Filter("(osgi.blueprint.container.symbolicname=org.apache.aries.blueprint)") BlueprintContainer blueprintExtender; @Inject @Filter("(osgi.blueprint.container.symbolicname=org.apache.aries.blueprint.sample)") BlueprintContainer blueprintSample; private Bundle extender; private Bundle sample; @Configuration public Option[] configuration() { return CoreOptions.options( jmxRuntime(), blueprint(), mavenBundle("org.apache.aries.jmx", "org.apache.aries.jmx.blueprint").versionAsInProject(), mavenBundle("org.apache.aries.blueprint", "org.apache.aries.blueprint.sample").versionAsInProject() ); } protected Option blueprint() { return composite( mavenBundle("org.ow2.asm", "asm-debug-all").versionAsInProject(), mavenBundle("org.apache.aries.proxy", "org.apache.aries.proxy").versionAsInProject(), mavenBundle("org.apache.aries.blueprint", "org.apache.aries.blueprint").versionAsInProject(), mavenBundle("org.apache.aries.blueprint", "org.apache.aries.blueprint.jexl.evaluator").versionAsInProject(), mavenBundle("org.apache.commons", "commons-jexl").versionAsInProject() ); } @Before public void setup() { extender = getBundleByName("org.apache.aries.blueprint"); sample = getBundleByName("org.apache.aries.blueprint.sample"); } @Test public void testBlueprintStateMBean() throws Exception { BlueprintStateMBean stateProxy = getMBean(BlueprintStateMBean.OBJECTNAME, BlueprintStateMBean.class); // test getBlueprintBundleIds long[] bpBundleIds = stateProxy.getBlueprintBundleIds(); assertEquals("The blueprint bundle ids are: " + Arrays.toString(bpBundleIds), 3, bpBundleIds.length); // test getLastEvent BlueprintEventValidator sampleValidator = new BlueprintEventValidator(sample.getBundleId(), extender.getBundleId(), 2); sampleValidator.validate(stateProxy.getLastEvent(sample.getBundleId())); // test getLastEvents TabularData lastEvents = stateProxy.getLastEvents(); assertEquals(BlueprintStateMBean.OSGI_BLUEPRINT_EVENTS_TYPE,lastEvents.getTabularType()); sampleValidator.validate(lastEvents.get(new Long[]{sample.getBundleId()})); } @Test public void testBlueprintMetaDataMBean() throws Exception { //find the Blueprint Sample bundle's container service id String filter = "(&(osgi.blueprint.container.symbolicname=" // no similar one in interfaces + sample.getSymbolicName() + ")(osgi.blueprint.container.version=" + sample.getVersion() + "))"; ServiceReference[] serviceReferences = null; try { serviceReferences = bundleContext.getServiceReferences(BlueprintContainer.class.getName(), filter); } catch (InvalidSyntaxException e) { throw new RuntimeException(e); } long sampleBlueprintContainerServiceId = (Long) serviceReferences[0].getProperty(Constants.SERVICE_ID); //retrieve the proxy object BlueprintMetadataMBean metadataProxy = MBeanServerInvocationHandler.newProxyInstance(mbeanServer, new ObjectName(BlueprintMetadataMBean.OBJECTNAME), BlueprintMetadataMBean.class, false); // test getBlueprintContainerServiceIds long[] bpContainerServiceIds = metadataProxy.getBlueprintContainerServiceIds(); assertEquals(3, bpContainerServiceIds.length); // test getBlueprintContainerServiceId assertEquals(sampleBlueprintContainerServiceId, metadataProxy.getBlueprintContainerServiceId(sample.getBundleId())); // test getComponentMetadata // bean: foo BeanValidator bv_foo = new BeanValidator("org.apache.aries.blueprint.sample.Foo", "init", "destroy"); BeanPropertyValidator bpv_a = property("a", "5"); BeanPropertyValidator bpv_b = property("b", "-1"); BeanPropertyValidator bpv_bar = new BeanPropertyValidator("bar"); bpv_bar.setObjectValueValidator(new RefValidator("bar")); BeanPropertyValidator bpv_currency = property("currency", "PLN"); BeanPropertyValidator bpv_date = property("date", "2009.04.17"); bv_foo.addPropertyValidators(bpv_a, bpv_b, bpv_bar, bpv_currency, bpv_date); bv_foo.validate(metadataProxy.getComponentMetadata(sampleBlueprintContainerServiceId, "foo")); // bean: bar BeanPropertyValidator bpv_value = property("value", "Hello FooBar"); BeanPropertyValidator bpv_context = new BeanPropertyValidator("context"); bpv_context.setObjectValueValidator(new RefValidator("blueprintBundleContext")); CollectionValidator cv = new CollectionValidator("java.util.List"); cv.addCollectionValueValidators( new ValueValidator("a list element"), new ValueValidator("5", "java.lang.Integer")); BeanPropertyValidator bpv_list = new BeanPropertyValidator("list"); bpv_list.setObjectValueValidator(cv); BeanValidator bv_bar = new BeanValidator("org.apache.aries.blueprint.sample.Bar"); bv_bar.addPropertyValidators(bpv_value, bpv_context, bpv_list); bv_bar.validate(metadataProxy.getComponentMetadata(sampleBlueprintContainerServiceId, "bar")); // service: ref=foo, no componentId set. So using it to test getComponentIdsByType. String[] serviceComponentIds = metadataProxy.getComponentIdsByType(sampleBlueprintContainerServiceId, BlueprintMetadataMBean.SERVICE_METADATA); assertEquals("There should be two service components in this sample", 2, serviceComponentIds.length); MapEntryValidator mev = new MapEntryValidator(); mev.setKeyValueValidator(new ValueValidator("key"), new ValueValidator("value")); RegistrationListenerValidator rglrv = new RegistrationListenerValidator("serviceRegistered", "serviceUnregistered"); rglrv.setListenerComponentValidator(new RefValidator("fooRegistrationListener")); ServiceValidator sv = new ServiceValidator(4); sv.setServiceComponentValidator(new RefValidator("foo")); sv.addMapEntryValidator(mev); sv.addRegistrationListenerValidator(rglrv); sv.validate(metadataProxy.getComponentMetadata(sampleBlueprintContainerServiceId, serviceComponentIds[0])); // bean: fooRegistrationListener BeanValidator bv_fooRegistrationListener = new BeanValidator("org.apache.aries.blueprint.sample.FooRegistrationListener"); bv_fooRegistrationListener.validate(metadataProxy.getComponentMetadata(sampleBlueprintContainerServiceId, "fooRegistrationListener")); // reference: ref2 ReferenceListenerValidator rlrv_1 = new ReferenceListenerValidator("bind", "unbind"); rlrv_1.setListenerComponentValidator(new RefValidator("bindingListener")); ReferenceValidator rv = new ReferenceValidator("org.apache.aries.blueprint.sample.InterfaceA", 100); rv.addReferenceListenerValidator(rlrv_1); rv.validate(metadataProxy.getComponentMetadata(sampleBlueprintContainerServiceId, "ref2")); // bean: bindingListener BeanValidator bv_bindingListener = new BeanValidator("org.apache.aries.blueprint.sample.BindingListener"); bv_bindingListener.validate(metadataProxy.getComponentMetadata(sampleBlueprintContainerServiceId, "bindingListener")); // reference-list: ref-list ReferenceListenerValidator rlrv_2 = new ReferenceListenerValidator("bind", "unbind"); rlrv_2.setListenerComponentValidator(new RefValidator("listBindingListener")); ReferenceListValidator rlv_ref_list = new ReferenceListValidator("org.apache.aries.blueprint.sample.InterfaceA"); rlv_ref_list.addReferenceListenerValidator(rlrv_2); rlv_ref_list.validate(metadataProxy.getComponentMetadata(sampleBlueprintContainerServiceId, "ref-list")); // bean: listBindingListener BeanValidator bv_listBindingListener = new BeanValidator("org.apache.aries.blueprint.sample.BindingListener"); bv_listBindingListener.validate(metadataProxy.getComponentMetadata(sampleBlueprintContainerServiceId, "listBindingListener")); // bean: circularReference ReferenceListenerValidator rlrv_3 = new ReferenceListenerValidator("bind", "unbind"); rlrv_3.setListenerComponentValidator(new RefValidator("circularReference")); ReferenceListValidator rlv_2 = new ReferenceListValidator("org.apache.aries.blueprint.sample.InterfaceA", 2); rlv_2.addReferenceListenerValidator(rlrv_3); BeanPropertyValidator bpv_list_2 = new BeanPropertyValidator("list"); bpv_list_2.setObjectValueValidator(rlv_2); BeanValidator bv_circularReference = new BeanValidator("org.apache.aries.blueprint.sample.BindingListener", "init"); bv_circularReference.addPropertyValidators(bpv_list_2); bv_circularReference.validate(metadataProxy.getComponentMetadata(sampleBlueprintContainerServiceId, "circularReference")); } private BeanPropertyValidator property(String name, String expectedValue) { BeanPropertyValidator val = new BeanPropertyValidator(name); val.setObjectValueValidator(new ValueValidator(expectedValue)); return val; } }