/**
* 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.dependency;
import com.liferay.registry.BasicRegistryImpl;
import com.liferay.registry.Filter;
import com.liferay.registry.Registry;
import com.liferay.registry.RegistryUtil;
import com.liferay.registry.internal.TrackedOne;
import com.liferay.registry.internal.TrackedTwo;
import java.util.concurrent.atomic.AtomicBoolean;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
* @author Michael C. Han
*/
public class ServiceDependencyManagerTest {
@Before
public void setUp() {
RegistryUtil.setRegistry(null);
RegistryUtil.setRegistry(new BasicRegistryImpl());
}
@Test
public void testDependenciesFulfilled() {
Registry registry = RegistryUtil.getRegistry();
registry.registerService(TestInterface1.class, new TestInstance1());
registry.registerService(TestInterface2.class, new TestInstance2());
ServiceDependencyManager serviceDependencyManager =
new ServiceDependencyManager();
serviceDependencyManager.addServiceDependencyListener(
new ServiceDependencyListener() {
@Override
public void dependenciesFulfilled() {
}
@Override
public void destroy() {
}
});
serviceDependencyManager.registerDependencies(TestInterface2.class);
}
@Test
public void testNoDependencies() {
Registry registry = RegistryUtil.getRegistry();
registry.registerService(TestInterface1.class, new TestInstance1());
ServiceDependencyManager serviceDependencyManager =
new ServiceDependencyManager();
serviceDependencyManager.addServiceDependencyListener(
new ServiceDependencyListener() {
@Override
public void dependenciesFulfilled() {
Assert.fail();
}
@Override
public void destroy() {
}
});
serviceDependencyManager.registerDependencies(TestInterface2.class);
}
@Test
public void testRegisterClassDependencies() throws InterruptedException {
Registry registry = RegistryUtil.getRegistry();
ServiceDependencyManager serviceDependencyManager =
new ServiceDependencyManager();
final AtomicBoolean dependenciesSatisfied = new AtomicBoolean(false);
serviceDependencyManager.addServiceDependencyListener(
new ServiceDependencyListener() {
@Override
public void dependenciesFulfilled() {
dependenciesSatisfied.set(true);
}
@Override
public void destroy() {
}
});
serviceDependencyManager.registerDependencies(
TrackedOne.class, TrackedTwo.class);
registry.registerService(TrackedOne.class, new TrackedOne());
registry.registerService(
TrackedTwo.class, new TrackedTwo(new TrackedOne()));
Thread.sleep(100);
Assert.assertTrue(dependenciesSatisfied.get());
}
@Test
public void testRegisterFilterAndClassDependencies()
throws InterruptedException {
Registry registry = RegistryUtil.getRegistry();
ServiceDependencyManager serviceDependencyManager =
new ServiceDependencyManager();
final AtomicBoolean dependenciesSatisfied = new AtomicBoolean(false);
serviceDependencyManager.addServiceDependencyListener(
new ServiceDependencyListener() {
@Override
public void dependenciesFulfilled() {
dependenciesSatisfied.set(true);
}
@Override
public void destroy() {
}
});
Filter filter = registry.getFilter(
"(objectClass=" + TrackedOne.class.getName() + ")");
serviceDependencyManager.registerDependencies(
new Class<?>[] {TrackedTwo.class}, new Filter[] {filter});
registry.registerService(TrackedOne.class, new TrackedOne());
registry.registerService(
TrackedTwo.class, new TrackedTwo(new TrackedOne()));
Thread.sleep(100);
Assert.assertTrue(dependenciesSatisfied.get());
}
@Test
public void testRegisterFilterDependencies() throws InterruptedException {
Registry registry = RegistryUtil.getRegistry();
ServiceDependencyManager serviceDependencyManager =
new ServiceDependencyManager();
final AtomicBoolean dependenciesSatisfied = new AtomicBoolean(false);
serviceDependencyManager.addServiceDependencyListener(
new ServiceDependencyListener() {
@Override
public void dependenciesFulfilled() {
dependenciesSatisfied.set(true);
}
@Override
public void destroy() {
}
});
Filter filter1 = registry.getFilter(
"(objectClass=" + TrackedOne.class.getName() + ")");
Filter filter2 = registry.getFilter(
"(objectClass=" + TrackedTwo.class.getName() + ")");
serviceDependencyManager.registerDependencies(filter1, filter2);
registry.registerService(TrackedOne.class, new TrackedOne());
registry.registerService(
TrackedTwo.class, new TrackedTwo(new TrackedOne()));
Thread.sleep(100);
Assert.assertTrue(dependenciesSatisfied.get());
}
@Test
public void testWaitForDependencies() {
Registry registry = RegistryUtil.getRegistry();
final ServiceDependencyManager serviceDependencyManager =
new ServiceDependencyManager();
final AtomicBoolean dependenciesSatisfied = new AtomicBoolean(false);
serviceDependencyManager.addServiceDependencyListener(
new ServiceDependencyListener() {
@Override
public void dependenciesFulfilled() {
dependenciesSatisfied.set(true);
}
@Override
public void destroy() {
}
});
Filter filter1 = registry.getFilter(
"(objectClass=" + TrackedOne.class.getName() + ")");
Filter filter2 = registry.getFilter(
"(objectClass=" + TrackedTwo.class.getName() + ")");
serviceDependencyManager.registerDependencies(filter1, filter2);
Thread dependencyWaiter1 = new Thread(
new Runnable() {
@Override
public void run() {
serviceDependencyManager.waitForDependencies(0);
}
});
dependencyWaiter1.setDaemon(true);
dependencyWaiter1.start();
Thread dependencyWaiter2 = new Thread(
new Runnable() {
@Override
public void run() {
serviceDependencyManager.waitForDependencies(0);
}
});
dependencyWaiter2.setDaemon(true);
dependencyWaiter2.start();
try {
Thread.sleep(250);
registry.registerService(TrackedOne.class, new TrackedOne());
registry.registerService(
TrackedTwo.class, new TrackedTwo(new TrackedOne()));
Thread.sleep(250);
Assert.assertFalse(
"Dependencies 1 should have been fulfilled",
dependencyWaiter1.isAlive());
Assert.assertFalse(
"Dependencies 2 should have been fulfilled",
dependencyWaiter2.isAlive());
Assert.assertTrue(dependenciesSatisfied.get());
}
catch (InterruptedException ie) {
}
}
@Test
public void testWaitForDependenciesUnfilled() {
Registry registry = RegistryUtil.getRegistry();
final ServiceDependencyManager serviceDependencyManager =
new ServiceDependencyManager();
final AtomicBoolean dependenciesSatisfied = new AtomicBoolean(false);
serviceDependencyManager.addServiceDependencyListener(
new ServiceDependencyListener() {
@Override
public void dependenciesFulfilled() {
dependenciesSatisfied.set(true);
}
@Override
public void destroy() {
}
});
Filter filter1 = registry.getFilter(
"(objectClass=" + TrackedOne.class.getName() + ")");
Filter filter2 = registry.getFilter(
"(objectClass=" + TrackedTwo.class.getName() + ")");
serviceDependencyManager.registerDependencies(filter1, filter2);
registry.registerService(TrackedOne.class, new TrackedOne());
Thread dependencyWaiter = new Thread(
new Runnable() {
@Override
public void run() {
serviceDependencyManager.waitForDependencies(100);
}
});
dependencyWaiter.setDaemon(true);
dependencyWaiter.start();
try {
Thread.sleep(250);
if (!dependencyWaiter.isAlive()) {
Assert.assertFalse(dependenciesSatisfied.get());
return;
}
Assert.fail("Dependencies should have timed out");
}
catch (InterruptedException ie) {
}
}
private static class TestInstance1 implements TestInterface1 {
}
private static class TestInstance2 implements TestInterface2 {
}
private interface TestInterface1 {
}
private interface TestInterface2 {
}
}