/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF 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 org.apache.hadoop.metrics2.lib;

import org.junit.Ignore;
import org.junit.Test;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;

import org.apache.hadoop.metrics2.MetricsException;
import org.apache.hadoop.metrics2.MetricsRecordBuilder;
import static org.apache.hadoop.metrics2.lib.Interns.*;
import static org.apache.hadoop.test.MetricsAsserts.*;

/**
 * Test the metric registry class
 */
public class TestMetricsRegistry {

  /**
   * Test various factory methods
   */
  @Test public void testNewMetrics() {
    final MetricsRegistry r = new MetricsRegistry("test");
    r.newCounter("c1", "c1 desc", 1);
    r.newCounter("c2", "c2 desc", 2L);
    r.newGauge("g1", "g1 desc", 3);
    r.newGauge("g2", "g2 desc", 4L);
    r.newGauge("g3", "g3 desc", 5f);
    r.newStat("s1", "s1 desc", "ops", "time");

    assertEquals("num metrics in registry", 6, r.metrics().size());
    assertTrue("c1 found", r.get("c1") instanceof MutableCounterInt);
    assertTrue("c2 found", r.get("c2") instanceof MutableCounterLong);
    assertTrue("g1 found", r.get("g1") instanceof MutableGaugeInt);
    assertTrue("g2 found", r.get("g2") instanceof MutableGaugeLong);
    assertTrue("g3 found", r.get("g3") instanceof MutableGaugeFloat);
    assertTrue("s1 found", r.get("s1") instanceof MutableStat);

    expectMetricsException("Metric name c1 already exists", new Runnable() {
      @Override
      public void run() { r.newCounter("c1", "test dup", 0); }
    });
  }

  /**
   * Test adding metrics with whitespace in the name
   */
  @Test
  public void testMetricsRegistryIllegalMetricNames() {
    final MetricsRegistry r = new MetricsRegistry("test");
    // Fill up with some basics
    r.newCounter("c1", "c1 desc", 1);
    r.newGauge("g1", "g1 desc", 1);
    r.newQuantiles("q1", "q1 desc", "q1 name", "q1 val type", 1);
    // Add some illegal names
    expectMetricsException("Metric name 'badcount 2' contains "+
        "illegal whitespace character", new Runnable() {
      @Override
      public void run() { r.newCounter("badcount 2", "c2 desc", 2); }
    });
    expectMetricsException("Metric name 'badcount3  ' contains "+
        "illegal whitespace character", new Runnable() {
      @Override
      public void run() { r.newCounter("badcount3  ", "c3 desc", 3); }
    });
    expectMetricsException("Metric name '  badcount4' contains "+
        "illegal whitespace character", new Runnable() {
      @Override
      public void run() { r.newCounter("  badcount4", "c4 desc", 4); }
    });
    expectMetricsException("Metric name 'withtab5	' contains "+
        "illegal whitespace character", new Runnable() {
      @Override
      public void run() { r.newCounter("withtab5	", "c5 desc", 5); }
    });
    expectMetricsException("Metric name 'withnewline6\n' contains "+
        "illegal whitespace character", new Runnable() {
      @Override
      public void run() { r.newCounter("withnewline6\n", "c6 desc", 6); }
    });
    // Final validation
    assertEquals("num metrics in registry", 3, r.metrics().size());
  }

  /**
   * Test the add by name method
   */
  @Test public void testAddByName() {
    MetricsRecordBuilder rb = mockMetricsRecordBuilder();
    final MetricsRegistry r = new MetricsRegistry("test");
    r.add("s1", 42);
    r.get("s1").snapshot(rb);
    verify(rb).addCounter(info("S1NumOps", "Number of ops for s1"), 1L);
    verify(rb).addGauge(info("S1AvgTime", "Average time for s1"), 42.0);

    r.newCounter("c1", "test add", 1);
    r.newGauge("g1", "test add", 1);

    expectMetricsException("Unsupported add", new Runnable() {
      @Override
      public void run() { r.add("c1", 42); }
    });

    expectMetricsException("Unsupported add", new Runnable() {
      @Override
      public void run() { r.add("g1", 42); }
    });
  }

  /**
   * Test adding illegal parameters
   */
  @Test
  public void testAddIllegalParameters() {
    final MetricsRegistry r = new MetricsRegistry("IllegalParamTest");

    expectMetricsException("Interval should be positive.  Value passed is: -20",
        new Runnable() {
      @Override
      public void run() {
          r.newQuantiles("q1", "New Quantile 1", "qq1", "qv1", (int)-20);
      }
    });
  }

  @Ignore
  private void expectMetricsException(String prefix, Runnable fun) {
    try {
      fun.run();
    }
    catch (MetricsException e) {
      assertTrue("expected exception", e.getMessage().startsWith(prefix));
      return;
    }
    fail("should've thrown '"+ prefix +"...'");
  }
}
