/* * RHQ Management Platform * Copyright 2013, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * 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.enterprise.server.event.test; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.persistence.Query; import org.testng.annotations.Test; import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.authz.Role; import org.rhq.core.domain.common.EntityContext; import org.rhq.core.domain.criteria.EventCriteria; 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.composite.EventComposite; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.group.ResourceGroup; import org.rhq.core.domain.util.PageControl; import org.rhq.core.domain.util.PageList; import org.rhq.enterprise.server.auth.SubjectManagerLocal; import org.rhq.enterprise.server.event.EventManagerLocal; import org.rhq.enterprise.server.test.AbstractEJB3Test; import org.rhq.enterprise.server.test.TransactionCallback; import org.rhq.enterprise.server.util.LookupUtil; import org.rhq.enterprise.server.util.SessionTestHelper; /** * Tests around the event subsystem * @author Heiko W. Rupp */ public class EventManagerTest extends AbstractEJB3Test { private EventManagerLocal eventManager; private SubjectManagerLocal subjectManager; @Override protected void beforeMethod() { try { eventManager = LookupUtil.getEventManager(); subjectManager = LookupUtil.getSubjectManager(); } catch (Throwable t) { // Catch RuntimeExceptions and Errors and dump their stack trace, because Surefire will completely swallow them // and throw a cryptic NPE (see http://jira.codehaus.org/browse/SUREFIRE-157)! t.printStackTrace(); throw new RuntimeException(t); } } @Test public void testEventsSimple() throws Exception { executeInTransaction(new TransactionCallback() { @Override public void execute() throws Exception { Resource resource = SessionTestHelper.createNewResource(em, "fake resource"); EventDefinition eDef = createEventDefinition(resource); em.persist(eDef); long now = System.currentTimeMillis(); EventSource evSrc = new EventSource("ESource", eDef, resource); Event ev = new Event("EType", "ESource", now, EventSeverity.INFO, "This is a test", evSrc); //Set<Event> eventSet = newEventSet(); //eventSet.add(ev); //Map<EventSource, Set<Event>> events = new HashMap<EventSource, Set<Event>>(); //events.put(evSrc, eventSet); em.persist(evSrc); em.persist(ev); em.flush(); /* * do NOT use addEventData method until this test is refactored to support the fact that * insertions made via direct SQL won't be visible to the entity manager in this xaction */ //eventManager.addEventData(events); int resourceId = resource.getId(); Query queryByTime = em.createNamedQuery(Event.FIND_EVENTS_FOR_RESOURCE_ID_AND_TIME); long t1 = now - 1000L; long t2 = now + 1000L; queryByTime.setParameter("resourceId", resourceId); queryByTime.setParameter("start", t1); queryByTime.setParameter("end", t2); List resultsByTime = queryByTime.getResultList(); assert resultsByTime.size() == 1 : "Expected 1 Event, got " + resultsByTime.size(); Query queryBySeverity = em.createNamedQuery(Event.FIND_EVENTS_FOR_RESOURCE_ID_AND_TIME_SEVERITY); queryBySeverity.setParameter("severity", EventSeverity.INFO); queryBySeverity.setParameter("resourceId", resourceId); queryBySeverity.setParameter("start", t1); queryBySeverity.setParameter("end", t2); List resultsBySeverity = queryBySeverity.getResultList(); assert resultsBySeverity.size() == 1 : "Expected 1 Event, got " + resultsBySeverity.size(); } }); } @Test public void testEventManager() throws Exception { executeInTransaction(new TransactionCallback() { @Override public void execute() throws Exception { Resource resource = SessionTestHelper.createNewResource(em, "fake resource"); EventDefinition eDef = createEventDefinition(resource); em.persist(eDef); em.flush(); long now = System.currentTimeMillis(); EventSource evSrc = new EventSource("ESource", eDef, resource); Event ev = new Event("EType", "ESource", now, EventSeverity.INFO, "This is a 2nd test", evSrc); //em.persist(evSrc); //em.persist(ev); //em.flush(); /* * do NOT use addEventData method until this test is refactored to support the fact that * insertions made via direct SQL won't be visible to the entity manager in this xaction */ eventManager.addEventData(newEventMap(evSrc, wrapEvents(ev))); int resourceId = resource.getId(); long t1 = now - 1000L; long t2 = now + 1000L; Subject overlord = LookupUtil.getSubjectManager().getOverlord(); int[] buckets = eventManager.getEventCounts(overlord, resourceId, t1, t2, 3); assert buckets != null : "Buckets should not be null, but were null"; assert buckets.length == 3 : "Expected 3 buckets, but got " + buckets.length; boolean bucketCounts = buckets[0] == 0 && buckets[1] == 1 && buckets[2] == 0; assert bucketCounts : "Expected bucket counts were [0 1 0] Received [" + buckets[0] + " " + buckets[1] + " " + buckets[2] + "]"; PageControl pc = PageControl.getUnlimitedInstance(); EntityContext context = EntityContext.forResource(resourceId); List<EventComposite> res = eventManager.findEventComposites(overlord, context, t1, t2, null, null, null, pc); assert res.size() == 1 : "Expected 1 Event, got " + res.size(); res = eventManager.findEventComposites(overlord, context, t1, t2, new EventSeverity[] { EventSeverity.INFO }, null, null, pc); assert res.size() == 1 : "Expected 1 Event, got " + res.size(); res = eventManager.findEventComposites(overlord, context, t1, t2, new EventSeverity[] { EventSeverity.WARN }, null, null, pc); assert res.size() == 0 : "Expected 0 Events, got " + res.size(); } }); } @Test public void testGetEventDetailForEventId() { executeInTransaction(new TransactionCallback() { @Override public void execute() throws Exception { Resource resource = SessionTestHelper.createNewResource(em, "fake resource"); EventDefinition eventDefinition = createEventDefinition(resource); em.persist(eventDefinition); EventSource eventSource = createEventSource(eventDefinition, resource); em.persist(eventSource); Event event = createEvent(eventSource, EventSeverity.FATAL); em.persist(event); em.flush(); EventComposite eventDetail = eventManager.getEventDetailForEventId(subjectManager.getOverlord(), event.getId()); assertNotNull(eventDetail); assertEquals(resource.getName(), eventDetail.getResourceName()); assertEquals(event.getSourceLocation(), eventDetail.getSourceLocation()); assertEquals(event.getSeverity(), eventDetail.getSeverity()); } }); } @Test public void testPurgeEventsForResourceContext() { executeInTransaction(new TransactionCallback() { @Override public void execute() throws Exception { Resource resource = SessionTestHelper.createNewResource(em, "fake resource"); EventDefinition eventDefinition = createEventDefinition(resource); em.persist(eventDefinition); EventSource eventSource = createEventSource(eventDefinition, resource); em.persist(eventSource); int eventCount = 7; for (int i = 0; i < eventCount; i++) { Event event = createEvent(eventSource, EventSeverity.FATAL); em.persist(event); } em.flush(); int deletedCount = eventManager.purgeEventsForContext(subjectManager.getOverlord(), EntityContext.forResource(resource.getId())); assertEquals(eventCount, deletedCount); } }); } @Test public void testPurgeEventsForResourceGroupContext() { executeInTransaction(new TransactionCallback() { @Override public void execute() throws Exception { Subject subject = SessionTestHelper.createNewSubject(em, "fake subject"); Role role = SessionTestHelper.createNewRoleForSubject(em, subject, "fake role"); ResourceGroup resourceGroup = SessionTestHelper.createNewCompatibleGroupForRole(em, role, "fake group"); Resource resource = SessionTestHelper.createNewResourceForGroup(em, resourceGroup, "fake resource"); EventDefinition eventDefinition = createEventDefinition(resource); em.persist(eventDefinition); EventSource eventSource = createEventSource(eventDefinition, resource); em.persist(eventSource); int eventCount = 7; for (int i = 0; i < eventCount; i++) { Event event = createEvent(eventSource, EventSeverity.FATAL); em.persist(event); } em.flush(); int deletedCount = eventManager.purgeEventsForContext(subjectManager.getOverlord(), EntityContext.forGroup(resourceGroup.getId())); assertEquals(eventCount, deletedCount); } }); } @Test public void testGetEventCountsBySeverity() { executeInTransaction(new TransactionCallback() { @Override public void execute() throws Exception { Resource resource = SessionTestHelper.createNewResource(em, "fake resource"); EventDefinition eventDefinition = createEventDefinition(resource); em.persist(eventDefinition); EventSource eventSource = createEventSource(eventDefinition, resource); em.persist(eventSource); int fatalEventCount = 7; for (int i = 0; i < fatalEventCount; i++) { Event event = createEvent(eventSource, EventSeverity.FATAL); em.persist(event); } int warnEventCount = 5; for (int i = 0; i < warnEventCount; i++) { Event event = createEvent(eventSource, EventSeverity.WARN); em.persist(event); } int infoEventCount = 9; for (int i = 0; i < infoEventCount; i++) { Event event = createEvent(eventSource, EventSeverity.INFO); em.persist(event); } em.flush(); Map<EventSeverity, Integer> eventCountsBySeverity = eventManager.getEventCountsBySeverity( subjectManager.getOverlord(), resource.getId(), 0, System.currentTimeMillis()); assertEquals(3, eventCountsBySeverity.keySet().size()); assertEquals(fatalEventCount, eventCountsBySeverity.get(EventSeverity.FATAL).intValue()); assertEquals(warnEventCount, eventCountsBySeverity.get(EventSeverity.WARN).intValue()); assertEquals(infoEventCount, eventCountsBySeverity.get(EventSeverity.INFO).intValue()); } }); } @Test public void testGetEventCountsBySeverityForGroup() { executeInTransaction(new TransactionCallback() { @Override public void execute() throws Exception { Subject subject = SessionTestHelper.createNewSubject(em, "fake subject"); Role role = SessionTestHelper.createNewRoleForSubject(em, subject, "fake role"); ResourceGroup resourceGroup = SessionTestHelper.createNewCompatibleGroupForRole(em, role, "fake group"); Resource resource = SessionTestHelper.createNewResourceForGroup(em, resourceGroup, "fake resource"); EventDefinition eventDefinition = createEventDefinition(resource); em.persist(eventDefinition); EventSource eventSource = createEventSource(eventDefinition, resource); em.persist(eventSource); int fatalEventCount = 7; for (int i = 0; i < fatalEventCount; i++) { Event event = createEvent(eventSource, EventSeverity.FATAL); em.persist(event); } int warnEventCount = 5; for (int i = 0; i < warnEventCount; i++) { Event event = createEvent(eventSource, EventSeverity.WARN); em.persist(event); } int infoEventCount = 9; for (int i = 0; i < infoEventCount; i++) { Event event = createEvent(eventSource, EventSeverity.INFO); em.persist(event); } em.flush(); Map<EventSeverity, Integer> eventCountsBySeverity = eventManager.getEventCountsBySeverityForGroup( subjectManager.getOverlord(), resourceGroup.getId(), 0, System.currentTimeMillis()); assertEquals(3, eventCountsBySeverity.keySet().size()); assertEquals(fatalEventCount, eventCountsBySeverity.get(EventSeverity.FATAL).intValue()); assertEquals(warnEventCount, eventCountsBySeverity.get(EventSeverity.WARN).intValue()); assertEquals(infoEventCount, eventCountsBySeverity.get(EventSeverity.INFO).intValue()); } }); } @Test public void testFindEventsByCriteria() { executeInTransaction(new TransactionCallback() { @Override public void execute() throws Exception { Resource resource = SessionTestHelper.createNewResource(em, "fake resource"); EventDefinition eventDefinition = createEventDefinition(resource); em.persist(eventDefinition); EventSource eventSource = createEventSource(eventDefinition, resource); em.persist(eventSource); Set<Event> events = newEventSet(); for (int i = 0; i < 4; i++) { Event event = createEvent(eventSource, EventSeverity.FATAL); events.add(event); em.persist(event); } for (int i = 0; i < 7; i++) { Event event = createEvent(eventSource, EventSeverity.WARN); events.add(event); em.persist(event); } for (int i = 0; i < 13; i++) { Event event = createEvent(eventSource, EventSeverity.INFO); events.add(event); em.persist(event); } em.flush(); EventCriteria criteria = new EventCriteria(); criteria.addFilterResourceId(resource.getId()); criteria.setStrict(true); criteria.clearPaging(); PageList<Event> foundEvents = eventManager.findEventsByCriteria(subjectManager.getOverlord(), criteria); assertNotNull(foundEvents); assertTrue("#findEventsByCriteria should have found all generated events", events.containsAll(foundEvents) && foundEvents.containsAll(events)); } }); } private EventDefinition createEventDefinition(Resource resource) { return new EventDefinition(resource.getResourceType(), "fake event definition"); } private EventSource createEventSource(EventDefinition eventDefinition, Resource resource) { return new EventSource("fake source location", eventDefinition, resource); } private Event createEvent(EventSource eventSource, EventSeverity eventSeverity) { return new Event("fake event type", eventSource.getLocation(), System.currentTimeMillis(), eventSeverity, "fake event detail", eventSource); } private Map<EventSource, Set<Event>> newEventMap(EventSource eventSource, Set<Event> events) { Map<EventSource, Set<Event>> eventMap = new HashMap<EventSource, Set<Event>>(); eventMap.put(eventSource, events); return eventMap; } private Set<Event> wrapEvents(Event... event) { Set<Event> set = newEventSet(); Collections.addAll(set, event); return set; } private Set<Event> newEventSet() { return new HashSet<Event>(); } }