protected void createMixedMessagesOnRemoteHost(ReplicationTestSetup testSetup, String msgStr) throws Exception {
    PartitionId partitionId = testSetup.partitionIds.get(0);
    StoreKey oldKey = testSetup.oldKey;
    StoreKey newKey = testSetup.newKey;
    MockHost remoteHost = testSetup.remoteHost;
    String[] messages = msgStr.split("\\s");
    for (String message : messages) {
      switch (message) {
        case "OP":
          addPutMessagesToReplicasOfPartition(Collections.singletonList(oldKey), Collections.singletonList(remoteHost));
          break;
        case "OD":
          addDeleteMessagesToReplicasOfPartition(partitionId, oldKey, Collections.singletonList(remoteHost));
          break;
        case "NP":
          addPutMessagesToReplicasOfPartition(Collections.singletonList(newKey), Collections.singletonList(remoteHost));
          break;
        case "ND":
          addDeleteMessagesToReplicasOfPartition(partitionId, newKey, Collections.singletonList(remoteHost));
          break;
      }
    }
  }
Set up different combinations of PUT, DELETE messages on remote host.
For simplicity, we use O(old) to denote Version_2 blobId, N(new) to denote Version_5 blobId.
For example, OP means Version_2 PUT message, ND means Version_5 DELETE message, etc.
@param testSetup the {@link ReplicationTestSetup} used to provide test environment info.
@param msgStr the string presenting the sequence of PUT, DELETE messages
@throws Exception
ambry-replication/src/test/java/com/github/ambry/replication/ReplicationTestHelper.java