changeset 1117:4cdafa27ac9a

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
author Andriy Petrus <apetrus@redhat.com>
date Tue, 28 May 2013 11:23:34 -0400
parents 6d696f9181d6
children d329d22447f4
files storage/core/src/main/java/com/redhat/thermostat/storage/internal/Activator.java storage/core/src/test/java/com/redhat/thermostat/storage/internal/ActivatorTest.java
diffstat 2 files changed, 60 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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);
             }
         };
--- 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());
+    }
 }