@Override
  public MockFlowFile putAttribute(
      final FlowFile flowFile, final String attrName, final String attrValue) {
    validateState(flowFile);
    if (attrName == null || attrValue == null || flowFile == null) {
      throw new IllegalArgumentException("argument cannot be null");
    }
    if (!(flowFile instanceof MockFlowFile)) {
      throw new IllegalArgumentException(
          "Cannot update attributes of a flow file that I did not create");
    }

    if ("uuid".equals(attrName)) {
      Assert.fail(
          "Should not be attempting to set FlowFile UUID via putAttribute. This will be ignored in production");
    }

    final MockFlowFile mock = (MockFlowFile) flowFile;
    final MockFlowFile newFlowFile = new MockFlowFile(mock.getId(), flowFile);
    currentVersions.put(newFlowFile.getId(), newFlowFile);

    final Map<String, String> attrs = new HashMap<>();
    attrs.put(attrName, attrValue);
    newFlowFile.putAttributes(attrs);
    return newFlowFile;
  }
  @Override
  public MockFlowFile putAllAttributes(final FlowFile flowFile, final Map<String, String> attrs) {
    validateState(flowFile);
    if (attrs == null || flowFile == null) {
      throw new IllegalArgumentException("argument cannot be null");
    }
    if (!(flowFile instanceof MockFlowFile)) {
      throw new IllegalArgumentException(
          "Cannot update attributes of a flow file that I did not create");
    }
    final MockFlowFile mock = (MockFlowFile) flowFile;
    final MockFlowFile newFlowFile = new MockFlowFile(mock.getId(), flowFile);
    currentVersions.put(newFlowFile.getId(), newFlowFile);

    newFlowFile.putAttributes(attrs);
    return newFlowFile;
  }
 public MockFlowFile createFlowFile(final byte[] data, final Map<String, String> attrs) {
   final MockFlowFile ff = createFlowFile(data);
   ff.putAttributes(attrs);
   return ff;
 }