### Question:
AbstractEventProducer implements EventProducer { @Override public synchronized void sendInfo(String type, String msg) { sendMessage(EventSeverity.INFO, type, msg); }  @Override void setSource(String source); @Override void setSeqNo(int sn); @Override synchronized void sendError(String type, String msg); @Override synchronized void sendWarning(String type, String msg); @Override synchronized void sendInfo(String type, String msg); @Override synchronized void sendWatch(String type, String msg); @Override synchronized void sendDistress(String type, String msg); @Override synchronized void sendCritical(String type, String msg); @Override synchronized void sendSevere(String type, String msg); @Override void sendInfo(String msg); @Override void sendWatch(String msg); @Override void sendWarning(String msg); @Override void sendCritical(String msg); @Override void sendDistress(String msg); @Override void sendSevere(String msg); @Override synchronized void setRepeatedEventReduction(boolean repeatedEventReduction,
            long repeatedEventTimeoutMillisec); @Override Event.Builder newEvent(); abstract long getMissionTime();  }### Answer:
@Test public void testEventReduction_flushOne() { producer.sendInfo("a-type", "a-msg"); assertMsgsEqual("a-msg"); assertSeqNosEqual(0); }
@Test public void testEventReduction_interleave() { producer.sendInfo("a-type", "a-msg"); producer.sendInfo("a-type", "a-msg"); producer.sendInfo("a-type", "another-msg"); producer.sendInfo("a-type", "a-msg"); producer.sendInfo("a-type", "another-msg"); producer.sendInfo("a-type", "another-msg"); producer.sendInfo("a-type", "another-msg"); producer.sendInfo("a-type", "a-msg"); assertMsgsEqual("a-msg", "a-msg", "another-msg", "a-msg", "another-msg", "Repeated 2 times: another-msg", "a-msg"); assertSeqNosEqual(0, 1, 2, 3, 4, 6, 7); }