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}