Search in sources :

Example 76 with Ensure

use of org.apache.felix.dm.itest.util.Ensure in project felix by apache.

the class ServiceDependencyPropagateTest method testServiceDependencyPropagateCallback.

/**
 * Checks that a ServiceDependency propagates the dependency service properties to the provided service properties,
 * using a callback method.
 */
public void testServiceDependencyPropagateCallback() {
    DependencyManager m = getDM();
    // helper class that ensures certain steps get executed in sequence
    Ensure e = new Ensure();
    Component c1 = m.createComponent().setImplementation(new C1(e)).add(m.createServiceDependency().setService(C2.class).setRequired(true).setCallbacks("bind", null));
    C2 c2Impl = new C2();
    Component c2 = m.createComponent().setInterface(C2.class.getName(), new Hashtable() {

        {
            put("foo", "bar");
        }
    }).setImplementation(c2Impl).add(m.createServiceDependency().setService(C3.class).setRequired(true).setPropagate(c2Impl, "getServiceProperties"));
    Component c3 = m.createComponent().setInterface(C3.class.getName(), null).setImplementation(new C3());
    m.add(c1);
    m.add(c2);
    m.add(c3);
    e.waitForStep(3, 10000);
    m.clear();
}
Also used : Hashtable(java.util.Hashtable) DependencyManager(org.apache.felix.dm.DependencyManager) Ensure(org.apache.felix.dm.itest.util.Ensure) Component(org.apache.felix.dm.Component)

Example 77 with Ensure

use of org.apache.felix.dm.itest.util.Ensure in project felix by apache.

the class ServiceRaceTest method doTest.

void doTest(int loop) throws Throwable {
    debug("loop#%d -------------------------", loop);
    final Ensure step = new Ensure(false);
    // Create one client component, which depends on many service dependencies
    final Component client = m_dm.createComponent();
    final Client clientImpl = new Client(step);
    client.setImplementation(clientImpl);
    // Create client service dependencies
    final ServiceDependency[] dependencies = new ServiceDependency[DEPENDENCIES];
    for (int i = 0; i < DEPENDENCIES; i++) {
        final String filter = "(id=loop" + loop + "." + i + ")";
        dependencies[i] = m_dm.createServiceDependency().setService(Dep.class, filter).setRequired(true).setCallbacks("add", "remove");
        client.add(dependencies[i]);
    }
    String pid = "pid." + loop;
    final ConfigurationDependency confDependency = m_dm.createConfigurationDependency().setPid(pid);
    client.add(confDependency);
    // Create Configuration (concurrently).
    final Configuration conf = m_cm.getConfiguration(pid, null);
    final Hashtable props = new Hashtable();
    props.put("foo", "bar");
    schedule(new Runnable() {

        public void run() {
            try {
                conf.update(props);
            } catch (IOException e) {
                error("update failed", e);
            }
        }
    });
    // Activate the client service dependencies concurrently.
    List<Component> deps = new ArrayList();
    for (int i = 0; i < DEPENDENCIES; i++) {
        Hashtable h = new Hashtable();
        h.put("id", "loop" + loop + "." + i);
        final Component s = m_dm.createComponent().setInterface(Dep.class.getName(), h).setImplementation(new DepImpl());
        deps.add(s);
        schedule(new Runnable() {

            public void run() {
                m_dm.add(s);
            }
        });
    }
    // Start the client (concurrently)
    schedule(new Runnable() {

        public void run() {
            m_dm.add(client);
        }
    });
    // Ensure that client has been started.
    int expectedStep = 1 + /* conf */
    DEPENDENCIES + 1;
    step.waitForStep(expectedStep, STEP_WAIT);
    Assert.assertEquals(DEPENDENCIES, clientImpl.getDependencies());
    Assert.assertNotNull(clientImpl.getConfiguration());
    // Stop all dependencies concurrently.
    for (Component dep : deps) {
        final Component dependency = dep;
        schedule(new Runnable() {

            public void run() {
                m_dm.remove(dependency);
            }
        });
    }
    // Stop client concurrently.
    schedule(new Runnable() {

        public void run() {
            m_dm.remove(client);
        }
    });
    // Remove configuration (asynchronously)
    final Ensure stepConfDeleted = new Ensure(false);
    schedule(new Runnable() {

        public void run() {
            try {
                conf.delete();
                stepConfDeleted.step(1);
            } catch (IOException e) {
                warn("error while unconfiguring", e);
            }
        }
    });
    // Ensure that client has been stopped, then destroyed, then unbound from all dependencies
    // stop/destroy
    expectedStep += 2;
    // removed all dependencies
    expectedStep += DEPENDENCIES;
    step.waitForStep(expectedStep, STEP_WAIT);
    // Make sure configuration is removed
    stepConfDeleted.waitForStep(1, STEP_WAIT);
    step.ensure();
    Assert.assertEquals(0, clientImpl.getDependencies());
    m_threadPool.awaitQuiescence(5000, TimeUnit.MILLISECONDS);
    if (super.errorsLogged()) {
        throw new IllegalStateException("Race test interrupted (some error occured, see previous logs)");
    }
    debug("finished one test loop");
    if ((loop + 1) % 100 == 0) {
        long duration = System.currentTimeMillis() - m_timeStamp;
        warn("Performed 100 tests (total=%d) in %d ms.", (loop + 1), duration);
        m_timeStamp = System.currentTimeMillis();
    }
}
Also used : ConfigurationDependency(org.apache.felix.dm.ConfigurationDependency) Configuration(org.osgi.service.cm.Configuration) Hashtable(java.util.Hashtable) ArrayList(java.util.ArrayList) IOException(java.io.IOException) ServiceDependency(org.apache.felix.dm.ServiceDependency) Ensure(org.apache.felix.dm.itest.util.Ensure) Component(org.apache.felix.dm.Component)

Example 78 with Ensure

use of org.apache.felix.dm.itest.util.Ensure in project felix by apache.

the class ServiceUpdateTest method testServiceUpdate.

public void testServiceUpdate() throws Exception {
    final DependencyManager m = getDM();
    // helper class that ensures certain steps get executed in sequence
    Ensure e = new Ensure();
    // create a resource provider
    ResourceProvider provider = new ResourceProvider(context, new URL("file://localhost/path/to/file1.txt"));
    // activate it
    m.add(m.createComponent().setImplementation(new ServiceProvider(e)).add(m.createServiceDependency().setService(ServiceInterface.class).setRequired(true).setCallbacks("add", "change", "remove")));
    m.add(m.createComponent().setImplementation(provider).add(m.createServiceDependency().setService(ResourceHandler.class).setCallbacks("add", "remove")));
    // create a resource adapter for our single resource
    // note that we can provide an actual implementation instance here because there will be only one
    // adapter, normally you'd want to specify a Class here
    CallbackInstance callbackInstance = new CallbackInstance(e);
    Hashtable<String, String> serviceProps = new Hashtable<String, String>();
    serviceProps.put("number", "1");
    Component component = m.createResourceAdapterService("(&(path=/path/to/*.txt)(host=localhost))", false, callbackInstance, "changed").setImplementation(new ResourceAdapter(e)).setInterface(ServiceInterface.class.getName(), serviceProps).setCallbacks(callbackInstance, "init", "start", "stop", "destroy");
    m.add(component);
    // wait until the single resource is available
    e.waitForStep(1, 5000);
    // wait until the component gets the dependency injected
    e.waitForStep(2, 5000);
    // trigger a 'change' in our resource
    provider.change();
    // wait until the changed callback is invoked
    e.waitForStep(3, 5000);
    // wait until the changed event arrived at the component
    e.waitForStep(4, 5000);
    System.out.println("Done!");
    m.clear();
}
Also used : Hashtable(java.util.Hashtable) DependencyManager(org.apache.felix.dm.DependencyManager) ResourceHandler(org.apache.felix.dm.ResourceHandler) Ensure(org.apache.felix.dm.itest.util.Ensure) Component(org.apache.felix.dm.Component) URL(java.net.URL)

Example 79 with Ensure

use of org.apache.felix.dm.itest.util.Ensure in project felix by apache.

the class TemporalServiceDependencyTest method testFELIX4858_ServiceAdapterConsumptionWithCallbackAndIntermittentAvailability.

// Same test as testServiceConsumptionWithCallbackAndIntermittentAvailability, but the consumer is now
// an adapter for the Adaptee interface.
public void testFELIX4858_ServiceAdapterConsumptionWithCallbackAndIntermittentAvailability() {
    final DependencyManager m = getDM();
    // helper class that ensures certain steps get executed in sequence
    Ensure e = new Ensure();
    // create a service provider and consumer
    TemporalServiceProvider provider = new TemporalServiceProvider(e);
    Component sp = m.createComponent().setImplementation(provider).setInterface(TemporalServiceInterface.class.getName(), null);
    TemporalServiceProvider2 provider2 = new TemporalServiceProvider2(e);
    Component sp2 = m.createComponent().setImplementation(provider2).setInterface(TemporalServiceInterface.class.getName(), null);
    TemporalServiceConsumerAdapterWithCallback consumer = new TemporalServiceConsumerAdapterWithCallback(e);
    ServiceDependency temporalDep = m.createTemporalServiceDependency(10000).setService(TemporalServiceInterface.class).setRequired(true).setCallbacks("add", "remove");
    Component sc = m.createAdapterService(Adaptee.class, null).setImplementation(consumer).add(temporalDep);
    Component adaptee = m.createComponent().setImplementation(new Adaptee()).setInterface(Adaptee.class.getName(), null);
    // add the adapter service consumer
    m.add(sc);
    // add the adaptee (the adapter service depends on it)
    m.add(adaptee);
    // now add the first provider
    m.add(sp);
    e.waitForStep(2, 5000);
    // and remove it again (this should not affect the consumer yet)
    m.remove(sp);
    // now add the second provider
    m.add(sp2);
    e.step(3);
    e.waitForStep(4, 5000);
    // and remove it again
    m.remove(sp2);
    // finally remove the consumer
    m.remove(sc);
    // Wait for the consumer.remove callback
    e.waitForStep(6, 5000);
    // ensure we executed all steps inside the component instance
    e.step(7);
    m.clear();
}
Also used : DependencyManager(org.apache.felix.dm.DependencyManager) ServiceDependency(org.apache.felix.dm.ServiceDependency) Ensure(org.apache.felix.dm.itest.util.Ensure) Component(org.apache.felix.dm.Component)

Example 80 with Ensure

use of org.apache.felix.dm.itest.util.Ensure in project felix by apache.

the class AdapterWithCallbackInstanceTest method testServiceWithAdapterAndConsumer.

public void testServiceWithAdapterAndConsumer() {
    DependencyManager m = getDM();
    // helper class that ensures certain steps get executed in sequence
    Ensure e = new Ensure();
    ServiceProvider serviceProvider = new ServiceProvider(e);
    Component provider = m.createComponent().setInterface(OriginalService.class.getName(), null).setImplementation(serviceProvider);
    Component consumer = m.createComponent().setImplementation(new ServiceConsumer(e)).add(m.createServiceDependency().setService(AdaptedService.class).setRequired(true));
    ServiceAdapterCallbackInstance callbackInstance = new ServiceAdapterCallbackInstance(e);
    Component adapter = m.createAdapterService(OriginalService.class, null, "m_originalService", callbackInstance, "set", "changed", "unset", null, true).setInterface(AdaptedService.class.getName(), null).setImplementation(new ServiceAdapter(e));
    // add the provider and the adapter
    m.add(provider);
    m.add(adapter);
    // Checks if the callbackInstances is called, and if the adapter start method is called
    e.waitForStep(2, 5000);
    // add a consumer that will invoke the adapter
    // which will in turn invoke the original provider
    m.add(consumer);
    // now validate that both have been invoked in the right order
    e.waitForStep(4, 5000);
    // change the service properties of the provider, and check that the adapter callback instance is changed.
    serviceProvider.changeServiceProperties();
    e.waitForStep(5, 5000);
    // remove the provider
    m.remove(provider);
    // ensure that the consumer is stopped, the adapter callback is called in its unset method, and the adapter is stopped.
    e.waitForStep(8, 5000);
    // remove adapter and consumer
    m.remove(adapter);
    m.remove(consumer);
}
Also used : DependencyManager(org.apache.felix.dm.DependencyManager) Ensure(org.apache.felix.dm.itest.util.Ensure) Component(org.apache.felix.dm.Component)

Aggregations

Ensure (org.apache.felix.dm.itest.util.Ensure)135 Component (org.apache.felix.dm.Component)90 DependencyManager (org.apache.felix.dm.DependencyManager)90 ServiceRegistration (org.osgi.framework.ServiceRegistration)42 Hashtable (java.util.Hashtable)32 Dictionary (java.util.Dictionary)8 URL (java.net.URL)6 HashMap (java.util.HashMap)5 Map (java.util.Map)5 ResourceHandler (org.apache.felix.dm.ResourceHandler)5 IOException (java.io.IOException)4 Dependency (org.apache.felix.dm.Dependency)4 ServiceDependency (org.apache.felix.dm.ServiceDependency)4 ConfigurationAdmin (org.osgi.service.cm.ConfigurationAdmin)4 ArrayList (java.util.ArrayList)2 ForkJoinPool (java.util.concurrent.ForkJoinPool)2 TimeUnit (java.util.concurrent.TimeUnit)2 ComponentStateListener (org.apache.felix.dm.ComponentStateListener)2 TestBase (org.apache.felix.dm.itest.util.TestBase)2 Bundle (org.osgi.framework.Bundle)2