/******************************************************************************* * This file is part of OpenNMS(R). * * Copyright (C) 2006-2011 The OpenNMS Group, Inc. * OpenNMS(R) is Copyright (C) 1999-2011 The OpenNMS Group, Inc. * * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. * * OpenNMS(R) 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, either version 3 of the License, * or (at your option) any later version. * * OpenNMS(R) 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 OpenNMS(R). If not, see: * http://www.gnu.org/licenses/ * * For more information contact: * OpenNMS(R) Licensing <license@opennms.org> * http://www.opennms.org/ * http://www.opennms.com/ *******************************************************************************/ package org.opennms.netmgt.poller.remote; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.expectLastCall; import static org.easymock.EasyMock.getCurrentArguments; import static org.easymock.EasyMock.isA; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.reset; import static org.easymock.EasyMock.verify; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; import junit.framework.TestCase; import org.easymock.EasyMock; import org.easymock.IAnswer; import org.easymock.IArgumentMatcher; import org.opennms.core.utils.TimeKeeper; import org.opennms.netmgt.EventConstants; import org.opennms.netmgt.config.PollerConfig; import org.opennms.netmgt.config.poller.Filter; import org.opennms.netmgt.config.poller.Package; import org.opennms.netmgt.config.poller.Parameter; import org.opennms.netmgt.config.poller.Service; import org.opennms.netmgt.dao.LocationMonitorDao; import org.opennms.netmgt.dao.MonitoredServiceDao; import org.opennms.netmgt.eventd.EventIpcManager; import org.opennms.netmgt.model.NetworkBuilder; import org.opennms.netmgt.model.OnmsDistPoller; import org.opennms.netmgt.model.OnmsLocationMonitor; import org.opennms.netmgt.model.OnmsLocationMonitor.MonitorStatus; import org.opennms.netmgt.model.OnmsLocationSpecificStatus; import org.opennms.netmgt.model.OnmsMonitoredService; import org.opennms.netmgt.model.OnmsMonitoringLocationDefinition; import org.opennms.netmgt.model.OnmsServiceType; import org.opennms.netmgt.model.PollStatus; import org.opennms.netmgt.model.ServiceSelector; import org.opennms.netmgt.model.events.EventBuilder; import org.opennms.netmgt.model.events.EventUtils; import org.opennms.netmgt.poller.DistributionContext; import org.opennms.netmgt.poller.ServiceMonitorLocator; import org.opennms.netmgt.poller.remote.support.DefaultPollerBackEnd; import org.opennms.netmgt.xml.event.Event; import org.quartz.Scheduler; public class PollerBackEndTest extends TestCase { public static class EventEquals implements IArgumentMatcher { private Event m_expected; EventEquals(Event value) { m_expected = value; } public void appendTo(StringBuffer buffer) { buffer.append(m_expected); } public boolean matches(Object argument) { Event actual = (Event)argument; if (m_expected == null) { return actual == null; } return ( m_expected.getUei().equals(actual.getUei()) && nullSafeEquals(m_expected.getSource(), actual.getSource()) && m_expected.getNodeid() == actual.getNodeid() && nullSafeEquals(m_expected.getInterface(), actual.getInterface()) && nullSafeEquals(m_expected.getService(), actual.getService()) && EventUtils.getLongParm(m_expected, EventConstants.PARM_LOCATION_MONITOR_ID, -1) == EventUtils.getLongParm(actual, EventConstants.PARM_LOCATION_MONITOR_ID, -1) ); } private boolean nullSafeEquals(Object a, Object b) { return (a == null ? b == null : a.equals(b)); } } private final class StatusChecker implements IAnswer<Object> { private OnmsLocationSpecificStatus m_status; private StatusChecker(OnmsLocationSpecificStatus status) { m_status = status; } public Object answer() throws Throwable { OnmsLocationSpecificStatus status = (OnmsLocationSpecificStatus)getCurrentArguments()[0]; assertEquals(m_status.getLocationMonitor(), status.getLocationMonitor()); assertEquals(m_status.getMonitoredService(), status.getMonitoredService()); assertEquals(m_status.getPollResult().getStatusCode(), status.getPollResult().getStatusCode()); assertEquals(m_status.getPollResult().getResponseTime(), status.getPollResult().getResponseTime()); assertEquals(m_status.getPollResult().getReason(), status.getPollResult().getReason()); return null; } } static final int DISCONNECTED_TIMEOUT = 300000; // the class under test private DefaultPollerBackEnd m_backEnd = new DefaultPollerBackEnd(); // mock objects that the class will call private LocationMonitorDao m_locMonDao; private MonitoredServiceDao m_monSvcDao; private PollerConfig m_pollerConfig; private Scheduler m_scheduler; private TimeKeeper m_timeKeeper; private EventIpcManager m_eventIpcManager; // helper objects used to respond from the mock objects private OnmsMonitoringLocationDefinition m_locationDefinition; private Package m_package; private ServiceSelector m_serviceSelector; private OnmsLocationMonitor m_locationMonitor; private Service m_httpSvcConfig; private Service m_dnsSvcConfig; private OnmsMonitoredService m_httpService; private OnmsMonitoredService m_dnsService; private OnmsMonitoredService[] m_monServices; private OnmsLocationSpecificStatus m_httpCurrentStatus; private OnmsLocationSpecificStatus m_dnsCurrentStatus; private Date m_startTime; private HashMap<String, String> m_pollerDetails; private void addParameter(Service service, String key, String value) { Parameter param = new Parameter(); param.setKey(key); param.setValue(value); service.addParameter(param); } private Service addService(Package pkg, String serviceName, int serviceInterval, String... parms) { // assume that parms are key then value pairs assertTrue(parms.length % 2 == 0); Service service = new Service(); service.setName(serviceName); service.setInterval(serviceInterval); for(int i = 0; i < parms.length-1; i+=2) { String key = parms[i]; String value = parms[i+1]; addParameter(service, key, value); } pkg.addService(service); return service; } private void anticipateDisconnectedEvent() { anticipateEvent(createDisconnectedEvent()); } private void anticipateEvent(Event e) { m_eventIpcManager.sendNow(eq(e)); } private void anticipateMonitorStarted() { anticipateEvent(createMonitorStartedEvent()); } private void anticipateMonitorRegisteredEvent() { anticipateEvent(createMonitorRegisteredEvent()); } private void anticipateMonitorStoppedEvent() { anticipateEvent(createMonitorStoppedEvent()); } private Event createDisconnectedEvent() { EventBuilder eventBuilder = new EventBuilder(EventConstants.LOCATION_MONITOR_DISCONNECTED_UEI, "PollerBackEnd") .addParam(EventConstants.PARM_LOCATION_MONITOR_ID, 1); Event e = eventBuilder.getEvent(); return e; } private Event createMonitorRegisteredEvent() { EventBuilder eventBuilder = new EventBuilder(EventConstants.LOCATION_MONITOR_REGISTERED_UEI, "PollerBackEnd") .addParam(EventConstants.PARM_LOCATION_MONITOR_ID, 1); Event e = eventBuilder.getEvent(); return e; } private Event createMonitorStartedEvent() { EventBuilder eventBuilder = new EventBuilder(EventConstants.LOCATION_MONITOR_STARTED_UEI, "PollerBackEnd") .addParam(EventConstants.PARM_LOCATION_MONITOR_ID, 1); Event e = eventBuilder.getEvent(); return e; } private Event createMonitorStoppedEvent() { EventBuilder eventBuilder = new EventBuilder(EventConstants.LOCATION_MONITOR_STOPPED_UEI, "PollerBackEnd") .addParam(EventConstants.PARM_LOCATION_MONITOR_ID, 1); return eventBuilder.getEvent(); } private Package createPackage(String pkgName, String filterRule) { Package pkg = new Package(); pkg.setName(pkgName); pkg.setFilter(new Filter()); pkg.getFilter().setContent(filterRule); return pkg; } private Event createReconnectedEvent() { EventBuilder eventBuilder = new EventBuilder(EventConstants.LOCATION_MONITOR_RECONNECTED_UEI, "PollerBackEnd"); eventBuilder.addParam(EventConstants.PARM_LOCATION_MONITOR_ID, 1); return eventBuilder.getEvent(); } private Event eq(Event e) { EasyMock.reportMatcher(new EventEquals(e)); return null; } private void expectLocationMonitorStarted() { final Date now = new Date(); expect(m_timeKeeper.getCurrentDate()).andReturn(now); expect(m_locMonDao.get(m_locationMonitor.getId())).andReturn(m_locationMonitor); m_locMonDao.update(m_locationMonitor); expectLastCall().andAnswer(new IAnswer<Object>() { public Object answer() throws Throwable { OnmsLocationMonitor mon = (OnmsLocationMonitor)getCurrentArguments()[0]; assertEquals(MonitorStatus.STARTED, mon.getStatus()); assertEquals(now, mon.getLastCheckInTime()); assertEquals(m_pollerDetails, mon.getDetails()); return null; } }); } private void expectLocationMonitorStatusChanged(final MonitorStatus oldStatus, final MonitorStatus expectedStatus) { final Date now = new Date(); if (oldStatus != null) { switch (oldStatus) { case DISCONNECTED: case STARTED: expect(m_timeKeeper.getCurrentTime()).andReturn(now.getTime()); } } expect(m_timeKeeper.getCurrentDate()).andReturn(now); expect(m_locMonDao.get(m_locationMonitor.getId())).andReturn(m_locationMonitor); m_locMonDao.update(m_locationMonitor); expectLastCall().andAnswer(new IAnswer<Object>() { public Object answer() throws Throwable { OnmsLocationMonitor mon = (OnmsLocationMonitor)getCurrentArguments()[0]; assertEquals("unexpected new monitor state", expectedStatus, mon.getStatus()); assertEquals(now, mon.getLastCheckInTime()); return null; } }); } private void replayMocks() { replay(m_locMonDao, m_monSvcDao, m_pollerConfig, m_scheduler, m_timeKeeper, m_eventIpcManager); } protected void setUp() throws Exception { System.setProperty("opennms.home", "src/test/test-configurations/PollerBackEndTest-home"); m_locMonDao = createMock(LocationMonitorDao.class); m_monSvcDao = createMock(MonitoredServiceDao.class); m_pollerConfig = createMock(PollerConfig.class); m_scheduler = createMock(Scheduler.class); m_timeKeeper = createMock(TimeKeeper.class); m_eventIpcManager = createMock(EventIpcManager.class); m_backEnd = new DefaultPollerBackEnd(); m_backEnd.setLocationMonitorDao(m_locMonDao); m_backEnd.setMonitoredServiceDao(m_monSvcDao); m_backEnd.setPollerConfig(m_pollerConfig); m_backEnd.setTimeKeeper(m_timeKeeper); m_backEnd.setEventIpcManager(m_eventIpcManager); m_backEnd.setDisconnectedTimeout(DISCONNECTED_TIMEOUT); m_startTime = new Date(System.currentTimeMillis() - 600000); expect(m_timeKeeper.getCurrentDate()).andReturn(m_startTime); replay(m_timeKeeper); m_backEnd.afterPropertiesSet(); verify(m_timeKeeper); reset(m_timeKeeper); // set up some objects that can be used to mock up the tests // the location definition m_locationDefinition = new OnmsMonitoringLocationDefinition(); m_locationDefinition.setArea("Oakland"); m_locationDefinition.setName("OAK"); m_locationDefinition.setPollingPackageName("OAKPackage"); m_package = createPackage(m_locationDefinition.getPollingPackageName(), "ipaddr = '192.168.1.1'"); m_serviceSelector = new ServiceSelector(m_package.getFilter().getContent(), Arrays.asList(new String[]{ "HTTP", "DNS" })); m_httpSvcConfig = addService(m_package, "HTTP", 1234, "url", "http://www.opennms.org"); m_dnsSvcConfig = addService(m_package, "DNS", 5678, "hostname", "www.opennms.org"); m_locationMonitor = new OnmsLocationMonitor(); m_locationMonitor.setId(1); m_locationMonitor.setDefinitionName(m_locationDefinition.getName()); NetworkBuilder builder = new NetworkBuilder(new OnmsDistPoller("localhost", "127.0.0.1")); builder.addNode("testNode").setId(1); builder.addInterface("192.168.1.1").setId(1); m_httpService = builder.addService(new OnmsServiceType("HTTP")); m_httpService.setId(1); m_dnsService = builder.addService(new OnmsServiceType("DNS")); m_dnsService.setId(2); m_monServices = new OnmsMonitoredService[] { m_httpService, m_dnsService }; long now = System.currentTimeMillis(); PollStatus httpResult = PollStatus.available(1000.0); httpResult.setTimestamp(new Date(now - 300000)); m_httpCurrentStatus = new OnmsLocationSpecificStatus(m_locationMonitor, m_httpService, httpResult); m_httpCurrentStatus.setId(1); PollStatus dnsResult = PollStatus.unavailable("Non responsive"); dnsResult.setTimestamp(new Date(now - 300000)); m_dnsCurrentStatus = new OnmsLocationSpecificStatus(m_locationMonitor, m_dnsService, dnsResult); m_dnsCurrentStatus.setId(2); m_pollerDetails = new HashMap<String, String>(); m_pollerDetails.put("os.name", "WonkaOS"); m_pollerDetails.put("os.version", "1.2.3"); } public void testGetMonitoringLocations() { List<OnmsMonitoringLocationDefinition> locations = Collections.singletonList(m_locationDefinition); expect(m_locMonDao.findAllMonitoringLocationDefinitions()).andReturn(locations); replayMocks(); Collection<OnmsMonitoringLocationDefinition> returned = m_backEnd.getMonitoringLocations(); verifyMocks(); assertEquals(locations, returned); } public void testGetPollerConfiguration() { expect(m_locMonDao.get(m_locationMonitor.getId())).andReturn(m_locationMonitor); expect(m_locMonDao.findMonitoringLocationDefinition(m_locationDefinition.getName())).andReturn(m_locationDefinition); expect(m_pollerConfig.getPackage(m_locationDefinition.getPollingPackageName())).andReturn(m_package); expect(m_pollerConfig.getServiceSelectorForPackage(m_package)).andReturn(m_serviceSelector); expect(m_pollerConfig.getServiceInPackage("HTTP", m_package)).andReturn(m_httpSvcConfig); expect(m_pollerConfig.getServiceInPackage("DNS", m_package)).andReturn(m_dnsSvcConfig); expect(m_monSvcDao.findMatchingServices(m_serviceSelector)).andReturn(Arrays.asList(m_monServices)); replayMocks(); PollerConfiguration config = m_backEnd.getPollerConfiguration(m_locationMonitor.getId()); verifyMocks(); assertNotNull(config); assertEquals(m_startTime, config.getConfigurationTimestamp()); assertNotNull(config.getPolledServices()); assertEquals(2, config.getPolledServices().length); Map<String,PolledService> services = new TreeMap<String,PolledService>(); for (final PolledService ps : config.getPolledServices()) { services.put(ps.getSvcName(), ps); } //Because the config is sorted DNS will change from index 1 to index 0; assertTrue(services.keySet().contains(m_dnsService.getServiceName())); assertTrue(services.keySet().contains(m_httpService.getServiceName())); assertEquals(5678, services.get("DNS").getPollModel().getPollInterval()); assertTrue(services.get("DNS").getMonitorConfiguration().containsKey("hostname")); } public void testGetPollerConfigurationForDeletedMonitor() { expect(m_locMonDao.get(m_locationMonitor.getId())).andReturn(null); replayMocks(); PollerConfiguration config = m_backEnd.getPollerConfiguration(m_locationMonitor.getId()); verifyMocks(); assertNotNull(config); assertTrue(m_startTime.after(config.getConfigurationTimestamp())); assertNotNull(config.getPolledServices()); assertEquals(0, config.getPolledServices().length); } public void testGetServiceMonitorLocators() { Collection<ServiceMonitorLocator> locators = new ArrayList<ServiceMonitorLocator>(); expect(m_pollerConfig.getServiceMonitorLocators(DistributionContext.REMOTE_MONITOR)).andReturn(locators); replayMocks(); Collection<ServiceMonitorLocator> results = m_backEnd.getServiceMonitorLocators(DistributionContext.REMOTE_MONITOR); verifyMocks(); assertSame(locators, results); } private void testGlobalConfigChange(MonitorStatus oldStatus, MonitorStatus newStatus, Event e) { verifyPollerCheckingIn(MonitorStatus.STARTED, MonitorStatus.STARTED, MonitorStatus.STARTED); updateConfiguration(); verifyPollerCheckingIn(oldStatus, newStatus, MonitorStatus.CONFIG_CHANGED, e); } public void testGlobalConfigChangeFromDisconnected() { testGlobalConfigChange(MonitorStatus.DISCONNECTED, MonitorStatus.STARTED, createReconnectedEvent()); } public void testGlobalConfigChangeFromStarted() { testGlobalConfigChange(MonitorStatus.STARTED, MonitorStatus.STARTED, null); } public void testPollerCheckingInFromDisconnected() { verifyPollerCheckingIn(MonitorStatus.DISCONNECTED, MonitorStatus.STARTED, MonitorStatus.STARTED, createReconnectedEvent()); } public void testPollerCheckingInFromPaused() { verifyPollerCheckingIn(MonitorStatus.PAUSED, MonitorStatus.PAUSED, MonitorStatus.PAUSED); } public void testPollerCheckingInFromStarted() { verifyPollerCheckingIn(MonitorStatus.STARTED, MonitorStatus.STARTED, MonitorStatus.STARTED); } public void testPollerCheckingInFromConfigChanged() { verifyPollerCheckingIn(MonitorStatus.CONFIG_CHANGED, MonitorStatus.STARTED, MonitorStatus.CONFIG_CHANGED); } public void testPollerStarting() { anticipateMonitorStarted(); expectLocationMonitorStarted(); replayMocks(); m_backEnd.pollerStarting(1, m_pollerDetails); verifyMocks(); } public void testPollerStopping() { anticipateMonitorStoppedEvent(); expectLocationMonitorStatusChanged(null, MonitorStatus.STOPPED); replayMocks(); m_backEnd.pollerStopping(1); verifyMocks(); } public void testPollerStoppingWithBadLocationMonitorId() { expect(m_locMonDao.get(1)).andReturn(null); replayMocks(); m_backEnd.pollerStopping(1); verifyMocks(); } public void testRegisterLocationMonitor() { expect(m_locMonDao.findMonitoringLocationDefinition(m_locationDefinition.getName())).andReturn(m_locationDefinition); m_locMonDao.save(isA(OnmsLocationMonitor.class)); expectLastCall().andAnswer(new IAnswer<Object>() { public Object answer() throws Throwable { OnmsLocationMonitor mon = (OnmsLocationMonitor)getCurrentArguments()[0]; mon.setId(1); assertEquals(OnmsLocationMonitor.MonitorStatus.REGISTERED, mon.getStatus()); return null; } }); anticipateMonitorRegisteredEvent(); replayMocks(); int locationMonitorId = m_backEnd.registerLocationMonitor(m_locationDefinition.getName()); verifyMocks(); assertEquals(1, locationMonitorId); } public void testReportResultWithBadLocationMonitorId() { expect(m_locMonDao.get(1)).andReturn(null); replayMocks(); m_backEnd.reportResult(1, 1, PollStatus.up()); verifyMocks(); } public void testReportResultWithBadServiceId() { expect(m_locMonDao.get(1)).andReturn(new OnmsLocationMonitor()); expect(m_monSvcDao.get(1)).andReturn(null); replayMocks(); m_backEnd.reportResult(1, 1, PollStatus.up()); verifyMocks(); } public void testReportResultWithNullPollResult() { expect(m_locMonDao.get(1)).andThrow(new RuntimeException("crazy location monitor exception")); replayMocks(); m_backEnd.reportResult(1, 1, null); verifyMocks(); } public void testStatusChangeFromDownToUp() { expect(m_locMonDao.get(1)).andReturn(m_locationMonitor); expect(m_monSvcDao.get(2)).andReturn(m_dnsService); expect(m_locMonDao.getMostRecentStatusChange(m_locationMonitor, m_dnsService)).andReturn(m_dnsCurrentStatus); // called when saving performance data expect(m_locMonDao.findMonitoringLocationDefinition(m_locationDefinition.getName())).andReturn(m_locationDefinition); expect(m_pollerConfig.getPackage(m_locationDefinition.getPollingPackageName())).andReturn(m_package); final PollStatus newStatus = PollStatus.available(1234.0); OnmsLocationSpecificStatus expectedStatus = new OnmsLocationSpecificStatus(m_locationMonitor, m_dnsService, newStatus); m_pollerConfig.saveResponseTimeData(Integer.toString(m_locationMonitor.getId()), m_dnsService, 1234, m_package); // TODO: make anticipate method EventBuilder eventBuilder = new EventBuilder(EventConstants.REMOTE_NODE_REGAINED_SERVICE_UEI, "PollerBackEnd") .setMonitoredService(m_dnsService) .addParam(EventConstants.PARM_LOCATION_MONITOR_ID, "1"); m_eventIpcManager.sendNow(eq(eventBuilder.getEvent())); m_locMonDao.saveStatusChange(isA(OnmsLocationSpecificStatus.class)); expectLastCall().andAnswer(new StatusChecker(expectedStatus)); replayMocks(); m_backEnd.reportResult(1, 2, newStatus); verifyMocks(); } // reportResult test variations // what if we cant' find the locationMonitor with that ID // what if we can't find the service with that ID // what if we can't find a current status // do I send events for status changed public void testStatusChangeFromUpToDown() { expect(m_locMonDao.get(1)).andReturn(m_locationMonitor); expect(m_monSvcDao.get(1)).andReturn(m_httpService); expect(m_locMonDao.getMostRecentStatusChange(m_locationMonitor, m_httpService)).andReturn(m_httpCurrentStatus); // TODO: make anticipate method EventBuilder eventBuilder = new EventBuilder(EventConstants.REMOTE_NODE_LOST_SERVICE_UEI, "PollerBackEnd") .setMonitoredService(m_httpService) .addParam(EventConstants.PARM_LOCATION_MONITOR_ID, "1"); m_eventIpcManager.sendNow(eq(eventBuilder.getEvent())); final PollStatus newStatus = PollStatus.unavailable("Test Down"); OnmsLocationSpecificStatus expectedStatus = new OnmsLocationSpecificStatus(m_locationMonitor, m_httpService, newStatus); m_locMonDao.saveStatusChange(isA(OnmsLocationSpecificStatus.class)); expectLastCall().andAnswer(new StatusChecker(expectedStatus)); replayMocks(); m_backEnd.reportResult(1, 1, newStatus); verifyMocks(); } public void testStatusDownWhenDown() { expect(m_locMonDao.get(1)).andReturn(m_locationMonitor); expect(m_monSvcDao.get(2)).andReturn(m_dnsService); expect(m_locMonDao.getMostRecentStatusChange(m_locationMonitor, m_dnsService)).andReturn(m_dnsCurrentStatus); final PollStatus newStatus = PollStatus.unavailable("Still Down"); // expect no status changes // expect no performance data replayMocks(); m_backEnd.reportResult(1, 2, newStatus); verifyMocks(); } public void testStatusDownWhenNoneKnown() { expect(m_locMonDao.get(1)).andReturn(m_locationMonitor); expect(m_monSvcDao.get(2)).andReturn(m_dnsService); expect(m_locMonDao.getMostRecentStatusChange(m_locationMonitor, m_dnsService)).andReturn(null); final PollStatus newStatus = PollStatus.unavailable("where'd he go?"); OnmsLocationSpecificStatus expectedStatus = new OnmsLocationSpecificStatus(m_locationMonitor, m_dnsService, newStatus); m_locMonDao.saveStatusChange(isA(OnmsLocationSpecificStatus.class)); expectLastCall().andAnswer(new StatusChecker(expectedStatus)); // expect a status change if the node is now down and we didn't know before EventBuilder eventBuilder = new EventBuilder(EventConstants.REMOTE_NODE_LOST_SERVICE_UEI, "PollerBackEnd") .setMonitoredService(m_dnsService) .addParam(EventConstants.PARM_LOCATION_MONITOR_ID, "1"); m_eventIpcManager.sendNow(eq(eventBuilder.getEvent())); replayMocks(); m_backEnd.reportResult(1, 2, newStatus); verifyMocks(); } public void testStatusUpWhenNoneKnown() { expect(m_locMonDao.get(1)).andReturn(m_locationMonitor); expect(m_monSvcDao.get(2)).andReturn(m_dnsService); expect(m_locMonDao.getMostRecentStatusChange(m_locationMonitor, m_dnsService)).andReturn(null); // called when saving performance data expect(m_locMonDao.findMonitoringLocationDefinition(m_locationDefinition.getName())).andReturn(m_locationDefinition); expect(m_pollerConfig.getPackage(m_locationDefinition.getPollingPackageName())).andReturn(m_package); final PollStatus newStatus = PollStatus.available(1234.0); OnmsLocationSpecificStatus expectedStatus = new OnmsLocationSpecificStatus(m_locationMonitor, m_dnsService, newStatus); m_pollerConfig.saveResponseTimeData(Integer.toString(m_locationMonitor.getId()), m_dnsService, 1234, m_package); m_locMonDao.saveStatusChange(isA(OnmsLocationSpecificStatus.class)); expectLastCall().andAnswer(new StatusChecker(expectedStatus)); replayMocks(); m_backEnd.reportResult(1, 2, newStatus); verifyMocks(); } public void testStatusUpWhenUp() { expect(m_locMonDao.get(1)).andReturn(m_locationMonitor); expect(m_monSvcDao.get(1)).andReturn(m_httpService); expect(m_locMonDao.getMostRecentStatusChange(m_locationMonitor, m_httpService)).andReturn(m_httpCurrentStatus); final PollStatus newStatus = PollStatus.available(1776.0); // called when saving performance data expect(m_locMonDao.findMonitoringLocationDefinition(m_locationDefinition.getName())).andReturn(m_locationDefinition); expect(m_pollerConfig.getPackage(m_locationDefinition.getPollingPackageName())).andReturn(m_package); // expect to save performance data m_pollerConfig.saveResponseTimeData(Integer.toString(m_locationMonitor.getId()), m_httpService, 1776, m_package); // expect no status change replayMocks(); m_backEnd.reportResult(1, 1, newStatus); verifyMocks(); } public void testTimeOutOnCheckin() { final Date now = new Date(); m_locationMonitor.setStatus(MonitorStatus.STARTED); m_locationMonitor.setLastCheckInTime(new Date(now.getTime() - DISCONNECTED_TIMEOUT - 100)); expect(m_locMonDao.findAll()).andReturn(Collections.singletonList(m_locationMonitor)); expect(m_timeKeeper.getCurrentDate()).andReturn(now); anticipateDisconnectedEvent(); m_locMonDao.update(m_locationMonitor); expectLastCall().andAnswer(new IAnswer<Object>() { public Object answer() throws Throwable { OnmsLocationMonitor mon = (OnmsLocationMonitor)getCurrentArguments()[0]; assertEquals(MonitorStatus.DISCONNECTED, mon.getStatus()); assertTrue(mon.getLastCheckInTime().before(new Date(now.getTime() - DISCONNECTED_TIMEOUT))); return null; } }); replayMocks(); m_backEnd.checkForDisconnectedMonitors(); verifyMocks(); } private void updateConfiguration() { expect(m_timeKeeper.getCurrentDate()).andReturn(new Date()); replayMocks(); m_backEnd.configurationUpdated(); verifyMocks(); } private void verifyMocks() { verify(m_locMonDao, m_monSvcDao, m_pollerConfig, m_scheduler, m_timeKeeper, m_eventIpcManager); reset(m_locMonDao, m_monSvcDao, m_pollerConfig, m_scheduler, m_timeKeeper, m_eventIpcManager); } private void verifyPollerCheckingIn(MonitorStatus oldStatus, MonitorStatus newStatus, MonitorStatus result) { verifyPollerCheckingIn(oldStatus, newStatus, result, null); } private void verifyPollerCheckingIn(MonitorStatus oldStatus, MonitorStatus newStatus, MonitorStatus result, Event e) { m_locationMonitor.setStatus(oldStatus); expectLocationMonitorStatusChanged(oldStatus, newStatus); if (e != null) { anticipateEvent(e); } replayMocks(); assertEquals("Unexpected result state", result, m_backEnd.pollerCheckingIn(1, m_startTime)); verifyMocks(); } }