package org.ovirt.engine.core.notifier.filter; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.ovirt.engine.core.common.AuditLogSeverity; import org.ovirt.engine.core.notifier.dao.DispatchResult; import org.ovirt.engine.core.notifier.transport.Observer; import org.ovirt.engine.core.notifier.transport.Transport; public class FirstMatchSimpleFilterTest { FirstMatchSimpleFilter filter; T snmp; T smtp; /* * This replaces the application message representation; the only requests we have are getName() to return the * name based on which we filter, and getSeverity() used only in filters where the severity is specified. */ private static class E extends AuditLogEvent { private String e; private AuditLogSeverity s; public E(String e) { this(e, null); } public E(String e, AuditLogSeverity s) { this.e = e; this.s = s; } @Override public String getName() { return e; } @Override public AuditLogSeverity getSeverity() { return s; } } private static class T extends Transport { private String t; private List<String> events = new ArrayList<>(); public T(String t) { this.t = t; } @Override public void dispatchEvent(AuditLogEvent event, String address) { events.add(event.getName() + "-->" + address); } public List<String> getEvents() { return events; } @Override public String getName() { return t; } @Override public boolean isActive() { return true; } @Override public void notifyObservers(DispatchResult data) { } @Override public void registerObserver(Observer observer) { } @Override public void removeObserver(Observer observer) { } } @Before public void setUp() throws Exception { filter = new FirstMatchSimpleFilter(); /* * Here we register two transports into the filter logic. * * All we need from a transport is to know its name and able to dispatch messages into it. * * transports have nothing to do with application, once initialized. */ snmp = new T("snmp"); smtp = new T("smtp"); filter.registerTransport(snmp); filter.registerTransport(smtp); } @After public void tearDown() throws Exception { } @Test public void testEmptyFilter() throws Exception { filter.clearFilterEntries(); filter.processEvent(new E("message0")); filter.processEvent(new E("message1")); assertTrue(snmp.getEvents().isEmpty()); } @Test public void testConfigurationEntries() throws Exception { filter.clearFilterEntries(); filter.addFilterEntries( Collections.singletonList( new FirstMatchSimpleFilter.FilterEntry("message0", null, false, "smtp", "dbtest1@redhat.com")) ); filter.processEvent(new E("message0")); filter.processEvent(new E("message1")); assertTrue(smtp.getEvents().contains("message0-->dbtest1@redhat.com")); } @Test public void testSimpleParse() throws Exception { filter.clearFilterEntries(); filter.addFilterEntries( FirstMatchSimpleFilter.parse("include:VDC_STOP(snmp:) " + "exclude:*") ); filter.processEvent(new E("VDC_STOP")); assertTrue(snmp.getEvents().contains("VDC_STOP-->")); } @Test public void testIncludeExcludeOrder() { String expected = "alonbl@redhat.com"; filter.clearFilterEntries(); filter.addFilterEntries( FirstMatchSimpleFilter.parse( "" + "include:message1(smtp:" + expected + ") " + "include:message2(smtp:" + expected + ") " + "exclude:message3(smtp:" + expected + ") " + "exclude:message1(smtp:" + expected + ") " + "include:*" )); filter.processEvent(new E("message1")); filter.processEvent(new E("message2")); filter.processEvent(new E("message3")); assertTrue(smtp.getEvents().contains("message1-->" + expected)); assertTrue(smtp.getEvents().contains("message2-->" + expected)); assertEquals(2, smtp.getEvents().size()); } @Test public void testSeverity() throws Exception { String expected1 = "test1@example.com"; String expected2 = "test2@example.com"; filter.clearFilterEntries(); filter.addFilterEntries( FirstMatchSimpleFilter.parse( "include:*:WARNING(smtp:" + expected1 + ") " + "exclude:*(smtp:" + expected1 + ")" + "exclude:*:WARNING(smtp:" + expected2 + ") " + "include:*(smtp:" + expected2 + ")" )); filter.processEvent(new E("message1", AuditLogSeverity.NORMAL)); filter.processEvent(new E("message2", AuditLogSeverity.WARNING)); filter.processEvent(new E("message3", AuditLogSeverity.ERROR)); filter.processEvent(new E("message4", AuditLogSeverity.ALERT)); assertTrue(smtp.getEvents().contains("message2-->" + expected1)); assertTrue(smtp.getEvents().contains("message3-->" + expected1)); assertTrue(smtp.getEvents().contains("message3-->" + expected2)); assertTrue(smtp.getEvents().contains("message4-->" + expected1)); assertTrue(smtp.getEvents().contains("message4-->" + expected2)); assertEquals(5, smtp.getEvents().size()); } @Test public void testSeverityAndEventCombo() throws Exception { // These combinations aren't useful in the real world, but we want them to work anyway String expected = "test@example.com"; filter.clearFilterEntries(); filter.addFilterEntries( FirstMatchSimpleFilter.parse( "include:normal_message:ERROR(smtp:" + expected + ") " + "include:error_message:NORMAL(smtp:" + expected + ") " + "exclude:*" )); filter.processEvent(new E("normal_message", AuditLogSeverity.NORMAL)); filter.processEvent(new E("error_message", AuditLogSeverity.ERROR)); assertTrue(smtp.getEvents().contains("error_message-->" + expected)); assertEquals(1, smtp.getEvents().size()); } @Test public void testAll() throws Exception { filter.clearFilterEntries(); filter.addFilterEntries(Collections.singletonList( new FirstMatchSimpleFilter.FilterEntry("kuku", null, false, "snmp", "pupu")) ); filter.addFilterEntries(Collections.singletonList( new FirstMatchSimpleFilter.FilterEntry("kuku", null, false, "smtp", "pupu")) ); filter.addFilterEntries( FirstMatchSimpleFilter.parse( "" + "include:*" )); filter.processEvent(new E("message1")); assertTrue(snmp.getEvents().contains("message1-->pupu")); assertTrue(smtp.getEvents().contains("message1-->pupu")); } @Test public void testFilter() throws Exception { filter.clearFilterEntries(); /* * Add configuration filter */ filter.addFilterEntries( FirstMatchSimpleFilter.parse( "include:message1(smtp:alonbl@redhat.com) " + "include:message2(smtp:alonbl@redhat.com) " + "exclude:message3(smtp:alonbl@redhat.com) " + "exclude:message1(smtp:alonbl@redhat.com) " + "include:message2(smtp:alon.barlev@gmail.com) " + "include:message1(smtp:alonbl@gentoo.org) " + "exclude:message1(snmp:profile1) " + "exclude:message2(snmp:profile1) " + "include:*(snmp:profile2) " + "include:*(snmp:profile1) " + "exclude:*" + "" )); filter.processEvent(new E("message0")); filter.processEvent(new E("message1")); filter.processEvent(new E("message2")); assertTrue(snmp.getEvents().contains("message0-->profile1")); assertTrue(snmp.getEvents().contains("message0-->profile2")); assertTrue(snmp.getEvents().contains("message1-->profile2")); assertTrue(snmp.getEvents().contains("message2-->profile2")); assertEquals(4, snmp.getEvents().size()); assertTrue(smtp.getEvents().contains("message1-->alonbl@gentoo.org")); assertTrue(smtp.getEvents().contains("message1-->alonbl@redhat.com")); assertTrue(smtp.getEvents().contains("message2-->alon.barlev@gmail.com")); assertTrue(smtp.getEvents().contains("message2-->alonbl@redhat.com")); assertEquals(4, smtp.getEvents().size()); } @Test public void testParsePositive() throws Exception { // Should parse FirstMatchSimpleFilter.parse("include:message(kuku:pupu) include:message(kuku:pupu)"); } @Test(expected = IllegalArgumentException.class) public void testParseNegative1() throws Exception { // No event FirstMatchSimpleFilter.parse("include:(kuku:pupu)"); } @Test(expected = IllegalArgumentException.class) public void testParseNegative2() throws Exception { // No Transport FirstMatchSimpleFilter.parse("include:message(:pupu)"); } @Test(expected = IllegalArgumentException.class) public void testParseNegative3() throws Exception { // Random text FirstMatchSimpleFilter.parse("lorem ipsum"); } @Test(expected = IllegalArgumentException.class) public void testParseNegative4() throws Exception { // Invalid severity FirstMatchSimpleFilter.parse("include:message:_badSeverityTest_(kuku:pupu)"); } }