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.hbtop.screen.top; 019 020import static org.hamcrest.CoreMatchers.is; 021import static org.junit.Assert.assertThat; 022import static org.junit.Assert.assertTrue; 023import static org.mockito.Mockito.when; 024 025import java.io.IOException; 026import java.util.Arrays; 027import java.util.List; 028import java.util.stream.Collectors; 029import org.apache.hadoop.hbase.HBaseClassTestRule; 030import org.apache.hadoop.hbase.client.Admin; 031import org.apache.hadoop.hbase.hbtop.Record; 032import org.apache.hadoop.hbase.hbtop.RecordFilter; 033import org.apache.hadoop.hbase.hbtop.TestUtils; 034import org.apache.hadoop.hbase.hbtop.field.Field; 035import org.apache.hadoop.hbase.hbtop.field.FieldInfo; 036import org.apache.hadoop.hbase.hbtop.field.FieldValue; 037import org.apache.hadoop.hbase.hbtop.mode.Mode; 038import org.apache.hadoop.hbase.testclassification.SmallTests; 039import org.junit.Before; 040import org.junit.ClassRule; 041import org.junit.Test; 042import org.junit.experimental.categories.Category; 043import org.junit.runner.RunWith; 044import org.mockito.Mock; 045import org.mockito.runners.MockitoJUnitRunner; 046 047 048@Category(SmallTests.class) 049@RunWith(MockitoJUnitRunner.class) 050public class TestTopScreenModel { 051 052 @ClassRule 053 public static final HBaseClassTestRule CLASS_RULE = 054 HBaseClassTestRule.forClass(TestTopScreenModel.class); 055 056 @Mock 057 private Admin admin; 058 059 private TopScreenModel topScreenModel; 060 061 private List<Field> fields; 062 063 @Before 064 public void setup() throws IOException { 065 when(admin.getClusterMetrics()).thenReturn(TestUtils.createDummyClusterMetrics()); 066 topScreenModel = new TopScreenModel(admin, Mode.REGION); 067 068 fields = Mode.REGION.getFieldInfos().stream() 069 .map(FieldInfo::getField) 070 .collect(Collectors.toList()); 071 } 072 073 @Test 074 public void testSummary() { 075 topScreenModel.refreshMetricsData(); 076 Summary summary = topScreenModel.getSummary(); 077 TestUtils.assertSummary(summary); 078 } 079 080 @Test 081 public void testRecords() { 082 // Region Mode 083 topScreenModel.refreshMetricsData(); 084 TestUtils.assertRecordsInRegionMode(topScreenModel.getRecords()); 085 086 // Namespace Mode 087 topScreenModel.switchMode(Mode.NAMESPACE, null, false); 088 topScreenModel.refreshMetricsData(); 089 TestUtils.assertRecordsInNamespaceMode(topScreenModel.getRecords()); 090 091 // Table Mode 092 topScreenModel.switchMode(Mode.TABLE, null, false); 093 topScreenModel.refreshMetricsData(); 094 TestUtils.assertRecordsInTableMode(topScreenModel.getRecords()); 095 096 // Namespace Mode 097 topScreenModel.switchMode(Mode.REGION_SERVER, null, false); 098 topScreenModel.refreshMetricsData(); 099 TestUtils.assertRecordsInRegionServerMode(topScreenModel.getRecords()); 100 } 101 102 @Test 103 public void testSort() { 104 // The sort key is LOCALITY 105 topScreenModel.setSortFieldAndFields(Field.LOCALITY, fields); 106 107 FieldValue previous = null; 108 109 // Test for ascending sort 110 topScreenModel.refreshMetricsData(); 111 112 for (Record record : topScreenModel.getRecords()) { 113 FieldValue current = record.get(Field.LOCALITY); 114 if (previous != null) { 115 assertTrue(current.compareTo(previous) < 0); 116 } 117 previous = current; 118 } 119 120 // Test for descending sort 121 topScreenModel.switchSortOrder(); 122 topScreenModel.refreshMetricsData(); 123 124 previous = null; 125 for (Record record : topScreenModel.getRecords()) { 126 FieldValue current = record.get(Field.LOCALITY); 127 if (previous != null) { 128 assertTrue(current.compareTo(previous) > 0); 129 } 130 previous = current; 131 } 132 } 133 134 @Test 135 public void testFilters() { 136 topScreenModel.addFilter("TABLE==table1", false); 137 topScreenModel.refreshMetricsData(); 138 for (Record record : topScreenModel.getRecords()) { 139 FieldValue value = record.get(Field.TABLE); 140 assertThat(value.asString(), is("table1")); 141 } 142 143 topScreenModel.clearFilters(); 144 topScreenModel.addFilter("TABLE==TABLE1", false); 145 topScreenModel.refreshMetricsData(); 146 assertThat(topScreenModel.getRecords().size(), is(0)); 147 148 // Test for ignore case 149 topScreenModel.clearFilters(); 150 topScreenModel.addFilter("TABLE==TABLE1", true); 151 topScreenModel.refreshMetricsData(); 152 for (Record record : topScreenModel.getRecords()) { 153 FieldValue value = record.get(Field.TABLE); 154 assertThat(value.asString(), is("table1")); 155 } 156 } 157 158 @Test 159 public void testFilterHistories() { 160 topScreenModel.addFilter("TABLE==table1", false); 161 topScreenModel.addFilter("TABLE==table2", false); 162 topScreenModel.addFilter("TABLE==table3", false); 163 164 assertThat(topScreenModel.getFilterHistories().get(0), is("TABLE==table1")); 165 assertThat(topScreenModel.getFilterHistories().get(1), is("TABLE==table2")); 166 assertThat(topScreenModel.getFilterHistories().get(2), is("TABLE==table3")); 167 } 168 169 @Test 170 public void testSwitchMode() { 171 topScreenModel.switchMode(Mode.TABLE, null, false); 172 assertThat(topScreenModel.getCurrentMode(), is(Mode.TABLE)); 173 174 // Test for initialFilters 175 List<RecordFilter> initialFilters = Arrays.asList( 176 RecordFilter.parse("TABLE==table1", fields, true), 177 RecordFilter.parse("TABLE==table2", fields, true)); 178 179 topScreenModel.switchMode(Mode.TABLE, initialFilters, false); 180 181 assertThat(topScreenModel.getFilters().size(), is(initialFilters.size())); 182 for (int i = 0; i < topScreenModel.getFilters().size(); i++) { 183 assertThat(topScreenModel.getFilters().get(i).toString(), 184 is(initialFilters.get(i).toString())); 185 } 186 187 // Test when keepSortFieldAndSortOrderIfPossible is true 188 topScreenModel.setSortFieldAndFields(Field.NAMESPACE, fields); 189 topScreenModel.switchMode(Mode.NAMESPACE, null, true); 190 assertThat(topScreenModel.getCurrentSortField(), is(Field.NAMESPACE)); 191 } 192 193 @Test 194 public void testDrillDown() { 195 topScreenModel.switchMode(Mode.TABLE, null, false); 196 topScreenModel.setSortFieldAndFields(Field.NAMESPACE, fields); 197 topScreenModel.refreshMetricsData(); 198 199 boolean success = topScreenModel.drillDown(topScreenModel.getRecords().get(0)); 200 assertThat(success, is(true)); 201 202 assertThat(topScreenModel.getFilters().get(0).toString(), is("NAMESPACE==namespace")); 203 assertThat(topScreenModel.getFilters().get(1).toString(), is("TABLE==table3")); 204 assertThat(topScreenModel.getCurrentSortField(), is(Field.NAMESPACE)); 205 } 206}