@Test
  public void should_get_the_data_that_has_been_set_when_no_log_entries() throws Exception {

    // given
    final int term = 10;
    final int leaderId = 2;
    final long leaderCommit = 34564;
    final int prevLogEntryTerm = 8;
    final long prevLogEntryIndex = 34765;

    // when
    directAppendRequest
        .term(term)
        .leaderId(leaderId)
        .leaderCommit(leaderCommit)
        .prevLogKey()
        .term(prevLogEntryTerm)
        .index(prevLogEntryIndex);

    final Sequence.SequenceIterator<LogEntry> logEntryIterator =
        directAppendRequest.logEntries().iterator();
    assertThat(logEntryIterator.hasNext()).isEqualTo(false);

    // then
    assertThat(directAppendRequest.type()).isEqualTo(MessageType.APPEND_REQUEST);
    assertThat(directAppendRequest.term()).isEqualTo(term);
    assertThat(directAppendRequest.leaderId()).isEqualTo(leaderId);
    assertThat(directAppendRequest.leaderCommit()).isEqualTo(leaderCommit);

    final int retrievedPrevLogEntryTerm = directAppendRequest.prevLogKey().term();
    final long retrievedPrevLogEntryIndex = directAppendRequest.prevLogKey().index();

    assertThat(retrievedPrevLogEntryTerm).isEqualTo(prevLogEntryTerm);
    assertThat(retrievedPrevLogEntryIndex).isEqualTo(prevLogEntryIndex);

    final int extectedAppendRequestBytes = DirectAppendRequest.EMPTY_LOG_BYTE_LENGTH;

    assertThat(directAppendRequest.byteLength()).isEqualTo(extectedAppendRequestBytes);
  }
  @Test
  public void should_get_the_data_that_has_been_set() throws Exception {

    // given
    final int term = 10;
    final int leaderId = 2;
    final long leaderCommit = 34564;
    final int prevLogEntryTerm = 8;
    final long prevLogEntryIndex = 34765;

    final int newEntryTerm1 = 9;
    final long newEntryIndex1 = 34766;
    final long newEntryCommandIndex1 = 45674;
    final int newEntryCommandSourceId1 = 34;

    final String myCommand1 = "Command: XXXXXX";
    final byte[] commandBytes1 = myCommand1.getBytes();

    final int newEntryTerm2 = 10;
    final long newEntryIndex2 = 34767;
    final long newEntryCommandIndex2 = 45675;
    final int newEntryCommandSourceId2 = 34;

    final String myCommand2 = "Command: YYYYYYYYYYY";
    final byte[] commandBytes2 = myCommand2.getBytes();

    // when
    directAppendRequest
        .term(term)
        .leaderId(leaderId)
        .leaderCommit(leaderCommit)
        .prevLogKey()
        .term(prevLogEntryTerm)
        .index(prevLogEntryIndex);

    final Sequence.SequenceIterator<LogEntry> logEntryIterator =
        directAppendRequest.logEntries().iterator();
    assertThat(logEntryIterator.hasNext()).isEqualTo(false);

    logEntry1
        .term(newEntryTerm1)
        .index(newEntryIndex1)
        .command()
        .sourceId(newEntryCommandSourceId1)
        .commandIndex(newEntryCommandIndex1)
        .commandPayload()
        .bytesFrom(commandBytes1, 0, commandBytes1.length);

    logEntry2
        .term(newEntryTerm2)
        .index(newEntryIndex2)
        .command()
        .sourceId(newEntryCommandSourceId2)
        .commandIndex(newEntryCommandIndex2)
        .commandPayload()
        .bytesFrom(commandBytes2, 0, commandBytes2.length);

    directAppendRequest.appendLogEntry(logEntry1);
    directAppendRequest.appendLogEntry(logEntry2);

    assertThat(logEntryIterator.hasNext()).isEqualTo(true);

    // then
    assertThat(directAppendRequest.type()).isEqualTo(MessageType.APPEND_REQUEST);
    assertThat(directAppendRequest.term()).isEqualTo(term);
    assertThat(directAppendRequest.leaderId()).isEqualTo(leaderId);
    assertThat(directAppendRequest.leaderCommit()).isEqualTo(leaderCommit);

    final int retrievedPrevLogEntryTerm = directAppendRequest.prevLogKey().term();
    final long retrievedPrevLogEntryIndex = directAppendRequest.prevLogKey().index();

    assertThat(retrievedPrevLogEntryTerm).isEqualTo(prevLogEntryTerm);
    assertThat(retrievedPrevLogEntryIndex).isEqualTo(prevLogEntryIndex);

    ///// LogEntry 1 ////////

    logEntryIterator.readNextTo(iteratingLogEntry);

    final int retrievedCommandLogEntryTerm1 = iteratingLogEntry.logKey().term();
    final long retrievedCommandLogEntryIndex1 = iteratingLogEntry.logKey().index();

    assertThat(retrievedCommandLogEntryTerm1).isEqualTo(newEntryTerm1);
    assertThat(retrievedCommandLogEntryIndex1).isEqualTo(newEntryIndex1);

    final int retrievedCommandSourceId1 = iteratingLogEntry.command().commandKey().sourceId();
    final long retrieveCommandIndex1 = iteratingLogEntry.command().commandKey().commandIndex();
    final int retrievedCommandByteLength1 =
        iteratingLogEntry.command().commandPayload().commandByteLength();

    assertThat(retrievedCommandSourceId1).isEqualTo(newEntryCommandSourceId1);
    assertThat(retrieveCommandIndex1).isEqualTo(newEntryCommandIndex1);
    assertThat(retrievedCommandByteLength1).isEqualTo(commandBytes1.length);

    final byte[] retrievedCommandBytes1 = new byte[retrievedCommandByteLength1];
    iteratingLogEntry.command().commandPayload().bytesTo(retrievedCommandBytes1, 0);

    assertThat(new String(retrievedCommandBytes1)).isEqualTo(myCommand1);

    ///// LogEntry 2 ////////

    assertThat(logEntryIterator.hasNext()).isEqualTo(true);

    logEntryIterator.readNextTo(iteratingLogEntry);

    final int retrievedCommandLogEntryTerm2 = iteratingLogEntry.logKey().term();
    final long retrievedCommandLogEntryIndex2 = iteratingLogEntry.logKey().index();

    assertThat(retrievedCommandLogEntryTerm2).isEqualTo(newEntryTerm2);
    assertThat(retrievedCommandLogEntryIndex2).isEqualTo(newEntryIndex2);

    final int retrievedCommandSourceId2 = iteratingLogEntry.command().commandKey().sourceId();
    final long retrieveCommandIndex2 = iteratingLogEntry.command().commandKey().commandIndex();
    final int retrievedCommandByteLength2 =
        iteratingLogEntry.command().commandPayload().commandByteLength();

    assertThat(retrievedCommandSourceId2).isEqualTo(newEntryCommandSourceId2);
    assertThat(retrieveCommandIndex2).isEqualTo(newEntryCommandIndex2);
    assertThat(retrievedCommandByteLength2).isEqualTo(commandBytes2.length);

    final byte[] retrievedCommandBytes2 = new byte[retrievedCommandByteLength2];
    iteratingLogEntry.command().commandPayload().bytesTo(retrievedCommandBytes2, 0);

    assertThat(new String(retrievedCommandBytes2)).isEqualTo(myCommand2);

    ///// LogEntry 3 - does not exist ////////
    assertThat(logEntryIterator.hasNext()).isEqualTo(false);

    final int extectedAppendRequestBytes =
        DirectAppendRequest.EMPTY_LOG_BYTE_LENGTH
            + DirectLogEntry.EMPTY_COMMAND_BYTE_LENGTH * 2
            + commandBytes1.length
            + commandBytes2.length;

    assertThat(directAppendRequest.byteLength()).isEqualTo(extectedAppendRequestBytes);
  }