/* * Copyright 2013 Cloudera Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.cloudera.cdk.morphline.maxmind; import org.junit.Ignore; import org.junit.Test; import com.cloudera.cdk.morphline.api.AbstractMorphlineTest; import com.cloudera.cdk.morphline.api.Record; import com.cloudera.cdk.morphline.base.Fields; import com.cloudera.cdk.morphline.base.Notifications; public class MaxmindMorphlineTest extends AbstractMorphlineTest { @Test public void testIPv4() throws Exception { morphline = createMorphline("test-morphlines/geoIP"); Record record = new Record(); String ip = "128.101.101.101"; record.put("ip", ip); Record expected = new Record(); expected.put("ip", ip); expected.put("/country/iso_code", "US"); expected.put("/country/names/en", "United States"); expected.put("/country/names/zh-CN", "美国"); expected.put("/subdivisions[]/names/en", "Minnesota"); expected.put("/subdivisions[]/iso_code", "MN"); expected.put("/city/names/en", "Minneapolis"); expected.put("/postal/code", "55455"); expected.put("/location/latitude", 44.9733); expected.put("/location/longitude", -93.2323); expected.put("/location/latitude_longitude", "44.9733,-93.2323"); expected.put("/location/longitude_latitude", "-93.2323,44.9733"); processAndVerifySuccess(record, expected, false); Notifications.notifyShutdown(morphline); Notifications.notifyShutdown(morphline); } @Test public void testIPv6() throws Exception { morphline = createMorphline("test-morphlines/geoIP"); Record record = new Record(); String ip = "2001:620::1"; record.put("ip", ip); Record expected = new Record(); expected.put("ip", ip); expected.put("/country/iso_code", "CH"); expected.put("/country/names/en", "Switzerland"); expected.put("/country/names/zh-CN", "瑞士"); expected.put("/location/latitude", 47.00016); expected.put("/location/longitude", 8.01427); expected.put("/location/latitude_longitude", "47.00016,8.01427"); expected.put("/location/longitude_latitude", "8.01427,47.00016"); processAndVerifySuccess(record, expected, false); Notifications.notifyShutdown(morphline); Notifications.notifyShutdown(morphline); } private void processAndVerifySuccess(Record input, Record expected, boolean isSame) { collector.reset(); startSession(); assertEquals(1, collector.getNumStartEvents()); assertTrue(morphline.process(input)); collector.getFirstRecord().removeAll(Fields.ATTACHMENT_BODY); assertEquals(expected, collector.getFirstRecord()); if (isSame) { assertSame(input, collector.getFirstRecord()); } else { assertNotSame(input, collector.getFirstRecord()); } } @Test @Ignore // Before running this disable debug logging // via log4j.logger.com.cloudera.cdk.morphline=INFO in log4j.properties public void benchmark() throws Exception { String morphlineConfigFile = "test-morphlines/geoIP"; long durationSecs = 20; System.out.println("Now benchmarking " + morphlineConfigFile + " ..."); morphline = createMorphline(morphlineConfigFile); long start = System.currentTimeMillis(); long duration = durationSecs * 1000; int iters = 0; while (System.currentTimeMillis() < start + duration) { Record record = new Record(); String msg = "128.101.101.101"; record.put("ip", msg); collector.reset(); startSession(); assertEquals(1, collector.getNumStartEvents()); assertTrue(morphline.process(record)); iters++; } float secs = (System.currentTimeMillis() - start) / 1000.0f; System.out.println("Results: iters=" + iters + ", took[secs]=" + secs + ", iters/secs=" + (iters/secs)); } /* private static final String RESOURCES_DIR = "target/test-classes"; @Test public void testRawMaxMindAPI() throws Exception { InetAddress HOST = InetAddress.getByName("128.101.101.101"); File database = new File(RESOURCES_DIR + "/GeoLite2-City.mmdb"); // File database = new File(RESOURCES_DIR + "/GeoLite2-Country.mmdb"); DatabaseReader dbReader = new DatabaseReader.Builder(database).build(); CityResponse cityResponse = dbReader.city(HOST); assertEquals("US", cityResponse.getCountry().getIsoCode()); assertEquals("United States", cityResponse.getCountry().getName()); assertEquals("美国", cityResponse.getCountry().getNames().get("zh-CN")); assertEquals("Minnesota", cityResponse.getMostSpecificSubdivision().getName()); assertEquals("MN", cityResponse.getMostSpecificSubdivision().getIsoCode()); assertEquals("Minneapolis", cityResponse.getCity().getName()); assertEquals("55455", cityResponse.getPostal().getCode()); assertEquals(new Double(44.9733), cityResponse.getLocation().getLatitude()); assertEquals(new Double(-93.2323), cityResponse.getLocation().getLongitude()); CountryResponse countryResponse = dbReader.country(HOST); //System.out.println("countryResponse="+countryResponse.toString()); assertEquals("US", countryResponse.getCountry().getIsoCode()); assertEquals("United States", countryResponse.getCountry().getName()); Reader reader = new Reader(database); JsonNode root = reader.get(HOST); //System.out.println("json="+root.toString()); assertEquals("US", root.get("country").get("iso_code").textValue()); assertEquals("United States", root.get("country").get("names").get("en").textValue()); assertEquals("美国", root.get("country").get("names").get("zh-CN").textValue()); assertEquals("Minnesota", root.get("subdivisions").get(0).get("names").get("en").textValue()); assertEquals("MN", root.get("subdivisions").get(0).get("iso_code").textValue()); assertEquals("Minneapolis", root.get("city").get("names").get("en").textValue()); assertEquals("55455", root.get("postal").get("code").textValue()); assertEquals(44.9733, root.get("location").get("latitude").doubleValue(), 0.00001); assertEquals(-93.2323, root.get("location").get("longitude").doubleValue(), 0.00001); reader.close(); reader.close(); } */ }