/*******************************************************************************
* 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.client;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.TreeSet;
import org.junit.Before;
import org.junit.Test;
public class ApplicationTest {
final Date m_to = new Date();
final Date m_from = new Date(m_to.getTime() - (1000 * 60 * 60 * 24));
final static long FIVE_MINUTES = 1000 * 60 * 5;
static int count = 0;
static int monitorOffset = 0;
final static Random m_random = new Random();
Map<String, ApplicationInfo> m_applications = null;
Map<String, GWTMonitoredService> m_services = null;
Map<String, GWTLocationMonitor> m_monitors = null;
@Before
public void setup() {
m_applications = new HashMap<String, ApplicationInfo>();
m_services = new HashMap<String, GWTMonitoredService>();
m_monitors = new HashMap<String, GWTLocationMonitor>();
count = 0;
monitorOffset = 0;
}
@Test
public void testApplicationStatusUnknown() {
ApplicationDetails appStatus = new ApplicationDetails(getApplication("TestApp1"), m_from, m_to, null, null);
assertEquals(Status.UNKNOWN, appStatus.getStatusDetails().getStatus());
}
@Test
public void testApplicationStatusUp() {
ApplicationDetails status = getUpApplicationStatus("TestApp1");
assertEquals(Status.UP, status.getStatusDetails().getStatus());
assertEquals(Double.valueOf(100.0), status.getAvailability());
}
@Test
public void testApplicationStatusMarginal() {
ApplicationDetails status = getMarginalApplicationStatus("TestApp1");
assertEquals(Status.MARGINAL, status.getStatusDetails().getStatus());
}
@Test
public void testApplicationStatusDown() {
ApplicationDetails status = getDownApplicationStatus("TestApp1");
assertEquals(Status.DOWN, status.getStatusDetails().getStatus());
}
@Test
public void testApplicationStateUnknown() {
Collection<ApplicationInfo> applications = new ArrayList<ApplicationInfo>();
applications.add(getApplication("TestApp1"));
applications.add(getApplication("TestApp2"));
Map<String, List<GWTLocationSpecificStatus>> appStatuses = new HashMap<String, List<GWTLocationSpecificStatus>>();
appStatuses.put("TestApp1", getUpStatusList());
appStatuses.put("TestApp1", getUpStatusList());
ApplicationState appState = new ApplicationState(m_from, m_to, applications, getMonitors(appStatuses.values()), appStatuses);
assertEquals(Status.UNKNOWN, appState.getStatusDetails().getStatus());
}
@Test
public void testApplicationStateMarginal() {
Collection<ApplicationInfo> applications = new ArrayList<ApplicationInfo>();
applications.add(getApplication("TestApp1"));
applications.add(getApplication("TestApp2"));
Map<String, List<GWTLocationSpecificStatus>> appStatuses = new HashMap<String, List<GWTLocationSpecificStatus>>();
appStatuses.put("TestApp1", getMarginalStatusList());
appStatuses.put("TestApp2", getUpStatusList());
ApplicationState appState = new ApplicationState(m_from, m_to, applications, getMonitors(appStatuses.values()), appStatuses);
assertEquals(Status.MARGINAL, appState.getStatusDetails().getStatus());
}
@Test
public void testApplicationStateDown() {
Collection<ApplicationInfo> applications = new ArrayList<ApplicationInfo>();
applications.add(getApplication("TestApp1"));
applications.add(getApplication("TestApp2"));
Map<String, List<GWTLocationSpecificStatus>> appStatuses = new HashMap<String, List<GWTLocationSpecificStatus>>();
appStatuses.put("TestApp1", getDownStatusList());
appStatuses.put("TestApp2", getUpStatusList());
ApplicationState appState = new ApplicationState(m_from, m_to, applications, getMonitors(appStatuses.values()), appStatuses);
assertEquals(Status.DOWN, appState.getStatusDetails().getStatus());
}
@Test
public void testSet() {
final Set<ApplicationInfo> applicationSet = new HashSet<ApplicationInfo>();
final ApplicationInfo ai1u = new ApplicationInfo(1, "test1", new TreeSet<GWTMonitoredService>(), new TreeSet<String>(), StatusDetails.unknown());
final ApplicationInfo ai2u = new ApplicationInfo(2, "test2", new TreeSet<GWTMonitoredService>(), new TreeSet<String>(), StatusDetails.unknown());
final ApplicationInfo ai1d = new ApplicationInfo(1, "test1", new TreeSet<GWTMonitoredService>(), new TreeSet<String>(), StatusDetails.down("busted"));
final ApplicationInfo ai2d = new ApplicationInfo(2, "test2", new TreeSet<GWTMonitoredService>(), new TreeSet<String>(), StatusDetails.down("busted"));
applicationSet.add(ai1u);
applicationSet.add(ai2u);
applicationSet.add(ai1d);
applicationSet.add(ai2d);
assertEquals("applications should be equal", ai1u, ai1d);
assertEquals("hashcodes should be equal", ai1u.hashCode(), ai1d.hashCode());
assertEquals(2, applicationSet.size());
}
private ApplicationDetails getDownApplicationStatus(final String appName) {
List<GWTLocationSpecificStatus> statuses = getDownStatusList();
ApplicationDetails status = new ApplicationDetails(getApplication(appName), m_from, m_to, getMonitors(statuses), statuses);
return status;
}
private List<GWTLocationMonitor> getMonitors(final Collection<List<GWTLocationSpecificStatus>> statuseses) {
final List<GWTLocationMonitor> monitors = new ArrayList<GWTLocationMonitor>();
for (final List<GWTLocationSpecificStatus> statuses : statuseses) {
for (final GWTLocationSpecificStatus status : statuses) {
if (!monitors.contains(status.getLocationMonitor())) {
monitors.add(status.getLocationMonitor());
}
}
}
return monitors;
}
private List<GWTLocationMonitor> getMonitors(final List<GWTLocationSpecificStatus> statuses) {
return getMonitors(Collections.singletonList(statuses));
}
private List<GWTLocationSpecificStatus> getDownStatusList() {
List<GWTLocationSpecificStatus> statuses = new ArrayList<GWTLocationSpecificStatus>();
int offset = monitorOffset;
// identical overlaps
Date date = m_from;
statuses.add(getUpStatus(date, "RDU", offset + 1));
statuses.add(getUpStatus(date, "RDU", offset + 2));
statuses.add(getUpStatus(date, "RDU", offset + 3));
date = new Date(date.getTime() + 1000);
statuses.add(getDownStatus(date, "RDU", offset + 1));
date = new Date(date.getTime() + 1000);
statuses.add(getDownStatus(date, "RDU", offset + 2));
date = new Date(date.getTime() + 1000);
statuses.add(getDownStatus(date, "RDU", offset + 3));
date = new Date(date.getTime() + FIVE_MINUTES);
statuses.add(getDownStatus(date, "RDU", offset + 1));
date = new Date(date.getTime() + 1000);
statuses.add(getDownStatus(date, "RDU", offset + 2));
date = new Date(date.getTime() + 1000);
statuses.add(getDownStatus(date, "RDU", offset + 3));
monitorOffset += offset;
return statuses;
}
private ApplicationDetails getUpApplicationStatus(final String appName) {
List<GWTLocationSpecificStatus> statuses = getUpStatusList();
ApplicationDetails status = new ApplicationDetails(getApplication(appName), m_from, m_to, getMonitors(statuses), statuses);
return status;
}
private List<GWTLocationSpecificStatus> getUpStatusList() {
List<GWTLocationSpecificStatus> statuses = new ArrayList<GWTLocationSpecificStatus>();
Date date = m_from;
for (int i = 0; i < 5; i++) {
statuses.add(getStatus(date, "RDU", monitorOffset + 1, up(date)));
date = new Date(date.getTime() + FIVE_MINUTES);
}
monitorOffset += 1;
return statuses;
}
private ApplicationDetails getMarginalApplicationStatus(final String appName) {
List<GWTLocationSpecificStatus> statuses = getMarginalStatusList();
ApplicationDetails status = new ApplicationDetails(getApplication(appName), m_from, m_to, getMonitors(statuses), statuses);
return status;
}
private List<GWTLocationSpecificStatus> getMarginalStatusList() {
List<GWTLocationSpecificStatus> statuses = new ArrayList<GWTLocationSpecificStatus>();
Date date = m_from;
for (int i = 0; i < 6; i++) {
statuses.add(getStatus(date, "RDU", monitorOffset + 1, up(date)));
statuses.add(getStatus(date, "RDU", monitorOffset + 2, down(date, "I'm so high, I have no idea what's going on!")));
date = new Date(date.getTime() + FIVE_MINUTES);
}
statuses.add(getStatus(date, "RDU", monitorOffset + 1, up(date)));
statuses.add(getStatus(date, "RDU", monitorOffset + 2, down(date, "Still totally broken.")));
monitorOffset += 2;
return statuses;
}
private GWTLocationSpecificStatus getUpStatus(Date date, String monitorName, Integer monitorId) {
return getStatus(date, monitorName, monitorId, up(date));
}
private GWTLocationSpecificStatus getDownStatus(Date date, String monitorName, Integer monitorId) {
return getStatus(date, monitorName, monitorId, down(date, "Stuff be broke, yo!"));
}
private GWTPollResult up(Date date) {
return new GWTPollResult("Up", date, "Everything is A-OK", m_random.nextDouble() * 300);
}
private GWTPollResult down(Date date, String reason) {
return new GWTPollResult("Down", date, reason, null);
}
private ApplicationInfo getApplication(String name) {
ApplicationInfo app = m_applications.get(name);
if (app == null) {
Set<GWTMonitoredService> services = new TreeSet<GWTMonitoredService>();
services.add(getMonitoredService());
Set<String> locationNames = new TreeSet<String>();
locationNames.add("TestApp1");
app = new ApplicationInfo(count++, name, services, locationNames, StatusDetails.down("busted"));
m_applications.put(name, app);
}
return app;
}
private GWTLocationSpecificStatus getStatus(Date date, String monitorName, int monitorId, GWTPollResult result) {
GWTLocationSpecificStatus status = new GWTLocationSpecificStatus();
status.setId(count++);
status.setLocationMonitor(getLocationMonitor(date, monitorName, monitorId, "STARTED"));
status.setMonitoredService(getMonitoredService());
status.setPollResult(result);
return status;
}
private GWTMonitoredService getMonitoredService() {
return getMonitoredService("HTTP");
}
private GWTMonitoredService getMonitoredService(String serviceName) {
GWTMonitoredService service = m_services.get(serviceName);
if (service == null) {
service = new GWTMonitoredService();
service.setId(count++);
Set<String> appNames = new TreeSet<String>();
appNames.add("TestApp1");
appNames.add("TestApp3");
service.setApplications(appNames);
service.setHostname("localhost");
service.setIfIndex(count++);
service.setIpAddress("127.0.0.1");
service.setIpInterfaceId(count++);
service.setNodeId(count++);
service.setServiceName(serviceName);
m_services.put(serviceName, service);
}
return service;
}
private GWTLocationMonitor getLocationMonitor(Date checkinTime, String name, int id, String status) {
final String monitorName = name + "-" + id;
GWTLocationMonitor monitor = m_monitors.get(monitorName);
if (monitor == null) {
monitor = new GWTLocationMonitor();
monitor.setId(id);
monitor.setDefinitionName(name);
monitor.setLastCheckInTime(checkinTime);
monitor.setName(monitorName);
monitor.setStatus(status);
m_monitors.put(monitorName, monitor);
} else {
monitor.setLastCheckInTime(checkinTime);
monitor.setStatus(status);
}
return monitor;
}
}