Allow incremental recovery
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / test / java / org / opendaylight / controller / cluster / datastore / RoleChangeNotifierTest.java
index 4e61260550cdc9ab4f5b7e9409e295337e0d47b8..be2ba8ce7153b0fb435ea06a9dfb0b53cc121759 100644 (file)
+/*
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
 package org.opendaylight.controller.cluster.datastore;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 
 import akka.actor.ActorRef;
-import akka.actor.Props;
-import akka.testkit.JavaTestKit;
 import akka.testkit.TestActorRef;
+import akka.testkit.javadsl.TestKit;
+import org.junit.Before;
 import org.junit.Test;
-import org.opendaylight.controller.cluster.datastore.utils.MessageCollectorActor;
+import org.opendaylight.controller.cluster.notifications.LeaderStateChanged;
 import org.opendaylight.controller.cluster.notifications.RegisterRoleChangeListener;
 import org.opendaylight.controller.cluster.notifications.RegisterRoleChangeListenerReply;
 import org.opendaylight.controller.cluster.notifications.RoleChangeNotification;
 import org.opendaylight.controller.cluster.notifications.RoleChangeNotifier;
 import org.opendaylight.controller.cluster.notifications.RoleChanged;
 import org.opendaylight.controller.cluster.raft.RaftState;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
+import org.opendaylight.controller.cluster.raft.utils.MessageCollectorActor;
 
-public class RoleChangeNotifierTest extends AbstractActorTest  {
+public class RoleChangeNotifierTest extends AbstractActorTest {
+    private TestKit testKit;
 
-    @Test
-    public void testHandleRegisterRoleChangeListener() throws Exception {
-        new JavaTestKit(getSystem()) {{
-            String memberId = "testHandleRegisterRoleChangeListener";
-            ActorRef listenerActor =  getSystem().actorOf(Props.create(MessageCollectorActor.class));
+    @Before
+    public void setup() {
+        testKit = new TestKit(getSystem());
+    }
 
-            TestActorRef<RoleChangeNotifier> notifierTestActorRef = TestActorRef.create(
-                getSystem(), RoleChangeNotifier.getProps(memberId), memberId);
+    @Test
+    public void testHandleRegisterRoleChangeListener() {
+        String memberId = "testHandleRegisterRoleChangeListener";
+        ActorRef listenerActor = getSystem().actorOf(MessageCollectorActor.props());
 
-            notifierTestActorRef.tell(new RegisterRoleChangeListener(), listenerActor);
+        TestActorRef<RoleChangeNotifier> notifierTestActorRef = TestActorRef.create(getSystem(),
+            RoleChangeNotifier.getProps(memberId), memberId);
 
-            RegisterRoleChangeListenerReply reply = (RegisterRoleChangeListenerReply)
-                MessageCollectorActor.getFirstMatching(listenerActor, RegisterRoleChangeListenerReply.class);
-            assertNotNull(reply);
+        notifierTestActorRef.tell(new RegisterRoleChangeListener(), listenerActor);
 
-            RoleChangeNotification notification = (RoleChangeNotification)
-                MessageCollectorActor.getFirstMatching(listenerActor, RoleChangeNotification.class);
-            assertNull(notification);
-        }};
+        RegisterRoleChangeListenerReply reply = MessageCollectorActor.getFirstMatching(listenerActor,
+            RegisterRoleChangeListenerReply.class);
+        assertNotNull(reply);
 
+        RoleChangeNotification notification = MessageCollectorActor.getFirstMatching(listenerActor,
+            RoleChangeNotification.class);
+        assertNull(notification);
     }
 
     @Test
-    public void testHandleRaftRoleChanged() throws Exception {
-        new JavaTestKit(getSystem()) {{
-            String memberId = "testHandleRegisterRoleChangeListenerWithNotificationSet";
-            ActorRef listenerActor =  getSystem().actorOf(Props.create(MessageCollectorActor.class));
-            ActorRef shardActor =  getTestActor();
-
-            TestActorRef<RoleChangeNotifier> notifierTestActorRef = TestActorRef.create(
-                getSystem(), RoleChangeNotifier.getProps(memberId), memberId);
-
-            RoleChangeNotifier roleChangeNotifier = notifierTestActorRef.underlyingActor();
+    public void testHandleRaftRoleChanged() {
+        String memberId = "testHandleRegisterRoleChangeListenerWithNotificationSet";
+        ActorRef listenerActor = getSystem().actorOf(MessageCollectorActor.props());
+        ActorRef shardActor = testKit.getTestActor();
+
+        TestActorRef<RoleChangeNotifier> notifierTestActorRef = TestActorRef.create(getSystem(),
+            RoleChangeNotifier.getProps(memberId), memberId);
+
+        notifierTestActorRef.tell(
+            new RoleChanged(memberId, RaftState.Candidate.name(), RaftState.Leader.name()), shardActor);
+
+        // no notification should be sent as listener has not yet
+        // registered
+        assertNull(MessageCollectorActor.getFirstMatching(listenerActor, RoleChangeNotification.class));
+
+        // listener registers after role has been changed, ensure we
+        // sent the latest role change after a reply
+        notifierTestActorRef.tell(new RegisterRoleChangeListener(), listenerActor);
+
+        RegisterRoleChangeListenerReply reply = MessageCollectorActor.getFirstMatching(listenerActor,
+            RegisterRoleChangeListenerReply.class);
+        assertNotNull(reply);
+
+        RoleChangeNotification notification = MessageCollectorActor.getFirstMatching(listenerActor,
+            RoleChangeNotification.class);
+        assertNotNull(notification);
+        assertEquals(RaftState.Candidate.name(), notification.getOldRole());
+        assertEquals(RaftState.Leader.name(), notification.getNewRole());
+    }
 
-            notifierTestActorRef.tell(new RoleChanged(memberId, RaftState.Candidate.name(), RaftState.Leader.name()), shardActor);
+    @Test
+    public void testHandleLeaderStateChanged() {
+        String actorId = "testHandleLeaderStateChanged";
+        TestActorRef<RoleChangeNotifier> notifierTestActorRef = TestActorRef.create(getSystem(),
+            RoleChangeNotifier.getProps(actorId), actorId);
 
-            // no notification should be sent as listener has not yet registered
-            assertNull(MessageCollectorActor.getFirstMatching(listenerActor, RoleChangeNotification.class));
+        notifierTestActorRef.tell(new LeaderStateChanged("member1", "leader1", (short) 5), ActorRef.noSender());
 
-            // listener registers after role has been changed, ensure we sent the latest role change after a reply
-            notifierTestActorRef.tell(new RegisterRoleChangeListener(), listenerActor);
+        // listener registers after the sate has been changed, ensure we
+        // sent the latest state change after a reply
+        notifierTestActorRef.tell(new RegisterRoleChangeListener(), testKit.getRef());
 
-            RegisterRoleChangeListenerReply reply = (RegisterRoleChangeListenerReply)
-                MessageCollectorActor.getFirstMatching(listenerActor, RegisterRoleChangeListenerReply.class);
-            assertNotNull(reply);
+        testKit.expectMsgClass(RegisterRoleChangeListenerReply.class);
 
-            RoleChangeNotification notification = (RoleChangeNotification)
-                MessageCollectorActor.getFirstMatching(listenerActor, RoleChangeNotification.class);
-            assertNotNull(notification);
-            assertEquals(RaftState.Candidate.name(), notification.getOldRole());
-            assertEquals(RaftState.Leader.name(), notification.getNewRole());
+        LeaderStateChanged leaderStateChanged = testKit.expectMsgClass(LeaderStateChanged.class);
+        assertEquals("getMemberId", "member1", leaderStateChanged.getMemberId());
+        assertEquals("getLeaderId", "leader1", leaderStateChanged.getLeaderId());
+        assertEquals("getLeaderPayloadVersion", 5, leaderStateChanged.getLeaderPayloadVersion());
 
-        }};
+        notifierTestActorRef.tell(new LeaderStateChanged("member1", "leader2", (short) 6), ActorRef.noSender());
 
+        leaderStateChanged = testKit.expectMsgClass(LeaderStateChanged.class);
+        assertEquals("getMemberId", "member1", leaderStateChanged.getMemberId());
+        assertEquals("getLeaderId", "leader2", leaderStateChanged.getLeaderId());
+        assertEquals("getLeaderPayloadVersion", 6, leaderStateChanged.getLeaderPayloadVersion());
     }
 }
-
-