001/*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *     http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018package org.apache.hadoop.hbase.regionserver;
019
020import static org.junit.Assert.assertEquals;
021import static org.junit.Assert.assertNotEquals;
022import static org.junit.Assert.assertTrue;
023
024import org.apache.hadoop.hbase.CompatibilitySingletonFactory;
025import org.apache.hadoop.hbase.HBaseClassTestRule;
026import org.apache.hadoop.hbase.testclassification.MetricsTests;
027import org.apache.hadoop.hbase.testclassification.SmallTests;
028import org.junit.ClassRule;
029import org.junit.Test;
030import org.junit.experimental.categories.Category;
031
032/**
033 *  Test for MetricsTableSourceImpl
034 */
035@Category({MetricsTests.class, SmallTests.class})
036public class TestMetricsTableSourceImpl {
037  @ClassRule
038  public static final HBaseClassTestRule CLASS_RULE =
039      HBaseClassTestRule.forClass(TestMetricsTableSourceImpl.class);
040
041  @SuppressWarnings("SelfComparison")
042  @Test
043  public void testCompareToHashCode() throws Exception {
044    MetricsRegionServerSourceFactory metricsFact =
045        CompatibilitySingletonFactory.getInstance(MetricsRegionServerSourceFactory.class);
046
047    MetricsTableSource one = metricsFact.createTable("ONETABLE", new TableWrapperStub("ONETABLE"));
048    MetricsTableSource oneClone = metricsFact.createTable("ONETABLE",
049            new TableWrapperStub("ONETABLE"));
050    MetricsTableSource two = metricsFact.createTable("TWOTABLE", new TableWrapperStub("TWOTABLE"));
051
052    assertEquals(0, one.compareTo(oneClone));
053    assertEquals(one.hashCode(), oneClone.hashCode());
054    assertNotEquals(one, two);
055
056    assertTrue(one.compareTo(two) != 0);
057    assertTrue(two.compareTo(one) != 0);
058    assertTrue(two.compareTo(one) != one.compareTo(two));
059    assertTrue(two.compareTo(two) == 0);
060  }
061
062  @Test(expected = RuntimeException.class)
063  public void testNoGetTableMetricsSourceImpl() {
064    // This should throw an exception because MetricsTableSourceImpl should only
065    // be created by a factory.
066    CompatibilitySingletonFactory.getInstance(MetricsTableSourceImpl.class);
067  }
068
069  @Test
070  public void testGetTableMetrics() {
071    MetricsTableSource oneTbl =
072        CompatibilitySingletonFactory.getInstance(MetricsRegionServerSourceFactory.class)
073        .createTable("ONETABLE", new TableWrapperStub("ONETABLE"));
074    assertEquals("ONETABLE", oneTbl.getTableName());
075  }
076
077  static class TableWrapperStub implements MetricsTableWrapperAggregate {
078    private String tableName;
079
080    public TableWrapperStub(String tableName) {
081      this.tableName = tableName;
082    }
083
084    @Override
085    public long getReadRequestsCount(String table) {
086      return 10;
087    }
088
089    @Override
090    public long getWriteRequestsCount(String table) {
091      return 20;
092    }
093
094    @Override
095    public long getTotalRequestsCount(String table) {
096      return 30;
097    }
098
099    @Override
100    public long getMemStoresSize(String table) {
101      return 1000;
102    }
103
104    @Override
105    public long getStoreFilesSize(String table) {
106      return 2000;
107    }
108
109    @Override
110    public long getTableSize(String table) {
111      return 3000;
112    }
113
114    public String getTableName() {
115      return tableName;
116    }
117  }
118}