package edu.sc.seis.sod.source.event;
import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import edu.iris.Fissures.IfEvent.NoPreferredOrigin;
import edu.iris.Fissures.model.TimeInterval;
import edu.iris.Fissures.model.UnitImpl;
import edu.sc.seis.fissuresUtil.cache.CacheEvent;
import edu.sc.seis.fissuresUtil.chooser.ClockUtil;
import edu.sc.seis.fissuresUtil.mockFissures.IfEvent.MockEventAccessOperations;
import edu.sc.seis.fissuresUtil.time.MicroSecondTimeRange;
public class DelayedEventSourceTest {
public static final TimeInterval LONG_AGO = new TimeInterval(1, UnitImpl.YEAR);
public static final TimeInterval SHORT_AGO = new TimeInterval(.1, UnitImpl.SECOND);
public static final TimeInterval MED_SHORT_AGO = new TimeInterval(.2, UnitImpl.SECOND);
@Test
public void testNext() throws InterruptedException, NoPreferredOrigin {
final List<CacheEvent> events = new ArrayList<CacheEvent>();
events.add(MockEventAccessOperations.createEvent(ClockUtil.now().subtract(LONG_AGO), 0f, 0));
events.add(MockEventAccessOperations.createEvent(ClockUtil.now().subtract(LONG_AGO), 1f, 0));
events.add(MockEventAccessOperations.createEvent(ClockUtil.now().subtract(SHORT_AGO), 2f, 0));
EventSource es = new TestSimpleEventSource(events);
DelayedEventSource delayedES = new DelayedEventSource(MED_SHORT_AGO, es);
CacheEvent[] firstEvents = delayedES.next();
assertEquals("first get", 2, firstEvents.length);
Thread.sleep((long)MED_SHORT_AGO.getValue(UnitImpl.MILLISECOND));
CacheEvent[] secondEvents = delayedES.next();
assertEquals("second get", 1, secondEvents.length);
assertEquals("lat", 2, secondEvents[0].get_preferred_origin().getLocation().latitude, 0.000001);
}
@Test
public void testGetWaitForNext() {
final List<CacheEvent> events = new ArrayList<CacheEvent>();
events.add(MockEventAccessOperations.createEvent(ClockUtil.now().subtract(LONG_AGO), 0f, 0));
events.add(MockEventAccessOperations.createEvent(ClockUtil.now().subtract(LONG_AGO), 1f, 0));
events.add(MockEventAccessOperations.createEvent(ClockUtil.now().subtract(SHORT_AGO), 2f, 0));
EventSource es = new TestSimpleEventSource(events);
DelayedEventSource delayedES = new DelayedEventSource(MED_SHORT_AGO, es);
CacheEvent[] firstEvents = delayedES.next();
TimeInterval wait = delayedES.getWaitBeforeNext();
assertTrue("wait less than MED "+wait, wait.lessThan(MED_SHORT_AGO));
}
}
class TestSimpleEventSource implements EventSource {
boolean first = true;
List<CacheEvent> events;
public TestSimpleEventSource(List<CacheEvent> events) {
this.events = events;
}
@Override
public String getName() {
return null;
}
@Override
public void appendToName(String suffix) {}
@Override
public boolean hasNext() {
return first;
}
@Override
public CacheEvent[] next() {
if (first) {
return events.toArray(new CacheEvent[0]);
}
return null;
}
@Override
public TimeInterval getWaitBeforeNext() {
return DelayedEventSourceTest.MED_SHORT_AGO;
}
@Override
public MicroSecondTimeRange getEventTimeRange() {
return null;
}
@Override
public String getDescription() {
return "fake es";
}
@Override
public int getRetries() {
// TODO Auto-generated method stub
return 0;
}
};