# HG changeset patch # User Andriy Petrus # Date 1369754614 14400 # Node ID 4cdafa27ac9a0d3c658839b3e321d7c39a89458d # Parent 6d696f9181d62292d2d07e5412f33a63af501652 PR1442: Error stopping bundle. (java.lang.IllegalStateException: Service already unregistered.) Reviewed-by: neugens, jerboaa Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2013-May/006813.html diff -r 6d696f9181d6 -r 4cdafa27ac9a storage/core/src/main/java/com/redhat/thermostat/storage/internal/Activator.java --- a/storage/core/src/main/java/com/redhat/thermostat/storage/internal/Activator.java Tue May 21 11:33:34 2013 +0200 +++ b/storage/core/src/main/java/com/redhat/thermostat/storage/internal/Activator.java Tue May 28 11:23:34 2013 -0400 @@ -96,6 +96,7 @@ for (ServiceRegistration reg : regs) { reg.unregister(); } + regs.clear(); super.removedService(reference, service); } }; diff -r 6d696f9181d6 -r 4cdafa27ac9a storage/core/src/test/java/com/redhat/thermostat/storage/internal/ActivatorTest.java --- a/storage/core/src/test/java/com/redhat/thermostat/storage/internal/ActivatorTest.java Tue May 21 11:33:34 2013 +0200 +++ b/storage/core/src/test/java/com/redhat/thermostat/storage/internal/ActivatorTest.java Tue May 28 11:23:34 2013 -0400 @@ -37,6 +37,7 @@ package com.redhat.thermostat.storage.internal; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; @@ -95,5 +96,63 @@ assertEquals(1, context.getAllServices().size()); } + @Test + public void verifyActivatorUnregistersServices() throws Exception { + StubBundleContext context = new StubBundleContext(); + Storage storage = mock(Storage.class); + + context.registerService(Storage.class, storage, null); + + Activator activator = new Activator(); + + activator.start(context); + + activator.stop(context); + + assertFalse(context.isServiceRegistered(HostInfoDAO.class.getName(), HostInfoDAOImpl.class)); + assertFalse(context.isServiceRegistered(NetworkInterfaceInfoDAO.class.getName(), NetworkInterfaceInfoDAOImpl.class)); + assertFalse(context.isServiceRegistered(VmInfoDAO.class.getName(), VmInfoDAOImpl.class)); + assertFalse(context.isServiceRegistered(AgentInfoDAO.class.getName(), AgentInfoDAOImpl.class)); + assertFalse(context.isServiceRegistered(BackendInfoDAO.class.getName(), BackendInfoDAOImpl.class)); + + assertEquals(0, context.getServiceListeners().size()); + assertEquals(1, context.getAllServices().size()); + } + + @Test + public void verifyActivatorRegistersServicesMultipleTimes() throws Exception { + StubBundleContext context = new StubBundleContext(); + Storage storage = mock(Storage.class); + + context.registerService(Storage.class, storage, null); + + Activator activator = new Activator(); + + activator.start(context); + + assertTrue(context.isServiceRegistered(HostInfoDAO.class.getName(), HostInfoDAOImpl.class)); + assertTrue(context.isServiceRegistered(NetworkInterfaceInfoDAO.class.getName(), NetworkInterfaceInfoDAOImpl.class)); + assertTrue(context.isServiceRegistered(VmInfoDAO.class.getName(), VmInfoDAOImpl.class)); + assertTrue(context.isServiceRegistered(AgentInfoDAO.class.getName(), AgentInfoDAOImpl.class)); + assertTrue(context.isServiceRegistered(BackendInfoDAO.class.getName(), BackendInfoDAOImpl.class)); + + activator.stop(context); + + assertEquals(0, context.getServiceListeners().size()); + assertEquals(1, context.getAllServices().size()); + + activator.start(context); + + assertTrue(context.isServiceRegistered(HostInfoDAO.class.getName(), HostInfoDAOImpl.class)); + assertTrue(context.isServiceRegistered(NetworkInterfaceInfoDAO.class.getName(), NetworkInterfaceInfoDAOImpl.class)); + assertTrue(context.isServiceRegistered(VmInfoDAO.class.getName(), VmInfoDAOImpl.class)); + assertTrue(context.isServiceRegistered(AgentInfoDAO.class.getName(), AgentInfoDAOImpl.class)); + assertTrue(context.isServiceRegistered(BackendInfoDAO.class.getName(), BackendInfoDAOImpl.class)); + + activator.stop(context); + + assertEquals(0, context.getServiceListeners().size()); + assertEquals(1, context.getAllServices().size()); + } }