/*****************************************************************************
*
* Copyright (C) Zenoss, Inc. 2010-2011, 2014 all rights reserved.
*
* This content is made available according to terms specified in
* License.zenoss under the directory where your Zenoss product is installed.
*
****************************************************************************/
package org.zenoss.zep.dao.impl;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import org.zenoss.protobufs.model.Model.ModelElementType;
import org.zenoss.protobufs.zep.Zep.Event;
import org.zenoss.protobufs.zep.Zep.EventDetail;
import org.zenoss.protobufs.zep.Zep.EventNote;
import org.zenoss.protobufs.zep.Zep.EventSeverity;
import org.zenoss.protobufs.zep.Zep.EventStatus;
import org.zenoss.protobufs.zep.Zep.EventSummary;
import org.zenoss.protobufs.zep.Zep.SyslogPriority;
import org.zenoss.zep.ZepException;
import org.zenoss.zep.dao.EventArchiveDao;
import org.zenoss.zep.dao.EventSummaryDao;
import org.zenoss.zep.impl.EventPreCreateContextImpl;
import java.util.*;
import java.util.concurrent.TimeUnit;
import static org.junit.Assert.*;
@ContextConfiguration({ "classpath:zep-config.xml" })
public class EventArchiveDaoImplIT extends AbstractTransactionalJUnit4SpringContextTests {
@Autowired
public EventArchiveDao eventArchiveDao;
@Autowired
public EventSummaryDao eventSummaryDao;
private static Event.Builder removeIsArchiveDetail(Event.Builder builder) {
for (int i=0; i < builder.getDetailsCount(); i++) {
if ("is_archive".equals(builder.getDetails(i).getName())) {
builder.removeDetails(i);
break;
}
}
return builder;
}
private static void compareEvents(Event event, Event eventFromDb) {
Event event1 = removeIsArchiveDetail(Event.newBuilder().mergeFrom(event).clearUuid().clearStatus()
.clearCreatedTime().clearTags().addAllTags(EventDaoHelper.buildTags(event))).build();
Event event2 = removeIsArchiveDetail(Event.newBuilder().mergeFrom(eventFromDb).clearUuid().clearStatus()
.clearCreatedTime()).build();
assertEquals(event1, event2);
}
private Event createClosedEvent() {
return Event.newBuilder(EventTestUtils.createSampleEvent()).setStatus(EventStatus.STATUS_CLOSED).build();
}
private EventSummary createArchive(Event event) throws ZepException {
return eventArchiveDao.findByUuid(eventArchiveDao.create(event, new EventPreCreateContextImpl()));
}
@Test
public void testArchiveInsert() throws ZepException, InterruptedException {
Event event = createClosedEvent();
EventSummary eventSummaryFromDb = createArchive(event);
Event eventFromSummary = eventSummaryFromDb.getOccurrence(0);
compareEvents(event, eventFromSummary);
assertEquals(1, eventSummaryFromDb.getCount());
assertEquals(EventStatus.STATUS_CLOSED, eventSummaryFromDb.getStatus());
assertEquals(eventFromSummary.getCreatedTime(), eventSummaryFromDb.getFirstSeenTime());
assertEquals(eventFromSummary.getCreatedTime(), eventSummaryFromDb.getStatusChangeTime());
assertEquals(eventFromSummary.getCreatedTime(), eventSummaryFromDb.getLastSeenTime());
assertFalse(eventSummaryFromDb.hasCurrentUserUuid());
assertFalse(eventSummaryFromDb.hasClearedByEventUuid());
}
public static Event createEvent() {
Event.Builder eventBuilder = Event.newBuilder();
eventBuilder.setUuid(UUID.randomUUID().toString());
eventBuilder.setCreatedTime(System.currentTimeMillis());
eventBuilder.addDetails(EventDetail.newBuilder().setName("foo")
.addValue("bar").addValue("baz").build());
eventBuilder.addDetails(EventDetail.newBuilder().setName("foo2")
.addValue("bar2").addValue("baz2").build());
eventBuilder.setActor(EventTestUtils.createSampleActor());
eventBuilder.setAgent("agent");
eventBuilder.setEventClass("/Unknown");
eventBuilder.setEventClassKey("eventClassKey");
eventBuilder.setEventClassMappingUuid(UUID.randomUUID().toString());
eventBuilder.setEventGroup("event group");
eventBuilder.setEventKey("event key");
eventBuilder.setFingerprint("my|dedupid|foo|");
eventBuilder.setMessage("my message");
eventBuilder.setMonitor("monitor");
eventBuilder.setNtEventCode(new Random().nextInt(50000));
eventBuilder.setSeverity(EventSeverity.SEVERITY_CRITICAL);
eventBuilder.setStatus(EventStatus.STATUS_CLOSED);
eventBuilder.setSummary("summary message");
eventBuilder.setSyslogFacility(11);
eventBuilder.setSyslogPriority(SyslogPriority.SYSLOG_PRIORITY_DEBUG);
eventBuilder.addTags(EventTestUtils.createTag(ModelElementType.DEVICE,
eventBuilder.getActor().getElementUuid()));
eventBuilder.addTags(EventTestUtils.createTag(
ModelElementType.COMPONENT, eventBuilder.getActor()
.getElementSubUuid()));
return eventBuilder.build();
}
@Test
public void testListByUuid() throws ZepException {
Set<String> uuidsToSearch = new HashSet<String>();
for (int i = 0; i < 10; i++) {
String uuid = createArchive(createEvent()).getUuid();
if ((i % 2) == 0) {
uuidsToSearch.add(uuid);
}
}
List<EventSummary> result = eventArchiveDao
.findByUuids(new ArrayList<String>(uuidsToSearch));
assertEquals(uuidsToSearch.size(), result.size());
for (EventSummary event : result) {
assertTrue(uuidsToSearch.contains(event.getUuid()));
}
}
@Test
public void testAddNote() throws ZepException {
EventSummary summary = createArchive(createEvent());
assertEquals(0, summary.getNotesCount());
EventNote note = EventNote.newBuilder().setMessage("My Note")
.setUserName("pkw").setUserUuid(UUID.randomUUID().toString())
.build();
assertEquals(1, eventArchiveDao.addNote(summary.getUuid(), note));
EventNote note2 = EventNote.newBuilder().setMessage("My Note 2")
.setUserName("kww").setUserUuid(UUID.randomUUID().toString())
.build();
assertEquals(1, eventArchiveDao.addNote(summary.getUuid(), note2));
summary = eventArchiveDao.findByUuid(summary.getUuid());
assertEquals(2, summary.getNotesCount());
// Notes returned in descending order to match previous behavior
assertEquals("My Note 2", summary.getNotes(0).getMessage());
assertEquals("kww", summary.getNotes(0).getUserName());
assertEquals("My Note", summary.getNotes(1).getMessage());
assertEquals("pkw", summary.getNotes(1).getUserName());
}
@Test
public void testImportEvent() throws ZepException {
EventSummary.Builder summaryBuilder = EventSummary.newBuilder(EventSummaryDaoImplIT.createRandomSummary());
summaryBuilder.setStatus(EventStatus.STATUS_CLOSED);
final EventSummary summary = summaryBuilder.build();
this.eventArchiveDao.importEvent(summary);
EventSummaryDaoImplIT.compareImported(summary, this.eventArchiveDao.findByUuid(summary.getUuid()));
// Verify we can't insert an event more than once
try {
this.eventArchiveDao.importEvent(summary);
fail("Expected duplicate import event to fail");
} catch (DuplicateKeyException e) {
// Expected
}
}
@Test(expected = ZepException.class)
public void testImportOpenEventFails() throws ZepException {
EventSummary.Builder summaryBuilder = EventSummary.newBuilder(EventSummaryDaoImplIT.createRandomSummary());
summaryBuilder.setStatus(EventStatus.STATUS_NEW);
final EventSummary summary = summaryBuilder.build();
this.eventArchiveDao.importEvent(summary);
}
@Test
public void testIncomingCount() throws ZepException {
Event event = Event.newBuilder(createEvent()).setCount(10).build();
final EventSummary summary = createArchive(event);
assertEquals(10, summary.getCount());
}
@Test
public void testIncomingFirstSeen() throws ZepException {
long yesterday = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1);
Event event = Event.newBuilder(createEvent()).setFirstSeenTime(yesterday).build();
EventSummary summary = createArchive(event);
assertEquals(yesterday, summary.getFirstSeenTime());
}
}