package org.lttng.ust.agent.integration.filter;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertEquals;
import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.junit.runner.RunWith;
import org.lttng.tools.ILttngSession;
import org.lttng.ust.agent.ILttngHandler;
-import org.lttng.ust.agent.filter.FilterNotificationManager;
+import org.lttng.ust.agent.filter.FilterChangeNotifier;
import org.lttng.ust.agent.filter.IFilterChangeListener;
import org.lttng.ust.agent.session.EventRule;
-import org.lttng.ust.agent.session.LogLevelFilter;
-import org.lttng.ust.agent.session.LogLevelFilter.LogLevelType;
+import org.lttng.ust.agent.session.LogLevelSelector;
+import org.lttng.ust.agent.session.LogLevelSelector.LogLevelType;
import org.lttng.ust.agent.utils.ILogLevelStrings;
import org.lttng.ust.agent.utils.TestPrintRunner;
@RunWith(TestPrintRunner.class)
public abstract class FilterListenerITBase {
- protected static final LogLevelFilter LOG_LEVEL_UNSPECIFIED = new LogLevelFilter(Integer.MIN_VALUE, 0);
+ protected static final LogLevelSelector LOG_LEVEL_UNSPECIFIED = new LogLevelSelector(Integer.MIN_VALUE, 0);
private static final String EVENT_NAME_A = "eventA";
private static final String EVENT_NAME_B = "eventB";
public void setup() throws SecurityException, IOException {
handler = getLogHandler();
listener = new TestFilterListener();
- FilterNotificationManager.getInstance().registerListener(listener);
+ FilterChangeNotifier.getInstance().registerListener(listener);
session = ILttngSession.createSession(null, getSessionDomain());
}
@After
public void teardown() {
session.close();
- FilterNotificationManager.getInstance().unregisterListener(listener);
+ FilterChangeNotifier.getInstance().unregisterListener(listener);
handler.close();
}
*/
@Test
public void testNoRules() {
- Set<EventRule> rules = Collections.EMPTY_SET;
- listener.setParameters(0, rules);
- /* Don't enable any events */
-
- assertTrue(listener.waitForAllNotifications());
- assertTrue(listener.checkRules());
+ assertEquals(0, listener.getNbNotifications());
+ assertEquals(Collections.EMPTY_SET, listener.getCurrentRules());
}
/**
Set<EventRule> rules = Collections.singleton(
new EventRule(EVENT_NAME_A, LOG_LEVEL_UNSPECIFIED, null));
- listener.setParameters(1, rules);
-
session.enableEvent(EVENT_NAME_A, null, false, null);
- assertTrue(listener.waitForAllNotifications());
- assertTrue(listener.checkRules());
+ assertEquals(1, listener.getNbNotifications());
+ assertEquals(rules, listener.getCurrentRules());
}
/**
new EventRule(EVENT_NAME_C, LOG_LEVEL_UNSPECIFIED, null))
.collect(Collectors.toSet());
- listener.setParameters(3, rules);
-
session.enableEvent(EVENT_NAME_A, null, false, null);
session.enableEvent(EVENT_NAME_B, null, false, null);
session.enableEvent(EVENT_NAME_C, null, false, null);
- assertTrue(listener.waitForAllNotifications());
- assertTrue(listener.checkRules());
+ assertEquals(3, listener.getNbNotifications());
+ assertEquals(rules, listener.getCurrentRules());
}
/**
Set<EventRule> rules = Collections.singleton(
new EventRule(EVENT_NAME_A, LOG_LEVEL_UNSPECIFIED, null));
- listener.setParameters(4, rules);
-
session.enableEvent(EVENT_NAME_A, null, false, null);
session.enableEvent(EVENT_NAME_B, null, false, null);
session.enableEvent(EVENT_NAME_C, null, false, null);
session.disableEvents(EVENT_NAME_B);
session.disableEvents(EVENT_NAME_C);
- assertTrue(listener.waitForAllNotifications());
- assertTrue(listener.checkRules());
+ assertEquals(5, listener.getNbNotifications());
+ assertEquals(rules, listener.getCurrentRules());
}
/**
public void testManyRulesDisableAll() {
Set<EventRule> rules = Collections.EMPTY_SET;
- /*
- * We should receive 6 notifications, because a "disable-event -a" sends
- * one for each event that was enabled.
- */
- listener.setParameters(6, rules);
-
session.enableEvent(EVENT_NAME_A, null, false, null);
session.enableEvent(EVENT_NAME_B, null, false, null);
session.enableEvent(EVENT_NAME_C, null, false, null);
session.disableAllEvents();
- assertTrue(listener.waitForAllNotifications());
- assertTrue(listener.checkRules());
+ /*
+ * We should receive 6 notifications, because a "disable-event -a" sends
+ * one for each event that was enabled.
+ */
+ assertEquals(6, listener.getNbNotifications());
+ assertEquals(rules, listener.getCurrentRules());
}
/**
@Ignore("Does not work as expected atm, see http://bugs.lttng.org/issues/913")
@Test
public void testSameEventsDiffLogLevels() {
- LogLevelFilter llf1 = new LogLevelFilter(getLogLevelStrings().warningInt(), LogLevelType.LTTNG_EVENT_LOGLEVEL_RANGE);
- LogLevelFilter llf2 = new LogLevelFilter(getLogLevelStrings().warningInt(), LogLevelType.LTTNG_EVENT_LOGLEVEL_SINGLE);
- LogLevelFilter llf3 = new LogLevelFilter(getLogLevelStrings().infoInt(), LogLevelType.LTTNG_EVENT_LOGLEVEL_RANGE);
+ LogLevelSelector lls1 = new LogLevelSelector(getLogLevelStrings().warningInt(), LogLevelType.LTTNG_EVENT_LOGLEVEL_RANGE);
+ LogLevelSelector lls2 = new LogLevelSelector(getLogLevelStrings().warningInt(), LogLevelType.LTTNG_EVENT_LOGLEVEL_SINGLE);
+ LogLevelSelector lls3 = new LogLevelSelector(getLogLevelStrings().infoInt(), LogLevelType.LTTNG_EVENT_LOGLEVEL_RANGE);
Set<EventRule> rules = Stream.of(
- new EventRule(EVENT_NAME_A, llf1, null),
- new EventRule(EVENT_NAME_A, llf2, null),
- new EventRule(EVENT_NAME_A, llf3, null))
+ new EventRule(EVENT_NAME_A, lls1, null),
+ new EventRule(EVENT_NAME_A, lls2, null),
+ new EventRule(EVENT_NAME_A, lls3, null))
.collect(Collectors.toSet());
- listener.setParameters(3, rules);
-
session.enableEvent(EVENT_NAME_A, getLogLevelStrings().warningName(), false, null);
session.enableEvent(EVENT_NAME_A, getLogLevelStrings().warningName(), true, null);
session.enableEvent(EVENT_NAME_A, getLogLevelStrings().infoName(), false, null);
- assertTrue(listener.waitForAllNotifications());
- assertTrue(listener.checkRules());
+ assertEquals(3, listener.getNbNotifications());
+ assertEquals(rules, listener.getCurrentRules());
}
/**
new EventRule(EVENT_NAME_A, LOG_LEVEL_UNSPECIFIED, filterB))
.collect(Collectors.toSet());
- listener.setParameters(3, rules);
-
session.enableEvent(EVENT_NAME_A, null, false, null);
session.enableEvent(EVENT_NAME_B, null, false, filterA);
session.enableEvent(EVENT_NAME_C, null, false, filterB);
- assertTrue(listener.waitForAllNotifications());
- assertTrue(listener.checkRules());
+ assertEquals(3, listener.getNbNotifications());
+ assertEquals(rules, listener.getCurrentRules());
}
/**
new EventRule(EVENT_NAME_B, LOG_LEVEL_UNSPECIFIED, null))
.collect(Collectors.toSet());
- listener.setParameters(2, rules);
-
session.enableEvent(EVENT_NAME_A, null, false, null);
session.enableEvent(EVENT_NAME_B, null, false, null);
- FilterNotificationManager.getInstance().unregisterListener(listener);
+ FilterChangeNotifier.getInstance().unregisterListener(listener);
session.enableEvent(EVENT_NAME_C, null, false, null);
- assertTrue(listener.waitForAllNotifications());
- assertTrue(listener.checkRules());
+ assertEquals(2, listener.getNbNotifications());
+ assertEquals(rules, listener.getCurrentRules());
}
/**
*/
@Test
public void testMultipleListeners() {
- FilterNotificationManager fnm = FilterNotificationManager.getInstance();
+ FilterChangeNotifier fcn = FilterChangeNotifier.getInstance();
TestFilterListener listener2 = new TestFilterListener();
TestFilterListener listener3 = new TestFilterListener();
- fnm.registerListener(listener2);
- fnm.registerListener(listener3);
+ fcn.registerListener(listener2);
+ fcn.registerListener(listener3);
Set<EventRule> rules = Stream.of(
new EventRule(EVENT_NAME_A, LOG_LEVEL_UNSPECIFIED, null),
new EventRule(EVENT_NAME_B, LOG_LEVEL_UNSPECIFIED, null))
.collect(Collectors.toSet());
- listener.setParameters(4, rules);
- listener2.setParameters(4, rules);
- listener3.setParameters(4, rules);
-
session.enableEvent(EVENT_NAME_A, null, false, null);
session.enableEvent(EVENT_NAME_B, null, false, null);
session.enableEvent(EVENT_NAME_C, null, false, null);
session.disableEvents(EVENT_NAME_C);
- assertTrue(listener.waitForAllNotifications());
- assertTrue(listener2.waitForAllNotifications());
- assertTrue(listener3.waitForAllNotifications());
- assertTrue(listener.checkRules());
- assertTrue(listener2.checkRules());
- assertTrue(listener3.checkRules());
+ assertEquals(4, listener.getNbNotifications());
+ assertEquals(rules, listener.getCurrentRules());
+
+ assertEquals(4, listener2.getNbNotifications());
+ assertEquals(rules, listener2.getCurrentRules());
+
+ assertEquals(4, listener3.getNbNotifications());
+ assertEquals(rules, listener3.getCurrentRules());
- fnm.unregisterListener(listener2);
- fnm.unregisterListener(listener3);
+ fcn.unregisterListener(listener2);
+ fcn.unregisterListener(listener3);
}
/**
*/
@Test
public void testUnattachedListeners() {
- FilterNotificationManager fnm = FilterNotificationManager.getInstance();
+ FilterChangeNotifier fcn = FilterChangeNotifier.getInstance();
TestFilterListener listener2 = new TestFilterListener();
TestFilterListener listener3 = new TestFilterListener();
/* We attach then detach listener2. We never attach listener3 */
- fnm.registerListener(listener2);
- fnm.unregisterListener(listener2);
+ fcn.registerListener(listener2);
+ fcn.unregisterListener(listener2);
Set<EventRule> rules = Stream.of(
new EventRule(EVENT_NAME_A, LOG_LEVEL_UNSPECIFIED, null),
new EventRule(EVENT_NAME_B, LOG_LEVEL_UNSPECIFIED, null))
.collect(Collectors.toSet());
- listener.setParameters(2, rules);
- listener2.setParameters(0, Collections.EMPTY_SET);
- listener3.setParameters(0, Collections.EMPTY_SET);
+ session.enableEvent(EVENT_NAME_A, null, false, null);
+ session.enableEvent(EVENT_NAME_B, null, false, null);
+
+ assertEquals(2, listener.getNbNotifications());
+ assertEquals(rules, listener.getCurrentRules());
+
+ assertEquals(0, listener2.getNbNotifications());
+ assertEquals(Collections.EMPTY_SET, listener2.getCurrentRules());
+
+ assertEquals(0, listener3.getNbNotifications());
+ assertEquals(Collections.EMPTY_SET, listener3.getCurrentRules());
+ }
+
+ /**
+ * Test that a newly-registered listener correctly receives the "statedump",
+ * which means all the rules currently active, upon registration.
+ */
+ @Test
+ public void testStatedump() {
+ FilterChangeNotifier fcn = FilterChangeNotifier.getInstance();
+ TestFilterListener listener2 = new TestFilterListener();
+
+ Set<EventRule> rules1 = Stream.of(
+ new EventRule(EVENT_NAME_A, LOG_LEVEL_UNSPECIFIED, null),
+ new EventRule(EVENT_NAME_B, LOG_LEVEL_UNSPECIFIED, null))
+ .collect(Collectors.toSet());
+ Set<EventRule> rules2 = Stream.of(
+ new EventRule(EVENT_NAME_A, LOG_LEVEL_UNSPECIFIED, null),
+ new EventRule(EVENT_NAME_C, LOG_LEVEL_UNSPECIFIED, null))
+ .collect(Collectors.toSet());
session.enableEvent(EVENT_NAME_A, null, false, null);
session.enableEvent(EVENT_NAME_B, null, false, null);
+ fcn.registerListener(listener2);
+
+ /* We should have received the "statedump" when registering */
+ assertEquals(2, listener2.getNbNotifications());
+ assertEquals(rules1, listener2.getCurrentRules());
- assertTrue(listener.waitForAllNotifications());
- assertTrue(listener2.waitForAllNotifications());
- assertTrue(listener3.waitForAllNotifications());
- assertTrue(listener.checkRules());
- assertTrue(listener2.checkRules());
- assertTrue(listener3.checkRules());
+ session.enableEvent(EVENT_NAME_C, null, false, null);
+ session.disableEvents(EVENT_NAME_B);
+
+ /* Subsequent changes should also be received */
+ assertEquals(4, listener2.getNbNotifications());
+ assertEquals(rules2, listener2.getCurrentRules());
+
+ fcn.unregisterListener(listener2);
}
/**
private static class TestFilterListener implements IFilterChangeListener {
private final Set<EventRule> currentRules = new HashSet<>();
- private CountDownLatch remainingExpectedNotifs;
- private Set<EventRule> expectedRules;
+ private volatile int currentNotifications = 0;
public TestFilterListener() {}
@Override
public void eventRuleAdded(EventRule rule) {
currentRules.add(rule);
- remainingExpectedNotifs.countDown();
+ currentNotifications++;
}
@Override
public void eventRuleRemoved(EventRule rule) {
currentRules.remove(rule);
- remainingExpectedNotifs.countDown();
- }
-
- public void setParameters(int expectedNotifications, Set<EventRule> expectedRulesAtEnd) {
- this.remainingExpectedNotifs = new CountDownLatch(expectedNotifications);
- this.expectedRules = expectedRulesAtEnd;
+ currentNotifications++;
}
- public boolean waitForAllNotifications() {
- System.out.println("Waiting for all notifications to arrive...");
- try {
- return remainingExpectedNotifs.await(10, TimeUnit.SECONDS);
- } catch (InterruptedException e) {
- return false;
- }
+ public int getNbNotifications() {
+ return currentNotifications;
}
- public boolean checkRules() {
- return ((remainingExpectedNotifs.getCount() == 0) && currentRules.equals(expectedRules));
+ public Set<EventRule> getCurrentRules() {
+ return currentRules;
}
}