blob: f365c6dcad7d7b2be6a305ef3c4922a3dbc03fce [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License. You may obtain a
* copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package org.apache.geode.internal.cache.control;
import static org.apache.geode.internal.cache.control.SerializableRestoreRedundancyResultsImpl.NO_REDUNDANT_COPIES_FOR_REGIONS;
import static org.apache.geode.internal.cache.control.SerializableRestoreRedundancyResultsImpl.PRIMARY_TRANSFERS_COMPLETED;
import static org.apache.geode.internal.cache.control.SerializableRestoreRedundancyResultsImpl.PRIMARY_TRANSFER_TIME;
import static org.apache.geode.internal.cache.control.SerializableRestoreRedundancyResultsImpl.REDUNDANCY_NOT_SATISFIED_FOR_REGIONS;
import static org.apache.geode.internal.cache.control.SerializableRestoreRedundancyResultsImpl.REDUNDANCY_SATISFIED_FOR_REGIONS;
import static org.apache.geode.management.runtime.RegionRedundancyStatus.RedundancyStatus.NOT_SATISFIED;
import static org.apache.geode.management.runtime.RegionRedundancyStatus.RedundancyStatus.NO_REDUNDANT_COPIES;
import static org.apache.geode.management.runtime.RegionRedundancyStatus.RedundancyStatus.SATISFIED;
import static org.apache.geode.management.runtime.RestoreRedundancyResults.Status.FAILURE;
import static org.apache.geode.management.runtime.RestoreRedundancyResults.Status.SUCCESS;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Before;
import org.junit.Test;
import org.apache.geode.cache.partition.PartitionRebalanceInfo;
import org.apache.geode.management.internal.operation.RegionRedundancyStatusImpl;
import org.apache.geode.management.internal.operation.RestoreRedundancyResultsImpl;
import org.apache.geode.management.runtime.RegionRedundancyStatus;
import org.apache.geode.management.runtime.RestoreRedundancyResults;
import org.apache.geode.util.internal.GeodeJsonMapper;
public class SerializableRestoreRedundancyResultsImplTest {
public static final String TEST_STRING = "Test";
private final RegionRedundancyStatus successfulRegionResult =
mock(SerializableRegionRedundancyStatusImpl.class);
private final String successfulRegionName = "successfulRegion";
private final RegionRedundancyStatus underRedundancyRegionResult =
mock(SerializableRegionRedundancyStatusImpl.class);
private final String underRedundancyRegionName = "underRedundancyRegion";
private final RegionRedundancyStatus zeroRedundancyRegionResult =
mock(SerializableRegionRedundancyStatusImpl.class);
private final String zeroRedundancyRegionName = "zeroRedundancyRegion";
private final PartitionRebalanceInfo details = mock(PartitionRebalanceInfo.class);
private final int transfersCompleted = 5;
private final long transferTime = 1234;
private SerializableRestoreRedundancyResultsImpl results;
private final ObjectMapper geodeMapper = GeodeJsonMapper.getMapper();
@Before
public void setUp() {
when(successfulRegionResult.getStatus()).thenReturn(SATISFIED);
when(successfulRegionResult.getRegionName()).thenReturn(successfulRegionName);
when(underRedundancyRegionResult.getStatus()).thenReturn(NOT_SATISFIED);
when(underRedundancyRegionResult.getRegionName()).thenReturn(underRedundancyRegionName);
when(zeroRedundancyRegionResult.getStatus()).thenReturn(NO_REDUNDANT_COPIES);
when(zeroRedundancyRegionResult.getRegionName()).thenReturn(zeroRedundancyRegionName);
when(details.getPrimaryTransfersCompleted()).thenReturn(transfersCompleted);
when(details.getPrimaryTransferTime()).thenReturn(transferTime);
results = new SerializableRestoreRedundancyResultsImpl();
}
@Test
public void initialStateIsSuccess() {
results = new SerializableRestoreRedundancyResultsImpl();
assertThat(results.getRegionOperationStatus()).isEqualTo(SUCCESS);
}
@Test
public void getStatusReturnsSuccessWhenAllRegionsHaveFullySatisfiedRedundancy() {
results.addRegionResult(successfulRegionResult);
assertThat(results.getRegionOperationStatus()).isEqualTo(SUCCESS);
}
@Test
public void getStatusReturnsFailureNotAllRegionsHaveFullySatisfiedRedundancy() {
results.addRegionResult(successfulRegionResult);
results.addRegionResult(underRedundancyRegionResult);
assertThat(results.getRegionOperationStatus()).isEqualTo(FAILURE);
}
@Test
public void getStatusReturnsFailureWhenAtLeastOneRegionHasNoRedundancy() {
results.addRegionResult(successfulRegionResult);
results.addRegionResult(zeroRedundancyRegionResult);
assertThat(results.getRegionOperationStatus()).isEqualTo(FAILURE);
}
@Test
public void getMessageReturnsStatusForAllRegionsAndPrimaryInfo() {
results.addRegionResult(successfulRegionResult);
results.addRegionResult(underRedundancyRegionResult);
results.addRegionResult(zeroRedundancyRegionResult);
results.addPrimaryReassignmentDetails(details);
String message = results.getRegionOperationMessage();
List<String> messageLines = Arrays.asList(message.split(System.lineSeparator()));
assertThat(messageLines).contains(NO_REDUNDANT_COPIES_FOR_REGIONS,
zeroRedundancyRegionResult.toString(),
REDUNDANCY_NOT_SATISFIED_FOR_REGIONS,
underRedundancyRegionResult.toString(),
REDUNDANCY_SATISFIED_FOR_REGIONS,
successfulRegionResult.toString(),
PRIMARY_TRANSFERS_COMPLETED + transfersCompleted,
PRIMARY_TRANSFER_TIME + transferTime);
}
@Test
public void addRegionResultAddsToCorrectInternalMap() {
results.addRegionResult(zeroRedundancyRegionResult);
results.addRegionResult(underRedundancyRegionResult);
results.addRegionResult(successfulRegionResult);
Map<String, RegionRedundancyStatus> zeroRedundancyResults =
results.getZeroRedundancyRegionResults();
assertThat(zeroRedundancyResults.size()).isEqualTo(1);
assertThat(zeroRedundancyResults.get(zeroRedundancyRegionName))
.isEqualTo(zeroRedundancyRegionResult);
Map<String, RegionRedundancyStatus> underRedundancyResults =
results.getUnderRedundancyRegionResults();
assertThat(underRedundancyResults.size()).isEqualTo(1);
assertThat(underRedundancyResults.get(underRedundancyRegionName))
.isEqualTo(underRedundancyRegionResult);
Map<String, RegionRedundancyStatus> successfulRegionResults =
results.getSatisfiedRedundancyRegionResults();
assertThat(successfulRegionResults.size()).isEqualTo(1);
assertThat(successfulRegionResults.get(successfulRegionName)).isEqualTo(successfulRegionResult);
}
@Test
public void addRegionResultsAddsToCorrectInternalMapAndAddsPrimaryReassignmentDetails() {
RestoreRedundancyResults regionResults = mock(RestoreRedundancyResults.class);
when(regionResults.getZeroRedundancyRegionResults())
.thenReturn(Collections.singletonMap(zeroRedundancyRegionName, zeroRedundancyRegionResult));
when(regionResults.getUnderRedundancyRegionResults()).thenReturn(
Collections.singletonMap(underRedundancyRegionName, underRedundancyRegionResult));
when(regionResults.getSatisfiedRedundancyRegionResults())
.thenReturn(Collections.singletonMap(successfulRegionName, successfulRegionResult));
when(regionResults.getTotalPrimaryTransfersCompleted()).thenReturn(transfersCompleted);
when(regionResults.getTotalPrimaryTransferTime()).thenReturn(transferTime);
results.addRegionResults(regionResults);
Map<String, RegionRedundancyStatus> zeroRedundancyResults =
results.getZeroRedundancyRegionResults();
assertThat(zeroRedundancyResults.size()).isEqualTo(1);
assertThat(zeroRedundancyResults.get(zeroRedundancyRegionName))
.isEqualTo(zeroRedundancyRegionResult);
Map<String, RegionRedundancyStatus> underRedundancyResults =
results.getUnderRedundancyRegionResults();
assertThat(underRedundancyResults.size()).isEqualTo(1);
assertThat(underRedundancyResults.get(underRedundancyRegionName))
.isEqualTo(underRedundancyRegionResult);
Map<String, RegionRedundancyStatus> successfulRegionResults =
results.getSatisfiedRedundancyRegionResults();
assertThat(successfulRegionResults.size()).isEqualTo(1);
assertThat(successfulRegionResults.get(successfulRegionName)).isEqualTo(successfulRegionResult);
assertThat(results.getTotalPrimaryTransfersCompleted()).isEqualTo(transfersCompleted);
assertThat(results.getTotalPrimaryTransferTime()).isEqualTo(transferTime);
}
@Test
public void addPrimaryDetailsUpdatesValue() {
assertThat(results.getTotalPrimaryTransfersCompleted()).isEqualTo(0);
assertThat(results.getTotalPrimaryTransferTime()).isEqualTo(0L);
results.addPrimaryReassignmentDetails(details);
assertThat(results.getTotalPrimaryTransfersCompleted()).isEqualTo(transfersCompleted);
assertThat(results.getTotalPrimaryTransferTime()).isEqualTo(transferTime);
results.addPrimaryReassignmentDetails(details);
assertThat(results.getTotalPrimaryTransfersCompleted()).isEqualTo(transfersCompleted * 2);
assertThat(results.getTotalPrimaryTransferTime()).isEqualTo(transferTime * 2);
}
@Test
public void testSerializable() throws JsonProcessingException {
RestoreRedundancyResultsImpl restoreRedundancyResults = new RestoreRedundancyResultsImpl();
restoreRedundancyResults.setStatusMessage(TEST_STRING);
restoreRedundancyResults.setSuccess(true);
restoreRedundancyResults.setTotalPrimaryTransfersCompleted(150);
restoreRedundancyResults.setTotalPrimaryTransferTime(250);
RegionRedundancyStatusImpl regionRedundancyStatus = new RegionRedundancyStatusImpl();
regionRedundancyStatus.setActualRedundancy(1);
regionRedundancyStatus.setConfiguredRedundancy(1);
regionRedundancyStatus.setRegionName("/foo");
regionRedundancyStatus.setStatus(SATISFIED);
restoreRedundancyResults.addRegionResult(regionRedundancyStatus);
String jsonString = geodeMapper.writeValueAsString(restoreRedundancyResults);
// deserialize the class
RestoreRedundancyResultsImpl value =
geodeMapper.readValue(jsonString, RestoreRedundancyResultsImpl.class);
assertThat(value).usingRecursiveComparison().isEqualTo(restoreRedundancyResults);
}
}