Search in sources :

Example 1 with LocalStatListenerImpl

use of org.apache.geode.internal.statistics.GemFireStatSampler.LocalStatListenerImpl in project geode by apache.

the class GemFireStatSamplerIntegrationTest method testLocalStatListener.

/**
   * Adds a LocalStatListener for an individual stat. Validates that it receives notifications.
   * Removes the listener and validates that it was in fact removed and no longer receives
   * notifications.
   */
@Test
public void testLocalStatListener() throws Exception {
    connect(createGemFireProperties());
    GemFireStatSampler statSampler = getGemFireStatSampler();
    assertTrue(statSampler.waitForInitialization(5000));
    Method getLocalListeners = getGemFireStatSampler().getClass().getMethod("getLocalListeners");
    assertNotNull(getLocalListeners);
    Method addLocalStatListener = getGemFireStatSampler().getClass().getMethod("addLocalStatListener", LocalStatListener.class, Statistics.class, String.class);
    assertNotNull(addLocalStatListener);
    Method removeLocalStatListener = getGemFireStatSampler().getClass().getMethod("removeLocalStatListener", LocalStatListener.class);
    assertNotNull(removeLocalStatListener);
    // validate that there are no listeners
    assertTrue(statSampler.getLocalListeners().isEmpty());
    // add a listener for sampleCount stat in StatSampler statistics
    StatisticsType statSamplerType = getStatisticsManager().findType("StatSampler");
    Statistics[] statsArray = getStatisticsManager().findStatisticsByType(statSamplerType);
    assertEquals(1, statsArray.length);
    final Statistics statSamplerStats = statsArray[0];
    final String statName = "sampleCount";
    final AtomicInteger sampleCountValue = new AtomicInteger(0);
    final AtomicInteger sampleCountChanged = new AtomicInteger(0);
    LocalStatListener listener = new LocalStatListener() {

        public void statValueChanged(double value) {
            sampleCountValue.set((int) value);
            sampleCountChanged.incrementAndGet();
        }
    };
    statSampler.addLocalStatListener(listener, statSamplerStats, statName);
    assertTrue(statSampler.getLocalListeners().size() == 1);
    // there's a level of indirection here and some protected member fields
    LocalStatListenerImpl lsli = (LocalStatListenerImpl) statSampler.getLocalListeners().iterator().next();
    assertEquals("sampleCount", lsli.stat.getName());
    // wait for the listener to update 4 times
    final int expectedChanges = 4;
    boolean done = false;
    try {
        for (StopWatch time = new StopWatch(true); !done && time.elapsedTimeMillis() < 5000; done = (sampleCountChanged.get() >= expectedChanges)) {
            Thread.sleep(10);
        }
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }
    assertTrue("Waiting for sampleCountChanged >= " + expectedChanges, done);
    // validate that the listener fired and updated the value
    assertTrue(sampleCountValue.get() > 0);
    assertTrue(sampleCountChanged.get() >= expectedChanges);
    // remove the listener
    statSampler.removeLocalStatListener(listener);
    final int expectedSampleCountValue = sampleCountValue.get();
    final int expectedSampleCountChanged = sampleCountChanged.get();
    // validate that there are no listeners now
    assertTrue(statSampler.getLocalListeners().isEmpty());
    // wait for 2 stat samples to occur
    waitForStatSample(statSamplerStats, expectedSampleCountValue, 5000, 10);
    // validate that the listener did not fire
    assertEquals(expectedSampleCountValue, sampleCountValue.get());
    assertEquals(expectedSampleCountChanged, sampleCountChanged.get());
}
Also used : StatisticsType(org.apache.geode.StatisticsType) LocalStatListenerImpl(org.apache.geode.internal.statistics.GemFireStatSampler.LocalStatListenerImpl) Method(java.lang.reflect.Method) Statistics(org.apache.geode.Statistics) StopWatch(org.apache.geode.internal.util.StopWatch) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) FlakyTest(org.apache.geode.test.junit.categories.FlakyTest) Test(org.junit.Test) IntegrationTest(org.apache.geode.test.junit.categories.IntegrationTest)

Aggregations

Method (java.lang.reflect.Method)1 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)1 Statistics (org.apache.geode.Statistics)1 StatisticsType (org.apache.geode.StatisticsType)1 LocalStatListenerImpl (org.apache.geode.internal.statistics.GemFireStatSampler.LocalStatListenerImpl)1 StopWatch (org.apache.geode.internal.util.StopWatch)1 FlakyTest (org.apache.geode.test.junit.categories.FlakyTest)1 IntegrationTest (org.apache.geode.test.junit.categories.IntegrationTest)1 Test (org.junit.Test)1