Skip to content

Commit 4d4af14

Browse files
committed
HBASE-29223 Unit tests for MasterStatusUtil
1 parent d8ab346 commit 4d4af14

File tree

1 file changed

+254
-0
lines changed

1 file changed

+254
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,254 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
package org.apache.hadoop.hbase.util;
19+
20+
import static org.junit.Assert.assertEquals;
21+
import static org.junit.Assert.assertNotNull;
22+
import static org.junit.Assert.assertNull;
23+
24+
import java.io.IOException;
25+
import java.util.ArrayList;
26+
import java.util.Collections;
27+
import java.util.HashMap;
28+
import java.util.List;
29+
import java.util.Map;
30+
import java.util.Optional;
31+
import org.apache.hadoop.conf.Configuration;
32+
import org.apache.hadoop.hbase.HBaseClassTestRule;
33+
import org.apache.hadoop.hbase.HBaseConfiguration;
34+
import org.apache.hadoop.hbase.ServerName;
35+
import org.apache.hadoop.hbase.TableDescriptors;
36+
import org.apache.hadoop.hbase.TableName;
37+
import org.apache.hadoop.hbase.client.RegionInfo;
38+
import org.apache.hadoop.hbase.client.RegionInfoBuilder;
39+
import org.apache.hadoop.hbase.client.TableDescriptor;
40+
import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
41+
import org.apache.hadoop.hbase.master.DeadServer;
42+
import org.apache.hadoop.hbase.master.HMaster;
43+
import org.apache.hadoop.hbase.master.RegionState;
44+
import org.apache.hadoop.hbase.master.ServerManager;
45+
import org.apache.hadoop.hbase.master.assignment.AssignmentManager;
46+
import org.apache.hadoop.hbase.master.assignment.RegionStateNode;
47+
import org.apache.hadoop.hbase.master.assignment.RegionStates;
48+
import org.apache.hadoop.hbase.testclassification.MasterTests;
49+
import org.apache.hadoop.hbase.testclassification.SmallTests;
50+
import org.apache.hadoop.hbase.zookeeper.ZKWatcher;
51+
import org.apache.hadoop.hbase.zookeeper.ZNodePaths;
52+
import org.junit.Before;
53+
import org.junit.ClassRule;
54+
import org.junit.Test;
55+
import org.junit.experimental.categories.Category;
56+
import org.mockito.Mockito;
57+
58+
@Category({ MasterTests.class, SmallTests.class })
59+
public class TestMasterStatusUtil {
60+
61+
@ClassRule
62+
public static final HBaseClassTestRule CLASS_RULE =
63+
HBaseClassTestRule.forClass(TestMasterStatusUtil.class);
64+
65+
private HMaster master;
66+
private Configuration conf;
67+
68+
static final ServerName FAKE_HOST = ServerName.valueOf("fakehost", 12345, 1234567890);
69+
static final TableDescriptor FAKE_TABLE =
70+
TableDescriptorBuilder.newBuilder(TableName.valueOf("mytable")).build();
71+
72+
static final RegionInfo FAKE_HRI = RegionInfoBuilder.newBuilder(FAKE_TABLE.getTableName())
73+
.setStartKey(Bytes.toBytes("a")).setEndKey(Bytes.toBytes("b")).build();
74+
75+
@Before
76+
public void setupBasicMocks() {
77+
conf = HBaseConfiguration.create();
78+
79+
master = Mockito.mock(HMaster.class);
80+
Mockito.doReturn(FAKE_HOST).when(master).getServerName();
81+
Mockito.doReturn(conf).when(master).getConfiguration();
82+
Mockito.doReturn(true).when(master).isInitialized();
83+
84+
// Fake DeadServer
85+
DeadServer deadServer = Mockito.mock(DeadServer.class);
86+
// Fake serverManager
87+
ServerManager serverManager = Mockito.mock(ServerManager.class);
88+
Mockito.doReturn(1.0).when(serverManager).getAverageLoad();
89+
Mockito.doReturn(serverManager).when(master).getServerManager();
90+
Mockito.doReturn(deadServer).when(serverManager).getDeadServers();
91+
92+
// Fake AssignmentManager and RIT
93+
AssignmentManager am = Mockito.mock(AssignmentManager.class);
94+
RegionStates rs = Mockito.mock(RegionStates.class);
95+
List<RegionState> regionsInTransition = new ArrayList<>();
96+
regionsInTransition
97+
.add(new RegionState(FAKE_HRI, RegionState.State.CLOSING, 12345L, FAKE_HOST));
98+
Mockito.doReturn(rs).when(am).getRegionStates();
99+
Mockito.doReturn(regionsInTransition).when(rs).getRegionsInTransition();
100+
Mockito.doReturn(am).when(master).getAssignmentManager();
101+
Mockito.doReturn(serverManager).when(master).getServerManager();
102+
103+
// Fake ZKW
104+
ZKWatcher zkw = Mockito.mock(ZKWatcher.class);
105+
Mockito.doReturn(new ZNodePaths(conf)).when(zkw).getZNodePaths();
106+
Mockito.doReturn("fakequorum").when(zkw).getQuorum();
107+
Mockito.doReturn(zkw).when(master).getZooKeeper();
108+
109+
// Fake ActiveMaster
110+
Mockito.doReturn(Optional.of(FAKE_HOST)).when(master).getActiveMaster();
111+
}
112+
113+
@Test
114+
public void testGetUserTables() throws IOException {
115+
Map<String, TableDescriptor> mockTables = new HashMap<>();
116+
mockTables.put("foo", TableDescriptorBuilder.newBuilder(TableName.valueOf("foo")).build());
117+
mockTables.put("bar", TableDescriptorBuilder.newBuilder(TableName.valueOf("bar")).build());
118+
119+
TableDescriptors tableDescriptors = Mockito.mock(TableDescriptors.class);
120+
Mockito.doReturn(tableDescriptors).when(master).getTableDescriptors();
121+
122+
Mockito.doReturn(mockTables).when(tableDescriptors).getAll();
123+
124+
List<TableDescriptor> tables = new ArrayList<>();
125+
126+
String errorMessage = MasterStatusUtil.getUserTables(master, tables);
127+
128+
assertNull(errorMessage);
129+
assertEquals(2, tables.size());
130+
}
131+
132+
@Test
133+
public void testGetUserTablesFilterOutSystemTables() throws IOException {
134+
Map<String, TableDescriptor> mockTables = new HashMap<>();
135+
mockTables.put("foo", TableDescriptorBuilder.newBuilder(TableName.valueOf("foo")).build());
136+
mockTables.put("bar", TableDescriptorBuilder.newBuilder(TableName.valueOf("bar")).build());
137+
mockTables.put("meta",
138+
TableDescriptorBuilder.newBuilder(TableName.valueOf("hbase", "meta")).build());
139+
140+
TableDescriptors tableDescriptors = Mockito.mock(TableDescriptors.class);
141+
Mockito.doReturn(tableDescriptors).when(master).getTableDescriptors();
142+
143+
Mockito.doReturn(mockTables).when(tableDescriptors).getAll();
144+
145+
List<TableDescriptor> tables = new ArrayList<>();
146+
147+
String errorMessage = MasterStatusUtil.getUserTables(master, tables);
148+
149+
assertNull(errorMessage);
150+
assertEquals(2, tables.size());
151+
}
152+
153+
@Test
154+
public void testGetUserTablesNoUserTables() throws IOException {
155+
Map<Object, Object> emptyMap = Collections.emptyMap();
156+
157+
TableDescriptors tableDescriptors = Mockito.mock(TableDescriptors.class);
158+
Mockito.doReturn(tableDescriptors).when(master).getTableDescriptors();
159+
160+
Mockito.doReturn(emptyMap).when(tableDescriptors).getAll();
161+
162+
List<TableDescriptor> tables = new ArrayList<>();
163+
164+
String errorMessage = MasterStatusUtil.getUserTables(master, tables);
165+
166+
assertNull(errorMessage);
167+
assertEquals(0, tables.size());
168+
}
169+
170+
@Test
171+
public void testGetUserTablesMasterNotInitialized() {
172+
Mockito.doReturn(false).when(master).isInitialized();
173+
174+
List<TableDescriptor> tables = new ArrayList<>();
175+
176+
String errorMessage = MasterStatusUtil.getUserTables(master, tables);
177+
178+
assertNull(errorMessage);
179+
assertEquals(0, tables.size());
180+
}
181+
182+
@Test
183+
public void testGetUserTablesException() throws IOException {
184+
TableDescriptors tableDescriptors = Mockito.mock(TableDescriptors.class);
185+
Mockito.doReturn(tableDescriptors).when(master).getTableDescriptors();
186+
187+
Mockito.doThrow(new IOException("some error")).when(tableDescriptors).getAll();
188+
189+
List<TableDescriptor> tables = new ArrayList<>();
190+
String errorMessage = MasterStatusUtil.getUserTables(master, tables);
191+
assertEquals("Got user tables error, some error", errorMessage);
192+
}
193+
194+
@Test
195+
public void testGetFragmentationInfoTurnedOff() throws IOException {
196+
conf.setBoolean("hbase.master.ui.fragmentation.enabled", false);
197+
assertNull(MasterStatusUtil.getFragmentationInfo(master, conf));
198+
}
199+
200+
@Test
201+
public void testGetFragmentationInfoTurnedOn() throws IOException {
202+
conf.setBoolean("hbase.master.ui.fragmentation.enabled", true);
203+
Map<String, Integer> fragmentationInfo = MasterStatusUtil.getFragmentationInfo(master, conf);
204+
assertNotNull(fragmentationInfo);
205+
assertEquals(1, fragmentationInfo.size());
206+
}
207+
208+
@Test
209+
public void testGetMetaLocationOrNull() {
210+
mockMetaLocation(true);
211+
212+
ServerName location = MasterStatusUtil.getMetaLocationOrNull(master);
213+
assertNotNull(location);
214+
assertEquals(FAKE_HOST, location);
215+
}
216+
217+
@Test
218+
public void testGetMetaLocationOrNullNotOpen() {
219+
mockMetaLocation(false);
220+
221+
ServerName location = MasterStatusUtil.getMetaLocationOrNull(master);
222+
assertNull(location);
223+
}
224+
225+
private void mockMetaLocation(boolean isOpen) {
226+
RegionStates rs = master.getAssignmentManager().getRegionStates();
227+
RegionStateNode rsn = Mockito.mock(RegionStateNode.class);
228+
Mockito.doReturn(rsn).when(rs).getRegionStateNode(RegionInfoBuilder.FIRST_META_REGIONINFO);
229+
Mockito.doReturn(isOpen).when(rsn).isInState(RegionState.State.OPEN);
230+
if (isOpen) {
231+
Mockito.doReturn(FAKE_HOST).when(rsn).getRegionLocation();
232+
}
233+
}
234+
235+
@Test
236+
public void testServerNameLink() {
237+
Mockito.doReturn(16030).when(master).getRegionServerInfoPort(FAKE_HOST);
238+
239+
String link = MasterStatusUtil.serverNameLink(master, FAKE_HOST);
240+
241+
assertNotNull(link);
242+
assertEquals("<a href=\"//fakehost:16030/rs-status\">fakehost,12345,1234567890</a>", link);
243+
}
244+
245+
@Test
246+
public void testServerNameLinkNoInfoPort() {
247+
Mockito.doReturn(-1).when(master).getRegionServerInfoPort(FAKE_HOST);
248+
249+
String link = MasterStatusUtil.serverNameLink(master, FAKE_HOST);
250+
251+
assertNotNull(link);
252+
assertEquals("fakehost,12345,1234567890", link);
253+
}
254+
}

0 commit comments

Comments
 (0)