// async enabling
component.enable();
delay();
TestCase.assertEquals( Component.STATE_ACTIVE, component.getState() );
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
TestCase.assertEquals( Component.STATE_ACTIVE, component.getState() );
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
TestCase.assertEquals( Component.STATE_ACTIVE, component.getState() );
final SimpleComponent comp12 = SimpleComponent.INSTANCE;
TestCase.assertSame( comp10, comp12 );
TestCase.assertNull( comp12.m_singleRef );
TestCase.assertTrue( comp12.m_multiRef.contains( srv2 ) );
component.disable();
delay(); // async disabling
final SimpleServiceImpl srv3 = SimpleServiceImpl.create( bundleContext, "srv3" );
// enable component with two services available, expect both bind
// async enabling
component.enable();
delay();
TestCase.assertEquals( Component.STATE_ACTIVE, component.getState() );
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();
TestCase.assertEquals( Component.STATE_ACTIVE, component.getState() );
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();
TestCase.assertEquals( Component.STATE_ACTIVE, component.getState() );
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();
TestCase.assertEquals( Component.STATE_ACTIVE, component.getState() );
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"
component.disable();
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 );
component.enable();
delay();
TestCase.assertEquals( Component.STATE_ACTIVE, component.getState() );
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();
TestCase.assertEquals( Component.STATE_ACTIVE, component.getState() );
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();
TestCase.assertEquals( Component.STATE_ACTIVE, component.getState() );
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 ) );