/*
* 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.blueprint.impl;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.aries.jmx.blueprint.BlueprintMetadataMBean;
import org.jmock.Expectations;
import org.jmock.Mockery;
import org.jmock.integration.junit4.JMock;
import org.jmock.integration.junit4.JUnit4Mockery;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.Version;
import org.osgi.service.blueprint.container.BlueprintContainer;
import org.osgi.service.blueprint.reflect.BeanMetadata;
import org.osgi.service.blueprint.reflect.ServiceMetadata;
@RunWith(JMock.class)
public class BlueprintMetadataTest {
private BlueprintMetadata metadata;
private Mockery mockery = new JUnit4Mockery();
private BundleContext mockContext;
private Bundle mockBundle;
private ServiceReference[] mockServiceReferences = new ServiceReference[1];
//private ServiceReference mockServiceReference;
private BlueprintContainer mockContainer;
private ServiceMetadata mockServiceMetadata;
private BeanMetadata mockBeanMetadata;
@Before
public void setUp() throws Exception {
mockContext = mockery.mock(BundleContext.class);
mockBundle = mockery.mock(Bundle.class);
mockServiceReferences[0] = mockery.mock(ServiceReference.class);
mockContainer = mockery.mock(BlueprintContainer.class);
mockServiceMetadata = mockery.mock(ServiceMetadata.class);
mockBeanMetadata = mockery.mock(BeanMetadata.class);
metadata = new BlueprintMetadata(mockContext);
}
@After
public void tearDown() throws Exception {
}
@Test
public void validGetBlueprintContainerServiceId() throws Exception {
final long bundleId = 12;
final long serviceId = 7117;
mockery.checking(new Expectations() {
{
allowing(mockContext).getBundle(bundleId);
will(returnValue(mockBundle));
oneOf(mockContext).getServiceReferences(with(any(String.class)), with(any(String.class)));
will(returnValue(mockServiceReferences));
}
});
// is there any need?
mockery.checking(new Expectations() {
{
allowing(mockBundle).getSymbolicName();
will(returnValue("org.apache.geronimo.blueprint.testXXX"));
allowing(mockBundle).getVersion();
will(returnValue(Version.emptyVersion));
}
});
mockery.checking(new Expectations() {
{
allowing(mockServiceReferences[0]).getProperty(Constants.SERVICE_ID);
will(returnValue(serviceId));
}
});
assertEquals(serviceId, metadata.getBlueprintContainerServiceId(bundleId));
}
@Test
public void invalidParaInGetBlueprintContainerServiceId() throws Exception
{
mockery.checking(new Expectations() {
{
allowing(mockContext).getBundle(with(any(Long.class)));
will(returnValue(null));
}
});
try{
metadata.getBlueprintContainerServiceId(-10);
} catch(Exception ex)
{
assertTrue(ex instanceof IllegalArgumentException);
}
}
@Test
public void cannotFindAssociatedContainerServiceId() throws Exception
{
final long bundleId = 12;
mockery.checking(new Expectations() {
{
allowing(mockContext).getBundle(bundleId);
will(returnValue(mockBundle));
oneOf(mockContext).getServiceReferences(with(any(String.class)), with(any(String.class)));
//return null if no services are registered which satisfy the search
will(returnValue(null));
}
});
// is there any need?
mockery.checking(new Expectations() {
{
allowing(mockBundle).getSymbolicName();
will(returnValue("org.apache.geronimo.blueprint.testXXX"));
allowing(mockBundle).getVersion();
will(returnValue(Version.emptyVersion));
}
});
assertEquals(-1, metadata.getBlueprintContainerServiceId(bundleId));
}
@Test
public void normalBlueprintContainerServiceIds() throws Exception {
final long serviceId = 7117;
final long [] serviceIds = new long[]{serviceId};
mockery.checking(new Expectations() {
{
oneOf(mockContext).getServiceReferences(with(any(String.class)), with(any(String.class)));
will(returnValue(mockServiceReferences));
}
});
mockery.checking(new Expectations() {
{
allowing(mockServiceReferences[0]).getProperty(Constants.SERVICE_ID);
will(returnValue(serviceId));
}
});
assertArrayEquals(serviceIds, metadata.getBlueprintContainerServiceIds());
}
@Test
public void noBlueprintContainerServiceIds() throws Exception
{//It is impossible according to osgi spec, here just test the robustness of code
mockery.checking(new Expectations() {
{
oneOf(mockContext).getServiceReferences(with(any(String.class)), with(any(String.class)));
//return null if no services are registered which satisfy the search
will(returnValue(null));
}
});
assertNull(metadata.getBlueprintContainerServiceIds());
}
@Test
public void nomalGetComponentIds() throws Exception {
final long serviceId = 7117;
final Set cidset = getAsSet(new String[]{".component-1", ".component-2", ".component-5"});
mockery.checking(new Expectations(){
{
oneOf(mockContext).getServiceReferences(with(any(String.class)), with(any(String.class)));
will(returnValue(mockServiceReferences));
oneOf(mockContext).getService(mockServiceReferences[0]);
will(returnValue(mockContainer));
}
});
mockery.checking(new Expectations(){
{
oneOf(mockContainer).getComponentIds();
will(returnValue(cidset));
}
});
assertEquals(cidset, getAsSet(metadata.getComponentIds(serviceId)));
}
@Test
public void normalGetComponentIdsByType() throws Exception {
final long serviceId = 7117;
final String [] cidarray = new String[]{".component-1"};
final Collection cMetadatas = new ArrayList();
cMetadatas.add(mockServiceMetadata);
mockery.checking(new Expectations(){
{
oneOf(mockContext).getServiceReferences(with(any(String.class)), with(any(String.class)));
will(returnValue(mockServiceReferences));
oneOf(mockContext).getService(mockServiceReferences[0]);
will(returnValue(mockContainer));
}
});
mockery.checking(new Expectations(){
{
oneOf(mockContainer).getMetadata(ServiceMetadata.class);
will(returnValue(cMetadatas));
}
});
mockery.checking(new Expectations(){
{
oneOf(mockServiceMetadata).getId();
will(returnValue(cidarray[0]));
}
});
assertArrayEquals(cidarray,
metadata.getComponentIdsByType(serviceId, BlueprintMetadataMBean.SERVICE_METADATA));
}
public void invalidParaInGetComponentIdsByType() throws Exception {
final long serviceId = 7117;
mockery.checking(new Expectations(){
{
allowing(mockContext).getServiceReferences(with(any(String.class)), with(any(String.class)));
will(returnValue(mockServiceReferences));
allowing(mockContext).getService(mockServiceReferences[0]);
will(returnValue(mockContainer));
}
});
try {
metadata.getComponentIdsByType(serviceId, null);
}catch(Exception ex)
{
assertTrue(ex instanceof IllegalArgumentException);
}
try {
metadata.getComponentIdsByType(serviceId, BlueprintMetadataMBean.COMPONENT_METADATA);
}catch(Exception ex)
{
assertTrue(ex instanceof IllegalArgumentException);
}
}
@Test
public void testGetComponentMetadata() throws Exception {
final long serviceId = 7117;
final String componentId = ".component-1";
final String [] cidarray = new String[]{componentId};
final List emptyList = new ArrayList();
mockery.checking(new Expectations(){
{
oneOf(mockContext).getServiceReferences(with(any(String.class)), with(any(String.class)));
will(returnValue(mockServiceReferences));
oneOf(mockContext).getService(mockServiceReferences[0]);
will(returnValue(mockContainer));
}
});
mockery.checking(new Expectations(){
{
oneOf(mockContainer).getComponentMetadata(componentId);
will(returnValue(mockBeanMetadata));
}
});
mockery.checking(new Expectations(){
{
allowing(mockBeanMetadata).getDependsOn();
will(returnValue(emptyList));
allowing(mockBeanMetadata).getArguments();
will(returnValue(emptyList));
allowing(mockBeanMetadata).getFactoryComponent();
will(returnValue(null));
allowing(mockBeanMetadata).getProperties();
will(returnValue(emptyList));
ignoring(mockBeanMetadata);
}
});
metadata.getComponentMetadata(serviceId, componentId);
mockery.assertIsSatisfied();
}
@Test
public void fail2GetBlueprintContainer() throws Exception
{
final long serviceId = 7117;
mockery.checking(new Expectations(){
{
exactly(3).of(mockContext).getServiceReferences(with(any(String.class)), with(any(String.class)));
will(returnValue(null));
}
});
try{
metadata.getComponentIds(serviceId);
}catch(Exception ex)
{
assertTrue(ex instanceof IOException);
}
try{
metadata.getComponentIdsByType(serviceId, BlueprintMetadataMBean.SERVICE_METADATA);
}catch(Exception ex)
{
assertTrue(ex instanceof IOException);
}
try{
metadata.getComponentMetadata(serviceId, "xxxx");
}catch(Exception ex)
{
assertTrue(ex instanceof IOException);
}
}
private Set getAsSet(String[] data) {
Set dataSet = new HashSet();
dataSet.addAll(Arrays.asList(data));
return dataSet;
}
}