/*******************************************************************************
* 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 static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import org.junit.Test;
public class LocationMonitorStateTest {
private static int count = 0;
@Test
public void testAllMonitorsStarted() {
Collection<GWTLocationMonitor> monitors = new ArrayList<GWTLocationMonitor>();
for (int i = 0; i < 5; i++) {
monitors.add(getMonitor("STARTED"));
}
LocationMonitorState lms = new LocationMonitorState(monitors, null);
assertTrue("all location monitors should be STARTED", lms.allMonitorsStarted());
monitors.add(getMonitor("CONFIG_CHANGED"));
lms = new LocationMonitorState(monitors, null);
assertTrue("all location monitors should be STARTED or CONFIG_CHANGED", lms.allMonitorsStarted());
monitors.add(getMonitor("DISCONNECTED"));
lms = new LocationMonitorState(monitors, null);
assertFalse("at least one monitor is not STARTED or CONFIG_CHANGED", lms.allMonitorsStarted());
}
@Test
public void testAtLeastOneMonitorStarted() {
Collection<GWTLocationMonitor> monitors = new ArrayList<GWTLocationMonitor>();
for (int i = 0; i < 5; i++) {
monitors.add(getMonitor("DISCONNECTED"));
}
monitors.add(getMonitor("CONFIG_CHANGED"));
LocationMonitorState lms = new LocationMonitorState(monitors, null);
assertTrue("at least one monitor is CONFIG_CHANGED or STARTED", lms.atLeastOneMonitorStarted());
monitors.add(getMonitor("STARTED"));
lms = new LocationMonitorState(monitors, null);
assertTrue("at least one monitor is CONFIG_CHANGED or STARTED", lms.atLeastOneMonitorStarted());
}
@Test
public void testAllButOneMonitorsDisconnected() {
Collection<GWTLocationMonitor> monitors = new ArrayList<GWTLocationMonitor>();
for (int i = 0; i < 5; i++) {
monitors.add(getMonitor("DISCONNECTED"));
}
LocationMonitorState lms = new LocationMonitorState(monitors, null);
assertFalse("all monitors should be DISCONNECTED", lms.allButOneMonitorsDisconnected());
monitors.add(getMonitor("STARTED"));
lms = new LocationMonitorState(monitors, null);
assertTrue("all but one monitors are DISCONNECTED", lms.allButOneMonitorsDisconnected());
monitors.add(getMonitor("CONFIG_CHANGED"));
lms = new LocationMonitorState(monitors, null);
assertFalse("more than one monitor is STARTED or CONFIG_CHANGED", lms.allButOneMonitorsDisconnected());
}
@Test
public void testMarkerStatusGreen() {
Collection<GWTLocationMonitor> monitors = new ArrayList<GWTLocationMonitor>();
Collection<GWTLocationSpecificStatus> statuses = new ArrayList<GWTLocationSpecificStatus>();
for (int i = 0; i< 5; i++) {
GWTLocationMonitor monitor = getMonitor("STARTED");
monitors.add(monitor);
GWTLocationSpecificStatus status = new GWTLocationSpecificStatus();
status.setId(++count);
status.setLocationMonitor(monitor);
status.setMonitoredService(getService(++count, "HTTP"));
status.setPollResult(GWTPollResult.available(100));
statuses.add(status);
status = new GWTLocationSpecificStatus();
status.setId(++count);
status.setLocationMonitor(monitor);
status.setMonitoredService(getService(++count, "FTP"));
status.setPollResult(GWTPollResult.available(150));
statuses.add(status);
}
LocationMonitorState lms = new LocationMonitorState(monitors, statuses);
assertEquals("status should be up", Status.UP, lms.getStatusDetails().getStatus());
}
@Test
public void testMarkerStatusAllButOneNonStoppedDisconnected() {
Collection<GWTLocationMonitor> monitors = new ArrayList<GWTLocationMonitor>();
Collection<GWTLocationSpecificStatus> statuses = new ArrayList<GWTLocationSpecificStatus>();
GWTLocationMonitor monitor = getMonitor("STARTED");
monitors.add(monitor);
monitors.add(getMonitor("DISCONNECTED"));
monitors.add(getMonitor("DISCONNECTED"));
monitors.add(getMonitor("DISCONNECTED"));
GWTLocationSpecificStatus status = new GWTLocationSpecificStatus();
status.setId(++count);
status.setLocationMonitor(monitor);
status.setMonitoredService(getService(++count, "HTTP"));
status.setPollResult(GWTPollResult.available(100));
statuses.add(status);
LocationMonitorState lms = new LocationMonitorState(monitors, statuses);
assertEquals("status should be marginal if only one monitor started, and more than one disconnected", Status.MARGINAL, lms.getStatusDetails().getStatus());
}
@Test
public void testMarkerStatusSomeReportDownStatus() {
Collection<GWTLocationMonitor> monitors = new ArrayList<GWTLocationMonitor>();
Collection<GWTLocationSpecificStatus> statuses = new ArrayList<GWTLocationSpecificStatus>();
int httpServiceId = ++count;
int ftpServiceId = ++count;
GWTLocationMonitor monitor = getMonitor("STARTED");
monitors.add(monitor);
GWTLocationSpecificStatus status = new GWTLocationSpecificStatus();
status.setId(++count);
status.setLocationMonitor(monitor);
status.setMonitoredService(getService(httpServiceId, "HTTP"));
status.setPollResult(GWTPollResult.available(100));
statuses.add(status);
status = new GWTLocationSpecificStatus();
status.setId(++count);
status.setLocationMonitor(monitor);
status.setMonitoredService(getService(ftpServiceId, "FTP"));
status.setPollResult(GWTPollResult.down("failure to yield to oncoming traffic"));
statuses.add(status);
monitor = getMonitor("STARTED");
monitors.add(monitor);
status = new GWTLocationSpecificStatus();
status.setId(++count);
status.setLocationMonitor(monitor);
status.setMonitoredService(getService(httpServiceId, "HTTP"));
status.setPollResult(GWTPollResult.down("trouble in paradise"));
statuses.add(status);
status = new GWTLocationSpecificStatus();
status.setId(++count);
status.setLocationMonitor(monitor);
status.setMonitoredService(getService(ftpServiceId, "FTP"));
status.setPollResult(GWTPollResult.available(150));
statuses.add(status);
LocationMonitorState lms = new LocationMonitorState(monitors, statuses);
assertEquals("status should be marginal when some services are down", Status.MARGINAL, lms.getStatusDetails().getStatus());
}
@Test
public void testMarkerStatusOneOfTwoServicesDown() {
Collection<GWTLocationMonitor> monitors = new ArrayList<GWTLocationMonitor>();
Collection<GWTLocationSpecificStatus> statuses = new ArrayList<GWTLocationSpecificStatus>();
for (int i = 0; i< 5; i++) {
GWTLocationMonitor monitor = getMonitor("STARTED");
monitors.add(monitor);
GWTLocationSpecificStatus status = new GWTLocationSpecificStatus();
status.setId(++count);
status.setLocationMonitor(monitor);
status.setMonitoredService(getService(++count, "HTTP"));
status.setPollResult(GWTPollResult.available(100));
statuses.add(status);
status = new GWTLocationSpecificStatus();
status.setId(++count);
status.setLocationMonitor(monitor);
status.setMonitoredService(getService(++count, "FTP"));
status.setPollResult(GWTPollResult.down("totally busted!"));
statuses.add(status);
}
LocationMonitorState lms = new LocationMonitorState(monitors, statuses);
assertEquals("status should be down when one service is down across all monitors", Status.DOWN, lms.getStatusDetails().getStatus());
}
@Test
public void testMarkerStatusOneServiceDown() {
Collection<GWTLocationMonitor> monitors = new ArrayList<GWTLocationMonitor>();
Collection<GWTLocationSpecificStatus> statuses = new ArrayList<GWTLocationSpecificStatus>();
for (int i = 0; i< 5; i++) {
GWTLocationMonitor monitor = getMonitor("STARTED");
monitors.add(monitor);
GWTLocationSpecificStatus status = new GWTLocationSpecificStatus();
status.setId(++count);
status.setLocationMonitor(monitor);
status.setMonitoredService(getService(++count, "HTTP"));
status.setPollResult(GWTPollResult.down("completely wacked"));
statuses.add(status);
}
LocationMonitorState lms = new LocationMonitorState(monitors, statuses);
assertEquals("status should be down when one (of one) service is down across all monitors", Status.DOWN, lms.getStatusDetails().getStatus());
}
@Test
public void testMarkerStatusTwoOfTwoServicesDown() {
Collection<GWTLocationMonitor> monitors = new ArrayList<GWTLocationMonitor>();
Collection<GWTLocationSpecificStatus> statuses = new ArrayList<GWTLocationSpecificStatus>();
for (int i = 0; i< 5; i++) {
GWTLocationMonitor monitor = getMonitor("STARTED");
monitors.add(monitor);
GWTLocationSpecificStatus status = new GWTLocationSpecificStatus();
status.setId(++count);
status.setLocationMonitor(monitor);
status.setMonitoredService(getService(++count, "HTTP"));
status.setPollResult(GWTPollResult.down("exploded"));
statuses.add(status);
status = new GWTLocationSpecificStatus();
status.setId(++count);
status.setLocationMonitor(monitor);
status.setMonitoredService(getService(++count, "FTP"));
status.setPollResult(GWTPollResult.down("casters up"));
statuses.add(status);
}
LocationMonitorState lms = new LocationMonitorState(monitors, statuses);
assertEquals("status should be down when two services (of two) are down across all monitors", Status.DOWN, lms.getStatusDetails().getStatus());
}
@Test
public void testMarkerStatusAllNonStoppedMonitorsDisconnected() {
Collection<GWTLocationMonitor> monitors = new ArrayList<GWTLocationMonitor>();
monitors.add(getMonitor("STOPPED"));
monitors.add(getMonitor("STOPPED"));
monitors.add(getMonitor("DISCONNECTED"));
monitors.add(getMonitor("DISCONNECTED"));
monitors.add(getMonitor("DISCONNECTED"));
LocationMonitorState lms = new LocationMonitorState(monitors, null);
assertEquals("status should be unknown if all monitors are either disconnected or stopped", Status.UNKNOWN, lms.getStatusDetails().getStatus());
}
@Test
public void testMarkerStatusAllRegisteredMonitorsDisconnected() {
Collection<GWTLocationMonitor> monitors = new ArrayList<GWTLocationMonitor>();
monitors.add(getMonitor("DISCONNECTED"));
monitors.add(getMonitor("DISCONNECTED"));
monitors.add(getMonitor("DISCONNECTED"));
LocationMonitorState lms = new LocationMonitorState(monitors, null);
assertEquals("status should be unknown if all registered monitors are disconnected", Status.UNKNOWN, lms.getStatusDetails().getStatus());
}
@Test
public void testMarkerStatusOnlyOneRegisteredMonitorIsStopped() {
Collection<GWTLocationMonitor> monitors = new ArrayList<GWTLocationMonitor>();
monitors.add(getMonitor("STOPPED"));
LocationMonitorState lms = new LocationMonitorState(monitors, null);
assertEquals("single stopped monitor should be unknown", Status.UNKNOWN, lms.getStatusDetails().getStatus());
}
private GWTLocationMonitor getMonitor(String status) {
GWTLocationMonitor monitor = new GWTLocationMonitor();
monitor.setDefinitionName("RDU");
monitor.setId(count++);
monitor.setLastCheckInTime(new Date());
monitor.setStatus(status);
return monitor;
}
private GWTMonitoredService getService(int id, String serviceName) {
GWTMonitoredService service = new GWTMonitoredService();
service.setId(id);
service.setServiceName(serviceName);
return service;
}
}