/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.aries.blueprint.itests.cm;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.ops4j.pax.exam.CoreOptions.keepCaches;
import static org.ops4j.pax.exam.CoreOptions.streamBundle;
import java.io.InputStream;
import java.util.Hashtable;
import javax.inject.Inject;
import org.apache.aries.blueprint.itests.AbstractBlueprintIntegrationTest;
import org.apache.aries.blueprint.itests.Helper;
import org.apache.aries.blueprint.itests.cm.service.Foo;
import org.apache.aries.blueprint.itests.cm.service.FooFactory;
import org.apache.aries.blueprint.itests.cm.service.FooInterface;
import org.junit.Test;
import org.ops4j.pax.exam.Option;
import org.ops4j.pax.exam.ProbeBuilder;
import org.ops4j.pax.exam.TestProbeBuilder;
import org.ops4j.pax.tinybundles.core.TinyBundles;
import org.osgi.framework.Constants;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;
public class ManagedServiceFactoryTest extends AbstractBlueprintIntegrationTest {
private static final String TEST_BUNDLE = "org.apache.aries.blueprint.cm.test.b1";
@Inject
ConfigurationAdmin ca;
@ProbeBuilder
public TestProbeBuilder probeConfiguration(TestProbeBuilder probe) {
probe.setHeader(Constants.EXPORT_PACKAGE, Foo.class.getPackage().getName());
probe.setHeader(Constants.IMPORT_PACKAGE, Foo.class.getPackage().getName());
return probe;
}
@org.ops4j.pax.exam.Configuration
public Option[] config() {
return new Option[] {
baseOptions(),
Helper.blueprintBundles(),
keepCaches(),
streamBundle(testBundle())
};
}
protected InputStream testBundle() {
return TinyBundles.bundle() //
.add(FooInterface.class) //
.add(Foo.class) //
.add(FooFactory.class) //
.add("OSGI-INF/blueprint/context.xml", getResource("ManagedServiceFactoryTest.xml"))
.set(Constants.BUNDLE_SYMBOLICNAME, TEST_BUNDLE) //
.set(Constants.EXPORT_PACKAGE, Foo.class.getPackage().getName()) //
.set(Constants.IMPORT_PACKAGE, Foo.class.getPackage().getName()) //
.build(TinyBundles.withBnd());
}
@Test
public void test1() throws Exception {
Configuration cf = ca.createFactoryConfiguration("blueprint-sample-managed-service-factory", null);
Hashtable<String, String> props = new Hashtable<String, String>();
props.put("a", "5");
cf.update(props);
@SuppressWarnings("rawtypes")
ServiceReference sr = getServiceRef(Foo.class, "(key=foo1)");
Foo foo = (Foo)context().getService(sr);
assertNotNull(foo);
assertEquals(5, foo.getA());
assertEquals("default", foo.getB());
assertEquals("5", sr.getProperty("a"));
assertNull(sr.getProperty("b"));
props = new Hashtable<String, String>();
props.put("a", "5");
props.put("b", "foo");
cf.update(props);
Thread.sleep(500);
// No update of bean after creation
assertEquals(5, foo.getA());
assertEquals("default", foo.getB());
// Only initial update of service properties
assertEquals("5", sr.getProperty("a"));
assertNull(sr.getProperty("b"));
}
@Test
public void test2() throws Exception {
Configuration cf = ca.createFactoryConfiguration("blueprint-sample-managed-service-factory2", null);
Hashtable<String, String> props = new Hashtable<String, String>();
props.put("a", "5");
cf.update(props);
@SuppressWarnings("rawtypes")
ServiceReference sr = getServiceRef(Foo.class, "(key=foo2)");
Foo foo = (Foo)context().getService(sr);
assertNotNull(foo);
assertEquals(5, foo.getA());
assertEquals("default", foo.getB());
assertNull(sr.getProperty("a"));
assertNull(sr.getProperty("b"));
props = new Hashtable<String, String>();
props.put("a", "5");
props.put("b", "foo");
cf.update(props);
// Update after creation
Thread.sleep(500);
assertEquals(5, foo.getA());
assertEquals("foo", foo.getB());
// No update of service properties
assertNull(sr.getProperty("a"));
assertNull(sr.getProperty("b"));
}
@Test
public void test3() throws Exception {
Configuration cf = ca.createFactoryConfiguration("blueprint-sample-managed-service-factory3", null);
Hashtable<String, String> props = new Hashtable<String, String>();
props.put("a", "5");
cf.update(props);
@SuppressWarnings("rawtypes")
ServiceReference sr = getServiceRef(Foo.class, "(&(key=foo3)(a=5))");
assertNotNull(sr);
Foo foo = (Foo)context().getService(sr);
assertNotNull(foo);
assertEquals(5, foo.getA());
assertEquals("default", foo.getB());
assertEquals("5", sr.getProperty("a"));
assertNull(sr.getProperty("b"));
props = new Hashtable<String, String>();
props.put("a", "5");
props.put("b", "foo");
cf.update(props);
// Update after creation
Thread.sleep(500);
assertEquals(5, foo.getA());
assertEquals("foo", foo.getB());
// Update of service properties
assertEquals("5", sr.getProperty("a"));
assertEquals("foo", sr.getProperty("b"));
cf.delete();
}
@SuppressWarnings("rawtypes")
@Test
public void testCreateAndUpdate() throws Exception {
Configuration cf = ca.createFactoryConfiguration("blueprint-sample-managed-service-factory3", null);
Hashtable<String, String> props = new Hashtable<String, String>();
props.put("a", "5");
cf.update(props);
Configuration cf2 = ca.createFactoryConfiguration("blueprint-sample-managed-service-factory3", null);
Hashtable<String, String> props2 = new Hashtable<String, String>();
props2.put("a", "7");
cf2.update(props2);
ServiceReference sr = getServiceRef(Foo.class, "(&(key=foo3)(a=5))");
ServiceReference sr2 = getServiceRef(Foo.class, "(&(key=foo3)(a=7))");
Foo foo = (Foo)context().getService(sr);
assertNotNull(foo);
assertEquals(5, foo.getA());
assertEquals("default", foo.getB());
assertEquals("5", sr.getProperty("a"));
assertNull(sr.getProperty("b"));
Foo foo2 = (Foo)context().getService(sr2);
assertNotNull(foo2);
assertEquals(7, foo2.getA());
assertEquals("default", foo2.getB());
assertEquals("7", sr2.getProperty("a"));
assertNull(sr2.getProperty("b"));
props = new Hashtable<String, String>();
props.put("a", "5");
props.put("b", "foo");
cf.update(props);
props2 = new Hashtable<String, String>();
props2.put("a", "7");
props2.put("b", "foo2");
cf2.update(props2);
// Update after creation
Thread.sleep(500);
assertEquals(5, foo.getA());
assertEquals("foo", foo.getB());
// Update of service properties
assertEquals("5", sr.getProperty("a"));
assertEquals("foo", sr.getProperty("b"));
// 2a Update after creation
assertEquals(7, foo2.getA());
assertEquals("foo2", foo2.getB());
// 2b Update of service properties
assertEquals("7", sr2.getProperty("a"));
assertEquals("foo2", sr2.getProperty("b"));
cf.delete();
cf2.delete();
}
@SuppressWarnings("rawtypes")
@Test
public void testCreateAndUpdateUsingUpdateMethod() throws Exception {
Configuration cf = ca.createFactoryConfiguration("blueprint-sample-managed-service-factory4", null);
Hashtable<String, String> props = new Hashtable<String, String>();
props.put("a", "5");
cf.update(props);
Configuration cf2 = ca.createFactoryConfiguration("blueprint-sample-managed-service-factory4", null);
Hashtable<String, String> props2 = new Hashtable<String, String>();
props2.put("a", "7");
cf2.update(props2);
ServiceReference sr = getServiceRef(Foo.class, "(&(key=foo4)(a=5))");
ServiceReference sr2 = getServiceRef(Foo.class, "(&(key=foo4)(a=7))");
Foo foo = (Foo)context().getService(sr);
assertNotNull(foo);
assertEquals(5, foo.getA());
assertEquals("default", foo.getB());
assertEquals("5", sr.getProperty("a"));
assertNull(sr.getProperty("b"));
Foo foo2 = (Foo)context().getService(sr2);
assertNotNull(foo2);
assertEquals(7, foo2.getA());
assertEquals("default", foo2.getB());
assertEquals("7", sr2.getProperty("a"));
assertNull(sr2.getProperty("b"));
props = new Hashtable<String, String>();
props.put("a", "5");
props.put("b", "foo");
cf.update(props);
props2 = new Hashtable<String, String>();
props2.put("a", "7");
props2.put("b", "foo2");
cf2.update(props2);
// Update after creation
Thread.sleep(500);
assertEquals(5, foo.getA());
assertEquals("foo", foo.getB());
// Update of service properties
assertEquals("5", sr.getProperty("a"));
assertEquals("foo", sr.getProperty("b"));
// 2a Update after creation
assertEquals(7, foo2.getA());
assertEquals("foo2", foo2.getB());
// 2b Update of service properties
assertEquals("7", sr2.getProperty("a"));
assertEquals("foo2", sr2.getProperty("b"));
}
@Test
public void testFactoryCreation() throws Exception {
Configuration cf = ca.createFactoryConfiguration("blueprint-sample-managed-service-factory5", null);
Hashtable<String, String> props = new Hashtable<String, String>();
props.put("a", "5");
cf.update(props);
@SuppressWarnings("rawtypes")
ServiceReference sr = getServiceRef(Foo.class, "(key=foo5)");
Foo foo = (Foo)context().getService(sr);
assertNotNull(foo);
assertEquals(5, foo.getA());
assertEquals("default", foo.getB());
assertEquals("5", sr.getProperty("a"));
assertNull(sr.getProperty("b"));
props = new Hashtable<String, String>();
props.put("a", "5");
props.put("b", "foo");
cf.update(props);
Thread.sleep(500);
// No update of bean after creation
assertEquals(5, foo.getA());
assertEquals("default", foo.getB());
// Only initial update of service properties
assertEquals("5", sr.getProperty("a"));
assertNull(sr.getProperty("b"));
}
@SuppressWarnings("rawtypes")
private ServiceReference getServiceRef(Class serviceInterface, String filter)
throws InvalidSyntaxException {
int tries = 0;
do {
ServiceReference[] srAr = bundleContext.getServiceReferences(serviceInterface.getName(), filter);
if (srAr != null && srAr.length > 0) {
return (ServiceReference)srAr[0];
}
tries++;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// Ignore
}
} while (tries < 100);
throw new RuntimeException("Could not find service " + serviceInterface.getName() + ", " + filter);
}
}