/******************************************************************************* * This file is part of OpenNMS(R). * * Copyright (C) 2010-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.features.poller.remote.gwt.server; import static org.easymock.EasyMock.expectLastCall; import static org.easymock.EasyMock.isA; import static org.easymock.EasyMock.reportMatcher; import static org.junit.Assert.assertEquals; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.GregorianCalendar; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Map.Entry; import org.easymock.IArgumentMatcher; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.opennms.features.poller.remote.gwt.client.ApplicationInfo; import org.opennms.features.poller.remote.gwt.client.Status; import org.opennms.features.poller.remote.gwt.client.StatusDetails; import org.opennms.features.poller.remote.gwt.client.location.LocationInfo; import org.opennms.features.poller.remote.gwt.client.remoteevents.ApplicationUpdatedRemoteEvent; import org.opennms.features.poller.remote.gwt.client.remoteevents.LocationUpdatedRemoteEvent; import org.opennms.features.poller.remote.gwt.client.remoteevents.UpdateCompleteRemoteEvent; import org.opennms.netmgt.dao.ApplicationDao; import org.opennms.netmgt.dao.LocationMonitorDao; import org.opennms.netmgt.dao.db.JUnitConfigurationEnvironment; import org.opennms.netmgt.dao.db.JUnitTemporaryDatabase; import org.opennms.core.test.MockLogAppender; import org.opennms.core.test.OpenNMSJUnit4ClassRunner; import org.opennms.core.utils.BeanUtils; import org.opennms.netmgt.model.OnmsApplication; import org.opennms.netmgt.model.OnmsLocationMonitor; import org.opennms.netmgt.model.OnmsLocationSpecificStatus; import org.opennms.netmgt.model.OnmsMonitoringLocationDefinition; import org.opennms.test.mock.EasyMockUtils; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.transaction.annotation.Transactional; import de.novanic.eventservice.service.EventExecutorService; @RunWith(OpenNMSJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:META-INF/opennms/mockEventIpcManager.xml", "classpath:/META-INF/opennms/applicationContext-dao.xml", "classpath*:/META-INF/opennms/component-dao.xml", "classpath:/META-INF/opennms/applicationContext-daemon.xml", "file:src/main/webapp/WEB-INF/applicationContext-remote-poller.xml", "classpath:/locationDataManagerTest.xml" }) @JUnitConfigurationEnvironment @JUnitTemporaryDatabase(useExistingDatabase="opennms") @Transactional @Ignore("requires custom database") public class LocationDataManagerTest implements InitializingBean { private static final DateFormat s_format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS"); @Autowired private LocationMonitorDao m_locationMonitorDao; @Autowired private LocationDataManager m_locationDataManager; @Autowired private LocationDataService m_locationDataService; @Autowired private ApplicationDao m_applicationDao; private EasyMockUtils m_easyMockUtils = new EasyMockUtils(); @Override public void afterPropertiesSet() throws Exception { BeanUtils.assertAutowiring(this); } @Before public void setUp() { Properties p = new Properties(); p.setProperty("log4j.logger.org.hibernate", "INFO"); p.setProperty("log4j.logger.org.hibernate.SQL", "DEBUG"); MockLogAppender.setupLogging(p); } @Test public void testHandleAllMonitoringLocationDefinitions() { LocationDefHandler handler = m_easyMockUtils.createMock(LocationDefHandler.class); handler.start(2880); handler.handle(isA(OnmsMonitoringLocationDefinition.class)); expectLastCall().times(2880); handler.finish(); m_easyMockUtils.replayAll(); m_locationDataService.handleAllMonitoringLocationDefinitions(Collections.singleton(handler)); m_easyMockUtils.verifyAll(); } @Test public void testGetInfoForAllLocations() { long count = 10; long start = System.currentTimeMillis(); for(int i = 0; i < count; i++ ) { List<LocationInfo> locations = m_locationDataService.getInfoForAllLocations(); assertEquals(2880, locations.size()); } System.err.printf("Avg getInfoForAllLocations: %d\n", (System.currentTimeMillis() - start)/count); } @Test public void testGetStatusDetailsForAllLocations() { Map<String, StatusDetails> statusDetails = m_locationDataService.getStatusDetailsForAllLocations(); assertEquals(2880, statusDetails.size()); assertEquals(2880-376, countStatus(Status.UNKNOWN, statusDetails)); assertEquals(3, countStatus(Status.DISCONNECTED, statusDetails)); assertEquals(4, countStatus(Status.STOPPED, statusDetails)); assertEquals(0, countStatus(Status.MARGINAL, statusDetails)); assertEquals(12, countStatus(Status.DOWN, statusDetails)); assertEquals(357, countStatus(Status.UP, statusDetails)); } private int countStatus(Status status, Map<String, StatusDetails> statusDetails) { int count = 0; for(Entry<String, StatusDetails> entry : statusDetails.entrySet()) { if (status.equals(entry.getValue().getStatus())) { count++; } } return count; } @Test public void testGetInfoForAllApplications() { long count = 10; long start = System.currentTimeMillis(); for(int i = 0; i < count; i++ ) { List<ApplicationInfo> applications = m_locationDataService.getInfoForAllApplications(); assertEquals(12, applications.size()); } System.err.printf("Avg getInfoForAllApplications: %d\n", (System.currentTimeMillis() - start)/count); } @Test public void testGetSatusDetailsForLocation() { OnmsMonitoringLocationDefinition def = m_locationMonitorDao.findMonitoringLocationDefinition("00002"); m_locationDataService.getStatusDetailsForLocation(def); } @Test public void testGetSatusDetailsForApplication() { String appName = "Domain Controllers"; int count = 100; long start = System.currentTimeMillis(); for(int i = 0; i < count; i++) { OnmsApplication app = m_applicationDao.findByName(appName); //System.err.println("TEST testGetSatusDetailsForApplication: calling getStatusDetailsForApplication"); StatusDetails details = m_locationDataService.getStatusDetailsForApplication(app); assertEquals(Status.UP, details.getStatus()); } System.err.println(String.format("Avg getStatusDetailsForApplication: %d\n", (System.currentTimeMillis() - start)/count)); } @Test public void testGetApplicationInfo() { String appName = "Domain Controllers"; OnmsApplication app = m_applicationDao.findByName(appName); System.err.println("TEST testGetApplicationInfo: calling getApplicationInfo"); m_locationDataService.getApplicationInfo(app, new StatusDetails()); } @Test public void testLocationMonitorDaoFindByApplication() { OnmsApplication app = m_applicationDao.findByName("Domain Controllers"); Collection<OnmsLocationMonitor> monitors = m_locationMonitorDao.findByApplication(app); assertEquals(376, monitors.size()); } @Test public void testGetAllStatusChangesAt() { Collection<OnmsLocationSpecificStatus> changes = m_locationMonitorDao.getAllStatusChangesAt(new Date()); assertEquals(4888, changes.size()); } @Test @Ignore public void testGetStatusChangesForApplicationBetween() throws ParseException { Collection<OnmsLocationSpecificStatus> changes = m_locationMonitorDao.getStatusChangesForApplicationBetween(june(7, 2010), june(8, 2010), "Domain Controllers"); assertEquals(54, changes.size()); } @Test public void testStart() { EventExecutorService service = m_easyMockUtils.createMock(EventExecutorService.class); service.addEventUserSpecific(hasStatus(Status.DOWN)); expectLastCall().times(12); service.addEventUserSpecific(hasStatus(Status.UP)); expectLastCall().times(357); service.addEventUserSpecific(hasStatus(Status.DISCONNECTED)); expectLastCall().times(3); service.addEventUserSpecific(hasStatus(Status.STOPPED)); expectLastCall().times(4); service.addEventUserSpecific(hasStatus(Status.UNKNOWN)); expectLastCall().times(2880-376); service.addEventUserSpecific(isA(ApplicationUpdatedRemoteEvent.class)); expectLastCall().times(12); service.addEventUserSpecific(isA(UpdateCompleteRemoteEvent.class)); m_easyMockUtils.replayAll(); m_locationDataManager.doInitialize(service); m_easyMockUtils.verifyAll(); } @Test public void testJune() throws ParseException { Date d= june(1, 2009); assertEquals("2009-06-01 00:00:00,000", s_format.format(d)); } Date june(int day, int year) { Calendar cal = new GregorianCalendar(year, Calendar.JUNE, day); return cal.getTime(); } public static LocationUpdatedRemoteEvent hasStatus(final Status status) { reportMatcher(new IArgumentMatcher() { public void appendTo(StringBuffer buffer) { buffer.append("hasStatus(\"" + status + "\")"); } public boolean matches(Object argument) { if (argument instanceof LocationUpdatedRemoteEvent) { LocationUpdatedRemoteEvent e = (LocationUpdatedRemoteEvent)argument; return status.equals(e.getLocationInfo().getStatus()); } else { return false; } } }); return null; } }