/* * 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.util; import java.util.Arrays; import java.util.Collection; import org.junit.Test; import static org.junit.Assert.*; import static org.mockito.Mockito.*; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.metrics2.Metric; import org.apache.hadoop.metrics2.MetricsRecord; import org.apache.hadoop.metrics2.MetricsTag; public class TestMetricsCache { private static final Log LOG = LogFactory.getLog(TestMetricsCache.class); @Test public void testUpdate() { MetricsCache cache = new MetricsCache(); MetricsRecord mr = makeRecord("r", Arrays.asList(makeTag("t", "tv")), Arrays.asList(makeMetric("m", 0), makeMetric("m1", 1))); MetricsCache.Record cr = cache.update(mr); verify(mr).name(); verify(mr).tags(); verify(mr).metrics(); assertEquals("same record size", cr.metrics.size(), ((Collection<Metric>)mr.metrics()).size()); assertEquals("same metric value", 0, cr.getMetric("m")); assertNotNull("metric not null", cr.getMetricInstance("m")); assertEquals("new metric value", 0, cr.getMetricInstance("m").value()); MetricsRecord mr2 = makeRecord("r", Arrays.asList(makeTag("t", "tv")), Arrays.asList(makeMetric("m", 2), makeMetric("m2", 42))); cr = cache.update(mr2); assertEquals("contains 3 metric", 3, cr.metrics.size()); assertEquals("updated metric value", 2, cr.getMetric("m")); assertNotNull("metric not null", cr.getMetricInstance("m")); assertEquals("new metric value", 2, cr.getMetricInstance("m").value()); assertEquals("old metric value", 1, cr.getMetric("m1")); assertNotNull("metric not null", cr.getMetricInstance("m1")); assertEquals("new metric value", 1, cr.getMetricInstance("m1").value()); assertEquals("new metric value", 42, cr.getMetric("m2")); assertNotNull("metric not null", cr.getMetricInstance("m2")); assertEquals("new metric value", 42, cr.getMetricInstance("m2").value()); MetricsRecord mr3 = makeRecord("r", Arrays.asList(makeTag("t", "tv3")), // different tag value Arrays.asList(makeMetric("m3", 3))); cr = cache.update(mr3); // should get a new record assertEquals("contains 1 metric", 1, cr.metrics.size()); assertEquals("updated metric value", 3, cr.getMetric("m3")); assertNotNull("metric not null", cr.getMetricInstance("m3")); assertEquals("new metric value", 3, cr.getMetricInstance("m3").value()); // tags cache should be empty so far assertEquals("no tags", 0, cr.tags.size()); // until now cr = cache.update(mr3, true); assertEquals("Got 1 tag", 1, cr.tags.size()); assertEquals("Tag value", "tv3", cr.getTag("t")); assertEquals("Metric value", 3, cr.getMetric("m3")); assertNotNull("metric not null", cr.getMetricInstance("m3")); assertEquals("new metric value", 3, cr.getMetricInstance("m3").value()); } @Test public void testGet() { MetricsCache cache = new MetricsCache(); assertNull("empty", cache.get("r", Arrays.asList(makeTag("t", "t")))); MetricsRecord mr = makeRecord("r", Arrays.asList(makeTag("t", "t")), Arrays.asList(makeMetric("m", 1))); cache.update(mr); MetricsCache.Record cr = cache.get("r", (Collection<MetricsTag>)mr.tags()); LOG.debug("tags="+ (Collection<MetricsTag>)mr.tags() +" cr="+ cr); assertNotNull("Got record", cr); assertEquals("contains 1 metric", 1, cr.metrics.size()); assertEquals("new metric value", 1, cr.getMetric("m")); assertNotNull("metric not null", cr.getMetricInstance("m")); assertEquals("new metric value", 1, cr.getMetricInstance("m").value()); } private MetricsRecord makeRecord(String name, Collection<MetricsTag> tags, Collection<Metric> metrics) { MetricsRecord mr = mock(MetricsRecord.class); when(mr.name()).thenReturn(name); when(mr.tags()).thenReturn(tags); when(mr.metrics()).thenReturn(metrics); return mr; } private MetricsTag makeTag(String name, String value) { return new MetricsTag(name, "", value); } private Metric makeMetric(String name, Number value) { Metric metric = mock(Metric.class); when(metric.name()).thenReturn(name); when(metric.value()).thenReturn(value); return metric; } }