@Test
public void testDuplicateAppendEntriesWillBeSentOnHeartBeat() {

    logStart("testDuplicateAppendEntriesWillBeSentOnHeartBeat");
    MockRaftActorContext actorContext = createActorContextWithFollower();
    actorContext.setConfigParams(new DefaultConfigParamsImpl() {
        @Override
        public FiniteDuration getHeartBeatInterval() {
            return FiniteDuration.apply(500, TimeUnit.MILLISECONDS);
        }
    });
    long term = 1;
    actorContext.getTermInformation().update(term, "");
    leader = new Leader(actorContext);
    // Leader will send an immediate heartbeat - ignore it.
    MessageCollectorActor.expectFirstMatching(followerActor, AppendEntries.class);
    // The follower would normally reply - simulate that explicitly here.
    long lastIndex = actorContext.getReplicatedLog().lastIndex();
    leader.handleMessage(followerActor, new AppendEntriesReply(
            FOLLOWER_ID, term, true, lastIndex, term, (short)0));
    assertEquals("isFollowerActive", true, leader.getFollower(FOLLOWER_ID).isFollowerActive());
    followerActor.underlyingActor().clear();
    sendReplicate(actorContext, lastIndex + 1);
    // Wait slightly longer than heartbeat duration
    Uninterruptibles.sleepUninterruptibly(750, TimeUnit.MILLISECONDS);
    leader.handleMessage(leaderActor, SendHeartBeat.INSTANCE);
    List<AppendEntries> allMessages = MessageCollectorActor.getAllMatching(followerActor, AppendEntries.class);
    assertEquals("The number of append entries collected should be 2", 2, allMessages.size());
    assertEquals(1, allMessages.get(0).getEntries().size());
    assertEquals(lastIndex + 1, allMessages.get(0).getEntries().get(0).getIndex());
    assertEquals(1, allMessages.get(1).getEntries().size());
    assertEquals(lastIndex + 1, allMessages.get(0).getEntries().get(0).getIndex());
}