protected void testMapper(String filename, boolean errorExpected) throws IOException {
    byte[] html =
        copyToBytesFromClasspath(
            "/org/elasticsearch/index/mapper/attachment/test/sample-files/" + filename);

    BytesReference json =
        jsonBuilder()
            .startObject()
            .startObject("file")
            .field("_name", filename)
            .field("_content", html)
            .endObject()
            .endObject()
            .bytes();

    ParseContext.Document doc = docMapper.parse("person", "person", "1", json).rootDoc();
    if (!errorExpected) {
      assertThat(
          doc.get(docMapper.mappers().getMapper("file.content").fieldType().name()),
          not(isEmptyOrNullString()));
      logger.debug(
          "-> extracted content: {}",
          doc.get(docMapper.mappers().getMapper("file").fieldType().name()));
      logger.debug("-> extracted metadata:");
      printMetadataContent(doc, AUTHOR);
      printMetadataContent(doc, CONTENT_LENGTH);
      printMetadataContent(doc, CONTENT_TYPE);
      printMetadataContent(doc, DATE);
      printMetadataContent(doc, KEYWORDS);
      printMetadataContent(doc, LANGUAGE);
      printMetadataContent(doc, NAME);
      printMetadataContent(doc, TITLE);
    }
  }
  @Test
  public void testMultipleDocsEncryptedLast() throws IOException {
    DocumentMapperParser mapperParser =
        new DocumentMapperParser(
            new Index("test"),
            ImmutableSettings.EMPTY,
            new AnalysisService(new Index("test")),
            null,
            null,
            null);
    mapperParser.putTypeParser(AttachmentMapper.CONTENT_TYPE, new AttachmentMapper.TypeParser());

    String mapping =
        copyToStringFromClasspath("/org/elasticsearch/index/mapper/multipledocs/test-mapping.json");
    DocumentMapper docMapper = mapperParser.parse(mapping);
    byte[] html =
        copyToBytesFromClasspath(
            "/org/elasticsearch/index/mapper/xcontent/htmlWithValidDateMeta.html");
    byte[] pdf = copyToBytesFromClasspath("/org/elasticsearch/index/mapper/xcontent/encrypted.pdf");

    BytesReference json =
        jsonBuilder()
            .startObject()
            .field("_id", 1)
            .field("file1", html)
            .field("file2", pdf)
            .endObject()
            .bytes();

    ParseContext.Document doc = docMapper.parse(json).rootDoc();
    assertThat(
        doc.get(docMapper.mappers().smartName("file1").mapper().names().indexName()),
        containsString("World"));
    assertThat(
        doc.get(docMapper.mappers().smartName("file1.title").mapper().names().indexName()),
        equalTo("Hello"));
    assertThat(
        doc.get(docMapper.mappers().smartName("file1.author").mapper().names().indexName()),
        equalTo("kimchy"));
    assertThat(
        doc.get(docMapper.mappers().smartName("file1.keywords").mapper().names().indexName()),
        equalTo("elasticsearch,cool,bonsai"));
    assertThat(
        doc.get(docMapper.mappers().smartName("file1.content_type").mapper().names().indexName()),
        equalTo("text/html; charset=ISO-8859-1"));
    assertThat(
        doc.getField(
                docMapper.mappers().smartName("file1.content_length").mapper().names().indexName())
            .numericValue()
            .longValue(),
        is(344L));

    assertThat(
        doc.get(docMapper.mappers().smartName("file2").mapper().names().indexName()), nullValue());
    assertThat(
        doc.get(docMapper.mappers().smartName("file2.title").mapper().names().indexName()),
        nullValue());
    assertThat(
        doc.get(docMapper.mappers().smartName("file2.author").mapper().names().indexName()),
        nullValue());
    assertThat(
        doc.get(docMapper.mappers().smartName("file2.keywords").mapper().names().indexName()),
        nullValue());
    assertThat(
        doc.get(docMapper.mappers().smartName("file2.content_type").mapper().names().indexName()),
        nullValue());
    assertThat(
        doc.getField(
            docMapper.mappers().smartName("file2.content_length").mapper().names().indexName()),
        nullValue());
  }
 private void printMetadataContent(ParseContext.Document doc, String field) {
   logger.debug(
       "- [{}]: [{}]",
       field,
       doc.get(docMapper.mappers().getMapper("file." + field).fieldType().name()));
 }