Package com.cloudera.flume.reporter

Source Code of com.cloudera.flume.reporter.MasterReportPusherTest

// Copyright (c) 2010 Cloudera, Inc.  All rights reserved.
//
//  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.flume.reporter;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.io.IOException;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

import org.junit.Test;

import com.cloudera.flume.agent.MockMasterRPC;
import com.cloudera.flume.conf.FlumeConfiguration;
import com.cloudera.flume.util.MockClock;
import com.cloudera.util.Clock;

/**
* Test cases for the MasterReportPusher, which deposits ReportEvents on the
* master.
*/
public class MasterReportPusherTest {

  final protected CountDownLatch latch = new CountDownLatch(1);

  /**
   * Specialise MockMasterRPC to allow us to tell when putReports has been
   * called.
   */
  public class PusherMockMaster extends MockMasterRPC {

    public Map<String, ReportEvent> reports;

    @Override
    public void putReports(Map<String, ReportEvent> reports) throws IOException {
      this.reports = reports;
      latch.countDown();
    }
  }

  /**
   * Test full pusher lifecycle - make sure that reports get sent to the master.
   */
  @Test
  public void testPusherThread() throws InterruptedException {
    ReportManager rptMan = ReportManager.get();
    rptMan.clear();

    PusherMockMaster master = new PusherMockMaster();

    MasterReportPusher reportPusher = new MasterReportPusher(FlumeConfiguration
        .createTestableConfiguration(), ReportManager.get(), master);

    MockClock mockClock = new MockClock(0);
    Clock.setClock(mockClock);

    Reportable reportable = new Reportable() {

      @Override
      public String getName() {
        return "test-reportable";
      }

      @Override
      public ReportEvent getReport() {
        ReportEvent r = new ReportEvent("test-reportable-report");
        r.setStringMetric("foo", "bar");
        return r;
      }

    };

    rptMan.add(reportable);

    reportPusher.start();

    // Trigger the report pusher
    mockClock.forward(FlumeConfiguration.get().getReporterPollPeriod() * 2);

    // Wait for 'real' 5s delay for report pusher to a) get on a CPU and b) do
    // the push
    assertTrue("putReports not called within 5 seconds", latch.await(5,
        TimeUnit.SECONDS));

    reportPusher.stop();

    assertEquals("Not enough reports received", 1, master.reports.size());
    assertEquals("Report metrics not correctly sent", "bar", master.reports
        .get("prefix.test-reportable").getStringMetric("foo"));

  }
}
TOP

Related Classes of com.cloudera.flume.reporter.MasterReportPusherTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.