@RunWith(PaxExam.class)
public class ResourceDependencyTest extends TestBase {
@Test
public void testResourceDependency() {
DependencyManager m = new DependencyManager(context);
// helper class that ensures certain steps get executed in sequence
Ensure e = new Ensure();
// create a service provider and consumer
ResourceConsumer c = new ResourceConsumer(e);
Component consumer = m.createComponent()
.setImplementation(c)
.add(m.createResourceDependency()
.setFilter("(&(path=/path/to/*.txt)(host=localhost))")
.setCallbacks("add", "change", "remove"));
Component dynamicProxyConsumer = m.createComponent()
.setFactory(new ResourceConsumerFactory(e), "create")
.add(m.createResourceDependency()
.setFilter("(path=*.doc)")
.setCallbacks("add", null));
ResourceProvider provider = new ResourceProvider(e);
Component resourceProvider = m.createComponent()
.setImplementation(provider)
.add(m.createServiceDependency()
.setService(ResourceHandler.class)
.setCallbacks("add", "remove"));
// first add the consumer
m.add(consumer);
// then the resource provider, which will provide 3 resources,
// 2 of which match the consumers filter conditions
m.add(resourceProvider);
// make sure our consumer invoked openStream() on both resources,
// increasing the step counter to 2
e.step(3);
// now add another consumer, that matches only one resource, and uses
// a dynamic proxy as its implementation
m.add(dynamicProxyConsumer);
// ensure the resource was injected properly
e.waitForStep(4, 5000);
// now change a resource and see if it gets propagated to the consumer
provider.changeResource();
// wait for change callback
e.waitForStep(5, 5000);
e.step(6);
// cleanup
m.remove(dynamicProxyConsumer);
m.remove(resourceProvider);
m.remove(consumer);
// validate that all consumed resources are "unconsumed" again
c.ensure();
}