blob: a20297b162106c80549a226c61e3685c961e51ab [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 java.util.Properties;
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.HDFSStore;
import com.gemstone.gemfire.cache.hdfs.internal.HDFSEventQueueAttributesImpl;
import com.gemstone.gemfire.cache.hdfs.internal.HDFSStoreConfigHolder;
import com.gemstone.gemfire.cache.hdfs.internal.HDFSStoreConfigHolder.AbstractHDFSCompactionConfigHolder;
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 AlterHDFSStoreFunctionJUnitTest test suite class tests the contract and
* functionality of the AlterHDFSStoreFunction 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.AlterHDFSStoreFunction
* @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 CreateHDFSStoreFunctionJUnitTest {
private static final Logger logger = LogService.getLogger();
private Mockery mockContext;
private static Properties props = new Properties();
@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 FunctionContext mockFunctionContext = mockContext.mock(FunctionContext.class, "FunctionContext");
final XmlEntity xmlEntity = mockContext.mock(XmlEntity.class, "XmlEntity");
final String memberId = "mockMemberId";
final String memberName = "mockMemberName";
final TestResultSender testResultSender = new TestResultSender();
final HDFSStoreImpl mockHdfsStore = createMockHDFSStoreImpl("hdfsStoreName", "hdfs://localhost:9000", "testDir",
1024, 20, .25f, null, 20, 20, null, false, 0, 1024, false, false, true, 20, 20, 10, 100);
final HDFSStoreConfigHolder mockHdfsStoreConfigHolder = createMockHDFSStoreConfigHolder("hdfsStoreName",
"hdfs://localhost:9000", "testDir", 1024, 20, .25f, null, 40, 40, null, false, 0, 2048, true, true, true, 40,
40, 40, 800);
final CreateHDFSStoreFunction function = new TestCreateHDFSStoreFunction(mockCache, mockMember, xmlEntity , mockHdfsStore);
mockContext.checking(new Expectations() {
{
oneOf(mockMember).getId();
will(returnValue(memberId));
exactly(2).of(mockMember).getName();
will(returnValue(memberName));
oneOf(mockFunctionContext).getArguments();
will(returnValue(mockHdfsStoreConfigHolder));
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
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 memberId = "mockMemberId";
final String memberName = "mockMemberName";
final TestResultSender testResultSender = new TestResultSender();
final HDFSStoreImpl mockHdfsStore = createMockHDFSStoreImpl("hdfsStoreName", "hdfs://localhost:9000", "testDir",
1024, 20, .25f, null, 20, 20, null, false, 0, 1024, false, false, true, 20, 20, 10, 100);
final HDFSStoreConfigHolder mockHdfsStoreConfigHolder = createMockHDFSStoreConfigHolder("hdfsStoreName",
"hdfs://localhost:9000", "testDir", 1024, 20, .25f, null, 40, 40, null, false, 0, 2048, true, true, true, 40,
40, 40, 800);
final CreateHDFSStoreFunction function = new TestCreateHDFSStoreFunction(mockCache, mockMember, xmlEntity , mockHdfsStore) {
@Override
protected Cache getCache() {
throw new CacheClosedException("Expected");
}
};
mockContext.checking(new Expectations() {
{
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 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 memberId = "mockMemberId";
final String memberName = "mockMemberName";
final TestResultSender testResultSender = new TestResultSender();
final HDFSStoreImpl mockHdfsStore = createMockHDFSStoreImpl("hdfsStoreName", "hdfs://localhost:9000", "testDir",
1024, 20, .25f, null, 20, 20, null, false, 0, 1024, false, false, true, 20, 20, 10, 100);
final HDFSStoreConfigHolder mockHdfsStoreConfigHolder = createMockHDFSStoreConfigHolder("hdfsStoreName",
"hdfs://localhost:9000", "testDir", 1024, 20, .25f, null, 40, 40, null, false, 0, 2048, true, true, true, 40,
40, 40, 800);
final CreateHDFSStoreFunction function = new TestCreateHDFSStoreFunction(mockCache, mockMember, xmlEntity , mockHdfsStore) {
@Override
protected Cache getCache() {
throw new RuntimeException("expected");
}
};
mockContext.checking(new Expectations() {
{
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());
assertEquals("expected", result.getThrowable().getMessage());
}
protected HDFSStoreImpl createMockHDFSStoreImpl(final String storeName, final String namenode, final String homeDir,
final int maxFileSize, final int fileRolloverInterval, final float blockCachesize, final String clientConfigFile,
final int batchSize, final int batchInterval, final String diskStoreName, final boolean syncDiskwrite,
final int dispatcherThreads, final int maxMemory, final boolean bufferPersistent, final boolean minorCompact,
final boolean majorCompact, final int majorCompactionInterval, final int majorCompactionThreads,
final int minorCompactionThreads, final int purgeInterval) {
HDFSStoreImpl mockHdfsStore = mockContext.mock(HDFSStoreImpl.class, "HDFSStoreImpl");
HDFSEventQueueAttributesImpl mockEventQueue = createMockEventQueue("hdfsStore_" + storeName, batchSize,
batchInterval, diskStoreName, syncDiskwrite, dispatcherThreads, maxMemory, bufferPersistent);
AbstractHDFSCompactionConfigHolder mockCompactionConfig = createMockHDFSCompactionConfigHolder("hdfsStore_"
+ storeName, minorCompact, majorCompact, majorCompactionInterval, majorCompactionThreads,
minorCompactionThreads, purgeInterval);
mockHdfsStore = (HDFSStoreImpl)createMockStore(mockHdfsStore, storeName, namenode, homeDir, maxFileSize,
fileRolloverInterval, minorCompact, blockCachesize, clientConfigFile, mockCompactionConfig, mockEventQueue);
return mockHdfsStore;
}
protected HDFSStoreConfigHolder createMockHDFSStoreConfigHolder(final String storeName, final String namenode,
final String homeDir, final int maxFileSize, final int fileRolloverInterval, final float blockCachesize,
final String clientConfigFile, final int batchSize, final int batchInterval, final String diskStoreName,
final boolean syncDiskwrite, final int dispatcherThreads, final int maxMemory, final boolean bufferPersistent,
final boolean minorCompact, final boolean majorCompact, final int majorCompactionInterval,
final int majorCompactionThreads, final int minorCompactionThreads, final int purgeInterval) {
HDFSStoreConfigHolder mockHdfsStore = mockContext.mock(HDFSStoreConfigHolder.class, "HDFSStoreConfigHolder");
HDFSEventQueueAttributesImpl mockEventQueue = createMockEventQueue("hdfsStoreConfig_" + storeName, batchSize,
batchInterval, diskStoreName, syncDiskwrite, dispatcherThreads, maxMemory, bufferPersistent);
AbstractHDFSCompactionConfigHolder mockCompactionConfig = createMockHDFSCompactionConfigHolder("hdfsStoreConfig_"
+ storeName, minorCompact, majorCompact, majorCompactionInterval, majorCompactionThreads,
minorCompactionThreads, purgeInterval);
mockHdfsStore = (HDFSStoreConfigHolder)createMockStore(mockHdfsStore, storeName, namenode, homeDir, maxFileSize,
fileRolloverInterval, minorCompact, blockCachesize, clientConfigFile, mockCompactionConfig, mockEventQueue);
return mockHdfsStore;
}
private HDFSEventQueueAttributesImpl createMockEventQueue(final String name, final int batchSize,
final int batchInterval, final String diskStoreName, final boolean syncDiskwrite, final int dispatcherThreads,
final int maxMemory, final boolean bufferPersistent) {
final HDFSEventQueueAttributesImpl mockEventQueue = mockContext.mock(HDFSEventQueueAttributesImpl.class, name
+ "EventQueueImpl");
mockContext.checking(new Expectations() {
{
allowing(mockEventQueue).getBatchSizeMB();
will(returnValue(batchSize));
allowing(mockEventQueue).getBatchTimeInterval();
will(returnValue(batchInterval));
allowing(mockEventQueue).getDiskStoreName();
will(returnValue(diskStoreName));
allowing(mockEventQueue).isDiskSynchronous();
will(returnValue(syncDiskwrite));
allowing(mockEventQueue).isPersistent();
will(returnValue(bufferPersistent));
allowing(mockEventQueue).getDispatcherThreads();
will(returnValue(dispatcherThreads));
allowing(mockEventQueue).getMaximumQueueMemory();
will(returnValue(maxMemory));
}
});
return mockEventQueue;
}
private AbstractHDFSCompactionConfigHolder createMockHDFSCompactionConfigHolder(final String name,
final boolean minorCompact, final boolean majorCompact, final int majorCompactionInterval,
final int majorCompactionThreads, final int minorCompactionThreads, final int purgeInterval) {
final AbstractHDFSCompactionConfigHolder mockCompactionConfig = mockContext.mock(
AbstractHDFSCompactionConfigHolder.class, name + "CompactionConfig");
mockContext.checking(new Expectations() {
{
allowing(mockCompactionConfig).getAutoMajorCompaction();
will(returnValue(majorCompact));
allowing(mockCompactionConfig).getMajorCompactionIntervalMins();
will(returnValue(majorCompactionInterval));
allowing(mockCompactionConfig).getMajorCompactionMaxThreads();
will(returnValue(majorCompactionThreads));
allowing(mockCompactionConfig).getMaxThreads();
will(returnValue(minorCompactionThreads));
allowing(mockCompactionConfig).getOldFilesCleanupIntervalMins();
will(returnValue(purgeInterval));
allowing(mockCompactionConfig).getMaxInputFileCount();
will(returnValue(10));
allowing(mockCompactionConfig).getMaxInputFileSizeMB();
will(returnValue(1024));
allowing(mockCompactionConfig).getMinInputFileCount();
will(returnValue(2));
allowing(mockCompactionConfig).getCompactionStrategy();
will(returnValue(null));
}
});
return mockCompactionConfig;
}
private HDFSStore createMockStore(final HDFSStore mockStore, final String storeName, final String namenode,
final String homeDir, final int maxFileSize, final int fileRolloverInterval, final boolean minorCompact, final float blockCachesize,
final String clientConfigFile, final AbstractHDFSCompactionConfigHolder mockCompactionConfig,
final HDFSEventQueueAttributesImpl mockEventQueue) {
mockContext.checking(new Expectations() {
{
allowing(mockStore).getName();
will(returnValue(storeName));
allowing(mockStore).getNameNodeURL();
will(returnValue(namenode));
allowing(mockStore).getHomeDir();
will(returnValue(homeDir));
allowing(mockStore).getMaxFileSize();
will(returnValue(maxFileSize));
allowing(mockStore).getFileRolloverInterval();
will(returnValue(fileRolloverInterval));
allowing(mockStore).getMinorCompaction();
will(returnValue(minorCompact));
allowing(mockStore).getBlockCacheSize();
will(returnValue(blockCachesize));
allowing(mockStore).getHDFSClientConfigFile();
will(returnValue(clientConfigFile));
allowing(mockStore).getHDFSEventQueueAttributes();
will(returnValue(mockEventQueue));
allowing(mockStore).getHDFSCompactionConfig();
will(returnValue(mockCompactionConfig));
}
});
return mockStore;
}
protected static class TestCreateHDFSStoreFunction extends CreateHDFSStoreFunction {
private static final long serialVersionUID = 1L;
private final Cache cache;
private final DistributedMember member;
private final XmlEntity xml;
private final HDFSStoreImpl hdfsStore;
public TestCreateHDFSStoreFunction(Cache cache, DistributedMember member, XmlEntity xml , HDFSStoreImpl hdfsStore) {
this.cache = cache;
this.member = member;
this.xml = xml;
this.hdfsStore = hdfsStore;
}
@Override
protected Cache getCache() {
return this.cache;
}
@Override
protected DistributedMember getDistributedMember(Cache cache) {
return member;
}
@Override
protected XmlEntity getXMLEntity(String storeName) {
return xml;
}
@Override
protected HDFSStoreImpl createHdfsStore(Cache cache, HDFSStoreConfigHolder configHolder){
return hdfsStore;
}
}
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;
}
}
}