From f9e9301010b0f1452ffb5c7e930f02697308c2ab Mon Sep 17 00:00:00 2001
From: Stoyan Boshev
Date: Thu, 12 Jan 2012 18:21:53 +0200
Subject: Implemented tests for DS 1.2 features
---
bundles/org.eclipse.equinox.ds.tests/.classpath | 1 +
.../META-INF/MANIFEST.MF | 3 +-
.../org.eclipse.equinox.ds.tests/build.properties | 6 +-
.../bundles_src/tb25/META-INF/MANIFEST.MF | 8 +
.../equinox/ds/tests/tb25/ConfigPIDComp.java | 37 +++
.../equinox/ds/tests/tb25/PolicyOptionComp.java | 97 ++++++
.../ds/tests/tb25/ServicePropertiesComp.java | 82 +++++
.../eclipse/equinox/ds/tests/tb25/components.xml | 191 +++++++++++
.../org/eclipse/equinox/ds/tests/tbc/DSTest.java | 354 ++++++++++++++++++++-
.../ds/tests/tbc/DefaultPropertiesProvider.java | 28 ++
10 files changed, 803 insertions(+), 4 deletions(-)
create mode 100644 bundles/org.eclipse.equinox.ds.tests/bundles_src/tb25/META-INF/MANIFEST.MF
create mode 100644 bundles/org.eclipse.equinox.ds.tests/bundles_src/tb25/org/eclipse/equinox/ds/tests/tb25/ConfigPIDComp.java
create mode 100644 bundles/org.eclipse.equinox.ds.tests/bundles_src/tb25/org/eclipse/equinox/ds/tests/tb25/PolicyOptionComp.java
create mode 100644 bundles/org.eclipse.equinox.ds.tests/bundles_src/tb25/org/eclipse/equinox/ds/tests/tb25/ServicePropertiesComp.java
create mode 100644 bundles/org.eclipse.equinox.ds.tests/bundles_src/tb25/org/eclipse/equinox/ds/tests/tb25/components.xml
create mode 100644 bundles/org.eclipse.equinox.ds.tests/src/org/eclipse/equinox/ds/tests/tbc/DefaultPropertiesProvider.java
diff --git a/bundles/org.eclipse.equinox.ds.tests/.classpath b/bundles/org.eclipse.equinox.ds.tests/.classpath
index 6b6a14baa..7fe05fae5 100644
--- a/bundles/org.eclipse.equinox.ds.tests/.classpath
+++ b/bundles/org.eclipse.equinox.ds.tests/.classpath
@@ -29,5 +29,6 @@
+
diff --git a/bundles/org.eclipse.equinox.ds.tests/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.ds.tests/META-INF/MANIFEST.MF
index 66282e3e2..84f89bf16 100644
--- a/bundles/org.eclipse.equinox.ds.tests/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.ds.tests/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2
Bundle-Name: Declarative Services Tests
Bundle-Category: test
Bundle-SymbolicName: org.eclipse.equinox.ds.tests
-Bundle-Version: 1.1.0.qualifier
+Bundle-Version: 1.2.0.qualifier
Bundle-Activator: org.eclipse.equinox.ds.tests.DSTestsActivator
Bundle-ActivationPolicy: lazy
Require-Bundle: org.junit
@@ -13,7 +13,6 @@ Import-Package:
org.osgi.service.cm;version="1.2.0",
org.osgi.service.component;version="1.0.0",
org.osgi.service.log;version="1.3.0",
- org.osgi.service.packageadmin;version="1.2.0",
org.osgi.service.permissionadmin;version="1.2.0",
org.osgi.util.tracker;version="1.4.2"
Export-Package: org.eclipse.equinox.ds.tests.tbc
diff --git a/bundles/org.eclipse.equinox.ds.tests/build.properties b/bundles/org.eclipse.equinox.ds.tests/build.properties
index cd188e0c8..8b6a057b3 100644
--- a/bundles/org.eclipse.equinox.ds.tests/build.properties
+++ b/bundles/org.eclipse.equinox.ds.tests/build.properties
@@ -38,6 +38,7 @@ bin.includes = META-INF/,\
scr_test/tb22.jar,\
scr_test/tb23.jar,\
scr_test/tb24.jar,\
+ scr_test/tb25.jar,\
test.xml
jars.compile.order = .,\
scr_test/tb1.jar,\
@@ -65,7 +66,8 @@ jars.compile.order = .,\
scr_test/tb21a.jar,\
scr_test/tb22.jar,\
scr_test/tb23.jar,\
- scr_test/tb24.jar
+ scr_test/tb24.jar,\
+ scr_test/tb25.jar
source.scr_test/tb1.jar = bundles_src/tb1/
manifest.scr_test/tb1.jar = META-INF/MANIFEST.MF
source.scr_test/tb1a.jar = bundles_src/tb1a/
@@ -118,3 +120,5 @@ source.scr_test/tb23.jar = bundles_src/tb23/
manifest.scr_test/tb23.jar = META-INF/MANIFEST.MF
source.scr_test/tb24.jar = bundles_src/tb24/
manifest.scr_test/tb24.jar = META-INF/MANIFEST.MF
+source.scr_test/tb25.jar = bundles_src/tb25/
+manifest.scr_test/tb25.jar = META-INF/MANIFEST.MF
diff --git a/bundles/org.eclipse.equinox.ds.tests/bundles_src/tb25/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.ds.tests/bundles_src/tb25/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..e89357d68
--- /dev/null
+++ b/bundles/org.eclipse.equinox.ds.tests/bundles_src/tb25/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-Name: Declaritive services test
+Bundle-Description: Declaritive services TB25
+Bundle-Category: test
+Import-Package: org.eclipse.equinox.ds.tests.tbc,
+ org.osgi.framework,
+ org.osgi.service.component;version="1.0.0"
+Service-Component: org/eclipse/equinox/ds/tests/tb25/components.xml
diff --git a/bundles/org.eclipse.equinox.ds.tests/bundles_src/tb25/org/eclipse/equinox/ds/tests/tb25/ConfigPIDComp.java b/bundles/org.eclipse.equinox.ds.tests/bundles_src/tb25/org/eclipse/equinox/ds/tests/tb25/ConfigPIDComp.java
new file mode 100644
index 000000000..317dba070
--- /dev/null
+++ b/bundles/org.eclipse.equinox.ds.tests/bundles_src/tb25/org/eclipse/equinox/ds/tests/tb25/ConfigPIDComp.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 1997, 2012 by ProSyst Software GmbH
+ * http://www.prosyst.com
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * ProSyst Software GmbH - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.equinox.ds.tests.tb25;
+
+import java.util.Dictionary;
+
+import org.eclipse.equinox.ds.tests.tbc.PropertiesProvider;
+import org.osgi.service.component.ComponentContext;
+
+public class ConfigPIDComp implements PropertiesProvider {
+ private ComponentContext ctxt;
+
+ protected void activate(ComponentContext ctxt) {
+ this.ctxt = ctxt;
+ }
+
+ protected void deactivate(ComponentContext ctxt) {
+
+ }
+
+ public Dictionary getProperties() {
+ if (ctxt == null) {
+ return null;
+ }
+
+ return ctxt.getProperties();
+ }
+}
diff --git a/bundles/org.eclipse.equinox.ds.tests/bundles_src/tb25/org/eclipse/equinox/ds/tests/tb25/PolicyOptionComp.java b/bundles/org.eclipse.equinox.ds.tests/bundles_src/tb25/org/eclipse/equinox/ds/tests/tb25/PolicyOptionComp.java
new file mode 100644
index 000000000..12566902d
--- /dev/null
+++ b/bundles/org.eclipse.equinox.ds.tests/bundles_src/tb25/org/eclipse/equinox/ds/tests/tb25/PolicyOptionComp.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 1997, 2012 by ProSyst Software GmbH
+ * http://www.prosyst.com
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * ProSyst Software GmbH - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.equinox.ds.tests.tb25;
+
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.equinox.ds.tests.tbc.PropertiesProvider;
+import org.osgi.framework.Constants;
+import org.osgi.service.component.ComponentContext;
+
+public class PolicyOptionComp implements PropertiesProvider {
+ private static final String RANK_MISSING_VALUE = "property.is.missing";
+
+ private ComponentContext ctxt;
+ private Map newProps;
+
+ protected void activate(ComponentContext ctxt) {
+ this.ctxt = ctxt;
+ }
+
+ protected void deactivate(ComponentContext ctxt) {
+
+ }
+
+ public void bind01(PropertiesProvider service, Map properties) {
+ registerMethodCall("bind01", properties);
+ }
+
+ public void bind11(PropertiesProvider service, Map properties) {
+ registerMethodCall("bind11", properties);
+ }
+
+ public void bind0n(PropertiesProvider service, Map properties) {
+ registerMethodCall("bind0n", properties);
+ }
+
+ public void bind1n(PropertiesProvider service, Map properties) {
+ registerMethodCall("bind1n", properties);
+ }
+
+ public synchronized Dictionary getProperties() {
+ if (ctxt == null) {
+ return null;
+ }
+
+ Dictionary result = new Hashtable();
+
+ Dictionary ctxtProps = ctxt.getProperties();
+ if (ctxtProps != null) {
+ for (Enumeration en = ctxtProps.keys(); en.hasMoreElements();) {
+ Object key = en.nextElement();
+ result.put(key, ctxtProps.get(key));
+ }
+ }
+
+ if (newProps != null) {
+ for (Iterator it = newProps.keySet().iterator(); it.hasNext();) {
+ Object key = it.next();
+ result.put(key, newProps.get(key));
+ }
+ }
+
+ return result;
+ }
+
+ private synchronized void registerMethodCall(String name, Map properties) {
+ if (newProps == null) {
+ newProps = new Hashtable();
+ }
+ Object rankValue = null;
+ if (properties != null) {
+ newProps.putAll(properties);
+ rankValue = properties.get(Constants.SERVICE_RANKING);
+ }
+ List list = (List) newProps.get(name);
+ if (list == null) {
+ list = new ArrayList();
+ newProps.put(name, list);
+ }
+ list.add(rankValue != null ? rankValue : RANK_MISSING_VALUE);
+ }
+}
diff --git a/bundles/org.eclipse.equinox.ds.tests/bundles_src/tb25/org/eclipse/equinox/ds/tests/tb25/ServicePropertiesComp.java b/bundles/org.eclipse.equinox.ds.tests/bundles_src/tb25/org/eclipse/equinox/ds/tests/tb25/ServicePropertiesComp.java
new file mode 100644
index 000000000..236dd5a6c
--- /dev/null
+++ b/bundles/org.eclipse.equinox.ds.tests/bundles_src/tb25/org/eclipse/equinox/ds/tests/tb25/ServicePropertiesComp.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 1997, 2012 by ProSyst Software GmbH
+ * http://www.prosyst.com
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * ProSyst Software GmbH - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.equinox.ds.tests.tb25;
+
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.eclipse.equinox.ds.tests.tbc.PropertiesProvider;
+import org.osgi.service.component.ComponentContext;
+
+public class ServicePropertiesComp implements PropertiesProvider {
+ private ComponentContext ctxt;
+ private Map newProps;
+
+ protected void activate(ComponentContext ctxt) {
+ this.ctxt = ctxt;
+ }
+
+ protected void deactivate(ComponentContext ctxt) {
+
+ }
+
+ public void bindRef(PropertiesProvider service, Map properties) {
+ }
+
+ public synchronized void serviceUpdatedStatic(PropertiesProvider service, Map properties) {
+ if (newProps == null) {
+ newProps = new Hashtable();
+ }
+ if (properties != null) {
+ newProps.putAll(properties);
+ }
+ newProps.put("serviceUpdatedStatic", Boolean.TRUE);
+ }
+
+ public synchronized void serviceUpdatedDynamic(PropertiesProvider service, Map properties) {
+ if (newProps == null) {
+ newProps = new Hashtable();
+ }
+ if (properties != null) {
+ newProps.putAll(properties);
+ }
+ newProps.put("serviceUpdatedDynamic", Boolean.TRUE);
+ }
+
+ public synchronized Dictionary getProperties() {
+ if (ctxt == null) {
+ return null;
+ }
+
+ Dictionary result = new Hashtable();
+
+ Dictionary ctxtProps = ctxt.getProperties();
+ if (ctxtProps != null) {
+ for (Enumeration en = ctxtProps.keys(); en.hasMoreElements();) {
+ Object key = en.nextElement();
+ result.put(key, ctxtProps.get(key));
+ }
+ }
+
+ if (newProps != null) {
+ for (Iterator it = newProps.keySet().iterator(); it.hasNext();) {
+ Object key = it.next();
+ result.put(key, newProps.get(key));
+ }
+ }
+
+ return result;
+ }
+}
diff --git a/bundles/org.eclipse.equinox.ds.tests/bundles_src/tb25/org/eclipse/equinox/ds/tests/tb25/components.xml b/bundles/org.eclipse.equinox.ds.tests/bundles_src/tb25/org/eclipse/equinox/ds/tests/tb25/components.xml
new file mode 100644
index 000000000..32a308be3
--- /dev/null
+++ b/bundles/org.eclipse.equinox.ds.tests/bundles_src/tb25/org/eclipse/equinox/ds/tests/tb25/components.xml
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/bundles/org.eclipse.equinox.ds.tests/src/org/eclipse/equinox/ds/tests/tbc/DSTest.java b/bundles/org.eclipse.equinox.ds.tests/src/org/eclipse/equinox/ds/tests/tbc/DSTest.java
index 49c1f6a03..36b9730e9 100644
--- a/bundles/org.eclipse.equinox.ds.tests/src/org/eclipse/equinox/ds/tests/tbc/DSTest.java
+++ b/bundles/org.eclipse.equinox.ds.tests/src/org/eclipse/equinox/ds/tests/tbc/DSTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 1997, 2011 by ProSyst Software GmbH
+ * Copyright (c) 1997, 2012 by ProSyst Software GmbH
* http://www.prosyst.com
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
@@ -12,9 +12,12 @@
package org.eclipse.equinox.ds.tests.tbc;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.Dictionary;
import java.util.Enumeration;
import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
import junit.framework.TestCase;
@@ -2496,6 +2499,9 @@ public class DSTest extends TestCase {
//start again the config admin
cmBundle.start();
+
+ //wait for processing components that depend on configurations
+ Thread.sleep(timeout * 2);
// component with optional configuration should be available and initialized by configuration
assertEquals("Component with optional configuration should be activated and inited by configuration", 1, getBaseConfigData(COMP_OPTIONAL));
@@ -2521,6 +2527,352 @@ public class DSTest extends TestCase {
}
}
+ // Tests update of service properties
+ public void testServicePropertiesUpdate() throws Exception {
+ Bundle tb25 = installBundle("tb25");
+ ServiceRegistration sr = null;
+ try {
+ final String COMP_NAME = "org.eclipse.equinox.ds.tests.tb25.ServicePropertiesComp";
+ final String PROP = "test.property";
+ final String PROP_STATIC = "serviceUpdatedStatic";
+ final String PROP_DYNAMIC = "serviceUpdatedDynamic";
+ tb25.start();
+ waitBundleStart();
+
+ Hashtable props = new Hashtable();
+ props.put("service.provider", "service.properties.update.test");
+ props.put(PROP, Boolean.FALSE);
+
+ // register service referenced by the component
+ sr = registerService(PropertiesProvider.class.getName(), new DefaultPropertiesProvider(null),
+ (Dictionary) props.clone());
+ Thread.sleep(timeout);
+
+ PropertiesProvider bs = getBaseService(COMP_NAME);
+ assertNotNull("Component " + COMP_NAME + " should be activated", bs);
+
+ // update service properties
+ props.put(PROP, Boolean.TRUE);
+ sr.setProperties((Dictionary) props.clone());
+ Thread.sleep(timeout);
+
+ bs = getBaseService(COMP_NAME);
+ assertNotNull("Component " + COMP_NAME + " should still be active", bs);
+ Dictionary compProps = bs.getProperties();
+ assertNotNull("Component properties should be available.", compProps);
+ assertEquals("Test property should be updated.", Boolean.TRUE, compProps.get(PROP));
+ assertEquals("Updated method for static reference should be called.", Boolean.TRUE, compProps.get(PROP_STATIC));
+ assertEquals("Updated method for dynamic reference should be called.", Boolean.TRUE, compProps.get(PROP_DYNAMIC));
+ } finally {
+ uninstallBundle(tb25);
+ if (sr != null) {
+ unregisterService(sr);
+ }
+ }
+ }
+
+ // Tests Reluctant policy option of service references
+ public void testPolicyOptionReluctant() throws Exception {
+ Bundle tb25 = installBundle("tb25");
+ ServiceRegistration sr = null;
+ ServiceRegistration srLower = null;
+ ServiceRegistration srHigher = null;
+ try {
+ final String COMP_NAME_STATIC = "org.eclipse.equinox.ds.tests.tb25.PolicyReluctantStaticComp";
+ final String COMP_NAME_DYNAMIC = "org.eclipse.equinox.ds.tests.tb25.PolicyReluctantDynamicComp";
+ final String PROP_BIND_01 = "bind01";
+ final String PROP_BIND_11 = "bind11";
+ final String PROP_BIND_0n = "bind0n";
+ final String PROP_BIND_1n = "bind1n";
+ final Integer RANK_1 = new Integer(1);
+ final Integer RANK_2 = new Integer(2);
+ final Integer RANK_3 = new Integer(3);
+ tb25.start();
+ waitBundleStart();
+
+ Hashtable props = new Hashtable();
+ props.put("service.provider", "reluctant.policy.option.test");
+ props.put(Constants.SERVICE_RANKING, RANK_2);
+
+ // register service referenced by the component
+ sr = registerService(PropertiesProvider.class.getName(), new DefaultPropertiesProvider(null),
+ (Dictionary) props.clone());
+ Thread.sleep(timeout);
+
+ PropertiesProvider bsStatic = getBaseService(COMP_NAME_STATIC);
+ assertNotNull("Component " + COMP_NAME_STATIC + " should be activated", bsStatic);
+ PropertiesProvider bsDynamic = getBaseService(COMP_NAME_DYNAMIC);
+ assertNotNull("Component " + COMP_NAME_DYNAMIC + " should be activated", bsDynamic);
+
+ // register service with lower ranking
+ props.put(Constants.SERVICE_RANKING, RANK_1);
+ srLower = registerService(PropertiesProvider.class.getName(), new DefaultPropertiesProvider(null),
+ (Dictionary) props.clone());
+ Thread.sleep(timeout);
+
+ // check bound references
+ bsStatic = getBaseService(COMP_NAME_STATIC);
+ assertNotNull("Component " + COMP_NAME_STATIC + " should still be active", bsStatic);
+ Dictionary compProps = bsStatic.getProperties();
+ assertNotNull("Component properties should be available.", compProps);
+ assertEqualElements("New target service with lower ranking should be ignored for static 0..1.", toList(RANK_2),
+ (List) compProps.get(PROP_BIND_01));
+ assertEqualElements("New target service with lower ranking should be ignored for static 1..1.", toList(RANK_2),
+ (List) compProps.get(PROP_BIND_11));
+ assertEqualElements("New target service with lower ranking should be ignored for static 0..n.", toList(RANK_2),
+ (List) compProps.get(PROP_BIND_0n));
+ assertEqualElements("New target service with lower ranking should be ignored for static 1..n.", toList(RANK_2),
+ (List) compProps.get(PROP_BIND_1n));
+ bsDynamic = getBaseService(COMP_NAME_DYNAMIC);
+ assertNotNull("Component " + COMP_NAME_DYNAMIC + " should still be active", bsDynamic);
+ compProps = bsDynamic.getProperties();
+ assertNotNull("Component properties should be available.", compProps);
+ assertEqualElements("New target service with lower ranking should be ignored for dynamic 0..1.", toList(RANK_2),
+ (List) compProps.get(PROP_BIND_01));
+ assertEqualElements("New target service with lower ranking should be ignored for dynamic 1..1.", toList(RANK_2),
+ (List) compProps.get(PROP_BIND_11));
+ assertEqualElements("New target service with lower ranking should be bound for dynamic 0..n.",
+ toList(RANK_1, RANK_2), (List) compProps.get(PROP_BIND_0n));
+ assertEqualElements("New target service with lower ranking should be bound for dynamic 1..n.",
+ toList(RANK_1, RANK_2), (List) compProps.get(PROP_BIND_1n));
+
+ // register service with higher ranking
+ props.put(Constants.SERVICE_RANKING, RANK_3);
+ srHigher = registerService(PropertiesProvider.class.getName(), new DefaultPropertiesProvider(null),
+ (Dictionary) props.clone());
+ Thread.sleep(timeout);
+
+ // check bound references
+ bsStatic = getBaseService(COMP_NAME_STATIC);
+ assertNotNull("Component " + COMP_NAME_STATIC + " should still be active", bsStatic);
+ compProps = bsStatic.getProperties();
+ assertNotNull("Component properties should be available.", compProps);
+ assertEqualElements("New target service with higher ranking should be ignored for static 0..1.", toList(RANK_2),
+ (List) compProps.get(PROP_BIND_01));
+ assertEqualElements("New target service with higher ranking should be ignored for static 1..1.", toList(RANK_2),
+ (List) compProps.get(PROP_BIND_11));
+ assertEqualElements("New target service with higher ranking should be ignored for static 0..n.", toList(RANK_2),
+ (List) compProps.get(PROP_BIND_0n));
+ assertEqualElements("New target service with higher ranking should be ignored for static 1..n.", toList(RANK_2),
+ (List) compProps.get(PROP_BIND_1n));
+ bsDynamic = getBaseService(COMP_NAME_DYNAMIC);
+ assertNotNull("Component " + COMP_NAME_DYNAMIC + " should still be active", bsDynamic);
+ compProps = bsDynamic.getProperties();
+ assertNotNull("Component properties should be available.", compProps);
+ assertEqualElements("New target service with higher ranking should be ignored for dynamic 0..1.", toList(RANK_2),
+ (List) compProps.get(PROP_BIND_01));
+ assertEqualElements("New target service with higher ranking should be ignored for dynamic 1..1.", toList(RANK_2),
+ (List) compProps.get(PROP_BIND_11));
+ assertEqualElements("New target service with higher ranking should be bound for dynamic 0..n.",
+ toList(RANK_1, RANK_2, RANK_3), (List) compProps.get(PROP_BIND_0n));
+ assertEqualElements("New target service with higher ranking should be bound for dynamic 1..n.",
+ toList(RANK_1, RANK_2, RANK_3), (List) compProps.get(PROP_BIND_1n));
+ } finally {
+ uninstallBundle(tb25);
+ if (sr != null) {
+ unregisterService(sr);
+ }
+ if (srLower != null) {
+ unregisterService(srLower);
+ }
+ if (srHigher != null) {
+ unregisterService(srHigher);
+ }
+ }
+ }
+
+ // Tests Greedy policy option of service references
+ public void testPolicyOptionGreedy() throws Exception {
+ Bundle tb25 = installBundle("tb25");
+ ServiceRegistration sr = null;
+ ServiceRegistration srLower = null;
+ ServiceRegistration srHigher = null;
+ try {
+ final String COMP_NAME_STATIC = "org.eclipse.equinox.ds.tests.tb25.PolicyGreedyStaticComp";
+ final String COMP_NAME_DYNAMIC = "org.eclipse.equinox.ds.tests.tb25.PolicyGreedyDynamicComp";
+ final String PROP_BIND_01 = "bind01";
+ final String PROP_BIND_11 = "bind11";
+ final String PROP_BIND_0n = "bind0n";
+ final String PROP_BIND_1n = "bind1n";
+ final Integer RANK_1 = new Integer(1);
+ final Integer RANK_2 = new Integer(2);
+ final Integer RANK_3 = new Integer(3);
+ tb25.start();
+ waitBundleStart();
+
+ Hashtable props = new Hashtable();
+ props.put("service.provider", "greedy.policy.option.test");
+ props.put(Constants.SERVICE_RANKING, RANK_2);
+
+ // register service referenced by the component
+ sr = registerService(PropertiesProvider.class.getName(), new DefaultPropertiesProvider(null),
+ (Dictionary) props.clone());
+ Thread.sleep(timeout);
+
+ PropertiesProvider bsStatic = getBaseService(COMP_NAME_STATIC);
+ assertNotNull("Component " + COMP_NAME_STATIC + " should be activated", bsStatic);
+ PropertiesProvider bsDynamic = getBaseService(COMP_NAME_DYNAMIC);
+ assertNotNull("Component " + COMP_NAME_DYNAMIC + " should be activated", bsDynamic);
+
+ // register service with lower ranking
+ props.put(Constants.SERVICE_RANKING, RANK_1);
+ srLower = registerService(PropertiesProvider.class.getName(), new DefaultPropertiesProvider(null),
+ (Dictionary) props.clone());
+ Thread.sleep(timeout);
+
+ // check bound references
+ bsStatic = getBaseService(COMP_NAME_STATIC);
+ assertNotNull("Component " + COMP_NAME_STATIC + " should still be active", bsStatic);
+ Dictionary compProps = bsStatic.getProperties();
+ assertNotNull("Component properties should be available.", compProps);
+ assertEqualElements("New target service with lower ranking should be ignored for static 0..1.", toList(RANK_2),
+ (List) compProps.get(PROP_BIND_01));
+ assertEqualElements("New target service with lower ranking should be ignored for static 1..1.", toList(RANK_2),
+ (List) compProps.get(PROP_BIND_11));
+ assertEqualElements("New target service with lower ranking should be bound for static 0..n.",
+ toList(RANK_1, RANK_2), (List) compProps.get(PROP_BIND_0n));
+ assertEqualElements("New target service with lower ranking should be bound for static 1..n.",
+ toList(RANK_1, RANK_2), (List) compProps.get(PROP_BIND_1n));
+ bsDynamic = getBaseService(COMP_NAME_DYNAMIC);
+ assertNotNull("Component " + COMP_NAME_DYNAMIC + " should still be active", bsDynamic);
+ compProps = bsDynamic.getProperties();
+ assertNotNull("Component properties should be available.", compProps);
+ assertEqualElements("New target service with lower ranking should be ignored for dynamic 0..1.", toList(RANK_2),
+ (List) compProps.get(PROP_BIND_01));
+ assertEqualElements("New target service with lower ranking should be ignored for dynamic 1..1.", toList(RANK_2),
+ (List) compProps.get(PROP_BIND_11));
+ assertEqualElements("New target service with lower ranking should be bound for dynamic 0..n.",
+ toList(RANK_1, RANK_2), (List) compProps.get(PROP_BIND_0n));
+ assertEqualElements("New target service with lower ranking should be bound for dynamic 1..n.",
+ toList(RANK_1, RANK_2), (List) compProps.get(PROP_BIND_1n));
+
+ // register service with higher ranking
+ props.put(Constants.SERVICE_RANKING, RANK_3);
+ srHigher = registerService(PropertiesProvider.class.getName(), new DefaultPropertiesProvider(null),
+ (Dictionary) props.clone());
+ Thread.sleep(timeout);
+
+ // check bound references
+ bsStatic = getBaseService(COMP_NAME_STATIC);
+ assertNotNull("Component " + COMP_NAME_STATIC + " should still be active", bsStatic);
+ compProps = bsStatic.getProperties();
+ assertNotNull("Component properties should be available.", compProps);
+ assertEqualElements("New target service with higher ranking should be bound for static 0..1.", toList(RANK_3),
+ (List) compProps.get(PROP_BIND_01));
+ assertEqualElements("New target service with higher ranking should be bound for static 1..1.", toList(RANK_3),
+ (List) compProps.get(PROP_BIND_11));
+ assertEqualElements("New target service with higher ranking should be bound for static 0..n.",
+ toList(RANK_1, RANK_2, RANK_3), (List) compProps.get(PROP_BIND_0n));
+ assertEqualElements("New target service with higher ranking should be bound for static 1..n.",
+ toList(RANK_1, RANK_2, RANK_3), (List) compProps.get(PROP_BIND_1n));
+ bsDynamic = getBaseService(COMP_NAME_DYNAMIC);
+ assertNotNull("Component " + COMP_NAME_DYNAMIC + " should still be active", bsDynamic);
+ compProps = bsDynamic.getProperties();
+ assertNotNull("Component properties should be available.", compProps);
+ assertEqualElements("New target service with higher ranking should be bound for dynamic 0..1.",
+ toList(RANK_2, RANK_3), (List) compProps.get(PROP_BIND_01));
+ assertEqualElements("New target service with higher ranking should be bound for dynamic 1..1.",
+ toList(RANK_2, RANK_3), (List) compProps.get(PROP_BIND_11));
+ assertEqualElements("New target service with higher ranking should be bound for dynamic 0..n.",
+ toList(RANK_1, RANK_2, RANK_3), (List) compProps.get(PROP_BIND_0n));
+ assertEqualElements("New target service with higher ranking should be bound for dynamic 1..n.",
+ toList(RANK_1, RANK_2, RANK_3), (List) compProps.get(PROP_BIND_1n));
+ } finally {
+ uninstallBundle(tb25);
+ if (sr != null) {
+ unregisterService(sr);
+ }
+ if (srLower != null) {
+ unregisterService(srLower);
+ }
+ if (srHigher != null) {
+ unregisterService(srHigher);
+ }
+ }
+ }
+
+ // Tests PID of Component configuration
+ public void testComponentConfigurationPID() throws Exception {
+ ConfigurationAdmin cm = (ConfigurationAdmin) trackerCM.getService();
+ if (cm == null) {
+ return;
+ }
+
+ Bundle tb25 = installBundle("tb25");
+ Configuration config = null;
+ try {
+ final String COMP_NAME = "org.eclipse.equinox.ds.tests.tb25.ConfigPIDComp";
+ final String CONFIG_PID = "test.changed.configuration.pid";
+ final String PROP = "test.property";
+
+ // set component configuration
+ config = cm.getConfiguration(CONFIG_PID);
+ Dictionary configProperties = config.getProperties();
+ if (configProperties == null) {
+ configProperties = new Hashtable();
+ }
+ configProperties.put(PROP, Boolean.TRUE);
+ config.update(configProperties);
+ Thread.sleep(timeout);
+
+ tb25.start();
+ waitBundleStart();
+
+ // check component properties
+ PropertiesProvider bs = getBaseService(COMP_NAME);
+ assertNotNull("Component " + COMP_NAME + " should be activated", bs);
+ Dictionary compProps = bs.getProperties();
+ assertNotNull("Component properties should be available.", compProps);
+ assertEquals("Test property should be set.", Boolean.TRUE, compProps.get(PROP));
+ } finally {
+ uninstallBundle(tb25);
+ if (config != null) {
+ config.delete();
+ }
+ }
+ }
+
+ /**
+ * Asserts that two lists contain equal elements (the order doesn't matter).
+ */
+ private static void assertEqualElements(String message, List list1, List list2) {
+ if (list1 == null || list2 == null) {
+ fail(message);
+ }
+ if (list1.size() != list2.size()) {
+ fail(message);
+ }
+ List tmp = new ArrayList(list2);
+ for (Iterator it = list1.iterator(); it.hasNext();) {
+ Object el = it.next();
+ if (!tmp.contains(el)) {
+ fail(message);
+ }
+ tmp.remove(el);
+ }
+ }
+
+ private List toList(Object el) {
+ List list = new ArrayList();
+ list.add(el);
+ return list;
+ }
+
+ private List toList(Object el1, Object el2) {
+ List list = new ArrayList();
+ list.add(el1);
+ list.add(el2);
+ return list;
+ }
+
+ private List toList(Object el1, Object el2, Object el3) {
+ List list = new ArrayList();
+ list.add(el1);
+ list.add(el2);
+ list.add(el3);
+ return list;
+ }
+
/**
* Searches for component with name componentName which provides
* PropertiesProvider. Returns value of its "config.base.data" property.
diff --git a/bundles/org.eclipse.equinox.ds.tests/src/org/eclipse/equinox/ds/tests/tbc/DefaultPropertiesProvider.java b/bundles/org.eclipse.equinox.ds.tests/src/org/eclipse/equinox/ds/tests/tbc/DefaultPropertiesProvider.java
new file mode 100644
index 000000000..dd06fac71
--- /dev/null
+++ b/bundles/org.eclipse.equinox.ds.tests/src/org/eclipse/equinox/ds/tests/tbc/DefaultPropertiesProvider.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 1997, 2012 by ProSyst Software GmbH
+ * http://www.prosyst.com
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * ProSyst Software GmbH - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.equinox.ds.tests.tbc;
+
+import java.util.Dictionary;
+
+public class DefaultPropertiesProvider implements PropertiesProvider {
+
+ private Dictionary properties;
+
+ public DefaultPropertiesProvider(Dictionary properties) {
+ this.properties = properties;
+ }
+
+ public Dictionary getProperties() {
+ return properties;
+ }
+
+}
--
cgit v1.2.3