| /* |
| * 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.felix.scr.integration; |
| |
| |
| import java.util.Hashtable; |
| import junit.framework.TestCase; |
| |
| import org.apache.felix.scr.integration.components.SimpleComponent; |
| import org.apache.felix.scr.integration.components.SimpleComponent2; |
| import org.apache.felix.scr.integration.components.SimpleService2Impl; |
| import org.apache.felix.scr.integration.components.SimpleServiceImpl; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.ops4j.pax.exam.junit.JUnit4TestRunner; |
| import org.osgi.framework.InvalidSyntaxException; |
| import org.osgi.framework.ServiceReference; |
| import org.osgi.service.component.ComponentConstants; |
| import org.osgi.service.component.ComponentFactory; |
| import org.osgi.service.component.ComponentInstance; |
| import org.osgi.service.component.runtime.dto.ComponentConfigurationDTO; |
| |
| |
| @RunWith(JUnit4TestRunner.class) |
| public class ServiceBindGreedyTest extends ComponentTestBase |
| { |
| |
| private static final String PROP_NAME_FACTORY = ComponentTestBase.PROP_NAME + ".factory"; |
| |
| static |
| { |
| // uncomment to enable debugging of this test class |
| // paxRunnerVmOption = DEBUG_VM_OPTION; |
| |
| descriptorFile = "/integration_test_simple_components_service_binding_greedy.xml"; |
| } |
| |
| |
| @Test |
| public void test_optional_single_dynamic() throws Exception |
| { |
| final SimpleServiceImpl srv1 = SimpleServiceImpl.create( bundleContext, "srv1" ); |
| |
| String name ="test_optional_single_dynamic"; |
| ComponentConfigurationDTO cc = getDisabledConfigurationAndEnable(name, ComponentConfigurationDTO.ACTIVE); |
| final SimpleComponent comp10 = SimpleComponent.INSTANCE; |
| TestCase.assertNotNull( comp10 ); |
| TestCase.assertEquals( srv1, comp10.m_singleRef ); |
| TestCase.assertTrue( comp10.m_multiRef.isEmpty() ); |
| |
| srv1.drop(); |
| // no delay, should be immediate |
| |
| final SimpleComponent comp11 = SimpleComponent.INSTANCE; |
| TestCase.assertSame( comp10, comp11 ); |
| TestCase.assertNull( comp11.m_singleRef ); |
| TestCase.assertTrue( comp11.m_multiRef.isEmpty() ); |
| |
| final SimpleServiceImpl srv2 = SimpleServiceImpl.create( bundleContext, "srv2", 2 ); |
| delay(); // async binding |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| final SimpleComponent comp12 = SimpleComponent.INSTANCE; |
| TestCase.assertSame( comp10, comp12 ); |
| TestCase.assertEquals( srv2, comp12.m_singleRef ); |
| TestCase.assertTrue( comp12.m_multiRef.isEmpty() ); |
| |
| disableAndCheck(cc); |
| |
| final SimpleServiceImpl srv3 = SimpleServiceImpl.create( bundleContext, "srv3", 2 ); |
| |
| // enable component with two services available of same ranking, expect srv2 bind |
| // async enabling |
| enableAndCheck(cc.description); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| final SimpleComponent comp20 = SimpleComponent.INSTANCE; |
| TestCase.assertNotNull( comp20 ); |
| TestCase.assertNotSame( comp10, comp20 ); |
| TestCase.assertEquals( srv2, comp20.m_singleRef ); |
| TestCase.assertTrue( comp20.m_multiRef.isEmpty() ); |
| |
| // drop srv2, expect rebind to srv3 (synchronously) |
| srv2.drop(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| final SimpleComponent comp21 = SimpleComponent.INSTANCE; |
| TestCase.assertSame( comp20, comp21 ); |
| TestCase.assertEquals( srv3, comp21.m_singleRef ); |
| TestCase.assertTrue( comp21.m_multiRef.isEmpty() ); |
| |
| // create srv4, expect greedy rebind |
| final SimpleServiceImpl srv4 = SimpleServiceImpl.create( bundleContext, "srv4", 4 ); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| final SimpleComponent comp22 = SimpleComponent.INSTANCE; |
| TestCase.assertSame( comp20, comp22 ); |
| TestCase.assertEquals( srv4, comp22.m_singleRef ); |
| TestCase.assertTrue( comp22.m_multiRef.isEmpty() ); |
| |
| // drop srv4 again, expect rebind to srv3 |
| srv4.drop(); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| final SimpleComponent comp23 = SimpleComponent.INSTANCE; |
| TestCase.assertSame( comp20, comp23 ); |
| TestCase.assertEquals( srv3, comp23.m_singleRef ); |
| TestCase.assertTrue( comp23.m_multiRef.isEmpty() ); |
| |
| // "reset" |
| disableAndCheck(cc); |
| srv3.drop(); |
| delay(); |
| |
| // two services with service ranking (srv6 > srv5) |
| final SimpleServiceImpl srv5 = SimpleServiceImpl.create( bundleContext, "srv5", 10 ); |
| final SimpleServiceImpl srv6 = SimpleServiceImpl.create( bundleContext, "srv6", 20 ); |
| |
| enableAndCheck(cc.description); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| final SimpleComponent comp30 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp20, comp30 ); |
| TestCase.assertEquals( srv6, comp30.m_singleRef ); |
| TestCase.assertTrue( comp30.m_multiRef.isEmpty() ); |
| |
| // another service with higher ranking -- greedy rebind ! |
| final SimpleServiceImpl srv7 = SimpleServiceImpl.create( bundleContext, "srv7", 30 ); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| final SimpleComponent comp31 = SimpleComponent.INSTANCE; |
| TestCase.assertSame( comp30, comp31 ); |
| TestCase.assertEquals( srv7, comp31.m_singleRef ); |
| TestCase.assertTrue( comp31.m_multiRef.isEmpty() ); |
| |
| // srv6 goes, rebind to srv7 |
| srv6.drop(); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| final SimpleComponent comp32 = SimpleComponent.INSTANCE; |
| TestCase.assertSame( comp30, comp32 ); |
| TestCase.assertEquals( srv7, comp32.m_singleRef ); |
| TestCase.assertTrue( comp32.m_multiRef.isEmpty() ); |
| } |
| |
| |
| @Test |
| public void test_required_single_dynamic() throws Exception |
| { |
| final SimpleServiceImpl srv1 = SimpleServiceImpl.create( bundleContext, "srv1", 1 ); |
| |
| String name ="test_required_single_dynamic"; |
| ComponentConfigurationDTO cc = getDisabledConfigurationAndEnable(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp10 = SimpleComponent.INSTANCE; |
| TestCase.assertNotNull( comp10 ); |
| TestCase.assertEquals( srv1, comp10.m_singleRef ); |
| TestCase.assertTrue( comp10.m_multiRef.isEmpty() ); |
| |
| srv1.drop(); |
| // no delay, should be immediate |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED); |
| final SimpleComponent comp11 = SimpleComponent.INSTANCE; |
| TestCase.assertNull( comp11 ); |
| |
| final SimpleServiceImpl srv2 = SimpleServiceImpl.create( bundleContext, "srv2", 2 ); |
| delay(); // async binding |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| final SimpleComponent comp12 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp10, comp12 ); |
| TestCase.assertEquals( srv2, comp12.m_singleRef ); |
| TestCase.assertTrue( comp12.m_multiRef.isEmpty() ); |
| |
| disableAndCheck(cc); |
| delay(); // async disabling |
| |
| final SimpleServiceImpl srv3 = SimpleServiceImpl.create( bundleContext, "srv3", 2 ); |
| |
| // enable component with two services available of same ranking, expect srv2 bind |
| // async enabling |
| enableAndCheck(cc.description); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| final SimpleComponent comp20 = SimpleComponent.INSTANCE; |
| TestCase.assertNotNull( comp20 ); |
| TestCase.assertNotSame( comp10, comp20 ); |
| TestCase.assertEquals( srv2, comp20.m_singleRef ); |
| TestCase.assertTrue( comp20.m_multiRef.isEmpty() ); |
| |
| // drop srv2, expect rebind to srv3 (synchronously) |
| srv2.drop(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| final SimpleComponent comp21 = SimpleComponent.INSTANCE; |
| TestCase.assertSame( comp20, comp21 ); |
| TestCase.assertEquals( srv3, comp21.m_singleRef ); |
| TestCase.assertTrue( comp21.m_multiRef.isEmpty() ); |
| |
| // create srv4, expect no rebind |
| final SimpleServiceImpl srv4 = SimpleServiceImpl.create( bundleContext, "srv4", 2 ); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| final SimpleComponent comp22 = SimpleComponent.INSTANCE; |
| TestCase.assertSame( comp20, comp22 ); |
| TestCase.assertEquals( srv3, comp22.m_singleRef ); |
| TestCase.assertTrue( comp22.m_multiRef.isEmpty() ); |
| |
| // drop srv4 again, expect no rebind |
| srv4.drop(); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| final SimpleComponent comp23 = SimpleComponent.INSTANCE; |
| TestCase.assertSame( comp20, comp23 ); |
| TestCase.assertEquals( srv3, comp23.m_singleRef ); |
| TestCase.assertTrue( comp23.m_multiRef.isEmpty() ); |
| |
| // "reset" |
| disableAndCheck(cc); |
| srv3.drop(); |
| delay(); |
| |
| // two services with service ranking (srv6 > srv5) |
| final SimpleServiceImpl srv5 = SimpleServiceImpl.create( bundleContext, "srv5", 10 ); |
| final SimpleServiceImpl srv6 = SimpleServiceImpl.create( bundleContext, "srv6", 20 ); |
| |
| enableAndCheck(cc.description); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| final SimpleComponent comp30 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp20, comp30 ); |
| TestCase.assertEquals( srv6, comp30.m_singleRef ); |
| TestCase.assertTrue( comp30.m_multiRef.isEmpty() ); |
| |
| // another service with higher ranking -- greedy rebind ! |
| final SimpleServiceImpl srv7 = SimpleServiceImpl.create( bundleContext, "srv7", 30 ); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| final SimpleComponent comp31 = SimpleComponent.INSTANCE; |
| TestCase.assertSame( comp30, comp31 ); |
| TestCase.assertEquals( srv7, comp31.m_singleRef ); |
| TestCase.assertTrue( comp31.m_multiRef.isEmpty() ); |
| |
| // srv6 goes, no rebind to srv7 |
| srv6.drop(); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| final SimpleComponent comp32 = SimpleComponent.INSTANCE; |
| TestCase.assertSame( comp30, comp32 ); |
| TestCase.assertEquals( srv7, comp32.m_singleRef ); |
| TestCase.assertTrue( comp32.m_multiRef.isEmpty() ); |
| } |
| |
| |
| @Test |
| public void test_optional_multiple_dynamic() throws Exception |
| { |
| final SimpleServiceImpl srv1 = SimpleServiceImpl.create( bundleContext, "srv1" ); |
| |
| String name ="test_optional_multiple_dynamic"; |
| ComponentConfigurationDTO cc = getDisabledConfigurationAndEnable(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp10 = SimpleComponent.INSTANCE; |
| TestCase.assertNotNull( comp10 ); |
| TestCase.assertNull( comp10.m_singleRef ); |
| TestCase.assertTrue( comp10.m_multiRef.contains( srv1 ) ); |
| |
| srv1.drop(); |
| // no delay, should be immediate |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| final SimpleComponent comp11 = SimpleComponent.INSTANCE; |
| TestCase.assertSame( comp10, comp11 ); |
| TestCase.assertNull( comp11.m_singleRef ); |
| TestCase.assertTrue( comp11.m_multiRef.isEmpty() ); |
| |
| final SimpleServiceImpl srv2 = SimpleServiceImpl.create( bundleContext, "srv2" ); |
| delay(); // async binding |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| final SimpleComponent comp12 = SimpleComponent.INSTANCE; |
| TestCase.assertSame( comp10, comp12 ); |
| TestCase.assertNull( comp12.m_singleRef ); |
| TestCase.assertTrue( comp12.m_multiRef.contains( srv2 ) ); |
| |
| disableAndCheck(cc); |
| delay(); // async disabling |
| |
| final SimpleServiceImpl srv3 = SimpleServiceImpl.create( bundleContext, "srv3" ); |
| |
| // enable component with two services available, expect both bind |
| // async enabling |
| enableAndCheck(cc.description); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| final SimpleComponent comp20 = SimpleComponent.INSTANCE; |
| TestCase.assertNotNull( comp20 ); |
| TestCase.assertNotSame( comp10, comp20 ); |
| TestCase.assertNull( comp20.m_singleRef ); |
| TestCase.assertTrue( comp20.m_multiRef.contains( srv2 ) ); |
| TestCase.assertTrue( comp20.m_multiRef.contains( srv3 ) ); |
| |
| srv2.drop(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| final SimpleComponent comp21 = SimpleComponent.INSTANCE; |
| TestCase.assertSame( comp20, comp21 ); |
| TestCase.assertNull( comp21.m_singleRef ); |
| TestCase.assertFalse( comp21.m_multiRef.contains( srv2 ) ); |
| TestCase.assertTrue( comp21.m_multiRef.contains( srv3 ) ); |
| |
| // create srv4, expect bind |
| final SimpleServiceImpl srv4 = SimpleServiceImpl.create( bundleContext, "srv4" ); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| final SimpleComponent comp22 = SimpleComponent.INSTANCE; |
| TestCase.assertSame( comp20, comp22 ); |
| TestCase.assertNull( comp22.m_singleRef ); |
| TestCase.assertFalse( comp22.m_multiRef.contains( srv2 ) ); |
| TestCase.assertTrue( comp22.m_multiRef.contains( srv3 ) ); |
| TestCase.assertTrue( comp22.m_multiRef.contains( srv4 ) ); |
| |
| // drop srv4 again, expect no rebind |
| srv4.drop(); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| final SimpleComponent comp23 = SimpleComponent.INSTANCE; |
| TestCase.assertSame( comp20, comp23 ); |
| TestCase.assertNull( comp23.m_singleRef ); |
| TestCase.assertFalse( comp23.m_multiRef.contains( srv2 ) ); |
| TestCase.assertTrue( comp23.m_multiRef.contains( srv3 ) ); |
| TestCase.assertFalse( comp23.m_multiRef.contains( srv4 ) ); |
| |
| // "reset" |
| disableAndCheck(cc); |
| srv3.drop(); |
| delay(); |
| |
| // two services with service ranking (srv6 > srv5) |
| final SimpleServiceImpl srv5 = SimpleServiceImpl.create( bundleContext, "srv5", 10 ); |
| final SimpleServiceImpl srv6 = SimpleServiceImpl.create( bundleContext, "srv6", 20 ); |
| |
| enableAndCheck(cc.description); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| final SimpleComponent comp30 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp20, comp30 ); |
| TestCase.assertNull( comp30.m_singleRef ); |
| TestCase.assertTrue( comp30.m_multiRef.contains( srv5 ) ); |
| TestCase.assertTrue( comp30.m_multiRef.contains( srv6 ) ); |
| |
| // another service with higher ranking -- no rebind ! |
| final SimpleServiceImpl srv7 = SimpleServiceImpl.create( bundleContext, "srv7", 30 ); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp31 = SimpleComponent.INSTANCE; |
| TestCase.assertSame( comp30, comp31 ); |
| TestCase.assertNull( comp31.m_singleRef ); |
| TestCase.assertTrue( comp31.m_multiRef.contains( srv5 ) ); |
| TestCase.assertTrue( comp31.m_multiRef.contains( srv6 ) ); |
| TestCase.assertTrue( comp31.m_multiRef.contains( srv7 ) ); |
| |
| // srv6 goes, rebind to srv7 |
| srv6.drop(); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp32 = SimpleComponent.INSTANCE; |
| TestCase.assertSame( comp30, comp32 ); |
| TestCase.assertNull( comp32.m_singleRef ); |
| TestCase.assertTrue( comp32.m_multiRef.contains( srv5 ) ); |
| TestCase.assertFalse( comp32.m_multiRef.contains( srv6 ) ); |
| TestCase.assertTrue( comp32.m_multiRef.contains( srv7 ) ); |
| } |
| |
| |
| @Test |
| public void test_required_multiple_dynamic() throws Exception |
| { |
| final SimpleServiceImpl srv1 = SimpleServiceImpl.create( bundleContext, "srv1" ); |
| |
| String name ="test_required_multiple_dynamic"; |
| ComponentConfigurationDTO cc = getDisabledConfigurationAndEnable(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp10 = SimpleComponent.INSTANCE; |
| TestCase.assertNotNull( comp10 ); |
| TestCase.assertNull( comp10.m_singleRef ); |
| TestCase.assertTrue( comp10.m_multiRef.contains( srv1 ) ); |
| |
| srv1.drop(); |
| // no delay, should be immediate |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED); |
| final SimpleComponent comp11 = SimpleComponent.INSTANCE; |
| TestCase.assertNull( comp11 ); |
| |
| final SimpleServiceImpl srv2 = SimpleServiceImpl.create( bundleContext, "srv2" ); |
| delay(); // async binding |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp12 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp10, comp12 ); |
| TestCase.assertNull( comp12.m_singleRef ); |
| TestCase.assertTrue( comp12.m_multiRef.contains( srv2 ) ); |
| |
| disableAndCheck(cc); |
| delay(); // async disabling |
| |
| final SimpleServiceImpl srv3 = SimpleServiceImpl.create( bundleContext, "srv3" ); |
| |
| // enable component with two services available, expect both bind |
| // async enabling |
| enableAndCheck(cc.description); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp20 = SimpleComponent.INSTANCE; |
| TestCase.assertNotNull( comp20 ); |
| TestCase.assertNotSame( comp10, comp20 ); |
| TestCase.assertNull( comp20.m_singleRef ); |
| TestCase.assertTrue( comp20.m_multiRef.contains( srv2 ) ); |
| TestCase.assertTrue( comp20.m_multiRef.contains( srv3 ) ); |
| |
| srv2.drop(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp21 = SimpleComponent.INSTANCE; |
| TestCase.assertSame( comp20, comp21 ); |
| TestCase.assertNull( comp21.m_singleRef ); |
| TestCase.assertFalse( comp21.m_multiRef.contains( srv2 ) ); |
| TestCase.assertTrue( comp21.m_multiRef.contains( srv3 ) ); |
| |
| // create srv4, expect bind |
| final SimpleServiceImpl srv4 = SimpleServiceImpl.create( bundleContext, "srv4" ); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp22 = SimpleComponent.INSTANCE; |
| TestCase.assertSame( comp20, comp22 ); |
| TestCase.assertNull( comp22.m_singleRef ); |
| TestCase.assertFalse( comp22.m_multiRef.contains( srv2 ) ); |
| TestCase.assertTrue( comp22.m_multiRef.contains( srv3 ) ); |
| TestCase.assertTrue( comp22.m_multiRef.contains( srv4 ) ); |
| |
| // drop srv4 again, expect no rebind |
| srv4.drop(); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp23 = SimpleComponent.INSTANCE; |
| TestCase.assertSame( comp20, comp23 ); |
| TestCase.assertNull( comp23.m_singleRef ); |
| TestCase.assertFalse( comp23.m_multiRef.contains( srv2 ) ); |
| TestCase.assertTrue( comp23.m_multiRef.contains( srv3 ) ); |
| TestCase.assertFalse( comp23.m_multiRef.contains( srv4 ) ); |
| |
| // "reset" |
| disableAndCheck(cc); |
| srv3.drop(); |
| delay(); |
| |
| // two services with service ranking (srv6 > srv5) |
| final SimpleServiceImpl srv5 = SimpleServiceImpl.create( bundleContext, "srv5", 10 ); |
| final SimpleServiceImpl srv6 = SimpleServiceImpl.create( bundleContext, "srv6", 20 ); |
| |
| enableAndCheck(cc.description); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp30 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp20, comp30 ); |
| TestCase.assertNull( comp30.m_singleRef ); |
| TestCase.assertTrue( comp30.m_multiRef.contains( srv5 ) ); |
| TestCase.assertTrue( comp30.m_multiRef.contains( srv6 ) ); |
| |
| // another service with higher ranking -- no rebind ! |
| final SimpleServiceImpl srv7 = SimpleServiceImpl.create( bundleContext, "srv7", 30 ); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp31 = SimpleComponent.INSTANCE; |
| TestCase.assertSame( comp30, comp31 ); |
| TestCase.assertNull( comp31.m_singleRef ); |
| TestCase.assertTrue( comp31.m_multiRef.contains( srv5 ) ); |
| TestCase.assertTrue( comp31.m_multiRef.contains( srv6 ) ); |
| TestCase.assertTrue( comp31.m_multiRef.contains( srv7 ) ); |
| |
| // srv6 goes, rebind to srv7 |
| srv6.drop(); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp32 = SimpleComponent.INSTANCE; |
| TestCase.assertSame( comp30, comp32 ); |
| TestCase.assertNull( comp32.m_singleRef ); |
| TestCase.assertTrue( comp32.m_multiRef.contains( srv5 ) ); |
| TestCase.assertFalse( comp32.m_multiRef.contains( srv6 ) ); |
| TestCase.assertTrue( comp32.m_multiRef.contains( srv7 ) ); |
| } |
| |
| |
| @Test |
| public void test_required_multiple_dynamic_factory() throws Exception |
| { |
| String name ="test_required_multiple_dynamic_factory"; //also pid |
| final String factoryPid = "factory_" + name; |
| getConfigurationsDisabledThenEnable(name, 0, ComponentConfigurationDTO.UNSATISFIED); |
| // final String pid = "test_required_multiple_dynamic_factory"; |
| // |
| // final Component component = findComponentDescriptorByName( pid ); |
| // TestCase.assertNotNull( component ); |
| // TestCase.assertEquals( Component.STATE_DISABLED, component.getState() ); |
| // |
| // // async enabling (unsatisfied) |
| // enableAndCheck(cc.description); |
| // delay(); |
| // findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED); |
| |
| // register service, satisfying |
| final SimpleServiceImpl srv1 = SimpleServiceImpl.create( bundleContext, "srv1" ); |
| delay(); |
| // TestCase.assertEquals( Component.STATE_FACTORY, component.getState() ); |
| |
| // create a component instance |
| final ServiceReference[] refs = bundleContext.getServiceReferences( ComponentFactory.class.getName(), "(" |
| + ComponentConstants.COMPONENT_FACTORY + "=" + factoryPid + ")" ); |
| TestCase.assertNotNull( refs ); |
| TestCase.assertEquals( 1, refs.length ); |
| final ComponentFactory factory = ( ComponentFactory ) bundleContext.getService( refs[0] ); |
| TestCase.assertNotNull( factory ); |
| |
| Hashtable<String, String> props = new Hashtable<String, String>(); |
| props.put( PROP_NAME_FACTORY, PROP_NAME_FACTORY ); |
| final ComponentInstance instance = factory.newInstance( props ); |
| TestCase.assertNotNull( instance ); |
| TestCase.assertNotNull( instance.getInstance() ); |
| TestCase.assertEquals( SimpleComponent.INSTANCE, instance.getInstance() ); |
| |
| // ensure instance is bound |
| final SimpleComponent sc = SimpleComponent.INSTANCE; |
| TestCase.assertEquals( 1, sc.m_multiRef.size() ); |
| TestCase.assertTrue( sc.m_multiRef.contains( srv1 ) ); |
| |
| // ensure factory is not bound |
| // TestCase.assertNull( component.getReferences()[0].getServiceReferences() ); |
| |
| // assert two components managed |
| checkConfigurationCount(name, 1, ComponentConfigurationDTO.ACTIVE); |
| // final Component[] allFactoryComponents = findComponentConfigurationsByName( pid, -1 ); |
| // TestCase.assertNotNull( allFactoryComponents ); |
| // TestCase.assertEquals( 2, allFactoryComponents.length ); |
| // for ( int i = 0; i < allFactoryComponents.length; i++ ) |
| // { |
| // final Component c = allFactoryComponents[i]; |
| // if ( c.getId() == component.getId() ) |
| // { |
| // TestCase.assertEquals( Component.STATE_FACTORY, c.getState() ); |
| // } |
| // else if ( c.getId() == SimpleComponent.INSTANCE.m_id ) |
| // { |
| // TestCase.assertEquals( Component.STATE_ACTIVE, c.getState() ); |
| // } |
| // else |
| // { |
| // TestCase.fail( "Unexpected Component " + c ); |
| // } |
| // } |
| |
| // register second service |
| final SimpleServiceImpl srv11 = SimpleServiceImpl.create( bundleContext, "srv11" ); |
| delay(); |
| |
| // ensure instance is bound |
| TestCase.assertEquals( 2, sc.m_multiRef.size() ); |
| TestCase.assertTrue( sc.m_multiRef.contains( srv1 ) ); |
| TestCase.assertTrue( sc.m_multiRef.contains( srv11 ) ); |
| |
| // ensure factory is not bound |
| // TestCase.assertNull( component.getReferences()[0].getServiceReferences() ); |
| |
| // drop second service and ensure unbound (and active) |
| srv11.drop(); |
| delay(); |
| TestCase.assertNotNull( instance.getInstance() ); |
| TestCase.assertEquals( SimpleComponent.INSTANCE, instance.getInstance() ); |
| TestCase.assertEquals( 1, sc.m_multiRef.size() ); |
| TestCase.assertTrue( sc.m_multiRef.contains( srv1 ) ); |
| // TestCase.assertNull( component.getReferences()[0].getServiceReferences() ); |
| |
| |
| // remove the service, expect factory to deactivate and instance to dispose |
| srv1.drop(); |
| delay(); |
| |
| checkConfigurationCount(name, 0, -1); |
| TestCase.assertNull( instance.getInstance() ); |
| |
| // assert component factory only managed |
| //TODO this check should be whether the service is registered. |
| // final Component[] allFactoryComponents2 = findComponentConfigurationsByName( pid, -1 ); |
| // TestCase.assertNotNull( allFactoryComponents2 ); |
| // TestCase.assertEquals( 1, allFactoryComponents2.length ); |
| // for ( int i = 0; i < allFactoryComponents2.length; i++ ) |
| // { |
| // final Component c = allFactoryComponents2[i]; |
| // if ( c.getId() == component.getId() ) |
| // { |
| // TestCase.assertEquals( Component.STATE_UNSATISFIED, c.getState() ); |
| // } |
| // else |
| // { |
| // TestCase.fail( "Unexpected Component " + c ); |
| // } |
| // } |
| |
| // registeranother service, factory must come back, instance not |
| final SimpleServiceImpl srv2 = SimpleServiceImpl.create( bundleContext, "srv2" ); |
| delay(); |
| |
| // TestCase.assertEquals( Component.STATE_FACTORY, component.getState() ); |
| TestCase.assertNull( instance.getInstance() ); |
| |
| // assert component factory only managed |
| checkConfigurationCount(name, 0, -1); |
| // final Component[] allFactoryComponents3 = findComponentConfigurationsByName( pid, -1 ); |
| // TestCase.assertNotNull( allFactoryComponents3 ); |
| // TestCase.assertEquals( 1, allFactoryComponents3.length ); |
| // for ( int i = 0; i < allFactoryComponents3.length; i++ ) |
| // { |
| // final Component c = allFactoryComponents3[i]; |
| // if ( c.getId() == component.getId() ) |
| // { |
| // TestCase.assertEquals( Component.STATE_FACTORY, c.getState() ); |
| // } |
| // else |
| // { |
| // TestCase.fail( "Unexpected Component " + c ); |
| // } |
| // } |
| } |
| |
| |
| @Test |
| public void test_optional_single_static() throws Exception |
| { |
| final SimpleServiceImpl srv1 = SimpleServiceImpl.create( bundleContext, "srv1" ); |
| |
| String name ="test_optional_single_static"; |
| ComponentConfigurationDTO cc = getDisabledConfigurationAndEnable(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp10 = SimpleComponent.INSTANCE; |
| TestCase.assertNotNull( comp10 ); |
| TestCase.assertEquals( srv1, comp10.m_singleRef ); |
| TestCase.assertTrue( comp10.m_multiRef.isEmpty() ); |
| |
| srv1.drop(); |
| delay(); // async reactivate |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp11 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp10, comp11 ); |
| TestCase.assertNull( comp11.m_singleRef ); |
| TestCase.assertTrue( comp11.m_multiRef.isEmpty() ); |
| |
| final SimpleServiceImpl srv2 = SimpleServiceImpl.create( bundleContext, "srv2" ); |
| delay(); // async binding |
| |
| // greedy static reference rebinds |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| final SimpleComponent comp12 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp10, comp12 ); |
| TestCase.assertNotSame( comp11, comp12 ); |
| TestCase.assertEquals( srv2, comp12.m_singleRef ); |
| TestCase.assertTrue( comp12.m_multiRef.isEmpty() ); |
| |
| disableAndCheck(cc); |
| delay(); // async disabling |
| |
| final SimpleServiceImpl srv3 = SimpleServiceImpl.create( bundleContext, "srv3" ); |
| |
| // enable component with two services available, expect srv2 bind |
| // async enabling |
| enableAndCheck(cc.description); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp20 = SimpleComponent.INSTANCE; |
| TestCase.assertNotNull( comp20 ); |
| TestCase.assertNotSame( comp10, comp20 ); |
| TestCase.assertEquals( srv2, comp20.m_singleRef ); |
| TestCase.assertTrue( comp20.m_multiRef.isEmpty() ); |
| |
| // drop srv2, expect rebind to srv3 (synchronously) |
| srv2.drop(); |
| delay(); // async reactivate |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp21 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp20, comp21 ); |
| TestCase.assertEquals( srv3, comp21.m_singleRef ); |
| TestCase.assertTrue( comp21.m_multiRef.isEmpty() ); |
| |
| // create srv4 of lower rank, expect no rebind |
| final SimpleServiceImpl srv4 = SimpleServiceImpl.create( bundleContext, "srv4", -1 ); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp22 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp20, comp22 ); |
| TestCase.assertSame( comp21, comp22 ); |
| TestCase.assertEquals( srv3, comp22.m_singleRef ); |
| TestCase.assertTrue( comp22.m_multiRef.isEmpty() ); |
| |
| // drop srv4 again, expect no rebind |
| srv4.drop(); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp23 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp20, comp23 ); |
| TestCase.assertSame( comp21, comp23 ); |
| TestCase.assertSame( comp22, comp23 ); |
| TestCase.assertEquals( srv3, comp23.m_singleRef ); |
| TestCase.assertTrue( comp23.m_multiRef.isEmpty() ); |
| |
| // "reset" |
| disableAndCheck(cc); |
| srv3.drop(); |
| delay(); |
| |
| // two services with service ranking (srv6 > srv5) |
| final SimpleServiceImpl srv5 = SimpleServiceImpl.create( bundleContext, "srv5", 10 ); |
| final SimpleServiceImpl srv6 = SimpleServiceImpl.create( bundleContext, "srv6", 20 ); |
| |
| enableAndCheck(cc.description); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp30 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp23, comp30 ); |
| TestCase.assertEquals( srv6, comp30.m_singleRef ); |
| TestCase.assertTrue( comp30.m_multiRef.isEmpty() ); |
| |
| // another service with higher ranking rebind ! |
| final SimpleServiceImpl srv7 = SimpleServiceImpl.create( bundleContext, "srv7", 30 ); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp31 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp30, comp31 ); |
| TestCase.assertEquals( srv7, comp31.m_singleRef ); |
| TestCase.assertTrue( comp31.m_multiRef.isEmpty() ); |
| |
| // srv6 goes, rebind to srv7 |
| srv6.drop(); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp32 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp30, comp32 ); |
| TestCase.assertSame( comp31, comp32 ); |
| TestCase.assertEquals( srv7, comp32.m_singleRef ); |
| TestCase.assertTrue( comp32.m_multiRef.isEmpty() ); |
| } |
| |
| |
| @Test |
| public void test_required_single_static() throws Exception |
| { |
| final SimpleServiceImpl srv1 = SimpleServiceImpl.create( bundleContext, "srv1" ); |
| |
| String name ="test_required_single_static"; |
| ComponentConfigurationDTO cc = getDisabledConfigurationAndEnable(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp10 = SimpleComponent.INSTANCE; |
| TestCase.assertNotNull( comp10 ); |
| TestCase.assertEquals( srv1, comp10.m_singleRef ); |
| TestCase.assertTrue( comp10.m_multiRef.isEmpty() ); |
| |
| srv1.drop(); |
| delay(); // async reactivate |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED); |
| final SimpleComponent comp11 = SimpleComponent.INSTANCE; |
| TestCase.assertNull( comp11 ); |
| |
| final SimpleServiceImpl srv2 = SimpleServiceImpl.create( bundleContext, "srv2" ); |
| delay(); // async binding |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp12 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp10, comp12 ); |
| TestCase.assertEquals( srv2, comp12.m_singleRef ); |
| TestCase.assertTrue( comp12.m_multiRef.isEmpty() ); |
| |
| disableAndCheck(cc); |
| delay(); // async disabling |
| |
| final SimpleServiceImpl srv3 = SimpleServiceImpl.create( bundleContext, "srv3" ); |
| |
| // enable component with two services available, expect srv2 bind |
| // async enabling |
| enableAndCheck(cc.description); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp20 = SimpleComponent.INSTANCE; |
| TestCase.assertNotNull( comp20 ); |
| TestCase.assertNotSame( comp10, comp20 ); |
| TestCase.assertEquals( srv2, comp20.m_singleRef ); |
| TestCase.assertTrue( comp20.m_multiRef.isEmpty() ); |
| |
| // drop srv2, expect rebind to srv3 |
| srv2.drop(); |
| delay(); // async reactivate |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp21 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp20, comp21 ); |
| TestCase.assertEquals( srv3, comp21.m_singleRef ); |
| TestCase.assertTrue( comp21.m_multiRef.isEmpty() ); |
| |
| // create srv4, expect no rebind |
| final SimpleServiceImpl srv4 = SimpleServiceImpl.create( bundleContext, "srv4" ); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp22 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp20, comp22 ); |
| TestCase.assertSame( comp21, comp22 ); |
| TestCase.assertEquals( srv3, comp22.m_singleRef ); |
| TestCase.assertTrue( comp22.m_multiRef.isEmpty() ); |
| |
| // drop srv4 again, expect no rebind |
| srv4.drop(); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp23 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp20, comp23 ); |
| TestCase.assertSame( comp21, comp23 ); |
| TestCase.assertSame( comp22, comp23 ); |
| TestCase.assertEquals( srv3, comp23.m_singleRef ); |
| TestCase.assertTrue( comp23.m_multiRef.isEmpty() ); |
| |
| // "reset" |
| disableAndCheck(cc); |
| srv3.drop(); |
| delay(); |
| |
| // two services with service ranking (srv6 > srv5) |
| final SimpleServiceImpl srv5 = SimpleServiceImpl.create( bundleContext, "srv5", 10 ); |
| final SimpleServiceImpl srv6 = SimpleServiceImpl.create( bundleContext, "srv6", 20 ); |
| |
| enableAndCheck(cc.description); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp30 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp23, comp30 ); |
| TestCase.assertEquals( srv6, comp30.m_singleRef ); |
| TestCase.assertTrue( comp30.m_multiRef.isEmpty() ); |
| |
| // another service with higher ranking -- rebind ! |
| final SimpleServiceImpl srv7 = SimpleServiceImpl.create( bundleContext, "srv7", 30 ); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp31 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp30, comp31 ); |
| TestCase.assertEquals( srv7, comp31.m_singleRef ); |
| TestCase.assertTrue( comp31.m_multiRef.isEmpty() ); |
| |
| // srv6 goes, no rebind to srv7 |
| srv6.drop(); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp32 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp30, comp32 ); |
| TestCase.assertSame( comp31, comp32 ); |
| TestCase.assertEquals( srv7, comp32.m_singleRef ); |
| TestCase.assertTrue( comp32.m_multiRef.isEmpty() ); |
| } |
| |
| |
| @Test |
| public void test_optional_multiple_static() throws Exception |
| { |
| final SimpleServiceImpl srv1 = SimpleServiceImpl.create( bundleContext, "srv1" ); |
| |
| String name ="test_optional_multiple_static"; |
| ComponentConfigurationDTO cc = getDisabledConfigurationAndEnable(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp10 = SimpleComponent.INSTANCE; |
| TestCase.assertNotNull( comp10 ); |
| TestCase.assertNull( comp10.m_singleRef ); |
| TestCase.assertTrue( comp10.m_multiRef.contains( srv1 ) ); |
| |
| srv1.drop(); |
| delay(); // async reactivate |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp11 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp10, comp11 ); |
| TestCase.assertNull( comp11.m_singleRef ); |
| TestCase.assertTrue( comp11.m_multiRef.isEmpty() ); |
| |
| final SimpleServiceImpl srv2 = SimpleServiceImpl.create( bundleContext, "srv2" ); |
| delay(); // async binding |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp12 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp10, comp12 ); |
| TestCase.assertNotSame( comp11, comp12 ); |
| TestCase.assertNull( comp12.m_singleRef ); |
| TestCase.assertTrue( comp12.m_multiRef.contains( srv2 ) ); |
| |
| disableAndCheck(cc); |
| delay(); // async disabling |
| |
| final SimpleServiceImpl srv3 = SimpleServiceImpl.create( bundleContext, "srv3" ); |
| |
| // enable component with two services available, expect both bind |
| // async enabling |
| enableAndCheck(cc.description); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp20 = SimpleComponent.INSTANCE; |
| TestCase.assertNotNull( comp20 ); |
| TestCase.assertNotSame( comp10, comp20 ); |
| TestCase.assertNotSame( comp11, comp20 ); |
| TestCase.assertNotSame( comp12, comp20 ); |
| TestCase.assertNull( comp20.m_singleRef ); |
| TestCase.assertTrue( comp20.m_multiRef.contains( srv2 ) ); |
| TestCase.assertTrue( comp20.m_multiRef.contains( srv3 ) ); |
| |
| srv2.drop(); |
| delay(); // async reactivate |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp21 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp20, comp21 ); |
| TestCase.assertNull( comp21.m_singleRef ); |
| TestCase.assertFalse( comp21.m_multiRef.contains( srv2 ) ); |
| TestCase.assertTrue( comp21.m_multiRef.contains( srv3 ) ); |
| |
| // create srv4, expect greedy bind (static case) |
| final SimpleServiceImpl srv4 = SimpleServiceImpl.create( bundleContext, "srv4" ); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp22 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp20, comp22 ); |
| TestCase.assertNotSame( comp21, comp22 ); |
| TestCase.assertNull( comp22.m_singleRef ); |
| TestCase.assertFalse( comp22.m_multiRef.contains( srv2 ) ); |
| TestCase.assertTrue( comp22.m_multiRef.contains( srv3 ) ); |
| TestCase.assertTrue( comp22.m_multiRef.contains( srv4 ) ); |
| |
| // drop srv4 again, expect rebind |
| srv4.drop(); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp23 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp20, comp23 ); |
| TestCase.assertNotSame( comp21, comp23 ); |
| TestCase.assertNotSame( comp22, comp23 ); |
| TestCase.assertNull( comp23.m_singleRef ); |
| TestCase.assertFalse( comp23.m_multiRef.contains( srv2 ) ); |
| TestCase.assertTrue( comp23.m_multiRef.contains( srv3 ) ); |
| TestCase.assertFalse( comp23.m_multiRef.contains( srv4 ) ); |
| |
| // "reset" |
| disableAndCheck(cc); |
| srv3.drop(); |
| delay(); |
| |
| // two services with service ranking (srv6 > srv5) |
| final SimpleServiceImpl srv5 = SimpleServiceImpl.create( bundleContext, "srv5", 10 ); |
| final SimpleServiceImpl srv6 = SimpleServiceImpl.create( bundleContext, "srv6", 20 ); |
| |
| enableAndCheck(cc.description); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp30 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp23, comp30 ); |
| TestCase.assertNull( comp30.m_singleRef ); |
| TestCase.assertTrue( comp30.m_multiRef.contains( srv5 ) ); |
| TestCase.assertTrue( comp30.m_multiRef.contains( srv6 ) ); |
| |
| // another service with higher ranking -- greedy rebind ! |
| final SimpleServiceImpl srv7 = SimpleServiceImpl.create( bundleContext, "srv7", 30 ); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp31 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp30, comp31 ); |
| TestCase.assertNull( comp31.m_singleRef ); |
| TestCase.assertTrue( comp31.m_multiRef.contains( srv5 ) ); |
| TestCase.assertTrue( comp31.m_multiRef.contains( srv6 ) ); |
| TestCase.assertTrue( comp31.m_multiRef.contains( srv7 ) ); |
| |
| // srv6 goes, rebind to srv7 |
| srv6.drop(); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp32 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp30, comp32 ); |
| TestCase.assertNotSame( comp31, comp32 ); |
| TestCase.assertNull( comp32.m_singleRef ); |
| TestCase.assertTrue( comp32.m_multiRef.contains( srv5 ) ); |
| TestCase.assertFalse( comp32.m_multiRef.contains( srv6 ) ); |
| TestCase.assertTrue( comp32.m_multiRef.contains( srv7 ) ); |
| } |
| |
| |
| @Test |
| public void test_required_multiple_static() throws Exception |
| { |
| final SimpleServiceImpl srv1 = SimpleServiceImpl.create( bundleContext, "srv1" ); |
| |
| String name ="test_required_multiple_static"; |
| ComponentConfigurationDTO cc = getDisabledConfigurationAndEnable(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp10 = SimpleComponent.INSTANCE; |
| TestCase.assertNotNull( comp10 ); |
| TestCase.assertNull( comp10.m_singleRef ); |
| TestCase.assertTrue( comp10.m_multiRef.contains( srv1 ) ); |
| |
| srv1.drop(); |
| delay(); // async reactivate |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED); |
| final SimpleComponent comp11 = SimpleComponent.INSTANCE; |
| TestCase.assertNull( comp11 ); |
| |
| final SimpleServiceImpl srv2 = SimpleServiceImpl.create( bundleContext, "srv2" ); |
| delay(); // async binding |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp12 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp10, comp12 ); |
| TestCase.assertNull( comp12.m_singleRef ); |
| TestCase.assertTrue( comp12.m_multiRef.contains( srv2 ) ); |
| |
| disableAndCheck(cc); |
| delay(); // async disabling |
| |
| final SimpleServiceImpl srv3 = SimpleServiceImpl.create( bundleContext, "srv3" ); |
| |
| // enable component with two services available, expect both bind |
| // async enabling |
| enableAndCheck(cc.description); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp20 = SimpleComponent.INSTANCE; |
| TestCase.assertNotNull( comp20 ); |
| TestCase.assertNotSame( comp10, comp20 ); |
| TestCase.assertNotSame( comp12, comp20 ); |
| TestCase.assertNull( comp20.m_singleRef ); |
| TestCase.assertTrue( comp20.m_multiRef.contains( srv2 ) ); |
| TestCase.assertTrue( comp20.m_multiRef.contains( srv3 ) ); |
| |
| srv2.drop(); |
| delay(); // async reactivate |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp21 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp20, comp21 ); |
| TestCase.assertNull( comp21.m_singleRef ); |
| TestCase.assertFalse( comp21.m_multiRef.contains( srv2 ) ); |
| TestCase.assertTrue( comp21.m_multiRef.contains( srv3 ) ); |
| |
| // create srv4, expect greedy bind |
| final SimpleServiceImpl srv4 = SimpleServiceImpl.create( bundleContext, "srv4" ); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp22 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp20, comp22 ); |
| TestCase.assertNotSame( comp21, comp22 ); |
| TestCase.assertNull( comp22.m_singleRef ); |
| TestCase.assertFalse( comp22.m_multiRef.contains( srv2 ) ); |
| TestCase.assertTrue( comp22.m_multiRef.contains( srv3 ) ); |
| TestCase.assertTrue( comp22.m_multiRef.contains( srv4 ) ); |
| |
| // drop srv4 again, expect greedy rebind |
| srv4.drop(); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp23 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp20, comp23 ); |
| TestCase.assertNotSame( comp21, comp23 ); |
| TestCase.assertNotSame( comp22, comp23 ); |
| TestCase.assertNull( comp23.m_singleRef ); |
| TestCase.assertFalse( comp23.m_multiRef.contains( srv2 ) ); |
| TestCase.assertTrue( comp23.m_multiRef.contains( srv3 ) ); |
| TestCase.assertFalse( comp23.m_multiRef.contains( srv4 ) ); |
| |
| // "reset" |
| disableAndCheck(cc); |
| srv3.drop(); |
| delay(); |
| |
| // two services with service ranking (srv6 > srv5) |
| final SimpleServiceImpl srv5 = SimpleServiceImpl.create( bundleContext, "srv5", 10 ); |
| final SimpleServiceImpl srv6 = SimpleServiceImpl.create( bundleContext, "srv6", 20 ); |
| |
| enableAndCheck(cc.description); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp30 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp23, comp30 ); |
| TestCase.assertNull( comp30.m_singleRef ); |
| TestCase.assertTrue( comp30.m_multiRef.contains( srv5 ) ); |
| TestCase.assertTrue( comp30.m_multiRef.contains( srv6 ) ); |
| |
| // another service with higher ranking -- greedy rebind ! |
| final SimpleServiceImpl srv7 = SimpleServiceImpl.create( bundleContext, "srv7", 30 ); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp31 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp30, comp31 ); |
| TestCase.assertNull( comp31.m_singleRef ); |
| TestCase.assertTrue( comp31.m_multiRef.contains( srv5 ) ); |
| TestCase.assertTrue( comp31.m_multiRef.contains( srv6 ) ); |
| TestCase.assertTrue( comp31.m_multiRef.contains( srv7 ) ); |
| |
| // srv6 goes, rebind to srv7 |
| srv6.drop(); |
| delay(); |
| |
| findComponentConfigurationByName(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent comp32 = SimpleComponent.INSTANCE; |
| TestCase.assertNotSame( comp30, comp32 ); |
| TestCase.assertNotSame( comp31, comp32 ); |
| TestCase.assertNull( comp32.m_singleRef ); |
| TestCase.assertTrue( comp32.m_multiRef.contains( srv5 ) ); |
| TestCase.assertFalse( comp32.m_multiRef.contains( srv6 ) ); |
| TestCase.assertTrue( comp32.m_multiRef.contains( srv7 ) ); |
| } |
| |
| @Test |
| public void test_multi_service_bind_unbind_order() throws Exception |
| { |
| final SimpleServiceImpl srv1 = SimpleServiceImpl.create( bundleContext, "srv1" ); |
| final SimpleService2Impl srv2 = SimpleService2Impl.create( bundleContext, "srv2" ); |
| |
| String name ="test_multi_service_bind_unbind_order"; |
| ComponentConfigurationDTO cc = getDisabledConfigurationAndEnable(name, ComponentConfigurationDTO.ACTIVE); |
| |
| final SimpleComponent2 comp10 = SimpleComponent2.INSTANCE; |
| TestCase.assertNotNull( comp10 ); |
| TestCase.assertEquals( 2, comp10.getBindings().size() ); |
| TestCase.assertEquals( "bindSimpleService", comp10.getBindings().get( 0 ) ); |
| TestCase.assertEquals( "bindSimpleService2", comp10.getBindings().get( 1 ) ); |
| |
| disableAndCheck(cc); |
| delay(); |
| |
| TestCase.assertEquals( 4, comp10.getBindings().size() ); |
| TestCase.assertEquals( "bindSimpleService", comp10.getBindings().get( 0 ) ); |
| TestCase.assertEquals( "bindSimpleService2", comp10.getBindings().get( 1 ) ); |
| TestCase.assertEquals( "unbindSimpleService2", comp10.getBindings().get( 2 ) ); |
| TestCase.assertEquals( "unbindSimpleService", comp10.getBindings().get( 3 ) ); |
| |
| srv1.drop(); |
| srv2.drop(); |
| } |
| } |