/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.registry.internal.test;
import com.liferay.registry.Filter;
import com.liferay.registry.Registry;
import com.liferay.registry.RegistryUtil;
import com.liferay.registry.ServiceReference;
import com.liferay.registry.ServiceRegistration;
import com.liferay.registry.ServiceTracker;
import com.liferay.registry.ServiceTrackerCustomizer;
import com.liferay.registry.internal.InterfaceBoth;
import com.liferay.registry.internal.InterfaceOne;
import com.liferay.registry.internal.InterfaceTwo;
import com.liferay.registry.internal.TrackedOne;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.SortedMap;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.junit.After;
import org.junit.Assert;
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.BundleException;
/**
* @author Raymond Augé
* @author Carlos Sierra Andrés
*/
@RunWith(Arquillian.class)
public class RegistryTest {
@Before
public void setUp() throws BundleException {
_bundle.start();
_registry = RegistryUtil.getRegistry();
}
@After
public void tearDown() throws BundleException {
_bundle.stop();
}
@Test
public void testGetBundleContext() {
Assert.assertNotNull(_bundleContext);
}
@Test
public void testGetRegistry() {
Assert.assertNotNull(_registry);
}
@Test
public void testGetRegistryService() {
org.osgi.framework.ServiceReference<Registry> serviceReference =
_bundleContext.getServiceReference(Registry.class);
Registry registry = _bundleContext.getService(serviceReference);
Assert.assertNotNull(registry);
}
@Test
public void testGetRegistryServiceReference() {
org.osgi.framework.ServiceReference<Registry> serviceReference =
_bundleContext.getServiceReference(Registry.class);
Assert.assertNotNull(serviceReference);
}
@Test
public void testGetServiceByClass() {
InterfaceOne interfaceOne = getInstance();
ServiceRegistration<InterfaceOne> serviceRegistration =
_registry.registerService(InterfaceOne.class, interfaceOne);
Assert.assertNotNull(serviceRegistration);
InterfaceOne registeredInterfaceOne = _registry.getService(
InterfaceOne.class);
Assert.assertEquals(interfaceOne, registeredInterfaceOne);
serviceRegistration.unregister();
}
@Test
public void testGetServiceByClassName() {
InterfaceOne interfaceOne = getInstance();
ServiceRegistration<InterfaceOne> serviceRegistration =
_registry.registerService(InterfaceOne.class, interfaceOne);
Assert.assertNotNull(serviceRegistration);
InterfaceOne registeredInterfaceOne = _registry.getService(
InterfaceOne.class.getName());
Assert.assertEquals(interfaceOne, registeredInterfaceOne);
serviceRegistration.unregister();
}
@Test
public void testGetServiceByClassNameAndFilterString() throws Exception {
InterfaceOne interfaceOneA = getInstance();
ServiceRegistration<InterfaceOne> serviceRegistrationA =
_registry.registerService(InterfaceOne.class, interfaceOneA);
Assert.assertNotNull(serviceRegistrationA);
InterfaceOne interfaceOneB = getInstance();
Map<String, Object> properties = new HashMap<>();
properties.put("a.property", "G");
ServiceRegistration<InterfaceOne> serviceRegistrationB =
_registry.registerService(
InterfaceOne.class, interfaceOneB, properties);
Assert.assertNotNull(serviceRegistrationB);
String filterString = "(a.property=G)";
InterfaceOne[] interfaceOnes = _registry.getServices(
InterfaceOne.class.getName(), filterString);
Assert.assertEquals(
Arrays.toString(interfaceOnes), 1, interfaceOnes.length);
serviceRegistrationA.unregister();
interfaceOnes = _registry.getServices(
InterfaceOne.class.getName(), filterString);
Assert.assertEquals(
Arrays.toString(interfaceOnes), 1, interfaceOnes.length);
serviceRegistrationB.unregister();
interfaceOnes = _registry.getServices(
InterfaceOne.class.getName(), filterString);
Assert.assertNull(interfaceOnes);
}
@Test
public void testGetServiceReferenceByClass() {
InterfaceOne interfaceOne = getInstance();
ServiceRegistration<InterfaceOne> serviceRegistration =
_registry.registerService(InterfaceOne.class, interfaceOne);
Assert.assertNotNull(serviceRegistration);
ServiceReference<InterfaceOne> serviceReference =
_registry.getServiceReference(InterfaceOne.class);
Assert.assertNotNull(serviceReference);
InterfaceOne registeredInterfaceOne = _registry.getService(
serviceReference);
Assert.assertEquals(interfaceOne, registeredInterfaceOne);
serviceRegistration.unregister();
}
@Test
public void testGetServiceReferenceByClassName() {
InterfaceOne interfaceOne = getInstance();
ServiceRegistration<InterfaceOne> serviceRegistration =
_registry.registerService(InterfaceOne.class, interfaceOne);
Assert.assertNotNull(serviceRegistration);
ServiceReference<InterfaceOne> serviceReference =
_registry.getServiceReference(InterfaceOne.class.getName());
Assert.assertNotNull(serviceReference);
InterfaceOne registeredInterfaceOne = _registry.getService(
serviceReference);
Assert.assertEquals(interfaceOne, registeredInterfaceOne);
serviceRegistration.unregister();
}
@Test
public void testGetServiceReferencesByClass() throws Exception {
InterfaceOne interfaceOneA = getInstance();
ServiceRegistration<InterfaceOne> serviceRegistrationA =
_registry.registerService(InterfaceOne.class, interfaceOneA);
Assert.assertNotNull(serviceRegistrationA);
InterfaceOne interfaceOneB = getInstance();
ServiceRegistration<InterfaceOne> serviceRegistrationB =
_registry.registerService(InterfaceOne.class, interfaceOneB);
Assert.assertNotNull(serviceRegistrationB);
Collection<ServiceReference<InterfaceOne>> serviceReferences =
_registry.getServiceReferences(InterfaceOne.class, null);
Assert.assertEquals(
serviceReferences.toString(), 2, serviceReferences.size());
serviceRegistrationA.unregister();
serviceReferences = _registry.getServiceReferences(
InterfaceOne.class, null);
Assert.assertEquals(
serviceReferences.toString(), 1, serviceReferences.size());
serviceRegistrationB.unregister();
serviceReferences = _registry.getServiceReferences(
InterfaceOne.class, null);
Assert.assertEquals(
serviceReferences.toString(), 0, serviceReferences.size());
}
@Test
public void testGetServiceReferencesByClassAndFilterString()
throws Exception {
InterfaceOne interfaceOneA = getInstance();
ServiceRegistration<InterfaceOne> serviceRegistrationA =
_registry.registerService(InterfaceOne.class, interfaceOneA);
Assert.assertNotNull(serviceRegistrationA);
InterfaceOne interfaceOneB = getInstance();
Map<String, Object> properties = new HashMap<>();
properties.put("a.property", "G");
ServiceRegistration<InterfaceOne> serviceRegistrationB =
_registry.registerService(
InterfaceOne.class, interfaceOneB, properties);
Assert.assertNotNull(serviceRegistrationB);
String filterString = "(a.property=G)";
Collection<ServiceReference<InterfaceOne>> serviceReferences =
_registry.getServiceReferences(InterfaceOne.class, filterString);
Assert.assertEquals(
serviceReferences.toString(), 1, serviceReferences.size());
serviceRegistrationA.unregister();
serviceReferences = _registry.getServiceReferences(
InterfaceOne.class, filterString);
Assert.assertEquals(
serviceReferences.toString(), 1, serviceReferences.size());
serviceRegistrationB.unregister();
serviceReferences = _registry.getServiceReferences(
InterfaceOne.class, filterString);
Assert.assertEquals(
serviceReferences.toString(), 0, serviceReferences.size());
}
@Test
public void testGetServiceReferencesByClassName() throws Exception {
InterfaceOne interfaceOneA = getInstance();
ServiceRegistration<InterfaceOne> serviceRegistrationA =
_registry.registerService(InterfaceOne.class, interfaceOneA);
Assert.assertNotNull(serviceRegistrationA);
InterfaceOne interfaceOneB = getInstance();
ServiceRegistration<InterfaceOne> serviceRegistrationB =
_registry.registerService(InterfaceOne.class, interfaceOneB);
Assert.assertNotNull(serviceRegistrationB);
ServiceReference<InterfaceOne>[] serviceReferences =
_registry.getServiceReferences(InterfaceOne.class.getName(), null);
Assert.assertNotNull(serviceReferences);
Assert.assertEquals(
Arrays.toString(serviceReferences), 2, serviceReferences.length);
serviceRegistrationA.unregister();
serviceReferences = _registry.getServiceReferences(
InterfaceOne.class.getName(), null);
Assert.assertEquals(
Arrays.toString(serviceReferences), 1, serviceReferences.length);
serviceRegistrationB.unregister();
serviceReferences = _registry.getServiceReferences(
InterfaceOne.class.getName(), null);
Assert.assertNull(serviceReferences);
}
@Test
public void testGetServiceReferencesByClassNameAndFilterString()
throws Exception {
InterfaceOne interfaceOneA = getInstance();
ServiceRegistration<InterfaceOne> serviceRegistrationA =
_registry.registerService(InterfaceOne.class, interfaceOneA);
Assert.assertNotNull(serviceRegistrationA);
InterfaceOne interfaceOneB = getInstance();
Map<String, Object> properties = new HashMap<>();
properties.put("a.property", "G");
ServiceRegistration<InterfaceOne> serviceRegistrationB =
_registry.registerService(
InterfaceOne.class, interfaceOneB, properties);
Assert.assertNotNull(serviceRegistrationB);
String filterString = "(a.property=G)";
ServiceReference<InterfaceOne>[] serviceReferences =
_registry.getServiceReferences(
InterfaceOne.class.getName(), filterString);
Assert.assertNotNull(serviceReferences);
Assert.assertEquals(
Arrays.toString(serviceReferences), 1, serviceReferences.length);
serviceRegistrationA.unregister();
serviceReferences = _registry.getServiceReferences(
InterfaceOne.class.getName(), filterString);
Assert.assertEquals(
Arrays.toString(serviceReferences), 1, serviceReferences.length);
serviceRegistrationB.unregister();
serviceReferences = _registry.getServiceReferences(
InterfaceOne.class.getName(), filterString);
Assert.assertNull(serviceReferences);
}
@Test
public void testGetServicesByClassAndFilterString() throws Exception {
InterfaceOne interfaceOneA = getInstance();
ServiceRegistration<InterfaceOne> serviceRegistrationA =
_registry.registerService(InterfaceOne.class, interfaceOneA);
Assert.assertNotNull(serviceRegistrationA);
InterfaceOne interfaceOneB = getInstance();
Map<String, Object> properties = new HashMap<>();
properties.put("a.property", "G");
ServiceRegistration<InterfaceOne> serviceRegistrationB =
_registry.registerService(
InterfaceOne.class, interfaceOneB, properties);
Assert.assertNotNull(serviceRegistrationB);
String filterString = "(a.property=G)";
Collection<InterfaceOne> interfaceOnes = _registry.getServices(
InterfaceOne.class, filterString);
Assert.assertEquals(interfaceOnes.toString(), 1, interfaceOnes.size());
serviceRegistrationA.unregister();
interfaceOnes = _registry.getServices(InterfaceOne.class, filterString);
Assert.assertEquals(interfaceOnes.toString(), 1, interfaceOnes.size());
serviceRegistrationB.unregister();
interfaceOnes = _registry.getServices(InterfaceOne.class, filterString);
Assert.assertEquals(interfaceOnes.toString(), 0, interfaceOnes.size());
}
@Test
public void testRegisterServiceByClass() {
InterfaceOne interfaceOne = getInstance();
ServiceRegistration<InterfaceOne> serviceRegistration =
_registry.registerService(InterfaceOne.class, interfaceOne);
Assert.assertNotNull(serviceRegistration);
ServiceReference<InterfaceOne> serviceReference =
serviceRegistration.getServiceReference();
Assert.assertNotNull(serviceReference);
InterfaceOne registeredInterfaceOne = _registry.getService(
serviceReference);
Assert.assertEquals(interfaceOne, registeredInterfaceOne);
serviceRegistration.unregister();
registeredInterfaceOne = _registry.getService(serviceReference);
Assert.assertNull(registeredInterfaceOne);
}
@Test
public void testRegisterServiceByClassAndProperties() {
InterfaceOne interfaceOne = getInstance();
Map<String, Object> properties = new HashMap<>();
properties.put("a.property", "A");
properties.put("b.property", "B");
ServiceRegistration<InterfaceOne> serviceRegistration =
_registry.registerService(
InterfaceOne.class, interfaceOne, properties);
Assert.assertNotNull(serviceRegistration);
ServiceReference<InterfaceOne> serviceReference =
serviceRegistration.getServiceReference();
Assert.assertNotNull(serviceReference);
Assert.assertEquals("A", serviceReference.getProperty("a.property"));
Assert.assertEquals("B", serviceReference.getProperty("b.property"));
Assert.assertNull(serviceReference.getProperty("c.property"));
serviceRegistration.unregister();
InterfaceOne registeredInterfaceOne = _registry.getService(
serviceReference);
Assert.assertNull(registeredInterfaceOne);
}
@Test
public void testRegisterServiceByClassNames() {
InterfaceBoth interfaceOne = new InterfaceBoth() {};
ServiceRegistration<?> serviceRegistration = _registry.registerService(
new String[] {
InterfaceOne.class.getName(), InterfaceTwo.class.getName()
},
interfaceOne);
Assert.assertNotNull(serviceRegistration);
ServiceReference<?> serviceReference =
serviceRegistration.getServiceReference();
Assert.assertNotNull(serviceReference);
Object registeredInterfaceOne = _registry.getService(serviceReference);
Assert.assertEquals(interfaceOne, registeredInterfaceOne);
Assert.assertTrue(registeredInterfaceOne instanceof InterfaceOne);
Assert.assertTrue(registeredInterfaceOne instanceof InterfaceTwo);
serviceRegistration.unregister();
registeredInterfaceOne = _registry.getService(serviceReference);
Assert.assertNull(registeredInterfaceOne);
}
@Test
public void testRegisterServiceByClassNamesAndProperties() {
Map<String, Object> properties = new HashMap<>();
properties.put("a.property", "E");
properties.put("b.property", "F");
ServiceRegistration<?> serviceRegistration = _registry.registerService(
new String[] {
InterfaceOne.class.getName(), InterfaceTwo.class.getName()
},
new InterfaceBoth() {}, properties);
Assert.assertNotNull(serviceRegistration);
ServiceReference<?> serviceReference =
serviceRegistration.getServiceReference();
Assert.assertNotNull(serviceReference);
Assert.assertEquals("E", serviceReference.getProperty("a.property"));
Assert.assertEquals("F", serviceReference.getProperty("b.property"));
Assert.assertNull(serviceReference.getProperty("c.property"));
serviceRegistration.unregister();
Object registeredInterfaceOne = _registry.getService(serviceReference);
Assert.assertNull(registeredInterfaceOne);
}
@Test
public void testRegisterServiceByFilterString() {
InterfaceOne interfaceOne = getInstance();
ServiceRegistration<InterfaceOne> serviceRegistration =
_registry.registerService(
InterfaceOne.class.getName(), interfaceOne);
Assert.assertNotNull(serviceRegistration);
ServiceReference<InterfaceOne> serviceReference =
serviceRegistration.getServiceReference();
Assert.assertNotNull(serviceReference);
InterfaceOne registeredInterfaceOne = _registry.getService(
serviceReference);
Assert.assertEquals(interfaceOne, registeredInterfaceOne);
serviceRegistration.unregister();
registeredInterfaceOne = _registry.getService(serviceReference);
Assert.assertNull(registeredInterfaceOne);
}
@Test
public void testRegisterServiceByFilterStringAndProperties() {
InterfaceOne interfaceOne = getInstance();
Map<String, Object> properties = new HashMap<>();
properties.put("a.property", "C");
properties.put("b.property", "D");
ServiceRegistration<InterfaceOne> serviceRegistration =
_registry.registerService(
InterfaceOne.class.getName(), interfaceOne, properties);
Assert.assertNotNull(serviceRegistration);
ServiceReference<InterfaceOne> serviceReference =
serviceRegistration.getServiceReference();
Assert.assertNotNull(serviceReference);
Assert.assertEquals("C", serviceReference.getProperty("a.property"));
Assert.assertEquals("D", serviceReference.getProperty("b.property"));
Assert.assertNull(serviceReference.getProperty("c.property"));
serviceRegistration.unregister();
InterfaceOne registeredInterfaceOne = _registry.getService(
serviceReference);
Assert.assertNull(registeredInterfaceOne);
}
@Test
public void testTrackServicesByClass() {
TestTrackServices testTrackServices = new TestTrackServices() {
@Override
public ServiceTracker<InterfaceOne, InterfaceOne>
getServiceTracker() {
return _registry.trackServices(InterfaceOne.class);
}
};
testTrackServices.test(2);
}
@Test
public void testTrackServicesByClassAndServiceTrackerCustomizer() {
TestTrackServicesByServiceTrackerCustomizer
testTrackServicesByServiceTrackerCustomizer =
new TestTrackServicesByServiceTrackerCustomizer() {
@Override
public ServiceTracker<InterfaceOne, TrackedOne>
getServiceTracker(
ServiceTrackerCustomizer<InterfaceOne, TrackedOne>
serviceTrackerCustomizer) {
return _registry.trackServices(
InterfaceOne.class, serviceTrackerCustomizer);
}
};
testTrackServicesByServiceTrackerCustomizer.test(2, 2, 0, 2);
}
@Test
public void testTrackServicesByClassName() {
TestTrackServices test = new TestTrackServices() {
@Override
public ServiceTracker<InterfaceOne, InterfaceOne>
getServiceTracker() {
return _registry.trackServices(InterfaceOne.class.getName());
}
};
test.test(2);
}
@Test
public void testTrackServicesByClassNameAndServiceTrackerCustomizer() {
TestTrackServicesByServiceTrackerCustomizer
testTrackServicesByServiceTrackerCustomizer =
new TestTrackServicesByServiceTrackerCustomizer() {
@Override
public ServiceTracker<InterfaceOne, TrackedOne>
getServiceTracker(
ServiceTrackerCustomizer<InterfaceOne, TrackedOne>
serviceTrackerCustomizer) {
return _registry.trackServices(
InterfaceOne.class.getName(),
serviceTrackerCustomizer);
}
};
testTrackServicesByServiceTrackerCustomizer.test(2, 2, 0, 2);
}
@Test
public void testTrackServicesByFilter() throws Exception {
TestTrackServices testTrackServices = new TestTrackServices() {
@Override
public ServiceTracker<InterfaceOne, InterfaceOne>
getServiceTracker() {
Filter filter = _registry.getFilter("(a.property=G)");
return _registry.trackServices(filter);
}
};
testTrackServices.test(1);
}
@Test
public void testTrackServicesByFilterAndServiceTrackerCustomizer()
throws Exception {
TestTrackServicesByServiceTrackerCustomizer
testTrackServicesByServiceTrackerCustomizer =
new TestTrackServicesByServiceTrackerCustomizer() {
@Override
public ServiceTracker<InterfaceOne, TrackedOne>
getServiceTracker(
ServiceTrackerCustomizer<InterfaceOne, TrackedOne>
serviceTrackerCustomizer) {
Filter filter = _registry.getFilter("(a.property=G)");
return _registry.trackServices(
filter, serviceTrackerCustomizer);
}
};
testTrackServicesByServiceTrackerCustomizer.test(1, 1, 0, 1);
}
protected InterfaceOne getInstance() {
return new InterfaceOne() {};
}
@ArquillianResource
private Bundle _bundle;
@ArquillianResource
private BundleContext _bundleContext;
private Registry _registry;
private class MockServiceTrackerCustomizer
implements ServiceTrackerCustomizer<InterfaceOne, TrackedOne> {
public MockServiceTrackerCustomizer(
InterfaceOne interfaceOneA, InterfaceOne interfaceOneB,
AtomicReference<TrackedOne> referenceA,
AtomicReference<TrackedOne> referenceB) {
_interfaceOneA = interfaceOneA;
_interfaceOneB = interfaceOneB;
_referenceA = referenceA;
_referenceB = referenceB;
}
@Override
public TrackedOne addingService(
ServiceReference<InterfaceOne> serviceReference) {
InterfaceOne service = _registry.getService(serviceReference);
TrackedOne trackedOne = new TrackedOne();
if (service == _interfaceOneA) {
_referenceA.set(trackedOne);
}
else if (service == _interfaceOneB) {
_referenceB.set(trackedOne);
}
_addingInvocationCount.incrementAndGet();
return trackedOne;
}
public int getAddingInvocationCount() {
return _addingInvocationCount.get();
}
public int getModifiedInvocationCount() {
return _modifiedInvocationCount.get();
}
public int getRemovedInvocationCount() {
return _removedInvocationCount.get();
}
@Override
public void modifiedService(
ServiceReference<InterfaceOne> serviceReference,
TrackedOne trackedOne) {
_modifiedInvocationCount.incrementAndGet();
}
@Override
public void removedService(
ServiceReference<InterfaceOne> serviceReference,
TrackedOne trackedOne) {
_removedInvocationCount.incrementAndGet();
}
private final AtomicInteger _addingInvocationCount = new AtomicInteger(
0);
private final InterfaceOne _interfaceOneA;
private final InterfaceOne _interfaceOneB;
private final AtomicInteger _modifiedInvocationCount =
new AtomicInteger(0);
private final AtomicReference<TrackedOne> _referenceA;
private final AtomicReference<TrackedOne> _referenceB;
private final AtomicInteger _removedInvocationCount = new AtomicInteger(
0);
}
private abstract class TestTrackServices {
public abstract ServiceTracker<InterfaceOne, InterfaceOne>
getServiceTracker();
public void test(int expectedServicesCount) {
ServiceTracker<InterfaceOne, InterfaceOne> serviceTracker =
getServiceTracker();
serviceTracker.open();
Assert.assertTrue(serviceTracker.isEmpty());
Assert.assertEquals(0, serviceTracker.size());
InterfaceOne interfaceOneA = getInstance();
ServiceRegistration<InterfaceOne> serviceRegistrationA =
_registry.registerService(InterfaceOne.class, interfaceOneA);
Assert.assertNotNull(serviceRegistrationA);
InterfaceOne interfaceOneB = getInstance();
Map<String, Object> properties = new HashMap<>();
properties.put("a.property", "G");
ServiceRegistration<InterfaceOne> serviceRegistrationB =
_registry.registerService(
InterfaceOne.class, interfaceOneB, properties);
Assert.assertNotNull(serviceRegistrationB);
Assert.assertFalse(serviceTracker.isEmpty());
Assert.assertEquals(
(expectedServicesCount == 2) ? interfaceOneA : interfaceOneB,
serviceTracker.getService());
Assert.assertEquals(
interfaceOneB,
serviceTracker.getService(
serviceRegistrationB.getServiceReference()));
ServiceReference<InterfaceOne>[] serviceReferences =
serviceTracker.getServiceReferences();
Assert.assertEquals(
Arrays.toString(serviceReferences), expectedServicesCount,
serviceReferences.length);
Object[] services = serviceTracker.getServices();
Assert.assertEquals(
Arrays.toString(services), expectedServicesCount,
services.length);
SortedMap<ServiceReference<InterfaceOne>, InterfaceOne>
trackedServiceReferences =
serviceTracker.getTrackedServiceReferences();
Assert.assertNotNull(trackedServiceReferences);
Assert.assertEquals(
trackedServiceReferences.toString(), expectedServicesCount,
trackedServiceReferences.size());
Assert.assertEquals(
(expectedServicesCount == 2) ? interfaceOneA : interfaceOneB,
trackedServiceReferences.get(
trackedServiceReferences.firstKey()));
Assert.assertEquals(
interfaceOneB,
trackedServiceReferences.get(
trackedServiceReferences.lastKey()));
serviceRegistrationA.unregister();
Assert.assertEquals(1, serviceTracker.size());
serviceRegistrationB.unregister();
Assert.assertEquals(0, serviceTracker.size());
trackedServiceReferences =
serviceTracker.getTrackedServiceReferences();
Assert.assertNotNull(trackedServiceReferences);
Assert.assertEquals(
trackedServiceReferences.toString(), 0,
trackedServiceReferences.size());
serviceTracker.close();
}
}
private abstract class TestTrackServicesByServiceTrackerCustomizer {
public abstract ServiceTracker<InterfaceOne, TrackedOne>
getServiceTracker(
ServiceTrackerCustomizer<InterfaceOne, TrackedOne>
serviceTrackerCustomizer);
public void test(
int expectedServicesCount, int expectedAddingInvocationCount,
int expectedModifiedInvocationCount,
int expectedRemovedInvocationCount) {
InterfaceOne interfaceOneA = getInstance();
InterfaceOne interfaceOneB = getInstance();
AtomicReference<TrackedOne> referenceA = new AtomicReference<>();
AtomicReference<TrackedOne> referenceB = new AtomicReference<>();
MockServiceTrackerCustomizer mockServiceTrackerCustomizer =
new MockServiceTrackerCustomizer(
interfaceOneA, interfaceOneB, referenceA, referenceB);
ServiceTracker<InterfaceOne, TrackedOne> serviceTracker =
getServiceTracker(mockServiceTrackerCustomizer);
serviceTracker.open();
Assert.assertTrue(serviceTracker.isEmpty());
Assert.assertEquals(0, serviceTracker.size());
ServiceRegistration<InterfaceOne> serviceRegistrationA =
_registry.registerService(InterfaceOne.class, interfaceOneA);
Assert.assertNotNull(serviceRegistrationA);
Map<String, Object> properties = new HashMap<>();
properties.put("a.property", "G");
ServiceRegistration<InterfaceOne> serviceRegistrationB =
_registry.registerService(
InterfaceOne.class, interfaceOneB, properties);
Assert.assertNotNull(serviceRegistrationB);
Assert.assertFalse(serviceTracker.isEmpty());
if (expectedServicesCount == 2) {
Assert.assertEquals(
referenceA.get(), serviceTracker.getService());
}
else {
Assert.assertEquals(
referenceB.get(), serviceTracker.getService());
}
Assert.assertEquals(
referenceB.get(),
serviceTracker.getService(
serviceRegistrationB.getServiceReference()));
ServiceReference<InterfaceOne>[] serviceReferences =
serviceTracker.getServiceReferences();
Assert.assertEquals(
Arrays.toString(serviceReferences), expectedServicesCount,
serviceReferences.length);
Object[] services = serviceTracker.getServices();
Assert.assertEquals(
Arrays.toString(services), expectedServicesCount,
services.length);
SortedMap<ServiceReference<InterfaceOne>, TrackedOne>
trackedServiceReferences =
serviceTracker.getTrackedServiceReferences();
Assert.assertNotNull(trackedServiceReferences);
Assert.assertEquals(
trackedServiceReferences.toString(), expectedServicesCount,
trackedServiceReferences.size());
if (expectedServicesCount == 2) {
Assert.assertEquals(
referenceA.get(),
trackedServiceReferences.get(
trackedServiceReferences.firstKey()));
}
else {
Assert.assertEquals(
referenceB.get(),
trackedServiceReferences.get(
trackedServiceReferences.firstKey()));
}
Assert.assertEquals(
referenceB.get(),
trackedServiceReferences.get(
trackedServiceReferences.lastKey()));
serviceRegistrationA.unregister();
Assert.assertEquals(1, serviceTracker.size());
serviceRegistrationB.unregister();
Assert.assertEquals(0, serviceTracker.size());
trackedServiceReferences =
serviceTracker.getTrackedServiceReferences();
Assert.assertNotNull(trackedServiceReferences);
Assert.assertEquals(
trackedServiceReferences.toString(), 0,
trackedServiceReferences.size());
assertInvocationCounts(
mockServiceTrackerCustomizer, expectedAddingInvocationCount,
expectedModifiedInvocationCount,
expectedRemovedInvocationCount);
serviceTracker.close();
}
protected void assertInvocationCounts(
MockServiceTrackerCustomizer mockServiceTrackerCustomizer,
int expectedAddingInvocationCount,
int expectedModifiedInvocationCount,
int expectedRemovedInvocationCount) {
Assert.assertEquals(
expectedAddingInvocationCount,
mockServiceTrackerCustomizer.getAddingInvocationCount());
Assert.assertEquals(
expectedModifiedInvocationCount,
mockServiceTrackerCustomizer.getModifiedInvocationCount());
Assert.assertEquals(
expectedRemovedInvocationCount,
mockServiceTrackerCustomizer.getRemovedInvocationCount());
}
}
}