Bug 6710 - Close ClusterSingletonServiceRegistration fix
[mdsal.git] / singleton-service / mdsal-singleton-dom-impl / src / test / java / org / opendaylight / mdsal / singleton / dom / impl / DOMClusterSingletonServiceProviderImplTest.java
index 6a05eb1cbbc644a9353ab219c7f4cd3de995a331..da9cd477ef1c81ff400e40a304d676bc0f806f20 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.mdsal.singleton.dom.impl;
 
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.doThrow;
@@ -266,6 +267,35 @@ public class DOMClusterSingletonServiceProviderImplTest {
      * @throws Exception
      */
     @Test
+    public void takeDoubleLeadershipClusterSingletonServiceTest() throws Exception {
+        final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
+                .registerClusterSingletonService(clusterSingletonService);
+        Assert.assertNotNull(reg);
+        verify(mockEos).registerCandidate(entity);
+        clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
+        verify(mockEos).registerCandidate(doubleEntity);
+        Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
+        clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
+        Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
+        clusterSingletonServiceProvider.ownershipChanged(getEntityToSlave());
+        Assert.assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
+        clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
+        Assert.assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
+        clusterSingletonServiceProvider.ownershipChanged(getInitDoubleEntityToSlave());
+        clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
+        Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
+        verify(mockEosDoubleEntityListReg, never()).close();
+        verify(mockEosEntityListReg, never()).close();
+        verify(mockEntityCandReg, never()).close();
+        verify(mockDoubleEntityCandReg).close();
+    }
+
+    /**
+     * Test GoldPath for takeLeadership with ownership result MASTER {@link ClusterSingletonService}.
+     *
+     * @throws Exception if the condition does not meet
+     */
+    @Test
     public void takeLeadershipClusterSingletonServiceTwoAddDuringWaitPhaseServicesTest() throws Exception {
         final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
                 .registerClusterSingletonService(clusterSingletonService);
@@ -310,7 +340,7 @@ public class DOMClusterSingletonServiceProviderImplTest {
      *
      * @throws Exception
      */
-    @Test
+    @Test(expected = RuntimeException.class)
     public void initializationClusterSingletonServiceCandidateAlreadyRegistredTest() throws Exception {
         doThrow(CandidateAlreadyRegisteredException.class).when(mockEos).registerCandidate(entity);
         final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
@@ -362,7 +392,7 @@ public class DOMClusterSingletonServiceProviderImplTest {
     }
 
     /**
-     * Test checks umexpected change for MASTER-TO-SLAVE double Candidate role change
+     * Test checks unexpected change for MASTER-TO-SLAVE double Candidate role change.
      *
      * @throws Exception
      */
@@ -380,10 +410,21 @@ public class DOMClusterSingletonServiceProviderImplTest {
         clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
         Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
         clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToSlave());
-        Assert.assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
+        Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
         verify(mockEosDoubleEntityListReg, never()).close();
         verify(mockEntityCandReg, never()).close();
-        verify(mockDoubleEntityCandReg).close();
+        verify(mockDoubleEntityCandReg, never()).close();
+        reg.close();
+        verify(mockEosEntityListReg, never()).close();
+        verify(mockEosDoubleEntityListReg, never()).close();
+        verify(mockEntityCandReg, atLeastOnce()).close();
+        verify(mockDoubleEntityCandReg, never()).close();
+        Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
+        clusterSingletonServiceProvider.ownershipChanged(getEntityToSlave());
+        verify(mockEntityCandReg, atLeastOnce()).close();
+        verify(mockDoubleEntityCandReg, atLeastOnce()).close();
+        verify(mockEosDoubleEntityListReg, never()).close();
+        Assert.assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
     }
 
     /**
@@ -543,6 +584,7 @@ public class DOMClusterSingletonServiceProviderImplTest {
         clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
         Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
         reg.close();
+        clusterSingletonServiceProvider.ownershipChanged(getEntityToSlave());
         verify(mockEosEntityListReg, never()).close();
         verify(mockEosDoubleEntityListReg, never()).close();
         verify(mockEntityCandReg).close();
@@ -551,7 +593,66 @@ public class DOMClusterSingletonServiceProviderImplTest {
     }
 
     /**
-     * Test checks close procesing for {@link ClusterSingletonServiceRegistration}
+     * Test checks close processing for {@link ClusterSingletonServiceRegistration}.
+     *
+     * @throws Exception if the condition does not meet
+     */
+    @Test
+    public void closeClusterSingletonServiceRegistrationMasterCloseWithNotificationTimesTest() throws Exception {
+        final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
+                .registerClusterSingletonService(clusterSingletonService);
+        Assert.assertNotNull(reg);
+        Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
+        verify(mockEos).registerCandidate(entity);
+        clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
+        verify(mockEos).registerCandidate(doubleEntity);
+        clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
+        Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
+        reg.close();
+        verify(mockEosEntityListReg, never()).close();
+        verify(mockEosDoubleEntityListReg, never()).close();
+        verify(mockEntityCandReg, atLeastOnce()).close();
+        verify(mockDoubleEntityCandReg, never()).close();
+        Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
+        clusterSingletonServiceProvider.ownershipChanged(getEntityToSlave());
+        verify(mockEntityCandReg, atLeastOnce()).close();
+        verify(mockDoubleEntityCandReg, atLeastOnce()).close();
+        verify(mockEosDoubleEntityListReg, never()).close();
+        Assert.assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
+    }
+
+    /**
+     * Test checks close processing for {@link ClusterSingletonServiceRegistration}.
+     *
+     * @throws Exception if the condition does not meet
+     */
+    @Test
+    public void closeClusterSingletonServiceRegistrationMasterCloseCoupleTimesTest() throws Exception {
+        final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
+                .registerClusterSingletonService(clusterSingletonService);
+        Assert.assertNotNull(reg);
+        Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
+        verify(mockEos).registerCandidate(entity);
+        clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
+        verify(mockEos).registerCandidate(doubleEntity);
+        clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
+        Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
+        reg.close();
+        reg.close();
+        verify(mockEosEntityListReg, never()).close();
+        verify(mockEosDoubleEntityListReg, never()).close();
+        verify(mockEntityCandReg, atLeastOnce()).close();
+        verify(mockDoubleEntityCandReg, never()).close();
+        Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
+        clusterSingletonServiceProvider.ownershipChanged(getEntityToSlave());
+        verify(mockEntityCandReg, atLeastOnce()).close();
+        verify(mockDoubleEntityCandReg, atLeastOnce()).close();
+        verify(mockEosDoubleEntityListReg, never()).close();
+        Assert.assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
+    }
+
+    /**
+     * Test checks close processing for {@link ClusterSingletonServiceRegistration}.
      *
      * @throws Exception
      */
@@ -645,15 +746,18 @@ public class DOMClusterSingletonServiceProviderImplTest {
     /**
      * Base states for AbstractClusterProjectProvider
      */
-    static enum TestClusterSingletonServiceState {
+    enum TestClusterSingletonServiceState {
+
         /**
          * State represents a correct Instantiated process
          */
+
         STARTED,
         /**
          * State represents a correct call abstract method instantiatingProject
          */
         INITIALIZED,
+
         /**
          * State represents a correct call abstract method destryingProject
          */