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.reporter; 
 
import static org.junit.Assert.assertEquals; 
 
import java.io.IOException; 
import java.io.OutputStreamWriter; 
import java.io.StringReader; 
import java.io.StringWriter; 
import java.io.Writer; 
import java.util.HashMap; 
 
import org.codehaus.jackson.map.ObjectMapper; 
import org.junit.Before; 
import org.junit.Test; 
 
/**
 * This test Attributes, type formatters. Json output is actually read by a json 
 * parser to check it. 
 */
 
public class TestReportEvent { 
 
  ReportEvent e; 
 
  @Before 
  public void setUp() { 
    System.out.println("\n---"); 
    e = new ReportEvent("test"); 
    e.setLongMetric("rpt.long.value"123456); 
    e.setStringMetric("rpt.string.value""this is a test string"); 
    e.setDoubleMetric("rpt.double.value", -1234.32e2); 
    e.setLongMetric("event1.duplicateLong"54321L); 
  } 
 
  @Test 
  public void testReportHtml() throws IOException { 
    Writer w = new OutputStreamWriter(System.out); 
    e.toHtml(w); 
    w.flush(); 
  } 
 
  @Test 
  public void testReportJson() throws IOException { 
    Writer w = new OutputStreamWriter(System.out); 
    e.toJson(w); 
    w.flush(); 
  } 
 
  /**
   * This just checks to make sure the value was json parsable. Throws exception 
   * on parse failure. 
   */
 
  @SuppressWarnings("unchecked"
  @Test 
  public void testReportJsonParse() throws IOException { 
    StringWriter w = new StringWriter(); 
    e.toJson(w); 
    w.flush(); 
    System.out.println(w.getBuffer()); 
    StringReader r = new StringReader(w.getBuffer().toString()); 
 
    ObjectMapper m = new ObjectMapper(); 
    HashMap<String, Object> node = m.readValue(r, HashMap.class); 
    System.out.println(node); 
  } 
 
  @Test 
  public void testReportText() throws IOException { 
    Writer w = new OutputStreamWriter(System.out); 
    e.toText(w); 
    w.flush(); 
  } 
 
  @Test 
  public void testLegacyReport() throws IOException { 
    ReportEvent e2 = ReportEvent.createLegacyHtmlReport("test"
        "this is an old single string report"); 
    Writer out = new OutputStreamWriter(System.out); 
    System.out.println(e2.toText()); 
    System.out.println(); 
 
    e2.toText(out); 
    out.flush(); 
    System.out.println(); 
 
    e2.toHtml(out); 
    out.flush(); 
    System.out.println(); 
 
    e2.toJson(out); 
    out.flush(); 
    System.out.println(); 
  } 
 
  /**
   * Only the new "another" attribute should be added to the original report 
   */
 
  @Test 
  public void testMerge() throws IOException { 
    ReportEvent e1 = new ReportEvent("test"); 
    e1.setLongMetric("another"12345); 
 
    long attrs = e.getNumMetrics(); 
    System.out.println("- before merge, " + attrs + " attributes"); 
    Writer out = new OutputStreamWriter(System.out); 
    e.toJson(out); 
    out.flush(); 
 
    System.out.println("- after merge, " + attrs + " + 1  attributes"); 
    e.merge(e1); 
    e.toJson(out); 
    out.flush(); 
    assertEquals(attrs + 1, e.getNumMetrics()); 
  } 
 
  /**
   * Test that hierarchical merge works correctly - a) that all metrics are 
   * merged in correctly, b) that metrics are renamed correctly and c) that 
   * merged-in metrics with an existing name are suppressed. 
   */
 
  @Test 
  public void testHierarchicalMerge() throws IOException { 
    ReportEvent e1 = new ReportEvent("test"); 
    e1.setLongMetric("another"12345); 
    e1.setLongMetric("duplicateLong"23456); 
 
    long attrs = e.getNumMetrics(); 
    System.out.println("- before merge, " + attrs + " attributes"); 
    Writer out = new OutputStreamWriter(System.out); 
    e.toJson(out); 
    out.flush(); 
 
    System.out.println("- after merge, " + attrs + " + 2  metrics"); 
    e.hierarchicalMerge("event1", e1); 
    e.toJson(out); 
    out.flush(); 
    assertEquals(attrs + 2, e.getNumMetrics()); 
    assertEquals(e.getLongMetric("event1.another"), Long.valueOf(12345L)); 
    assertEquals(e.getLongMetric("event1.duplicateLong"), Long.valueOf(54321L)); 
  } 
}