/******************************************************************************* * 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.expect; import static org.easymock.EasyMock.expectLastCall; import static org.easymock.EasyMock.isA; import static org.springframework.util.ObjectUtils.nullSafeEquals; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Collections; import java.util.Date; import java.util.Map; import java.util.Set; import junit.framework.TestCase; import org.easymock.EasyMock; import org.easymock.IArgumentMatcher; import org.opennms.netmgt.config.DefaultServiceMonitorLocator; import org.opennms.netmgt.model.PollStatus; import org.opennms.netmgt.model.OnmsLocationMonitor.MonitorStatus; import org.opennms.netmgt.poller.DistributionContext; import org.opennms.netmgt.poller.ServiceMonitorLocator; import org.opennms.netmgt.poller.monitors.HttpMonitor; import org.opennms.netmgt.poller.remote.support.DefaultPollerFrontEnd; import org.opennms.test.mock.EasyMockUtils; public class PollerFrontEndTest extends TestCase { public static class PolledServiceChangeEventEquals implements IArgumentMatcher { private ServicePollStateChangedEvent m_expected; PolledServiceChangeEventEquals(ServicePollStateChangedEvent value) { m_expected = value; } public void appendTo(StringBuffer buffer) { buffer.append(m_expected); } public boolean matches(Object argument) { ServicePollStateChangedEvent actual = (ServicePollStateChangedEvent) argument; if (m_expected == null) { return actual == null; } return (m_expected.getSource() == actual.getSource() && m_expected .getIndex() == actual.getIndex()); } } public static class PropertyChangeEventEquals implements IArgumentMatcher { private PropertyChangeEvent m_expected; PropertyChangeEventEquals(PropertyChangeEvent value) { m_expected = value; } public void appendTo(StringBuffer buffer) { buffer.append(m_expected); buffer.append(" property="); buffer.append(m_expected.getPropertyName()); buffer.append(", oldValue="); buffer.append(m_expected.getOldValue()); buffer.append(", newValue="); buffer.append(m_expected.getNewValue()); } public boolean matches(Object argument) { PropertyChangeEvent actual = (PropertyChangeEvent) argument; if (m_expected == actual) return true; if (m_expected == null) { return actual == null; } return (m_expected.getSource() == actual.getSource() && m_expected.getPropertyName().equals(actual.getPropertyName()) && nullSafeEquals(m_expected.getOldValue(), actual.getOldValue()) && nullSafeEquals(m_expected.getNewValue(), actual.getNewValue())); } } private PollerBackEnd m_backEnd; private ConfigurationChangedListener m_configChangeListener; private DefaultPollerFrontEnd m_frontEnd; private EasyMockUtils m_mock = new EasyMockUtils(); private DemoPollerConfiguration m_oldPollerConfiguration; private ServicePollStateChangedListener m_polledServiceListener; private DemoPollerConfiguration m_pollerConfiguration; private PollService m_pollService; private Integer m_registeredId; private PropertyChangeListener m_registrationListener; private PollStatus m_serviceStatus; private PollerSettings m_settings; private MonitorStatus m_oldStatus = MonitorStatus.STARTED; private MonitorStatus m_monitorStatus = MonitorStatus.CONFIG_CHANGED; public void testAfterPropertiesSetWhenNotRegistered() throws Exception { testAfterPropertiesSetWithRegisteredId(null); } public void testAfterPropertiesSetWhenRegistered() throws Exception { testAfterPropertiesSetWithRegisteredId(1); } public void testAlreadyRegistered() throws Exception { setRegistered(); anticipateAfterPropertiesSet(); m_mock.replayAll(); m_frontEnd.afterPropertiesSet(); assertTrue(m_frontEnd.isRegistered()); m_mock.verifyAll(); } public void testConfigCheck() throws Exception { setRegistered(); anticipateAfterPropertiesSet(); anticipateCheckConfig(); m_mock.replayAll(); m_frontEnd.afterPropertiesSet(); m_frontEnd.checkConfig(); m_mock.verifyAll(); } public void testDetails() { Map<String, String> details = m_frontEnd.getDetails(); assertPropertyEquals("os.name", details); assertPropertyEquals("os.version", details); } public void testIsRegistered() throws Exception { setRegistered(); anticipateAfterPropertiesSet(); m_mock.replayAll(); m_frontEnd.afterPropertiesSet(); assertTrue(m_frontEnd.isRegistered()); m_mock.verifyAll(); } public void testNotYetRegistered() throws Exception { setRegisteredId(null); anticipateAfterPropertiesSet(); m_mock.replayAll(); m_frontEnd.afterPropertiesSet(); assertFalse(m_frontEnd.isRegistered()); m_mock.verifyAll(); } public void testPoll() throws Exception { setRegistered(); anticipateAfterPropertiesSet(); anticipatePollService(); anticipateGetServicePollState(); m_mock.replayAll(); m_frontEnd.afterPropertiesSet(); m_frontEnd.pollService(pollConfig().getFirstId()); ServicePollState pollState = m_frontEnd .getServicePollState(pollConfig().getFirstId()); m_mock.verifyAll(); assertEquals(PollStatus.SERVICE_AVAILABLE, pollState.getLastPoll() .getStatusCode()); } public void testRegisterNewMonitor() throws Exception { anticipateAfterPropertiesSet(); anticiapateRegister(); m_mock.replayAll(); m_frontEnd.afterPropertiesSet(); assertFalse(m_frontEnd.isRegistered()); m_frontEnd.register("OAK"); assertTrue(m_frontEnd.isRegistered()); m_mock.verifyAll(); } public void testSetInitialPollTime() throws Exception { Date start = new Date(1200000000000L); setRegistered(); anticipateAfterPropertiesSet(); int polledServiceId = pollConfig().getFirstId(); anticipateSetInitialPollTime(); anticipateGetServicePollState(); // expect(m_settings.getMonitorId()).andReturn(1).atLeastOnce(); // anticipateNewConfig(pollConfig()); // expect(m_backEnd.pollerStarting(1, getPollerDetails())).andReturn(true); m_mock.replayAll(); m_frontEnd.afterPropertiesSet(); m_frontEnd.setInitialPollTime(polledServiceId, start); assertEquals(start, m_frontEnd.getServicePollState(polledServiceId) .getNextPollTime()); m_mock.verifyAll(); } public void testStop() throws Exception { setRegistered(); anticipateAfterPropertiesSet(); anticipateStop(); m_mock.replayAll(); m_frontEnd.afterPropertiesSet(); assertTrue(m_frontEnd.isStarted()); m_frontEnd.stop(); assertFalse(m_frontEnd.isStarted()); m_mock.verifyAll(); } public void testPause() throws Exception { setRegistered(); anticipateAfterPropertiesSet(); setMonitorStatus(MonitorStatus.PAUSED); anticipateCheckConfig(); setMonitorStatus(MonitorStatus.STARTED); anticipateCheckConfig(); m_mock.replayAll(); m_frontEnd.afterPropertiesSet(); m_frontEnd.checkConfig(); m_frontEnd.checkConfig(); m_mock.verifyAll(); } public void testDisconnect() throws Exception { setRegistered(); anticipateAfterPropertiesSet(); setMonitorStatus(MonitorStatus.DISCONNECTED); anticipateCheckConfig(); setMonitorStatus(MonitorStatus.STARTED); anticipateCheckConfig(); m_mock.replayAll(); m_frontEnd.afterPropertiesSet(); m_frontEnd.checkConfig(); m_frontEnd.checkConfig(); m_mock.verifyAll(); } private void setMonitorStatus(MonitorStatus status) { m_oldStatus = m_monitorStatus; m_monitorStatus = status; } @Override protected void setUp() throws Exception { m_backEnd = m_mock.createMock(PollerBackEnd.class); m_settings = m_mock.createMock(PollerSettings.class); m_pollService = m_mock.createMock(PollService.class); m_registrationListener = m_mock.createMock(PropertyChangeListener.class); m_polledServiceListener = m_mock.createMock(ServicePollStateChangedListener.class); m_configChangeListener = m_mock.createMock(ConfigurationChangedListener.class); setPollConfig(new DemoPollerConfiguration()); m_oldPollerConfiguration = null; m_frontEnd = new DefaultPollerFrontEnd(); m_frontEnd.setTimeAdjustment(new DefaultTimeAdjustment()); // ServerUnreachableAdaptor adaptor = new ServerUnreachableAdaptor(); // adaptor.setRemoteBackEnd(m_backEnd); // m_frontEnd.setPollerBackEnd(adaptor); m_frontEnd.setPollerBackEnd(m_backEnd); m_frontEnd.setPollerSettings(m_settings); m_frontEnd.setPollService(m_pollService); m_frontEnd.addConfigurationChangedListener(m_configChangeListener); m_frontEnd.addPropertyChangeListener(m_registrationListener); m_frontEnd.addServicePollStateChangedListener(m_polledServiceListener); m_serviceStatus = PollStatus.available(1234.0); } private void anticiapateRegister() { anticipateRegisterLocationMonitor(); anticipateDoPollerStart(); } private void anticipateAfterPropertiesSet() { anticipateGetMonitorId(); if (getRegisteredId() == null) return; anticipateDoPollerStart(); } private void anticipateDoPollerStart() { anticipateGetMonitorId(); anticipatePollerStarting(); anticipateDoLoadConfig(); anticipateFirePropertyChangeEvent("registered", false, true); anticipateFirePropertyChangeEvent("started", false, true); } private void anticipateDoLoadConfig() { anticipatePollServiceSetMonitorLocators(); anticipateGetMonitorId(); anticipateGetConfiguration(); anticipatePolledServicesInitialized(); anticipateFireConfigurationChangeEvent(); } private void anticipatePollerStarting() { expect(m_backEnd.pollerStarting(getRegisteredId(), getPollerDetails())) .andReturn(true); } private void anticipateCheckConfig() { anticipateDoCheckIn(); } private void anticipateDoCheckIn() { anticipateGetMonitorId(); anticipatePollerCheckingIn(); switch(m_monitorStatus) { case CONFIG_CHANGED: anticipateDoLoadConfig(); break; case PAUSED: anticipateDoPause(); break; case DISCONNECTED: anticipateDoDisconnect(); break; case STARTED: if (m_oldStatus == MonitorStatus.PAUSED) { anticipateDoResume(); } else if (m_oldStatus == MonitorStatus.DISCONNECTED) { anticipateReconnect(); } break; } } private void anticipateReconnect() { anticipateDoLoadConfig(); anticipateFirePropertyChangeEvent("disconnected", true, false); } private void anticipateDoDisconnect() { anticipateDoLoadConfig(); anticipateFirePropertyChangeEvent("disconnected", false, true); } private void anticipateDoResume() { anticipateDoLoadConfig(); anticipateFirePropertyChangeEvent("paused", true, false); } private void anticipateDoPause() { anticipateFirePropertyChangeEvent("paused", false, true); } private void anticipateDoPoll() { anticipateGetPolledService(); expect(m_pollService.poll(pollConfig().getFirstService())).andReturn(m_serviceStatus); } private void anticipateFireConfigurationChangeEvent() { PropertyChangeEvent e = new PropertyChangeEvent(m_frontEnd, "configuration", (oldConfig() == null ? null : oldConfig().getConfigurationTimestamp()), (pollConfig() == null ? null : pollConfig().getConfigurationTimestamp())); m_configChangeListener.configurationChanged(eq(e)); } private void anticipateFirePropertyChangeEvent(String property, Object oldValue, Object newValue) { PropertyChangeEvent e= new PropertyChangeEvent(m_frontEnd, property, oldValue, newValue); m_registrationListener.propertyChange(eq(e)); } private void anticipateFireServicePollStateChanged() { ServicePollStateChangedEvent e = new ServicePollStateChangedEvent(pollConfig().getFirstService(), 0); m_polledServiceListener.pollStateChange(eq(e)); } private void anticipateGetConfiguration() { expect(m_backEnd.getPollerConfiguration(1)).andReturn(pollConfig()); } private void anticipateGetMonitorId() { expect(m_settings.getMonitorId()).andReturn(getRegisteredId()); } private void anticipateGetPolledService() { anticipateGetServicePollState(); } private void anticipateGetServicePollState() { } private void anticipatePolledServicesInitialized() { m_pollService.initialize(isA(PolledService.class)); expectLastCall().times(pollConfig().getPolledServices().length); } private void anticipatePollerCheckingIn() { Date oldTimestamp = pollConfig().getConfigurationTimestamp(); switch(m_monitorStatus) { case CONFIG_CHANGED: setPollConfig(new DemoPollerConfiguration()); break; case DISCONNECTED: setPollConfig(new DemoPollerConfiguration(new Date(0))); break; case STARTED: if (m_oldStatus != MonitorStatus.STARTED) { setPollConfig(new DemoPollerConfiguration()); } } expect(m_backEnd.pollerCheckingIn(1, oldTimestamp)).andReturn(m_monitorStatus); } private void anticipatePollerStopping() { m_backEnd.pollerStopping(getRegisteredId()); } private void anticipatePollService() { anticipateDoPoll(); anticipateUpdateServicePollState(); anticipateGetMonitorId(); anticipateReportResult(); } private void anticipatePollServiceSetMonitorLocators() { ServiceMonitorLocator locator = new DefaultServiceMonitorLocator( "HTTP", HttpMonitor.class); Set<ServiceMonitorLocator> locators = Collections.singleton(locator); expect( m_backEnd .getServiceMonitorLocators(DistributionContext.REMOTE_MONITOR)) .andReturn(locators); m_pollService.setServiceMonitorLocators(locators); } private void anticipateRegisterLocationMonitor() { setRegistered(); expect(m_backEnd.registerLocationMonitor("OAK")).andReturn(getRegisteredId()); m_settings.setMonitorId(getRegisteredId()); } private void anticipateReportResult() { m_backEnd.reportResult(getRegisteredId(), pollConfig().getFirstId(), m_serviceStatus); } private void anticipateSetInitialPollTime() { anticipateGetServicePollState(); anticipateFireServicePollStateChanged(); } private void anticipateStop() { anticipateGetMonitorId(); anticipatePollerStopping(); anticipateFirePropertyChangeEvent("registered", true, false); anticipateFirePropertyChangeEvent("started", true, false); } private void anticipateUpdateServicePollState() { anticipateGetServicePollState(); anticipateFireServicePollStateChanged(); } private void assertPropertyEquals(String propertyName, Map<String, String> details) { assertNotNull("has " + propertyName, details.get(propertyName)); assertEquals(propertyName, System.getProperty(propertyName), details .get(propertyName)); } private PropertyChangeEvent eq(PropertyChangeEvent e) { EasyMock.reportMatcher(new PropertyChangeEventEquals(e)); return null; } private ServicePollStateChangedEvent eq(ServicePollStateChangedEvent e) { EasyMock.reportMatcher(new PolledServiceChangeEventEquals(e)); return null; } private Map<String, String> getPollerDetails() { return m_frontEnd.getDetails(); } private Integer getRegisteredId() { return m_registeredId; } private DemoPollerConfiguration oldConfig() { return m_oldPollerConfiguration; } private DemoPollerConfiguration pollConfig() { return m_pollerConfiguration; } private void setPollConfig(DemoPollerConfiguration pollerConfiguration) { m_oldPollerConfiguration = pollConfig(); m_pollerConfiguration = pollerConfiguration; } private void setRegistered() { setRegisteredId(1); } private void setRegisteredId(Integer registeredId) { m_registeredId = registeredId; } private void testAfterPropertiesSetWithRegisteredId(Integer registeredId) throws Exception { setRegisteredId(registeredId); anticipateAfterPropertiesSet(); m_mock.replayAll(); m_frontEnd.afterPropertiesSet(); m_mock.verifyAll(); } }