+ @Test
+ 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());