package org.sakaiproject.component.app.scheduler.events.hibernate;
import org.junit.After;
import org.junit.Assert;
import org.junit.Test;
import org.sakaiproject.api.app.scheduler.events.TriggerEvent;
import org.sakaiproject.scheduler.events.hibernate.TriggerEventHibernateImpl;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
/**
* Created by IntelliJ IDEA.
* User: duffy
* Date: Oct 7, 2010
* Time: 2:32:11 PM
* To change this template use File | Settings | File Templates.
*/
public class TestTriggerEventManagerHibernateImpl
{
private ClassPathXmlApplicationContext
context = null;
private TriggerEventManagerHibernateImpl
temhi = null;
private static final Date
TEST_DATE;
static
{
//Need to create a time with 0 in the milliseconds field ao that equality comparisons work with values
// returned from the DB
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MILLISECOND, 0);
TEST_DATE = new Date(cal.getTimeInMillis());
}
public TestTriggerEventManagerHibernateImpl()
{
context = new ClassPathXmlApplicationContext("testApplicationContext.xml");
temhi = (TriggerEventManagerHibernateImpl)
context.getBean("org.sakaiproject.component.app.scheduler.events.hibernate.TriggerEventManagerHibernateImpl");
}
private TriggerEventManagerHibernateImpl getEventManager()
{
return temhi;
}
private TriggerEventHibernateImpl getTestTriggerEvent()
{
TriggerEventHibernateImpl
evt = new TriggerEventHibernateImpl();
evt.setEventType(TriggerEvent.TRIGGER_EVENT_TYPE.DEBUG);
evt.setJobName("job name");
evt.setTriggerName("trigger name");
evt.setMessage("message");
evt.setTime(TEST_DATE);
return evt;
}
private final void assertEquals(TriggerEventHibernateImpl evt1, TriggerEventHibernateImpl evt2)
throws Exception
{
Assert.assertEquals(evt1.getEventType(), evt2.getEventType());
Assert.assertEquals(evt1.getJobName(), evt2.getJobName());
Assert.assertEquals(evt1.getMessage(), evt2.getMessage());
Assert.assertEquals(evt1.getTriggerName(), evt2.getTriggerName());
Assert.assertEquals(evt1.getTime(), evt2.getTime());
}
private final void generateEvents (int count)
throws Exception
{
final TriggerEventManagerHibernateImpl
mgr = getEventManager();
TriggerEventHibernateImpl
evt = null;
int
eventTypeCount = TriggerEvent.TRIGGER_EVENT_TYPE.values().length;
Calendar
cal = Calendar.getInstance();
cal.setTimeInMillis(TEST_DATE.getTime());
for (int i = count; i > 0; i--)
{
TriggerEvent.TRIGGER_EVENT_TYPE
type = TriggerEvent.TRIGGER_EVENT_TYPE.values()[i % eventTypeCount];
Date newDate = new Date(cal.getTimeInMillis());
mgr.createTriggerEvent(type, "job name " + i, "trigger name " + i,
newDate, "message " + i, "server1");
cal.add(Calendar.HOUR, -1);
}
}
@After
public final void cleanUp()
throws Exception
{
final TriggerEventManagerHibernateImpl
mgr = getEventManager();
mgr.purgeEvents(new Date());
}
@Test
public void testPurgeEventsBeforeDate()
throws Exception
{
final TriggerEventManagerHibernateImpl
mgr = getEventManager();
generateEvents(5);
Calendar
cal = Calendar.getInstance();
cal.setTimeInMillis(TEST_DATE.getTime());
cal.add(Calendar.HOUR, -2);
Date
before = new Date (cal.getTimeInMillis());
mgr.purgeEvents(before);
List<TriggerEvent>
results = mgr.getTriggerEvents();
Assert.assertNotNull(results);
Assert.assertEquals(3, results.size());
for (TriggerEvent evt : results)
{
Date
evtTime = evt.getTime();
long
evtMillis = evtTime.getTime(),
b4Millis = before.getTime();
Assert.assertTrue (b4Millis <= evtMillis);
}
}
@Test
public void testPurgeEventsOnEmptyTableSucceeds()
throws Exception
{
cleanUp();
}
@Test
public void testPurgeEventsWithNullArgumentHasNoEffect()
throws Exception
{
final TriggerEventManagerHibernateImpl
mgr = getEventManager();
generateEvents(5);
mgr.purgeEvents(null);
List<TriggerEvent>
results = mgr.getTriggerEvents();
Assert.assertNotNull(results);
Assert.assertEquals (5, results.size());
}
@Test
public void testCreateTriggerEventSucceds()
throws Exception
{
final TriggerEventManagerHibernateImpl
mgr = getEventManager();
final TriggerEventHibernateImpl
evt = getTestTriggerEvent();
final TriggerEventHibernateImpl
result = (TriggerEventHibernateImpl)mgr.createTriggerEvent(evt.getEventType(),
evt.getJobName(),
evt.getTriggerName(),
evt.getTime(),
evt.getMessage(),
"server1");
Assert.assertNotNull(result);
Assert.assertNotNull(result.getId());
assertEquals(evt, result);
}
@Test
public void testCreateTriggerEventFailsOnInvalidInput()
throws Exception
{
final TriggerEventManagerHibernateImpl
mgr = getEventManager();
final TriggerEventHibernateImpl
evt = getTestTriggerEvent();
boolean
fail = true;
try
{
mgr.createTriggerEvent(null, evt.getJobName(), evt.getTriggerName(), evt.getTime(), evt.getMessage(), "server1");
}
catch (Exception e)
{
fail = false;
}
if (fail)
{
Assert.fail("createTriggerEvent accepted null TriggerEventType");
}
else
{
fail = true;
}
try
{
mgr.createTriggerEvent(evt.getEventType(), null, evt.getTriggerName(), evt.getTime(), evt.getMessage(), "server1");
}
catch (Exception e)
{
fail = false;
}
if (fail)
{
Assert.fail("createTriggerEvent accepted null Job name");
}
else
{
fail = true;
}
try
{
mgr.createTriggerEvent(evt.getEventType(), evt.getJobName(), evt.getTriggerName(), null, evt.getMessage(), "server1");
}
catch (Exception e)
{
fail = false;
}
if (fail)
{
Assert.fail("createTriggerEvent accepted null time");
}
else
{
fail = true;
}
}
@Test
public void testGetTriggerEventsReturnsEmptyListWhenAppropriate()
throws Exception
{
final TriggerEventManagerHibernateImpl
mgr = getEventManager();
final List<TriggerEvent>
results = mgr.getTriggerEvents();
Assert.assertNotNull(results);
Assert.assertTrue(results.isEmpty());
}
@Test
public void testGetTriggerEventsReturnsCompleteResults()
throws Exception
{
final TriggerEventManagerHibernateImpl
mgr = getEventManager();
generateEvents(100);
List<TriggerEvent>
result = mgr.getTriggerEvents();
Assert.assertNotNull(result);
Assert.assertEquals (100, result.size());
}
@Test
public void testGetTriggerEventsNullArgsMatchesNoArgMethodResults ()
throws Exception
{
final TriggerEventManagerHibernateImpl
mgr = getEventManager();
generateEvents(5);
List<TriggerEvent>
noArgResult = mgr.getTriggerEvents(),
nullArgResult = mgr.getTriggerEvents(null, null, null, null, null);
Assert.assertNotNull(noArgResult);
Assert.assertNotNull(nullArgResult);
Assert.assertEquals (5, noArgResult.size());
Assert.assertEquals (5, nullArgResult.size());
Set<TriggerEvent>
noArgSet = new HashSet<TriggerEvent> (noArgResult);
for (TriggerEvent evt : nullArgResult)
{
Assert.assertTrue(noArgSet.contains(evt));
noArgSet.remove(evt);
}
Assert.assertTrue(noArgSet.isEmpty());
}
@Test
public void testGetTriggerEventsAfterDateBoundaryConditions()
throws Exception
{
final TriggerEventManagerHibernateImpl
mgr = getEventManager();
generateEvents(5);
Calendar
cal = Calendar.getInstance();
cal.setTimeInMillis(TEST_DATE.getTime());
List<TriggerEvent>
results = null;
// test 1 hour beyond last event
cal.add(Calendar.HOUR, 1);
for (int i = 0; i < 6; i++)
{
results = mgr.getTriggerEvents(new Date(cal.getTimeInMillis()), null, null, null, null);
Assert.assertNotNull (results);
Assert.assertEquals (i, results.size());
cal.add(Calendar.HOUR, -1);
}
}
@Test
public void testGetTriggerEventsBeforeDateBoundaryConditions()
throws Exception
{
final TriggerEventManagerHibernateImpl
mgr = getEventManager();
generateEvents(5);
Calendar
cal = Calendar.getInstance();
cal.setTimeInMillis(TEST_DATE.getTime());
List<TriggerEvent>
results = null;
// test 1 hour beyond last event
cal.add(Calendar.HOUR, -5);
for (int i = 0; i < 6; i++)
{
results = mgr.getTriggerEvents(null, new Date(cal.getTimeInMillis()), null, null, null);
Assert.assertNotNull (results);
Assert.assertEquals (i, results.size());
cal.add(Calendar.HOUR, 1);
}
}
@Test
public void testGetTriggerEventsBetweenDates()
throws Exception
{
final TriggerEventManagerHibernateImpl
mgr = getEventManager();
generateEvents(5);
Calendar
cal = Calendar.getInstance();
cal.setTimeInMillis(TEST_DATE.getTime());
cal.add(Calendar.HOUR, -5);
Date
dates[] = new Date[7];
for (int i = 0; i < 7; i++)
{
dates[i] = new Date(cal.getTimeInMillis());
cal.add(Calendar.HOUR, 1);
}
List<TriggerEvent>
results = null;
//should return empty list - can't have after less than before
results = mgr.getTriggerEvents(dates[4], dates[2], null, null, null);
Assert.assertNotNull(results);
Assert.assertTrue(results.isEmpty());
//should return the last event only
results = mgr.getTriggerEvents(dates[5], dates[6], null, null, null);
Assert.assertNotNull(results);
Assert.assertEquals(1, results.size());
TriggerEvent
evt = results.get(0);
Assert.assertEquals (TEST_DATE, evt.getTime());
//should return the first event only
results = mgr.getTriggerEvents(dates[0], dates[1], null, null, null);
Assert.assertNotNull(results);
Assert.assertEquals(1, results.size());
evt = results.get(0);
Assert.assertEquals (dates[1], evt.getTime());
//should return the all events
results = mgr.getTriggerEvents(dates[1], dates[5], null, null, null);
Assert.assertNotNull(results);
Assert.assertEquals(5, results.size());
}
@Test
public void testGetTriggerEventsByJobList()
throws Exception
{
final TriggerEventManagerHibernateImpl
mgr = getEventManager();
generateEvents(5);
List<TriggerEvent>
results = null;
List<String>
jobs = new LinkedList<String>();
// empty job list should return an empty result list
results = mgr.getTriggerEvents(null, null, jobs, null, null);
Assert.assertNotNull(results);
Assert.assertEquals(5, results.size());
jobs.add("job name 1");
jobs.add("job name 2");
jobs.add("job name 3");
jobs.add("job name 4");
jobs.add("job name 5");
for (TriggerEvent evt : results)
{
String
jn = evt.getJobName();
Assert.assertTrue(jobs.contains(jn));
jobs.remove(jn);
}
// check getting a couple of jobs with different names
jobs.clear();
jobs.add("job name 1");
jobs.add("job name 3");
results = mgr.getTriggerEvents(null, null, jobs, null, null);
Assert.assertNotNull(results);
Assert.assertEquals (2, results.size());
for (TriggerEvent evt : results)
{
String
jn = evt.getJobName();
Assert.assertTrue(jobs.contains(jn));
jobs.remove(jn);
}
// check getting a couple of jobs with the same name
jobs.clear();
jobs.add("job name 2");
generateEvents(5);
results = mgr.getTriggerEvents(null, null, jobs, null, null);
Assert.assertNotNull(results);
Assert.assertEquals (2, results.size());
for (TriggerEvent evt : results)
{
Assert.assertEquals("job name 2", evt.getJobName());
}
}
@Test
public void testGetTriggerEventsByTriggerName()
throws Exception
{
final TriggerEventManagerHibernateImpl
mgr = getEventManager();
generateEvents(5);
List<TriggerEvent>
results = null;
String
triggerName = null;
// unknown trigger name should return an empty result list
triggerName = "bogus";
results = mgr.getTriggerEvents(null, null, null, triggerName, null);
Assert.assertNotNull(results);
Assert.assertTrue(results.isEmpty());
// check getting a couple a single event by trigger name
triggerName = "trigger name 3";
results = mgr.getTriggerEvents(null, null, null, triggerName, null);
Assert.assertNotNull(results);
Assert.assertEquals (1, results.size());
Assert.assertEquals (triggerName, ((TriggerEvent)results.get(0)).getTriggerName());
// check getting a couple of events with the same trigger name
generateEvents(5);
results = mgr.getTriggerEvents(null, null, null, triggerName, null);
Assert.assertNotNull(results);
Assert.assertEquals (2, results.size());
for (TriggerEvent evt : results)
{
Assert.assertEquals(triggerName, evt.getTriggerName());
}
}
@Test
public void testGetTriggerEventsByEventType()
throws Exception
{
final TriggerEventManagerHibernateImpl
mgr = getEventManager();
TriggerEvent.TRIGGER_EVENT_TYPE[]
values = TriggerEvent.TRIGGER_EVENT_TYPE.values(),
searchValue = new TriggerEvent.TRIGGER_EVENT_TYPE[1];
int
numTypes = values.length,
count = 3 * numTypes;
List<TriggerEvent>
results = null;
generateEvents (count);
for (int x = 0; x < numTypes; x++)
{
searchValue[0] = values[x];
results = mgr.getTriggerEvents(null, null, null, null, searchValue);
Assert.assertNotNull(results);
Assert.assertEquals (3, results.size());
for (TriggerEvent evt : results)
{
Assert.assertEquals (searchValue[0], evt.getEventType());
}
}
}
}