blob: a07aefcd6224885beb15078e613a804be739dbb6 [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.management.internal.cli.functions;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.Logger;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.mockito.ArgumentCaptor;
import org.apache.geode.cache.CacheClosedException;
import org.apache.geode.cache.PartitionAttributes;
import org.apache.geode.cache.execute.FunctionContext;
import org.apache.geode.cache.execute.ResultSender;
import org.apache.geode.distributed.internal.InternalDistributedSystem;
import org.apache.geode.internal.cache.DistributedRegion;
import org.apache.geode.internal.cache.GemFireCacheImpl;
import org.apache.geode.internal.cache.PartitionRegionConfig;
import org.apache.geode.internal.cache.PartitionedRegion;
import org.apache.geode.internal.cache.execute.FunctionContextImpl;
import org.apache.geode.internal.cache.partitioned.ColocatedRegionDetails;
import org.apache.geode.internal.cache.persistence.DiskStoreID;
import org.apache.geode.internal.cache.persistence.PersistentMemberID;
import org.apache.geode.internal.cache.persistence.PersistentMemberManager;
import org.apache.geode.internal.cache.persistence.PersistentMemberPattern;
import org.apache.geode.test.fake.Fakes;
public class ShowMissingDiskStoresFunctionJUnitTest {
private GemFireCacheImpl cache;
private InternalDistributedSystem system;
private PartitionedRegion pr1;
private PartitionedRegion pr2;
private DistributedRegion prRoot;
private PartitionAttributes pa;
private PartitionRegionConfig prc;
private Logger logger;
private Appender mockAppender;
private ArgumentCaptor<LogEvent> loggingEventCaptor;
private FunctionContext context;
private TestResultSender resultSender;
private PersistentMemberManager memberManager;
private ShowMissingDiskStoresFunction smdsFunc;
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Before
public void setUp() throws Exception {
cache = Fakes.cache();
system = (InternalDistributedSystem) cache.getDistributedSystem();
pr1 = mock(PartitionedRegion.class);
pr2 = mock(PartitionedRegion.class);
prRoot = mock(DistributedRegion.class);
pa = mock(PartitionAttributes.class);
prc = mock(PartitionRegionConfig.class);
cache = Fakes.cache();
resultSender = new TestResultSender();
context = new FunctionContextImpl(cache, "testFunction", null, resultSender);
memberManager = mock(PersistentMemberManager.class);
smdsFunc = new ShowMissingDiskStoresFunction();
}
@Test
public void testExecute() throws Exception {
List<?> results = null;
when(cache.getPersistentMemberManager()).thenReturn(memberManager);
smdsFunc.execute(context);
results = resultSender.getResults();
assertNotNull(results);
}
@Test
public void testExecuteWithNullContextThrowsRuntimeException() {
expectedException.expect(RuntimeException.class);
smdsFunc.execute(null);
}
/**
* Test method for
* {@link org.apache.geode.management.internal.cli.functions.ShowMissingDiskStoresFunction#execute(org.apache.geode.cache.execute.FunctionContext)}.
*/
@Test
public void testExecuteWithNullCacheInstanceThrowsCacheClosedException() throws Throwable {
expectedException.expect(CacheClosedException.class);
context = new FunctionContextImpl(null, "testFunction", null, resultSender);
List<?> results = null;
smdsFunc.execute(context);
results = resultSender.getResults();
}
@Test
public void testExecuteWithNullGFCIResultValueIsNull() throws Throwable {
List<?> results = null;
when(cache.getPersistentMemberManager()).thenReturn(memberManager);
smdsFunc.execute(context);
results = resultSender.getResults();
assertNotNull(results);
assertEquals(1, results.size());
assertNull(results.get(0));
}
@Test
public void testExecuteWhenGFCIClosedResultValueIsNull() throws Throwable {
List<?> results = null;
when(cache.getPersistentMemberManager()).thenReturn(memberManager);
when(((GemFireCacheImpl) cache).isClosed()).thenReturn(true);
smdsFunc.execute(context);
results = resultSender.getResults();
assertNotNull(results);
}
@Test
public void testExecuteReturnsMissingDiskStores() throws Throwable {
List<?> results = null;
when(cache.getPersistentMemberManager()).thenReturn(memberManager);
// Fake missing disk-stores
Set<PersistentMemberID> regions1 = new HashSet<PersistentMemberID>();
regions1.add(new PersistentMemberID(new DiskStoreID(), InetAddress.getLocalHost(),
"/diskStore1", 1L, (short) 1));
regions1.add(new PersistentMemberID(new DiskStoreID(), InetAddress.getLocalHost(),
"/diskStore2", 2L, (short) 2));
Map<String, Set<PersistentMemberID>> mapMember1 =
new HashMap<String, Set<PersistentMemberID>>();;
mapMember1.put("member1", regions1);
when(memberManager.getWaitingRegions()).thenReturn(mapMember1);
smdsFunc.execute(context);
results = resultSender.getResults();
assertNotNull(results);
assertEquals(1, results.size());
Set<?> detailSet = (Set<?>) results.get(0);
assertEquals(2, detailSet.toArray().length);
assertTrue(detailSet.toArray()[0] instanceof PersistentMemberPattern);
assertTrue(detailSet.toArray()[1] instanceof PersistentMemberPattern);
// Results are not sorted so verify results in either order
if (((PersistentMemberPattern) detailSet.toArray()[0]).getDirectory().equals("/diskStore1")) {
assertEquals("/diskStore2",
((PersistentMemberPattern) detailSet.toArray()[1]).getDirectory());
} else if (((PersistentMemberPattern) detailSet.toArray()[0]).getDirectory()
.equals("/diskStore2")) {
assertEquals("/diskStore1",
((PersistentMemberPattern) detailSet.toArray()[1]).getDirectory());
}
}
@Test
public void testExecuteReturnsMissingColocatedRegions() throws Throwable {
List<?> results = null;
when(cache.getPersistentMemberManager()).thenReturn(memberManager);
// Fake missing colocated regions
Set<PartitionedRegion> prs = new HashSet<PartitionedRegion>();
prs.add(pr1);
prs.add(pr2);
List<String> missing1 = new ArrayList<String>(Arrays.asList("child1", "child2"));
when(cache.getPartitionedRegions()).thenReturn(prs);
when(pr1.getMissingColocatedChildren()).thenReturn(missing1);
when(pr1.getFullPath()).thenReturn("/pr1");
smdsFunc.execute(context);
results = resultSender.getResults();
assertEquals(1, results.size());
Set<?> detailSet = (Set<?>) results.get(0);
assertEquals(2, detailSet.toArray().length);
assertTrue(detailSet.toArray()[0] instanceof ColocatedRegionDetails);
assertTrue(detailSet.toArray()[1] instanceof ColocatedRegionDetails);
assertEquals("/pr1", ((ColocatedRegionDetails) detailSet.toArray()[0]).getParent());
assertEquals("/pr1", ((ColocatedRegionDetails) detailSet.toArray()[1]).getParent());
// Results are not sorted so verify results in either order
if (((ColocatedRegionDetails) detailSet.toArray()[0]).getChild().equals("child1")) {
assertEquals("child2", ((ColocatedRegionDetails) detailSet.toArray()[1]).getChild());
} else if (((ColocatedRegionDetails) detailSet.toArray()[0]).getChild().equals("child2")) {
assertEquals("child1", ((ColocatedRegionDetails) detailSet.toArray()[1]).getChild());
}
}
@Test
public void testExecuteReturnsMissingStoresAndRegions() throws Throwable {
List<?> results = null;
when(cache.getPersistentMemberManager()).thenReturn(memberManager);
// Fake missing disk-stores
Set<PersistentMemberID> regions1 = new HashSet<PersistentMemberID>();
regions1.add(new PersistentMemberID(new DiskStoreID(), InetAddress.getLocalHost(),
"/diskStore1", 1L, (short) 1));
regions1.add(new PersistentMemberID(new DiskStoreID(), InetAddress.getLocalHost(),
"/diskStore2", 2L, (short) 2));
Map<String, Set<PersistentMemberID>> mapMember1 =
new HashMap<String, Set<PersistentMemberID>>();;
mapMember1.put("member1", regions1);
when(memberManager.getWaitingRegions()).thenReturn(mapMember1);
// Fake missing colocated regions
Set<PartitionedRegion> prs = new HashSet<PartitionedRegion>();
prs.add(pr1);
prs.add(pr2);
List<String> missing1 = new ArrayList<String>(Arrays.asList("child1", "child2"));
when(cache.getPartitionedRegions()).thenReturn(prs);
when(pr1.getMissingColocatedChildren()).thenReturn(missing1);
when(pr1.getFullPath()).thenReturn("/pr1");
smdsFunc.execute(context);
results = resultSender.getResults();
assertEquals(2, results.size());
for (Object result : results) {
Set<?> detailSet = (Set<?>) result;
if (detailSet.toArray()[0] instanceof PersistentMemberPattern) {
assertEquals(2, detailSet.toArray().length);
assertTrue(detailSet.toArray()[1] instanceof PersistentMemberPattern);
// Results are not sorted so verify results in either order
if (((PersistentMemberPattern) detailSet.toArray()[0]).getDirectory()
.equals("/diskStore1")) {
assertEquals("/diskStore2",
((PersistentMemberPattern) detailSet.toArray()[1]).getDirectory());
} else if (((PersistentMemberPattern) detailSet.toArray()[0]).getDirectory()
.equals("/diskStore2")) {
assertEquals("/diskStore1",
((PersistentMemberPattern) detailSet.toArray()[1]).getDirectory());
}
} else if (detailSet.toArray()[0] instanceof ColocatedRegionDetails) {
assertEquals(2, detailSet.toArray().length);
assertTrue(detailSet.toArray()[1] instanceof ColocatedRegionDetails);
assertEquals("/pr1", ((ColocatedRegionDetails) detailSet.toArray()[0]).getParent());
assertEquals("/pr1", ((ColocatedRegionDetails) detailSet.toArray()[1]).getParent());
// Results are not sorted so verify results in either order
if (((ColocatedRegionDetails) detailSet.toArray()[0]).getChild().equals("child1")) {
assertEquals("child2", ((ColocatedRegionDetails) detailSet.toArray()[1]).getChild());
} else if (((ColocatedRegionDetails) detailSet.toArray()[0]).getChild().equals("child2")) {
assertEquals("child1", ((ColocatedRegionDetails) detailSet.toArray()[1]).getChild());
} else {
fail("Incorrect missing colocated region results");
}
}
}
}
@Test
public void testExecuteCatchesExceptions() throws Exception {
expectedException.expect(RuntimeException.class);
when(cache.getPersistentMemberManager()).thenThrow(new RuntimeException());
smdsFunc.execute(context);
List<?> results = resultSender.getResults();
}
@Test
public void testGetId() {
assertEquals(ShowMissingDiskStoresFunction.class.getName(), smdsFunc.getId());
}
private static class TestResultSender implements ResultSender {
private final List<Object> results = new LinkedList<Object>();
private Exception t;
protected List<Object> getResults() throws Exception {
if (t != null) {
throw t;
}
return Collections.unmodifiableList(results);
}
@Override
public void lastResult(final Object lastResult) {
results.add(lastResult);
}
@Override
public void sendResult(final Object oneResult) {
results.add(oneResult);
}
@Override
public void sendException(final Throwable t) {
this.t = (Exception) t;
}
}
}