public void testCountry() throws Exception {
    InputStream database = getDatabaseFileInputStream("/GeoLite2-Country.mmdb.gz");
    GeoIpProcessor processor =
        new GeoIpProcessor(
            randomAsciiOfLength(10),
            "source_field",
            new DatabaseReader.Builder(database).build(),
            "target_field",
            EnumSet.allOf(GeoIpProcessor.Property.class));

    Map<String, Object> document = new HashMap<>();
    document.put("source_field", "82.170.213.79");
    IngestDocument ingestDocument = RandomDocumentPicks.randomIngestDocument(random(), document);
    processor.execute(ingestDocument);

    assertThat(ingestDocument.getSourceAndMetadata().get("source_field"), equalTo("82.170.213.79"));
    @SuppressWarnings("unchecked")
    Map<String, Object> geoData =
        (Map<String, Object>) ingestDocument.getSourceAndMetadata().get("target_field");
    assertThat(geoData.size(), equalTo(4));
    assertThat(geoData.get("ip"), equalTo("82.170.213.79"));
    assertThat(geoData.get("country_iso_code"), equalTo("NL"));
    assertThat(geoData.get("country_name"), equalTo("Netherlands"));
    assertThat(geoData.get("continent_name"), equalTo("Europe"));
  }
  public void testCity() throws Exception {
    InputStream database = getDatabaseFileInputStream("/GeoLite2-City.mmdb.gz");
    GeoIpProcessor processor =
        new GeoIpProcessor(
            randomAsciiOfLength(10),
            "source_field",
            new DatabaseReader.Builder(database).build(),
            "target_field",
            EnumSet.allOf(GeoIpProcessor.Property.class));

    Map<String, Object> document = new HashMap<>();
    document.put("source_field", "8.8.8.8");
    IngestDocument ingestDocument = RandomDocumentPicks.randomIngestDocument(random(), document);
    processor.execute(ingestDocument);

    assertThat(ingestDocument.getSourceAndMetadata().get("source_field"), equalTo("8.8.8.8"));
    @SuppressWarnings("unchecked")
    Map<String, Object> geoData =
        (Map<String, Object>) ingestDocument.getSourceAndMetadata().get("target_field");
    assertThat(geoData.size(), equalTo(8));
    assertThat(geoData.get("ip"), equalTo("8.8.8.8"));
    assertThat(geoData.get("country_iso_code"), equalTo("US"));
    assertThat(geoData.get("country_name"), equalTo("United States"));
    assertThat(geoData.get("continent_name"), equalTo("North America"));
    assertThat(geoData.get("region_name"), equalTo("California"));
    assertThat(geoData.get("city_name"), equalTo("Mountain View"));
    assertThat(geoData.get("timezone"), equalTo("America/Los_Angeles"));
    Map<String, Object> location = new HashMap<>();
    location.put("lat", 37.386d);
    location.put("lon", -122.0838d);
    assertThat(geoData.get("location"), equalTo(location));
  }
  public void testParseAsBytesArray() throws Exception {
    String path = "/org/elasticsearch/ingest/attachment/test/sample-files/text-in-english.txt";
    byte[] bytes;
    try (InputStream is = AttachmentProcessorTests.class.getResourceAsStream(path)) {
      bytes = IOUtils.toByteArray(is);
    }

    Map<String, Object> document = new HashMap<>();
    document.put("source_field", bytes);

    IngestDocument ingestDocument = RandomDocumentPicks.randomIngestDocument(random(), document);
    processor.execute(ingestDocument);

    @SuppressWarnings("unchecked")
    Map<String, Object> attachmentData =
        (Map<String, Object>) ingestDocument.getSourceAndMetadata().get("target_field");

    assertThat(
        attachmentData.keySet(),
        containsInAnyOrder("language", "content", "content_type", "content_length"));
    assertThat(attachmentData.get("language"), is("en"));
    assertThat(
        attachmentData.get("content"),
        is("\"God Save the Queen\" (alternatively \"God Save the King\""));
    assertThat(attachmentData.get("content_type").toString(), containsString("text/plain"));
    assertThat(attachmentData.get("content_length"), is(notNullValue()));
  }
  private Map<String, Object> parseDocument(String file, AttachmentProcessor processor)
      throws Exception {
    Map<String, Object> document = new HashMap<>();
    document.put("source_field", getAsBase64(file));

    IngestDocument ingestDocument = RandomDocumentPicks.randomIngestDocument(random(), document);
    processor.execute(ingestDocument);

    @SuppressWarnings("unchecked")
    Map<String, Object> attachmentData =
        (Map<String, Object>) ingestDocument.getSourceAndMetadata().get("target_field");
    return attachmentData;
  }
 /**
  * Returns a randomly selected existing field name out of the fields that are contained in the
  * document provided as an argument.
  */
 public static String randomExistingFieldName(Random random, IngestDocument ingestDocument) {
   Map<String, Object> source = new TreeMap<>(ingestDocument.getSourceAndMetadata());
   Map.Entry<String, Object> randomEntry = RandomPicks.randomFrom(random, source.entrySet());
   String key = randomEntry.getKey();
   while (randomEntry.getValue() instanceof Map) {
     @SuppressWarnings("unchecked")
     Map<String, Object> map = (Map<String, Object>) randomEntry.getValue();
     Map<String, Object> treeMap = new TreeMap<>(map);
     randomEntry = RandomPicks.randomFrom(random, treeMap.entrySet());
     key += "." + randomEntry.getKey();
   }
   assert ingestDocument.getFieldValue(key, Object.class) != null;
   return key;
 }
  public void testAddressIsNotInTheDatabase() throws Exception {
    InputStream database = getDatabaseFileInputStream("/GeoLite2-City.mmdb.gz");
    GeoIpProcessor processor =
        new GeoIpProcessor(
            randomAsciiOfLength(10),
            "source_field",
            new DatabaseReader.Builder(database).build(),
            "target_field",
            EnumSet.allOf(GeoIpProcessor.Property.class));

    Map<String, Object> document = new HashMap<>();
    document.put("source_field", "127.0.0.1");
    IngestDocument ingestDocument = RandomDocumentPicks.randomIngestDocument(random(), document);
    processor.execute(ingestDocument);
    @SuppressWarnings("unchecked")
    Map<String, Object> geoData =
        (Map<String, Object>) ingestDocument.getSourceAndMetadata().get("target_field");
    assertThat(geoData.size(), equalTo(0));
  }
 /**
  * Checks whether the provided field name can be safely added to the provided document. When the
  * provided field name holds the path using the dot notation, we have to make sure that each node
  * of the tree either doesn't exist or is a map, otherwise new fields cannot be added.
  */
 public static boolean canAddField(String path, IngestDocument ingestDocument) {
   String[] pathElements = path.split("\\.");
   Map<String, Object> innerMap = ingestDocument.getSourceAndMetadata();
   if (pathElements.length > 1) {
     for (int i = 0; i < pathElements.length - 1; i++) {
       Object currentLevel = innerMap.get(pathElements[i]);
       if (currentLevel == null) {
         return true;
       }
       if (currentLevel instanceof Map == false) {
         return false;
       }
       @SuppressWarnings("unchecked")
       Map<String, Object> map = (Map<String, Object>) currentLevel;
       innerMap = map;
     }
   }
   String leafKey = pathElements[pathElements.length - 1];
   return innerMap.containsKey(leafKey) == false;
 }