/* * RHQ Management Platform * Copyright (C) 2005-2008 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.core.domain.event.test; import java.util.Map; import java.util.Set; import org.testng.annotations.Test; import org.rhq.core.domain.event.Event; import org.rhq.core.domain.event.EventDefinition; import org.rhq.core.domain.event.EventSeverity; import org.rhq.core.domain.event.EventSource; import org.rhq.core.domain.event.transfer.EventReport; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.ResourceCategory; import org.rhq.core.domain.resource.ResourceType; @Test public class EventReportTest { public void testEventReport() { ResourceType resourceType = new ResourceType("foo", "foo", ResourceCategory.PLATFORM, null); Resource resource = new Resource(1); EventDefinition eventDefinition = new EventDefinition(resourceType, "foo"); EventSource eventSource = new EventSource("foo", eventDefinition, resource); EventReport report = new EventReport(10, 10); report.addEvent(new Event("foo", "foo", 0, EventSeverity.DEBUG, "foo-first", eventSource), eventSource); report.addLimitWarningEvents(); // should do nothing Map<EventSource, Set<Event>> allEvents = report.getEvents(); assert allEvents.size() == 1; assert allEvents.get(eventSource).size() == 1; report.addEvent(new Event("foo", "foo", 1, EventSeverity.DEBUG, "foo-second", eventSource), eventSource); report.addLimitWarningEvents(); // should do nothing allEvents = report.getEvents(); assert allEvents.size() == 1; // only one event source still! assert allEvents.get(eventSource).size() == 2; // make sure they are the ones we expect for (Event e : allEvents.get(eventSource)) { assert e.getDetail().startsWith("foo-"); } // use a second event source EventSource eventSource2 = new EventSource("bar", eventDefinition, resource); report.addEvent(new Event("bar", "bar", 2, EventSeverity.DEBUG, "bar-first", eventSource2), eventSource2); report.addLimitWarningEvents(); // should do nothing allEvents = report.getEvents(); assert allEvents.size() == 2; assert allEvents.get(eventSource).size() == 2; assert allEvents.get(eventSource2).size() == 1; // make sure they are the ones we expect for (Event e : allEvents.get(eventSource)) { assert e.getDetail().startsWith("foo-"); } for (Event e : allEvents.get(eventSource2)) { assert e.getDetail().startsWith("bar-"); } } public void testEventReportMaxPerSource() { ResourceType resourceType = new ResourceType("foo", "foo", ResourceCategory.PLATFORM, null); Resource resource = new Resource(1); EventDefinition eventDefinition = new EventDefinition(resourceType, "foo"); EventSource eventSource = new EventSource("foo", eventDefinition, resource); EventReport report = new EventReport(1, 10); // add the first addEvent(report, "foo", "first", eventSource); report.addLimitWarningEvents(); // should do nothing Map<EventSource, Set<Event>> allEvents = report.getEvents(); assert allEvents.size() == 1; // only one event source still! assert allEvents.get(eventSource).size() == 1; // add the second (this is over the max) addEvent(report, "foo", "second", eventSource); // OVER MAX SO THIS NEVER MAKES IT! report.addLimitWarningEvents(); allEvents = report.getEvents(); assert allEvents.size() == 1; // only one event source still! assert allEvents.get(eventSource).size() == 2; // the second one is our "over the max" message int foo_count = 0; int limit_count = 0; for (Event e : allEvents.get(eventSource)) { if (e.getDetail().startsWith("foo-")) { foo_count++; continue; } if (e.getDetail().contains("Event Report Limit Reached:")) { limit_count++; continue; } assert false : "this event was unexpected: " + e; } assert foo_count == 1 : "there should have only been one of our events in the report: " + foo_count; assert limit_count == 1 : "there should have been an event warning of the limit breach: " + limit_count; // add the third (this is over the max) report = stripLimitWarningEvents(report); addEvent(report, "foo", "second", eventSource); // OVER MAX SO THIS NEVER MAKES IT! addEvent(report, "foo", "third", eventSource); // STILL OVER MAX SO THIS NEVER MAKES IT EITHER! report.addLimitWarningEvents(); allEvents = report.getEvents(); assert allEvents.size() == 1; // only one event source still! assert allEvents.get(eventSource).size() == 2; // no others have been added, this includes our "over the max" event foo_count = 0; limit_count = 0; for (Event e : allEvents.get(eventSource)) { if (e.getDetail().startsWith("foo-")) { foo_count++; continue; } if (e.getDetail().contains("Event Report Limit Reached:")) { limit_count++; continue; } assert false : "this event was unexpected: " + e; } // use a second event source - since we didn't hit our max total, this should work EventSource eventSource2 = new EventSource("bar", eventDefinition, resource); report = stripLimitWarningEvents(report); addEvent(report, "foo", "second", eventSource); // OVER MAX SO THIS NEVER MAKES IT! addEvent(report, "foo", "third", eventSource); // STILL OVER MAX SO THIS NEVER MAKES IT EITHER! addEvent(report, "bar", "first", eventSource2); report.addLimitWarningEvents(); allEvents = report.getEvents(); assert allEvents.size() == 2; assert allEvents.get(eventSource).size() == 2; // the original one plus a warning event assert allEvents.get(eventSource2).size() == 1; // our new one (no warning events here) // make sure they are the ones we expect for (Event e : allEvents.get(eventSource)) { assert e.getDetail().startsWith("foo-") || e.getDetail().contains("Event Report Limit Reached:"); } for (Event e : allEvents.get(eventSource2)) { assert e.getDetail().startsWith("bar-"); } } public void testEventReportMaxTotal() { ResourceType resourceType = new ResourceType("foo", "foo", ResourceCategory.PLATFORM, null); Resource resource = new Resource(1); EventDefinition eventDefinition = new EventDefinition(resourceType, "foo"); EventSource eventSource = new EventSource("foo", eventDefinition, resource); EventReport report = new EventReport(10, 1); // max total takes precedence! // add the first addEvent(report, "foo", "first", eventSource); report.addLimitWarningEvents(); // should do nothing Map<EventSource, Set<Event>> allEvents = report.getEvents(); assert allEvents.size() == 1; // only one event source still! assert allEvents.get(eventSource).size() == 1; // add the second (this is over the max) addEvent(report, "foo", "second", eventSource); // OVER MAX SO THIS NEVER MAKES IT! report.addLimitWarningEvents(); allEvents = report.getEvents(); assert allEvents.size() == 1; // only one event source still! assert allEvents.get(eventSource).size() == 2; // the second one is our "over the max" message int foo_count = 0; int limit_count = 0; for (Event e : allEvents.get(eventSource)) { if (e.getDetail().startsWith("foo-")) { foo_count++; continue; } if (e.getDetail().contains("Event Report Limit Reached:")) { limit_count++; continue; } assert false : "this event was unexpected: " + e; } assert foo_count == 1 : "there should have only been one of our events in the report: " + foo_count; assert limit_count == 1 : "there should have been an event warning of the limit breach: " + limit_count; // use a second event source - since we are over the total, this should add nothing EventSource eventSource2 = new EventSource("bar", eventDefinition, resource); report = stripLimitWarningEvents(report); addEvent(report, "foo", "second", eventSource); // OVER MAX SO THIS NEVER MAKES IT! addEvent(report, "foo", "third", eventSource); // STILL OVER MAX SO THIS NEVER MAKES IT EITHER! addEvent(report, "bar", "first", eventSource2); // WE ARE OVER THE TOTAL MAX, SO THIS NEVER MAKES IT EITHER! report.addLimitWarningEvents(); allEvents = report.getEvents(); assert allEvents.size() == 2; // both are here, the second one just has a single limit warning event assert allEvents.get(eventSource).size() == 2; assert allEvents.containsKey(eventSource2) == true; // even though the "real" event never made it, we have a limit warn event assert allEvents.get(eventSource2).size() == 1; // this isn't the "real" bar event, its the limit warn event assert allEvents.get(eventSource2).iterator().next().getDetail().contains("Event Report Limit Reached:"); } private void addEvent(EventReport report, String testId, String testDetail, EventSource eventSource) { report.addEvent(new Event(testId, testId, System.currentTimeMillis(), EventSeverity.DEBUG, testId + "-" + testDetail, eventSource), eventSource); return; } // this creates a new report with the same debug/test events but without the limi warn events private EventReport stripLimitWarningEvents(EventReport report) { EventReport newReport = new EventReport(report.getMaxEventsPerSource(), report.getMaxEventsPerReport()); for (Map.Entry<EventSource, Set<Event>> entry : report.getEvents().entrySet()) { EventSource eventSource = entry.getKey(); for (Event event : entry.getValue()) { if (event.getSeverity() == EventSeverity.DEBUG) { newReport.addEvent(event, eventSource); } } } return newReport; } }