Project: Flume-Hive
/**
 * Licensed to Cloudera, Inc. under one 
 * or more contributor license agreements.  See the NOTICE file 
 * distributed with this work for additional information 
 * regarding copyright ownership.  Cloudera, Inc. licenses this file 
 * to you 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.flume.core; 
 
import static org.junit.Assert.assertEquals; 
import static org.junit.Assert.assertFalse; 
import static org.junit.Assert.assertTrue; 
 
import java.util.Map; 
 
import org.junit.Test; 
 
import com.cloudera.flume.core.Event.Priority; 
 
public class TestEvent { 
  /**
   * Test full escaping - the replacement of %{...} strings by their 
   * corresponding attributes. 
   */
 
  @Test 
  public void testEscaping() { 
    Event e = new EventImpl("abcde".getBytes()); 
    String test = "/henry/%{customer}/test"
    e.set("customer""cloudera".getBytes()); 
    assertEquals("Tag replacement of customer failed!""/henry/cloudera/test"
        e.escapeString(test)); 
    test = "/henry/%{unknown}/test"
    assertEquals("Tag replacement of unknown tag failed!""/henry//test", e 
        .escapeString(test)); 
  } 
 
  /**
   * Test replacement of %{...} strings with dots or dashes (FLUME-160) 
   */
 
  @Test 
  public void testFlume160() { 
    Event e = new EventImpl("abcde".getBytes()); 
    String test = "/henry/%{scribe.category}/test"
    e.set("scribe.category""default".getBytes()); 
    assertEquals("Tag replacement of scribe.category failed!""/henry/default/test", e.escapeString(test)); 
    test = "/henry/%{foo-bar}/test"
    e.set("foo-bar""zomg".getBytes()); 
    assertEquals("Tag replacement of foo-bar failed!""/henry/zomg/test", e.escapeString(test)); 
  } 
 
  /**
   * Test an instance of the special-cased form of tag escaping 
   */
 
  @Test 
  public void testSpecialEscaping() { 
    Event e = new EventImpl("abcde".getBytes()); 
    String test = "/henry/%{body}-test"
    test = e.escapeString(test); 
    assertEquals("Tag replacement of host failed!""/henry/abcde-test", test); 
    test = e.escapeString("/henry/%f"); 
    assertEquals("Tag replacement of unknown single character tag failed!"
        "/henry/", test); 
  } 
 
  /**
   * Test the contains method in Event, used to check if a string contains a 
   * replacable tag. 
   */
 
  @Test 
  public void testContains() { 
    assertTrue("Didn't find expected tag", Event.containsTag("/henry/%{test}")); 
    assertTrue("Didn't find expected shorthand tag", Event 
        .containsTag("/henry/%h")); 
    assertFalse("Found non-existant tag", Event.containsTag("/henry/test")); 
  } 
 
  /**
   * Test that the regex correctly decodes %% before %%{..} 
   */
 
  @Test 
  public void testMatchOrdering() { 
    String test = "%%{henry}"
    Event e = new EventImpl("abcde".getBytes()); 
    test = e.escapeString(test); 
    assertEquals("Replacement of tags in order failed: " + test, "%{henry}"
        test); 
  } 
 
  /**
   * Test the date 
   */
 
  @Test 
  public void testDateFormat() { 
    String test = "%a"
    Event e = new EventImpl(new byte[0], 1267578391, Priority.INFO, 0
        "localhost"); 
    test = e.escapeString(test); 
    assertEquals("Replacement of tag by date failed: " + test, "Thu", test); 
  } 
 
  /**
   * Test getting an attribute names from a escape sequence. 
   *  
   * TODO (jon) This assumes a US PST locale currently 
   */
 
  @Test 
  public void testAttributeNames() { 
    String test = "%a %A %b %B %c %d %D %H %I %j %k %l %m"
    Event e = new EventImpl(new byte[0], 1267578391, Priority.INFO, 0
        "localhost"); 
    System.out.println(e.escapeString(test)); 
    Map<String, String> mapping1 = e.getEscapeMapping(test); 
    assertTrue(mapping1.get("weekday_short").equals("Thu")); 
    assertTrue(mapping1.get("weekday_full").equals("Thursday")); 
    assertTrue(mapping1.get("monthname_short").equals("Jan")); 
    assertTrue(mapping1.get("monthname_full").equals("January")); 
    assertTrue(mapping1.get("datetime").equals("Thu Jan 15 08:06:18 1970")); 
    assertTrue(mapping1.get("day_of_month_xx").equals("15")); 
    assertTrue(mapping1.get("date_short").equals("01/15/70")); 
    assertTrue(mapping1.get("hour_24_xx").equals("08")); 
    assertTrue(mapping1.get("hour_12_xx").equals("08")); 
    assertTrue(mapping1.get("day_of_year_xxx").equals("015")); 
    assertTrue(mapping1.get("hour_24").equals("8")); 
    assertTrue(mapping1.get("hour_12").equals("8")); 
    assertTrue(mapping1.get("month_xx").equals("01")); 
 
    String test2 = "%M %p %s %S %t %y %Y %z %{host} %{priority} %{nanos} %{body}"
    System.out.println(e.escapeString(test2)); 
    Map<String, String> mapping2 = e.getEscapeMapping(test2); 
    assertTrue(mapping2.get("minute_xx").equals("06")); 
    assertTrue(mapping2.get("am_pm").equals("AM")); 
    assertTrue(mapping2.get("unix_seconds").equals("1267578")); 
    assertTrue(mapping2.get("seconds_xx").equals("18")); 
    assertTrue(mapping2.get("unix_millis").equals("1267578391")); 
    assertTrue(mapping2.get("year_xx").equals("70")); 
    assertTrue(mapping2.get("year_xxxx").equals("1970")); 
    assertTrue(mapping2.get("timezone_delta").equals("-0800")); 
    assertTrue(mapping2.get("host").equals("localhost")); 
    assertTrue(mapping2.get("priority").equals("INFO")); 
    assertTrue(mapping2.get("nanos").equals("0")); 
    assertTrue(mapping2.get("body").equals("")); 
  } 
 
  /**
   * Unhandled escape sequences just return the shorthand and an empty string 
   * value 
   *  
   * TODO (jon) This assumes a US PST locale currently 
   */
 
  @Test 
  public void testBadAttributeName() { 
    Event e = new EventImpl(new byte[0], 1267578391, Priority.INFO, 0
        "localhost"); 
    String test2 = "%v %r %u"
    System.out.println(e.escapeString(test2)); 
    Map<String, String> mapping = e.getEscapeMapping(test2); 
    assertEquals(3, mapping.size()); 
    assertTrue(mapping.get("v").equals("")); 
    assertTrue(mapping.get("r").equals("")); 
    assertTrue(mapping.get("u").equals("")); 
  } 
 
}