/******************************************************************************
* 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.service;
import java.io.Serializable;
import java.util.Dictionary;
import java.util.Hashtable;
import junit.framework.TestCase;
import org.easymock.MockControl;
import org.eclipse.gemini.blueprint.util.OsgiFilterUtils;
import org.eclipse.gemini.blueprint.util.OsgiServiceReferenceUtils;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceReference;
import org.eclipse.gemini.blueprint.mock.MockServiceReference;
/**
* @author Costin Leau
*
*/
public class OsgiServiceReferenceUtilsTest extends TestCase {
private String[] classes;
// private Dictionary dict;
private BundleContext context;
private ServiceReference ref1, ref2, ref3;
MockControl ctrl;
/*
* (non-Javadoc)
* @see junit.framework.TestCase#setUp()
*/
protected void setUp() throws Exception {
classes = new String[] { Object.class.getName(), Cloneable.class.getName(), Serializable.class.getName() };
// lowest service reference
Dictionary dict1 = new Hashtable();
dict1.put(Constants.SERVICE_RANKING, new Integer(Integer.MIN_VALUE));
ref1 = new MockServiceReference(null, dict1, null);
// neutral service reference
Dictionary dict2 = new Hashtable();
dict2.put(Constants.SERVICE_ID, new Long(20));
ref2 = new MockServiceReference(null, dict2, null);
// neutral service reference
Dictionary dict3 = new Hashtable();
dict3.put(Constants.SERVICE_ID, new Long(30));
ref3 = new MockServiceReference(null, dict3, null);
ctrl = MockControl.createStrictControl(BundleContext.class);
context = (BundleContext) ctrl.getMock();
}
/*
* (non-Javadoc)
* @see junit.framework.TestCase#tearDown()
*/
protected void tearDown() throws Exception {
classes = null;
}
/**
* Test method for
* {@link org.eclipse.gemini.blueprint.util.OsgiServiceReferenceUtils#getServiceReference(org.osgi.framework.BundleContext, java.lang.String[])}.
*/
public void testServiceSortingAlgorithm() throws Exception {
String filter = OsgiFilterUtils.unifyFilter(classes, null);
ctrl.expectAndReturn(context.getServiceReferences(classes[0], filter), new ServiceReference[] { ref1 });
ctrl.replay();
ServiceReference ref = OsgiServiceReferenceUtils.getServiceReference(context, classes, null);
assertSame("wrong service reference picked up", ref1, ref);
ctrl.verify();
}
/**
* Test method for
* {@link org.eclipse.gemini.blueprint.util.OsgiServiceReferenceUtils#getServiceReference(org.osgi.framework.BundleContext, java.lang.String, java.lang.String)}.
*/
public void testGetServiceReferenceBundleContextStringString() throws Exception {
ctrl.expectAndReturn(context.getServiceReferences(Object.class.getName(), null), new ServiceReference[] { ref1,
ref3, ref2 });
ctrl.replay();
// ref2 should win since it has the highest ranking and the lowest id
ServiceReference ref = OsgiServiceReferenceUtils.getServiceReference(context, Object.class.getName(), null);
assertSame("wrong service reference picked up", ref2, ref);
ctrl.verify();
}
/**
* Test method for
* {@link org.eclipse.gemini.blueprint.util.OsgiServiceReferenceUtils#getServiceReference(org.osgi.framework.BundleContext, java.lang.String[], java.lang.String)}.
*/
public void testGetServiceReferenceBundleContextStringArrayString() throws Exception {
String smallFilter = "(cn=John)";
String filter = OsgiFilterUtils.unifyFilter(classes, smallFilter);
ctrl.expectAndReturn(context.getServiceReferences(Object.class.getName(), filter),
new ServiceReference[] { ref1 });
ctrl.replay();
ServiceReference ref = OsgiServiceReferenceUtils.getServiceReference(context, classes, smallFilter);
assertSame("wrong service reference picked up", ref1, ref);
ctrl.verify();
}
/**
* Test method for
* {@link org.eclipse.gemini.blueprint.util.OsgiServiceReferenceUtils#getServiceReference(org.osgi.framework.BundleContext, java.lang.String)}.
*/
public void testAlwaysGetAnArrayOfServiceReferences() throws Exception {
ctrl.expectAndReturn(context.getServiceReferences(Object.class.getName(), null), null);
ctrl.replay();
ServiceReference[] refs = OsgiServiceReferenceUtils.getServiceReferences(context, Object.class.getName(), null);
assertNotNull(refs);
assertEquals(0, refs.length);
ctrl.verify();
}
/**
* Test method for
* {@link org.eclipse.gemini.blueprint.util.OsgiServiceReferenceUtils#getServiceId(org.osgi.framework.ServiceReference)}.
*/
public void testGetServiceId() {
long id = 12345;
Dictionary dict = new Hashtable();
dict.put(Constants.SERVICE_ID, new Long(id));
ServiceReference ref = new MockServiceReference(null, dict, null);
assertEquals(id, OsgiServiceReferenceUtils.getServiceId(ref));
}
/**
* Test method for
* {@link org.eclipse.gemini.blueprint.util.OsgiServiceReferenceUtils#getServiceRanking(org.osgi.framework.ServiceReference)}.
*/
public void testGetServiceRankingAvailable() {
int ranking = 12345;
Dictionary dict = new Hashtable();
dict.put(Constants.SERVICE_RANKING, new Integer(ranking));
ServiceReference ref = new MockServiceReference(null, dict, null);
assertEquals(ranking, OsgiServiceReferenceUtils.getServiceRanking(ref));
}
public void testGetServiceRankingWithInvalidClass() {
int ranking = 12345;
Dictionary dict = new Hashtable();
dict.put(Constants.SERVICE_RANKING, new Long(ranking));
ServiceReference ref = new MockServiceReference(null, dict, null);
assertEquals(0, OsgiServiceReferenceUtils.getServiceRanking(ref));
}
public void testGetServiceRankingWithNonExistingRanking() {
Dictionary dict = new Hashtable() {
// forbid adding the service ranking
public synchronized Object put(Object key, Object value) {
if (!Constants.SERVICE_RANKING.equals(key))
return super.put(key, value);
return null;
}
};
ServiceReference ref = new MockServiceReference(null, dict, null);
assertNull(ref.getProperty(Constants.SERVICE_RANKING));
assertEquals(0, OsgiServiceReferenceUtils.getServiceRanking(ref));
}
}