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.master.http; 019 020import static org.hamcrest.MatcherAssert.assertThat; 021import static org.hamcrest.Matchers.contains; 022import static org.hamcrest.Matchers.containsInAnyOrder; 023import static org.junit.jupiter.api.Assertions.assertEquals; 024import static org.junit.jupiter.api.Assertions.assertNull; 025 026import javax.servlet.http.HttpServletRequest; 027import org.apache.hadoop.hbase.TableName; 028import org.apache.hadoop.hbase.client.AsyncConnection; 029import org.apache.hadoop.hbase.master.RegionState; 030import org.apache.hadoop.hbase.master.http.TestMetaBrowser.MockRequestBuilder; 031import org.apache.hadoop.hbase.testclassification.MasterTests; 032import org.apache.hadoop.hbase.testclassification.SmallTests; 033import org.junit.jupiter.api.BeforeEach; 034import org.junit.jupiter.api.Tag; 035import org.junit.jupiter.api.Test; 036import org.mockito.Mock; 037import org.mockito.MockitoAnnotations; 038 039@Tag(MasterTests.TAG) 040@Tag(SmallTests.TAG) 041public class TestMetaBrowserNoCluster { 042 043 @Mock 044 private AsyncConnection connection; 045 046 @BeforeEach 047 public void before() { 048 MockitoAnnotations.openMocks(this); 049 } 050 051 @Test 052 public void buildFirstPageQueryStringNoParams() { 053 final HttpServletRequest request = new MockRequestBuilder().build(); 054 final MetaBrowser metaBrowser = new MetaBrowser(connection, request); 055 056 assertEquals("hbase:meta", metaBrowser.getName()); 057 assertNull(metaBrowser.getScanLimit()); 058 assertNull(metaBrowser.getScanRegionState()); 059 assertNull(metaBrowser.getScanStart()); 060 assertNull(metaBrowser.getScanTable()); 061 assertEquals("/table.jsp?name=hbase%3Ameta", metaBrowser.buildFirstPageUrl()); 062 } 063 064 @Test 065 public void buildFirstPageQueryStringNonNullParams() { 066 final HttpServletRequest request = new MockRequestBuilder().setLimit(50) 067 .setRegionState(RegionState.State.ABNORMALLY_CLOSED).setTable("foo%3Abar").build(); 068 final MetaBrowser metaBrowser = new MetaBrowser(connection, request); 069 070 assertEquals(50, metaBrowser.getScanLimit().intValue()); 071 assertEquals(RegionState.State.ABNORMALLY_CLOSED, metaBrowser.getScanRegionState()); 072 assertEquals(TableName.valueOf("foo", "bar"), metaBrowser.getScanTable()); 073 assertEquals("/table.jsp?name=hbase%3Ameta" + "&scan_limit=50" 074 + "&scan_region_state=ABNORMALLY_CLOSED" + "&scan_table=foo%3Abar", 075 metaBrowser.buildNextPageUrl(null)); 076 } 077 078 @Test 079 public void buildNextPageQueryString() { 080 final HttpServletRequest request = new MockRequestBuilder().build(); 081 final MetaBrowser metaBrowser = new MetaBrowser(connection, request); 082 083 assertEquals("/table.jsp?name=hbase%3Ameta&scan_start=%255Cx80%255Cx00%255Cx7F", 084 metaBrowser.buildNextPageUrl(new byte[] { Byte.MIN_VALUE, (byte) 0, Byte.MAX_VALUE })); 085 } 086 087 @Test 088 public void unparseableLimitParam() { 089 final HttpServletRequest request = new MockRequestBuilder().setLimit("foo").build(); 090 final MetaBrowser metaBrowser = new MetaBrowser(connection, request); 091 assertNull(metaBrowser.getScanLimit()); 092 assertThat(metaBrowser.getErrorMessages(), 093 contains("Requested SCAN_LIMIT value 'foo' cannot be parsed as an integer.")); 094 } 095 096 @Test 097 public void zeroLimitParam() { 098 final HttpServletRequest request = new MockRequestBuilder().setLimit(0).build(); 099 final MetaBrowser metaBrowser = new MetaBrowser(connection, request); 100 assertEquals(MetaBrowser.SCAN_LIMIT_DEFAULT, metaBrowser.getScanLimit().intValue()); 101 assertThat(metaBrowser.getErrorMessages(), contains("Requested SCAN_LIMIT value 0 is <= 0.")); 102 } 103 104 @Test 105 public void negativeLimitParam() { 106 final HttpServletRequest request = new MockRequestBuilder().setLimit(-10).build(); 107 final MetaBrowser metaBrowser = new MetaBrowser(connection, request); 108 assertEquals(MetaBrowser.SCAN_LIMIT_DEFAULT, metaBrowser.getScanLimit().intValue()); 109 assertThat(metaBrowser.getErrorMessages(), contains("Requested SCAN_LIMIT value -10 is <= 0.")); 110 } 111 112 @Test 113 public void excessiveLimitParam() { 114 final HttpServletRequest request = new MockRequestBuilder().setLimit(10_001).build(); 115 final MetaBrowser metaBrowser = new MetaBrowser(connection, request); 116 assertEquals(MetaBrowser.SCAN_LIMIT_MAX, metaBrowser.getScanLimit().intValue()); 117 assertThat(metaBrowser.getErrorMessages(), 118 contains("Requested SCAN_LIMIT value 10001 exceeds maximum value 10000.")); 119 } 120 121 @Test 122 public void invalidRegionStateParam() { 123 final HttpServletRequest request = new MockRequestBuilder().setRegionState("foo").build(); 124 final MetaBrowser metaBrowser = new MetaBrowser(connection, request); 125 assertNull(metaBrowser.getScanRegionState()); 126 assertThat(metaBrowser.getErrorMessages(), 127 contains("Requested SCAN_REGION_STATE value 'foo' cannot be parsed as a RegionState.")); 128 } 129 130 @Test 131 public void multipleErrorMessages() { 132 final HttpServletRequest request = 133 new MockRequestBuilder().setLimit("foo").setRegionState("bar").build(); 134 final MetaBrowser metaBrowser = new MetaBrowser(connection, request); 135 assertThat(metaBrowser.getErrorMessages(), 136 containsInAnyOrder("Requested SCAN_LIMIT value 'foo' cannot be parsed as an integer.", 137 "Requested SCAN_REGION_STATE value 'bar' cannot be parsed as a RegionState.")); 138 } 139}