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.field;
019
020import static org.hamcrest.CoreMatchers.is;
021import static org.junit.Assert.assertThat;
022import static org.mockito.ArgumentMatchers.any;
023import static org.mockito.ArgumentMatchers.anyBoolean;
024import static org.mockito.ArgumentMatchers.anyInt;
025import static org.mockito.ArgumentMatchers.eq;
026import static org.mockito.Mockito.inOrder;
027import static org.mockito.Mockito.verify;
028
029import java.util.EnumMap;
030import java.util.List;
031import java.util.stream.Collectors;
032import org.apache.hadoop.hbase.HBaseClassTestRule;
033import org.apache.hadoop.hbase.hbtop.field.Field;
034import org.apache.hadoop.hbase.hbtop.field.FieldInfo;
035import org.apache.hadoop.hbase.hbtop.mode.Mode;
036import org.apache.hadoop.hbase.hbtop.screen.top.TopScreenView;
037import org.apache.hadoop.hbase.testclassification.SmallTests;
038import org.junit.Before;
039import org.junit.ClassRule;
040import org.junit.Test;
041import org.junit.experimental.categories.Category;
042import org.junit.runner.RunWith;
043import org.mockito.InOrder;
044import org.mockito.Mock;
045import org.mockito.runners.MockitoJUnitRunner;
046
047
048@Category(SmallTests.class)
049@RunWith(MockitoJUnitRunner.class)
050public class FieldScreenPresenterTest {
051
052  @ClassRule
053  public static final HBaseClassTestRule CLASS_RULE =
054    HBaseClassTestRule.forClass(FieldScreenPresenterTest.class);
055
056  @Mock
057  private FieldScreenView fieldScreenView;
058
059  private int sortFieldPosition = -1;
060  private List<Field> fields;
061  private EnumMap<Field, Boolean> fieldDisplayMap;
062
063  @Mock
064  private FieldScreenPresenter.ResultListener resultListener;
065
066  @Mock
067  private TopScreenView topScreenView;
068
069  private FieldScreenPresenter fieldScreenPresenter;
070
071  @Before
072  public void setup() {
073    Field sortField = Mode.REGION.getDefaultSortField();
074    fields = Mode.REGION.getFieldInfos().stream()
075      .map(FieldInfo::getField)
076      .collect(Collectors.toList());
077
078    fieldDisplayMap = Mode.REGION.getFieldInfos().stream()
079      .collect(() -> new EnumMap<>(Field.class),
080        (r, fi) -> r.put(fi.getField(), fi.isDisplayByDefault()), (r1, r2) -> {});
081
082    fieldScreenPresenter =
083      new FieldScreenPresenter(fieldScreenView, sortField, fields, fieldDisplayMap, resultListener,
084        topScreenView);
085
086    for (int i = 0; i < fields.size(); i++) {
087      Field field = fields.get(i);
088      if (field == sortField) {
089        sortFieldPosition = i;
090        break;
091      }
092    }
093  }
094
095  @Test
096  public void testInit() {
097    fieldScreenPresenter.init();
098
099    int modeHeaderMaxLength = "#COMPingCell".length();
100    int modeDescriptionMaxLength = "Filtered Read Request Count per second".length();
101
102    verify(fieldScreenView).showFieldScreen(eq("#REQ/S"), eq(fields), eq(fieldDisplayMap),
103      eq(sortFieldPosition), eq(modeHeaderMaxLength), eq(modeDescriptionMaxLength), eq(false));
104  }
105
106  @Test
107  public void testChangeSortField() {
108    fieldScreenPresenter.arrowUp();
109    fieldScreenPresenter.setSortField();
110
111    fieldScreenPresenter.arrowDown();
112    fieldScreenPresenter.arrowDown();
113    fieldScreenPresenter.setSortField();
114
115    fieldScreenPresenter.pageUp();
116    fieldScreenPresenter.setSortField();
117
118    fieldScreenPresenter.pageDown();
119    fieldScreenPresenter.setSortField();
120
121    InOrder inOrder = inOrder(fieldScreenView);
122    inOrder.verify(fieldScreenView).showScreenDescription(eq("LRS"));
123    inOrder.verify(fieldScreenView).showScreenDescription(eq("#READ/S"));
124    inOrder.verify(fieldScreenView).showScreenDescription(eq(fields.get(0).getHeader()));
125    inOrder.verify(fieldScreenView).showScreenDescription(
126      eq(fields.get(fields.size() - 1).getHeader()));
127  }
128
129  @Test
130  public void testSwitchFieldDisplay() {
131    fieldScreenPresenter.switchFieldDisplay();
132    fieldScreenPresenter.switchFieldDisplay();
133
134    InOrder inOrder = inOrder(fieldScreenView);
135    inOrder.verify(fieldScreenView).showField(anyInt(), any(), eq(false), anyBoolean(), anyInt(),
136      anyInt(), anyBoolean());
137    inOrder.verify(fieldScreenView).showField(anyInt(), any(), eq(true), anyBoolean(), anyInt(),
138      anyInt(), anyBoolean());
139  }
140
141  @Test
142  public void testChangeFieldsOrder() {
143    fieldScreenPresenter.turnOnMoveMode();
144    fieldScreenPresenter.arrowUp();
145    fieldScreenPresenter.turnOffMoveMode();
146
147    Field removed = fields.remove(sortFieldPosition);
148    fields.add(sortFieldPosition - 1, removed);
149
150    assertThat(fieldScreenPresenter.transitionToNextScreen(), is(topScreenView));
151    verify(resultListener).accept(any(), eq(fields), any());
152  }
153}