blob: 08e18ec575eb07a609f5b1306e6b11315b390b05 [file] [log] [blame]
/*=========================================================================
* Copyright (c) 2002-2014 Pivotal Software, Inc. All Rights Reserved.
* This product is protected by U.S. and international copyright
* and intellectual property laws. Pivotal products are covered by
* one or more patents listed at http://www.pivotal.io/patents.
*=========================================================================
*/
package com.gemstone.gemfire.management.internal.cli.functions;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import org.apache.logging.log4j.Logger;
import org.jmock.Expectations;
import org.jmock.Mockery;
import org.jmock.lib.legacy.ClassImposteriser;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import com.gemstone.gemfire.cache.Cache;
import com.gemstone.gemfire.cache.CacheClosedException;
import com.gemstone.gemfire.cache.execute.FunctionContext;
import com.gemstone.gemfire.cache.execute.ResultSender;
import com.gemstone.gemfire.cache.hdfs.internal.HDFSStoreImpl;
import com.gemstone.gemfire.distributed.DistributedMember;
import com.gemstone.gemfire.internal.cache.GemFireCacheImpl;
import com.gemstone.gemfire.internal.logging.LogService;
import com.gemstone.gemfire.management.internal.configuration.domain.XmlEntity;
import com.gemstone.gemfire.test.junit.categories.HoplogTest;
import com.gemstone.gemfire.test.junit.categories.IntegrationTest
;
/**
* The DestroyHDFSStoreFunctionJUnitTest test suite class tests the contract and
* functionality of the DestroyHDFSStoreFunction class. </p>
*
* @author Namrata Thanvi
* @see com.gemstone.gemfire.cache.hdfs.internal.HDFSStoreImpl
* @see com.gemstone.gemfire.cache.hdfs.internal.HDFSStoreConfigHolder
* @see com.gemstone.gemfire.management.internal.cli.functions.DestroyHDFSStoreFunction
* @see org.jmock.Expectations
* @see org.jmock.Mockery
* @see org.junit.Assert
* @see org.junit.Test
*/
@SuppressWarnings( { "unused" })
@Category({IntegrationTest.class, HoplogTest.class})
public class DestroyHDFSStoreFunctionJUnitTest {
private static final Logger logger = LogService.getLogger();
private Mockery mockContext;
@Before
public void setup() {
mockContext = new Mockery() {
{
setImposteriser(ClassImposteriser.INSTANCE);
}
};
}
@After
public void tearDown() {
mockContext.assertIsSatisfied();
mockContext = null;
}
@Test
public void testExecute() throws Throwable {
final GemFireCacheImpl mockCache = mockContext.mock(GemFireCacheImpl.class, "Cache");
final DistributedMember mockMember = mockContext.mock(DistributedMember.class, "DistributedMember");
final XmlEntity xmlEntity = mockContext.mock(XmlEntity.class, "XmlEntity");
final HDFSStoreImpl mockHdfsStore = mockContext.mock(HDFSStoreImpl.class, "HDFSStoreImpl");
final FunctionContext mockFunctionContext = mockContext.mock(FunctionContext.class, "FunctionContext");
final String hdfsStoreName = "mockHdfsStore";
final String memberId = "mockMemberId";
final String memberName = "mockMemberName";
final TestResultSender testResultSender = new TestResultSender();
final DestroyHDFSStoreFunction function = createDestroyHDFSStoreFunction(mockCache, mockMember, xmlEntity);
mockContext.checking(new Expectations() {
{
oneOf(mockCache).findHDFSStore(hdfsStoreName);
will(returnValue(mockHdfsStore));
one(mockHdfsStore).destroy();
oneOf(mockMember).getId();
will(returnValue(memberId));
exactly(2).of(mockMember).getName();
will(returnValue(memberName));
oneOf(mockFunctionContext).getArguments();
will(returnValue(hdfsStoreName));
oneOf(mockFunctionContext).getResultSender();
will(returnValue(testResultSender));
}
});
function.execute(mockFunctionContext);
final List<?> results = testResultSender.getResults();
assertNotNull(results);
assertEquals(1, results.size());
final CliFunctionResult result = (CliFunctionResult)results.get(0);
assertEquals(memberName, result.getMemberIdOrName());
assertEquals("Success", result.getMessage());
}
@Test
@SuppressWarnings("unchecked")
public void testExecuteOnMemberHavingNoHDFSStore() throws Throwable {
final String hdfsStoreName = "mockHdfsStore";
final String memberId = "mockMemberId";
final String memberName = "mockMemberName";
final GemFireCacheImpl mockCache = mockContext.mock(GemFireCacheImpl.class, "Cache");
final DistributedMember mockMember = mockContext.mock(DistributedMember.class, "DistributedMember");
final FunctionContext mockFunctionContext = mockContext.mock(FunctionContext.class, "FunctionContext");
final XmlEntity xmlEntity = mockContext.mock(XmlEntity.class, "XmlEntity");
final TestResultSender testResultSender = new TestResultSender();
final DestroyHDFSStoreFunction function = createDestroyHDFSStoreFunction(mockCache, mockMember, xmlEntity);
mockContext.checking(new Expectations() {
{
oneOf(mockCache).findHDFSStore(hdfsStoreName);
will(returnValue(null));
oneOf(mockMember).getId();
will(returnValue(memberId));
exactly(2).of(mockMember).getName();
will(returnValue(memberName));
oneOf(mockFunctionContext).getArguments();
will(returnValue(hdfsStoreName));
oneOf(mockFunctionContext).getResultSender();
will(returnValue(testResultSender));
}
});
function.execute(mockFunctionContext);
final List<?> results = testResultSender.getResults();
assertNotNull(results);
assertEquals(1, results.size());
final CliFunctionResult result = (CliFunctionResult)results.get(0);
assertEquals(memberName, result.getMemberIdOrName());
assertEquals("Hdfs store not found on this member", result.getMessage());
}
@Test
public void testExecuteOnMemberWithNoCache() throws Throwable {
final FunctionContext mockFunctionContext = mockContext.mock(FunctionContext.class, "MockFunctionContext");
final DistributedMember mockMember = mockContext.mock(DistributedMember.class, "DistributedMember");
final GemFireCacheImpl mockCache = mockContext.mock(GemFireCacheImpl.class, "Cache");
final XmlEntity xmlEntity = mockContext.mock(XmlEntity.class, "XmlEntity");
final String hdfsStoreName = "mockHdfsStore";
final TestResultSender testResultSender = new TestResultSender();
final DestroyHDFSStoreFunction function = new TestDestroyHDFSStoreFunction(mockCache, mockMember, xmlEntity) {
private static final long serialVersionUID = 1L;
@Override
protected Cache getCache() {
throw new CacheClosedException("Expected");
}
};
mockContext.checking(new Expectations() {
{
oneOf(mockFunctionContext).getArguments();
will(returnValue(hdfsStoreName));
oneOf(mockFunctionContext).getResultSender();
will(returnValue(testResultSender));
}
});
function.execute(mockFunctionContext);
final List<?> results = testResultSender.getResults();
assertNotNull(results);
assertEquals(1, results.size());
final CliFunctionResult result = (CliFunctionResult)results.get(0);
assertEquals("", result.getMemberIdOrName());
assertNull(result.getMessage());
}
@Test
public void testExecuteHandleRuntimeException() throws Throwable {
final GemFireCacheImpl mockCache = mockContext.mock(GemFireCacheImpl.class, "Cache");
final DistributedMember mockMember = mockContext.mock(DistributedMember.class, "DistributedMember");
final FunctionContext mockFunctionContext = mockContext.mock(FunctionContext.class, "FunctionContext");
final XmlEntity xmlEntity = mockContext.mock(XmlEntity.class, "XmlEntity");
final String hdfsStoreName = "mockHdfsStore";
final String memberId = "mockMemberId";
final String memberName = "mockMemberName";
final TestResultSender testResultSender = new TestResultSender();
final DestroyHDFSStoreFunction function = createDestroyHDFSStoreFunction(mockCache, mockMember, xmlEntity);
mockContext.checking(new Expectations() {
{
oneOf(mockMember).getId();
will(returnValue(memberId));
exactly(2).of(mockMember).getName();
will(returnValue(memberName));
oneOf(mockFunctionContext).getArguments();
will(returnValue(hdfsStoreName));
oneOf(mockCache).findHDFSStore(hdfsStoreName);
will(throwException(new RuntimeException("expected")));
oneOf(mockFunctionContext).getResultSender();
will(returnValue(testResultSender));
}
});
function.execute(mockFunctionContext);
final List<?> results = testResultSender.getResults();
assertNotNull(results);
assertEquals(1, results.size());
final CliFunctionResult result = (CliFunctionResult)results.get(0);
assertEquals(memberName, result.getMemberIdOrName());
assertEquals("expected", result.getThrowable().getMessage());
}
protected TestDestroyHDFSStoreFunction createDestroyHDFSStoreFunction(final Cache cache, DistributedMember member,
XmlEntity xml) {
return new TestDestroyHDFSStoreFunction(cache, member, xml);
}
protected static class TestDestroyHDFSStoreFunction extends DestroyHDFSStoreFunction {
private static final long serialVersionUID = 1L;
private final Cache cache;
private final DistributedMember member;
private final XmlEntity xml;
public TestDestroyHDFSStoreFunction(final Cache cache, DistributedMember member, XmlEntity xml) {
this.cache = cache;
this.member = member;
this.xml = xml;
}
@Override
protected Cache getCache() {
return this.cache;
}
@Override
protected DistributedMember getDistributedMember(Cache cache) {
return member;
}
@Override
protected XmlEntity getXMLEntity(String storeName) {
return xml;
}
}
protected static class TestResultSender implements ResultSender {
private final List<Object> results = new LinkedList<Object>();
private Throwable t;
protected List<Object> getResults() throws Throwable {
if (t != null) {
throw t;
}
return Collections.unmodifiableList(results);
}
public void lastResult(final Object lastResult) {
results.add(lastResult);
}
public void sendResult(final Object oneResult) {
results.add(oneResult);
}
public void sendException(final Throwable t) {
this.t = t;
}
}
}