blob: 2c09b69a048fe3a8a3fa4630bfb42a7adba7742c [file] [log] [blame]
/*=========================================================================
* Copyright (c) 2010-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.internal.statistics;
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 java.io.File;
import java.util.List;
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.StatisticDescriptor;
import com.gemstone.gemfire.Statistics;
import com.gemstone.gemfire.StatisticsType;
import com.gemstone.gemfire.internal.NanoTimer;
import com.gemstone.gemfire.internal.statistics.TestSampleHandler.Info;
import com.gemstone.gemfire.internal.statistics.TestSampleHandler.ResourceInstanceInfo;
import com.gemstone.gemfire.internal.statistics.TestSampleHandler.ResourceTypeInfo;
import com.gemstone.gemfire.internal.statistics.TestSampleHandler.SampledInfo;
import com.gemstone.gemfire.test.junit.categories.UnitTest;
/**
* Unit tests for the SampleCollector class.
*
* @author Kirk Lund
* @since 7.0
*/
@Category(UnitTest.class)
public class SampleCollectorJUnitTest {
private static final String dir = "SampleCollectorJUnitTest";
private Mockery mockContext;
private TestStatisticsManager manager;
private SampleCollector sampleCollector;
@Before
public void setUp() throws Exception {
new File(dir).mkdir();
this.mockContext = new Mockery() {{
setImposteriser(ClassImposteriser.INSTANCE);
}};
final long startTime = System.currentTimeMillis();
this.manager = new TestStatisticsManager(1, "SampleCollectorJUnitTest", startTime);
final StatArchiveHandlerConfig mockStatArchiveHandlerConfig = this.mockContext.mock(StatArchiveHandlerConfig.class, "SampleCollectorJUnitTest$StatArchiveHandlerConfig");
this.mockContext.checking(new Expectations() {{
allowing(mockStatArchiveHandlerConfig).getArchiveFileName();
will(returnValue(new File("")));
allowing(mockStatArchiveHandlerConfig).getArchiveFileSizeLimit();
will(returnValue(0));
allowing(mockStatArchiveHandlerConfig).getArchiveDiskSpaceLimit();
will(returnValue(0));
allowing(mockStatArchiveHandlerConfig).getSystemId();
will(returnValue(1));
allowing(mockStatArchiveHandlerConfig).getSystemStartTime();
will(returnValue(startTime));
allowing(mockStatArchiveHandlerConfig).getSystemDirectoryPath();
will(returnValue(""));
allowing(mockStatArchiveHandlerConfig).getProductDescription();
will(returnValue("SampleCollectorJUnitTest"));
}});
StatisticsSampler sampler = new TestStatisticsSampler(manager);
this.sampleCollector = new SampleCollector(sampler);
this.sampleCollector.initialize(mockStatArchiveHandlerConfig, NanoTimer.getTime());
}
@After
public void tearDown() throws Exception {
if (this.sampleCollector != null) {
this.sampleCollector.close();
this.sampleCollector = null;
}
this.mockContext.assertIsSatisfied();
this.mockContext = null;
this.manager = null;
}
@Test
public void testAddHandlerBeforeSample() {
TestSampleHandler handler = new TestSampleHandler();
this.sampleCollector.addSampleHandler(handler);
StatisticDescriptor[] statsST1 = new StatisticDescriptor[] {
manager.createIntCounter("ST1_1_name", "ST1_1_desc", "ST1_1_units")
};
StatisticsType ST1 = manager.createType("ST1_name", "ST1_desc", statsST1);
Statistics st1_1 = manager.createAtomicStatistics(ST1, "st1_1_text", 1);
this.sampleCollector.sample(NanoTimer.getTime());
assertEquals(3, handler.getNotificationCount());
List<Info> notifications = handler.getNotifications();
// validate the allocatedResourceType notification
assertTrue(notifications.get(0) instanceof ResourceTypeInfo);
ResourceTypeInfo allocatedResourceTypeInfo = (ResourceTypeInfo) notifications.get(0);
assertNotNull(allocatedResourceTypeInfo);
assertEquals("allocatedResourceType", allocatedResourceTypeInfo.getName());
ResourceType resourceType = allocatedResourceTypeInfo.getResourceType();
assertNotNull(resourceType);
assertEquals(0, resourceType.getId());
assertEquals(1, resourceType.getStatisticDescriptors().length);
StatisticsType statisticsType = resourceType.getStatisticsType();
assertNotNull(statisticsType);
assertTrue(statisticsType == ST1);
assertEquals("ST1_name", statisticsType.getName());
assertEquals("ST1_desc", statisticsType.getDescription());
assertEquals(1, statisticsType.getStatistics().length);
// validate the allocatedResourceInstance notification
assertTrue(notifications.get(1) instanceof ResourceInstanceInfo);
ResourceInstanceInfo allocatedResourceInstanceInfo = (ResourceInstanceInfo) notifications.get(1);
assertNotNull(allocatedResourceInstanceInfo);
assertEquals("allocatedResourceInstance", allocatedResourceInstanceInfo.getName());
ResourceInstance resourceInstance = allocatedResourceInstanceInfo.getResourceInstance();
assertNotNull(resourceInstance);
assertEquals(0, resourceInstance.getId());
assertEquals(1, resourceInstance.getUpdatedStats().length);
assertEquals(1, resourceInstance.getLatestStatValues().length); // TODO: is this correct?
Statistics statistics = resourceInstance.getStatistics();
assertNotNull(statistics);
assertTrue(statistics == st1_1);
assertEquals(1, statistics.getUniqueId());
assertEquals(1, statistics.getNumericId());
assertEquals("st1_1_text", statistics.getTextId());
assertEquals("ST1_name", statistics.getType().getName());
assertTrue(resourceType == resourceInstance.getResourceType());
// validate the sampled notification
assertTrue(notifications.get(2) instanceof SampledInfo);
SampledInfo sampledInfo = (SampledInfo) notifications.get(2);
assertNotNull(sampledInfo);
assertEquals("sampled", sampledInfo.getName());
assertEquals(1, sampledInfo.getResourceCount());
}
@Test
public void testAddHandlerAfterSamples() {
StatisticDescriptor[] statsST1 = new StatisticDescriptor[] {
manager.createIntCounter("ST1_1_name", "ST1_1_desc", "ST1_1_units")
};
StatisticsType ST1 = manager.createType("ST1_name", "ST1_desc", statsST1);
Statistics st1_1 = manager.createAtomicStatistics(ST1, "st1_1_text", 1);
Statistics st1_2 = manager.createAtomicStatistics(ST1, "st1_2_text", 1);
StatisticDescriptor[] statsST2 = new StatisticDescriptor[] {
manager.createIntCounter("ST2_1_name", "ST2_1_desc", "ST2_1_units")
};
StatisticsType ST2 = manager.createType("ST2_name", "ST2_desc", statsST2);
Statistics st2_1 = manager.createAtomicStatistics(ST2, "st2_1_text", 1);
st1_1.incInt("ST1_1_name", 1);
st1_2.incInt("ST1_1_name", 1);
st2_1.incInt("ST2_1_name", 1);
long sampleTime = NanoTimer.getTime();
this.sampleCollector.sample(sampleTime);
st1_1.incInt("ST1_1_name", 2);
st2_1.incInt("ST2_1_name", 1);
sampleTime += NanoTimer.millisToNanos(1000);
this.sampleCollector.sample(sampleTime);
st1_1.incInt("ST1_1_name", 1);
st1_1.incInt("ST1_1_name", 2);
sampleTime += NanoTimer.millisToNanos(1000);
this.sampleCollector.sample(sampleTime);
TestSampleHandler handler = new TestSampleHandler();
this.sampleCollector.addSampleHandler(handler);
assertEquals("TestSampleHandler = " + handler, 0, handler.getNotificationCount());
st1_2.incInt("ST1_1_name", 1);
st2_1.incInt("ST2_1_name", 1);
sampleTime += NanoTimer.millisToNanos(1000);
this.sampleCollector.sample(sampleTime);
assertEquals(6, handler.getNotificationCount());
List<Info> notifications = handler.getNotifications();
// validate the allocatedResourceType notification for ST1
int notificationIdx = 0;
assertTrue(notifications.get(notificationIdx) instanceof ResourceTypeInfo);
ResourceTypeInfo allocatedResourceTypeInfo = (ResourceTypeInfo) notifications.get(notificationIdx);
assertNotNull(allocatedResourceTypeInfo);
assertEquals("allocatedResourceType", allocatedResourceTypeInfo.getName());
ResourceType resourceType = allocatedResourceTypeInfo.getResourceType();
assertNotNull(resourceType);
assertEquals(0, resourceType.getId());
assertEquals(1, resourceType.getStatisticDescriptors().length);
StatisticsType statisticsType = resourceType.getStatisticsType();
assertNotNull(statisticsType);
assertTrue(statisticsType == ST1);
assertEquals("ST1_name", statisticsType.getName());
assertEquals("ST1_desc", statisticsType.getDescription());
assertEquals(1, statisticsType.getStatistics().length);
// validate the allocatedResourceInstance notification for st1_1
notificationIdx++;
assertTrue(notifications.get(notificationIdx) instanceof ResourceInstanceInfo);
ResourceInstanceInfo allocatedResourceInstanceInfo = (ResourceInstanceInfo) notifications.get(notificationIdx);
assertNotNull(allocatedResourceInstanceInfo);
assertEquals("allocatedResourceInstance", allocatedResourceInstanceInfo.getName());
ResourceInstance resourceInstance = allocatedResourceInstanceInfo.getResourceInstance();
assertNotNull(resourceInstance);
assertEquals(0, resourceInstance.getId());
assertEquals(0, resourceInstance.getUpdatedStats().length);
assertEquals(1, resourceInstance.getLatestStatValues().length); // TODO: is this correct?
Statistics statistics = resourceInstance.getStatistics();
assertNotNull(statistics);
assertTrue(statistics == st1_1);
assertEquals(1, statistics.getUniqueId());
assertEquals(1, statistics.getNumericId());
assertEquals("st1_1_text", statistics.getTextId());
assertEquals("ST1_name", statistics.getType().getName());
assertTrue(resourceType == resourceInstance.getResourceType());
// validate the allocatedResourceInstance notification for st1_2
notificationIdx++;
assertTrue(notifications.get(notificationIdx) instanceof ResourceInstanceInfo);
allocatedResourceInstanceInfo = (ResourceInstanceInfo) notifications.get(notificationIdx);
assertNotNull(allocatedResourceInstanceInfo);
assertEquals("allocatedResourceInstance", allocatedResourceInstanceInfo.getName());
resourceInstance = allocatedResourceInstanceInfo.getResourceInstance();
assertNotNull(resourceInstance);
assertEquals(1, resourceInstance.getId());
assertEquals(1, resourceInstance.getUpdatedStats().length);
assertEquals(1, resourceInstance.getLatestStatValues().length); // TODO: is this correct?
statistics = resourceInstance.getStatistics();
assertNotNull(statistics);
assertTrue(statistics == st1_2);
assertEquals(2, statistics.getUniqueId());
assertEquals(1, statistics.getNumericId());
assertEquals("st1_2_text", statistics.getTextId());
assertEquals("ST1_name", statistics.getType().getName());
assertTrue(resourceType == resourceInstance.getResourceType());
// validate the allocatedResourceType notification for ST2
notificationIdx++;
assertTrue(notifications.get(notificationIdx) instanceof ResourceTypeInfo);
allocatedResourceTypeInfo = (ResourceTypeInfo) notifications.get(notificationIdx);
assertNotNull(allocatedResourceTypeInfo);
assertEquals("allocatedResourceType", allocatedResourceTypeInfo.getName());
resourceType = allocatedResourceTypeInfo.getResourceType();
assertNotNull(resourceType);
assertEquals(1, resourceType.getId());
assertEquals(1, resourceType.getStatisticDescriptors().length);
statisticsType = resourceType.getStatisticsType();
assertNotNull(statisticsType);
assertTrue(statisticsType == ST2);
assertEquals("ST2_name", statisticsType.getName());
assertEquals("ST2_desc", statisticsType.getDescription());
assertEquals(1, statisticsType.getStatistics().length);
// validate the allocatedResourceInstance notification for st2_1
notificationIdx++;
assertTrue(notifications.get(notificationIdx) instanceof ResourceInstanceInfo);
allocatedResourceInstanceInfo = (ResourceInstanceInfo) notifications.get(notificationIdx);
assertNotNull(allocatedResourceInstanceInfo);
assertEquals("allocatedResourceInstance", allocatedResourceInstanceInfo.getName());
resourceInstance = allocatedResourceInstanceInfo.getResourceInstance();
assertNotNull(resourceInstance);
assertEquals(2, resourceInstance.getId());
assertEquals(1, resourceInstance.getUpdatedStats().length);
assertEquals(1, resourceInstance.getLatestStatValues().length); // TODO: is this correct?
statistics = resourceInstance.getStatistics();
assertNotNull(statistics);
assertTrue(statistics == st2_1);
assertEquals(3, statistics.getUniqueId());
assertEquals(1, statistics.getNumericId());
assertEquals("st2_1_text", statistics.getTextId());
assertEquals("ST2_name", statistics.getType().getName());
assertTrue(resourceType == resourceInstance.getResourceType());
// validate the sampled notification
notificationIdx++;
assertTrue(notifications.get(notificationIdx) instanceof SampledInfo);
SampledInfo sampledInfo = (SampledInfo) notifications.get(notificationIdx);
assertNotNull(sampledInfo);
assertEquals("sampled", sampledInfo.getName());
assertEquals(3, sampledInfo.getResourceCount());
}
@Test
public void testGetStatMonitorHandler() {
StatMonitorHandler handler = SampleCollector.getStatMonitorHandler();
assertNotNull(handler);
assertTrue(handler.getMonitorsSnapshot().isEmpty());
assertNull(handler.getStatMonitorNotifier());
}
@Test
public void testGetStatMonitorHandlerAfterClose() {
this.sampleCollector.close();
try {
/*StatMonitorHandler handler =*/ SampleCollector.getStatMonitorHandler();
fail("getStatMonitorHandler should throw IllegalStateException when SampleCollector is closed");
} catch (IllegalStateException expected) {
// passed
}
}
@Test
public void testGetStatMonitorHandlerBeforeAndAfterClose() {
StatMonitorHandler handler = SampleCollector.getStatMonitorHandler();
assertNotNull(handler);
this.sampleCollector.close();
try {
handler = SampleCollector.getStatMonitorHandler();
fail("getStatMonitorHandler should throw IllegalStateException when SampleCollector is closed");
} catch (IllegalStateException expected) {
// passed
}
}
@Test
public void testGetStatArchiveHandler() {
StatArchiveHandler handler = this.sampleCollector.getStatArchiveHandler();
assertNotNull(handler);
}
}