/*******************************************************************************
* 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.pollables;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.concurrent.Callable;
import javax.sql.DataSource;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.opennms.core.test.MockLogAppender;
import org.opennms.core.utils.InetAddressUtils;
import org.opennms.netmgt.EventConstants;
import org.opennms.netmgt.config.PollOutagesConfig;
import org.opennms.netmgt.config.PollerConfig;
import org.opennms.netmgt.config.poller.Package;
import org.opennms.netmgt.mock.EventAnticipator;
import org.opennms.netmgt.mock.MockDatabase;
import org.opennms.netmgt.mock.MockElement;
import org.opennms.netmgt.mock.MockEventIpcManager;
import org.opennms.netmgt.mock.MockEventUtil;
import org.opennms.netmgt.mock.MockInterface;
import org.opennms.netmgt.mock.MockNetwork;
import org.opennms.netmgt.mock.MockNode;
import org.opennms.netmgt.mock.MockPollerConfig;
import org.opennms.netmgt.mock.MockService;
import org.opennms.netmgt.mock.MockVisitor;
import org.opennms.netmgt.mock.MockVisitorAdapter;
import org.opennms.netmgt.mock.OutageAnticipator;
import org.opennms.netmgt.model.PollStatus;
import org.opennms.netmgt.poller.mock.MockPollContext;
import org.opennms.netmgt.poller.mock.MockScheduler;
import org.opennms.netmgt.poller.mock.MockTimer;
import org.opennms.netmgt.scheduler.Schedule;
import org.opennms.netmgt.scheduler.ScheduleTimer;
import org.opennms.netmgt.utils.Querier;
import org.opennms.netmgt.xml.event.Event;
import org.opennms.test.DaoTestConfigBean;
import org.opennms.test.mock.MockUtil;
/**
* Represents a PollablesTest
*
* @author brozow
*/
public class PollablesTest {
private PollableNetwork m_network;
private MockPollContext m_pollContext;
private MockNetwork m_mockNetwork;
private MockDatabase m_db;
private EventAnticipator m_anticipator;
private MockEventIpcManager m_eventMgr;
private MockNode mNode1;
private MockInterface mDot1;
private MockInterface mDot2;
private MockNode mNode2;
private MockService mDot1Smtp;
private MockService mDot1Icmp;
private MockService mDot2Icmp;
private MockInterface mDot3;
private MockService mDot3Http;
private MockNode mNode3;
private MockInterface mDot4;
private MockService mDot4Smtp;
@SuppressWarnings("unused")
private MockService mDot4Http;
private PollableNode pNode1;
private PollableInterface pDot1;
private PollableService pDot1Smtp;
private PollableService pDot1Icmp;
private PollableInterface pDot2;
private PollableService pDot2Smtp;
private PollableService pDot2Icmp;
private PollableNode pNode2;
private PollableInterface pDot3;
private PollableService pDot3Http;
private PollableService pDot3Icmp;
private PollableNode pNode3;
private PollableInterface pDot4;
private PollableService pDot4Smtp;
private PollableService pDot4Http;
private OutageAnticipator m_outageAnticipator;
private MockPollerConfig m_pollerConfig;
private MockScheduler m_scheduler;
private MockTimer m_timer;
private int m_lockCount = 0;
@Before
public void setUp() throws Exception {
DaoTestConfigBean bean = new DaoTestConfigBean();
bean.afterPropertiesSet();
MockUtil.println("------------ Begin Test --------------------------");
MockLogAppender.setupLogging();
m_lockCount = 0;
m_mockNetwork = new MockNetwork();
m_mockNetwork.addNode(1, "Router");
m_mockNetwork.addInterface("192.168.1.1");
m_mockNetwork.addService("ICMP");
m_mockNetwork.addService("SMTP");
m_mockNetwork.addInterface("192.168.1.2");
m_mockNetwork.addService("ICMP");
m_mockNetwork.addService("SMTP");
m_mockNetwork.addNode(2, "Server");
m_mockNetwork.addInterface("192.168.1.3");
m_mockNetwork.addService("ICMP");
m_mockNetwork.addService("HTTP");
m_mockNetwork.addNode(3, "Firewall");
m_mockNetwork.addInterface("192.168.1.4");
m_mockNetwork.addService("SMTP");
m_mockNetwork.addService("HTTP");
m_mockNetwork.addInterface("192.168.1.5");
m_mockNetwork.addService("SMTP");
m_mockNetwork.addService("SNMP");
m_db = new MockDatabase();
m_db.populate(m_mockNetwork);
m_anticipator = new EventAnticipator();
m_outageAnticipator = new OutageAnticipator(m_db);
m_eventMgr = new MockEventIpcManager();
m_eventMgr.setEventWriter(m_db);
m_eventMgr.setEventAnticipator(m_anticipator);
m_eventMgr.addEventListener(m_outageAnticipator);
m_pollContext = new MockPollContext();
m_pollContext.setDatabase(m_db);
m_pollContext.setCriticalServiceName("ICMP");
m_pollContext.setNodeProcessingEnabled(true);
m_pollContext.setPollingAllIfCritServiceUndefined(true);
m_pollContext.setServiceUnresponsiveEnabled(true);
m_pollContext.setEventMgr(m_eventMgr);
m_pollContext.setMockNetwork(m_mockNetwork);
m_pollerConfig = new MockPollerConfig(m_mockNetwork);
m_pollerConfig.setNodeOutageProcessingEnabled(true);
m_pollerConfig.setCriticalService("ICMP");
m_pollerConfig.addPackage("TestPackage");
m_pollerConfig.addDowntime(100L, 0L, 500L, false);
m_pollerConfig.addDowntime(200L, 500L, 1500L, false);
m_pollerConfig.addDowntime(500L, 1500L, -1L, true);
m_pollerConfig.setDefaultPollInterval(1000L);
m_pollerConfig.populatePackage(m_mockNetwork);
m_pollerConfig.addPackage("TestPkg2");
m_pollerConfig.addDowntime(500L, 0L, 1000L, false);
m_pollerConfig.addDowntime(500L, 1000L, -1L, true);
m_pollerConfig.setDefaultPollInterval(2000L);
m_pollerConfig.addService(m_mockNetwork.getService(2, "192.168.1.3", "HTTP"));
m_timer = new MockTimer();
m_scheduler = new MockScheduler(m_timer);
m_network = createPollableNetwork(m_db, m_scheduler, m_pollerConfig, m_pollerConfig, m_pollContext);
// set members to make the tests easier
mNode1 = m_mockNetwork.getNode(1);
mDot1 = mNode1.getInterface("192.168.1.1");
mDot1Smtp = mDot1.getService("SMTP");
mDot1Icmp = mDot1.getService("ICMP");
mDot2 = mNode1.getInterface("192.168.1.2");
mDot2Icmp = mDot2.getService("ICMP");
mNode2 = m_mockNetwork.getNode(2);
mDot3 = mNode2.getInterface("192.168.1.3");
mDot3Http = mDot3.getService("HTTP");
mNode3 = m_mockNetwork.getNode(3);
mDot4 = mNode3.getInterface("192.168.1.4");
mDot4Smtp = mDot4.getService("SMTP");
mDot4Http = mDot4.getService("HTTP");
assignPollableMembers(m_network);
}
private void assignPollableMembers(PollableNetwork pNetwork) throws UnknownHostException {
pNode1 = pNetwork.getNode(1);
pDot1 = pNode1.getInterface(InetAddressUtils.addr("192.168.1.1"));
pDot1Smtp = pDot1.getService("SMTP");
pDot1Icmp = pDot1.getService("ICMP");
pDot2 = pNode1.getInterface(InetAddressUtils.addr("192.168.1.2"));
pDot2Smtp = pDot2.getService("SMTP");
pDot2Icmp = pDot2.getService("ICMP");
pNode2 = pNetwork.getNode(2);
pDot3 = pNode2.getInterface(InetAddressUtils.addr("192.168.1.3"));
pDot3Http = pDot3.getService("HTTP");
pDot3Icmp = pDot3.getService("ICMP");
pNode3 = pNetwork.getNode(3);
pDot4 = pNode3.getInterface(InetAddressUtils.addr("192.168.1.4"));
pDot4Smtp = pDot4.getService("SMTP");
pDot4Http = pDot4.getService("HTTP");
}
static class InitCause extends PollableVisitorAdaptor {
private PollEvent m_cause;
public InitCause(PollEvent cause) {
m_cause = cause;
}
public void visitElement(PollableElement element) {
if (!element.hasOpenOutage())
element.setCause(m_cause);
}
}
private PollableNetwork createPollableNetwork(final DataSource db, final ScheduleTimer scheduler, final PollerConfig pollerConfig, final PollOutagesConfig pollOutageConfig, PollContext pollContext) throws UnknownHostException {
final PollableNetwork pNetwork = new PollableNetwork(pollContext);
String sql = "select ifServices.nodeId as nodeId, node.nodeLabel as nodeLabel, ifServices.ipAddr as ipAddr, ifServices.serviceId as serviceId, service.serviceName as serviceName, outages.svcLostEventId as svcLostEventId, events.eventUei as svcLostEventUei, outages.ifLostService as ifLostService, outages.ifRegainedService as ifRegainedService " +
"from ifServices " +
"join node on ifServices.nodeId = node.nodeId " +
"join service on ifServices.serviceId = service.serviceId " +
"left outer join outages on " +
"ifServices.nodeId = outages.nodeId and " +
"ifServices.ipAddr = outages.ipAddr and " +
"ifServices.serviceId = outages.serviceId and " +
"ifRegainedService is null " +
"left outer join events on outages.svcLostEventId = events.eventid " +
"where ifServices.status = 'A'";
Querier querier = new Querier(db, sql) {
public void processRow(ResultSet rs) throws SQLException {
int nodeId = rs.getInt("nodeId");
String nodeLabel = rs.getString("nodeLabel");
String ipAddr = rs.getString("ipAddr");
String serviceName = rs.getString("serviceName");
Date date = rs.getTimestamp("ifLostService");
Number svcLostEventId = (Number)rs.getObject("svcLostEventId");
String svcLostUei = rs.getString("svcLostEventUei");
addServiceToNetwork(pNetwork, nodeId, nodeLabel, ipAddr,
serviceName, svcLostEventId, svcLostUei,
date, scheduler, pollerConfig,
pollOutageConfig);
// schedule.schedule();
//MockUtil.println("Created Pollable Service "+svc+" with package "+pkg.getName());
}
};
querier.execute();
pNetwork.recalculateStatus();
pNetwork.propagateInitialCause();
pNetwork.resetStatusChanged();
return pNetwork;
}
@After
public void tearDown() throws Exception {
m_eventMgr.finishProcessingEvents();
MockLogAppender.assertNoWarningsOrGreater();
m_db.drop();
}
@Test
public void testCreateNode() {
int nodeId = 99;
PollableNode node = m_network.createNode(nodeId, "WebServer99");
assertNotNull("node is null", node);
assertEquals(99, node.getNodeId());
assertEquals("WebServer99", node.getNodeLabel());
assertEquals(node, m_network.getNode(nodeId));
assertEquals(m_network, node.getNetwork());
}
@Test
public void testCreateInterface() throws UnknownHostException {
int nodeId = 99;
InetAddress addr = InetAddressUtils.addr("192.168.1.99");
PollableInterface iface = m_network.createInterface(nodeId, "WebServer99", addr);
assertNotNull("iface is null", iface);
assertEquals(addr, iface.getAddress());
assertEquals(nodeId, iface.getNodeId());
assertEquals(iface, m_network.getInterface(nodeId, addr));
PollableNode node = iface.getNode();
assertNotNull("node is null", node);
assertEquals(nodeId, node.getNodeId());
assertEquals("WebServer99", node.getNodeLabel());
assertEquals(node, m_network.getNode(nodeId));
assertEquals(m_network, iface.getNetwork());
}
@Test
public void testCreateService() throws Exception {
int nodeId = 99;
InetAddress addr = InetAddressUtils.addr("192.168.1.99");
String svcName = "HTTP-99";
PollableService svc = m_network.createService(nodeId, "WebServer99", addr, svcName);
assertNotNull("svc is null", svc);
assertEquals(svcName, svc.getSvcName());
assertEquals(addr, svc.getAddress());
assertEquals(nodeId, svc.getNodeId());
assertEquals(svc, m_network.getService(nodeId, addr, svcName));
PollableInterface iface = svc.getInterface();
assertNotNull("iface is null", iface);
assertEquals(addr, iface.getAddress());
assertEquals(nodeId, iface.getNodeId());
assertEquals(iface, m_network.getInterface(nodeId, addr));
PollableNode node = svc.getNode();
assertNotNull("node is null", node);
assertEquals(nodeId, node.getNodeId());
assertEquals("WebServer99", node.getNodeLabel());
assertEquals(node, m_network.getNode(nodeId));
assertEquals(m_network, svc.getNetwork());
}
@Test
public void testVisit() {
class Counter extends PollableVisitorAdaptor {
public int svcCount;
public int ifCount;
public int nodeCount;
public int elementCount;
public int containerCount;
public int networkCount;
@Override
public void visitService(PollableService s) {
svcCount++;
}
@Override
public void visitInterface(PollableInterface iface) {
ifCount++;
}
@Override
public void visitNode(PollableNode node) {
nodeCount++;
}
@Override
public void visitElement(PollableElement element) {
elementCount++;
}
@Override
public void visitContainer(PollableContainer container) {
containerCount++;
}
@Override
public void visitNetwork(PollableNetwork n) {
networkCount++;
}
};
Counter counter = new Counter();
m_network.visit(counter);
assertEquals(10, counter.svcCount);
assertEquals(5, counter.ifCount);
assertEquals(3, counter.nodeCount);
assertEquals(1, counter.networkCount);
assertEquals(19, counter.elementCount);
assertEquals(9, counter.containerCount);
}
@Test
public void testDeleteService() {
pDot1Icmp.delete();
assertDeleted(pDot1Icmp);
assertNotDeleted(pDot1);
assertNotDeleted(pNode1);
pDot1Smtp.delete();
assertDeleted(pDot1Smtp);
assertDeleted(pDot1);
assertNotDeleted(pNode1);
pDot2Smtp.delete();
assertDeleted(pDot2Smtp);
assertNotDeleted(pDot2);
assertNotDeleted(pNode1);
pDot2Icmp.delete();
assertDeleted(pDot2Icmp);
assertDeleted(pDot2);
assertDeleted(pNode1);
}
private void assertDeleted(PollableService svc) {
assertTrue(svc.isDeleted());
assertNull(m_network.getService(svc.getNodeId(), svc.getAddress(), svc.getSvcName()));
}
private void assertNotDeleted(PollableService svc) {
assertFalse(svc.isDeleted());
assertNotNull(m_network.getService(svc.getNodeId(), svc.getAddress(), svc.getSvcName()));
}
private void assertDeleted(PollableInterface iface) {
assertTrue(iface.isDeleted());
assertNull(m_network.getInterface(iface.getNodeId(), iface.getAddress()));
}
private void assertNotDeleted(PollableInterface iface) {
assertFalse(iface.isDeleted());
assertNotNull(m_network.getInterface(iface.getNodeId(), iface.getAddress()));
}
private void assertDeleted(PollableNode node) {
assertTrue(node.isDeleted());
assertNull(m_network.getNode(node.getNodeId()));
}
private void assertNotDeleted(PollableNode node) {
assertFalse(node.isDeleted());
assertNotNull(m_network.getNode(node.getNodeId()));
}
@Test
public void testDeleteInterface() throws Exception {
pDot1.delete();
assertDeleted(pDot1Icmp);
assertDeleted(pDot1Smtp);
assertDeleted(pDot1);
assertNotDeleted(pDot2);
assertNotDeleted(pNode1);
pDot2.delete();
assertDeleted(pDot2Icmp);
assertDeleted(pDot2Smtp);
assertDeleted(pDot2);;
assertDeleted(pNode1);
}
@Test
public void testDeleteNode() throws Exception {
pNode1.delete();
assertDeleted(pDot1Icmp);
assertDeleted(pDot1Smtp);
assertDeleted(pDot1);
assertDeleted(pDot2Icmp);
assertDeleted(pDot2Smtp);
assertDeleted(pDot2);
assertDeleted(pNode1);
}
@Test
public void testDeleteServiceStatus() {
anticipateDown(mDot1);
mDot1Icmp.bringDown();
pDot1Icmp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
mDot1.removeService(mDot1Icmp);
anticipateUp(mDot1);
pDot1Icmp.delete();
m_network.processStatusChange(new Date());
verifyAnticipated();
}
@Test
public void testDowntimeDelete() {
pDot3Http.getSchedule().schedule();
m_scheduler.next();
assertTime(0);
assertNotDeleted(pDot3Http);
m_scheduler.next();
assertTime(2000);
assertNotDeleted(pDot3Http);
anticipateDown(mDot3Http);
mDot3Http.bringDown();
m_scheduler.next();
assertTime(4000);
assertNotDeleted(pDot3Http);
verifyAnticipated();
m_scheduler.next();
assertTime(4500);
assertNotDeleted(pDot3Http);
m_anticipator.anticipateEvent(MockEventUtil.createServiceEvent("Test", EventConstants.DELETE_SERVICE_EVENT_UEI, mDot3Http, null));
m_scheduler.next();
assertTime(5000);
verifyAnticipated();
}
@Test
public void testReparentInterface() {
InetAddress address = pDot1.getAddress();
pDot1.reparentTo(pNode2);
assertNull(m_network.getInterface(1, address));
assertNotNull(m_network.getInterface(2, address));
assertEquals(2, pDot1.getNodeId());
assertSame(pNode2, pDot1.getNode());
}
@Test
public void testReparentOutages() {
// create some outages in the database
mDot1.bringDown();
pDot1Icmp.doPoll();
m_network.processStatusChange(new Date());
mDot1.bringUp();
pDot1Icmp.doPoll();
m_network.processStatusChange(new Date());
final String ifOutageOnNode1 = "select * from outages where nodeId = 1 and ipAddr = '192.168.1.1'";
final String ifOutageOnNode2 = "select * from outages where nodeId = 2 and ipAddr = '192.168.1.1'";
m_eventMgr.finishProcessingEvents();
assertEquals(2, m_db.countRows(ifOutageOnNode1));
assertEquals(0, m_db.countRows(ifOutageOnNode2));
m_db.reparentInterface(pDot1.getIpAddr(), pDot1.getNodeId(), pNode2.getNodeId());
pDot1.reparentTo(pNode2);
assertEquals(0, m_db.countRows(ifOutageOnNode1));
assertEquals(2, m_db.countRows(ifOutageOnNode2));
}
@Test
public void testReparentStatusChanges() {
//
// Plan to bring down both nodes except the reparented interface
// the node owning the interface should be up while the other is down
// after reparenting we should got the old owner go down while the other
// comes up.
//
anticipateDown(mNode2);
anticipateDown(mDot1);
// bring down both nodes but bring iface back up
mNode1.bringDown();
mNode2.bringDown();
mDot2.bringUp();
pDot1Icmp.doPoll();
m_network.processStatusChange(new Date());
pDot2Icmp.doPoll();
m_network.processStatusChange(new Date());
pDot3Icmp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
m_db.reparentInterface(mDot2.getIpAddr(), mDot2.getNodeId(), mNode2.getNodeId());
mDot2.moveTo(mNode2);
resetAnticipated();
anticipateDown(mNode1);
anticipateUp(mNode2);
anticipateDown(mDot3);
pDot2.reparentTo(pNode2);
verifyAnticipated();
}
@Test
public void testStatus() throws Exception {
PollableVisitor updater = new PollableVisitorAdaptor() {
public void visitElement(PollableElement e) {
e.updateStatus(PollStatus.down());
}
};
m_network.visit(updater);
PollableVisitor downChecker = new PollableVisitorAdaptor() {
public void visitElement(PollableElement e) {
assertEquals(PollStatus.down(), e.getStatus());
assertEquals(true, e.isStatusChanged());
}
};
m_network.visit(downChecker);
m_network.resetStatusChanged();
PollableVisitor statusChangedChecker = new PollableVisitorAdaptor() {
public void visitElement(PollableElement e) {
assertEquals(false, e.isStatusChanged());
}
};
m_network.visit(statusChangedChecker);
pDot1Icmp.updateStatus(PollStatus.up());
m_network.recalculateStatus();
PollableVisitor upChecker = new PollableVisitorAdaptor() {
public void visitNode(PollableNode node) {
if (node == pDot1Icmp.getNode())
assertUp(node);
else
assertDown(node);
}
public void visitInterface(PollableInterface iface) {
if (iface == pDot1Icmp.getInterface())
assertUp(iface);
else
assertDown(iface);
}
public void visitService(PollableService s) {
if (s == pDot1Icmp)
assertUp(s);
else
assertDown(s);
}
};
m_network.visit(upChecker);
}
@Test
public void testInterfaceStatus() throws Exception {
pDot2Smtp.updateStatus(PollStatus.down());
m_network.recalculateStatus();
assertDown(pDot2Smtp);
assertUp(pDot2Smtp.getInterface());
pDot2Smtp.updateStatus(PollStatus.up());
m_network.recalculateStatus();
assertUp(pDot2Smtp);
assertUp(pDot2Smtp.getInterface());
pDot2Icmp.updateStatus(PollStatus.down());
m_network.recalculateStatus();
assertDown(pDot2Icmp);
assertDown(pDot2Icmp.getInterface());
}
@Test
public void testFindMemberWithDescendent() throws Exception {
assertSame(pNode1, m_network.findMemberWithDescendent(pDot1Icmp));
assertSame(pDot1, pNode1.findMemberWithDescendent(pDot1Icmp));
assertSame(pDot1Icmp, pDot1.findMemberWithDescendent(pDot1Icmp));
// pDot1Icmp is not a descendent of pNode2
assertNull(pNode2.findMemberWithDescendent(pDot1Icmp));
}
@Test
public void testPropagateUnresponsive() throws Exception {
pDot1Smtp.updateStatus(PollStatus.unresponsive());
pDot1Icmp.updateStatus(PollStatus.unresponsive());
m_network.recalculateStatus();
assertUp(pDot1);
}
@Test
public void testPollUnresponsive() {
m_pollContext.setServiceUnresponsiveEnabled(true);
anticipateUnresponsive(mDot1);
mDot1.bringUnresponsive();
pDot1Smtp.doPoll();
m_network.processStatusChange(new Date());
pDot1Icmp.doPoll();
m_network.processStatusChange(new Date());
assertUp(pDot1);
verifyAnticipated();
anticipateResponsive(mDot1);
mDot1.bringUp();
pDot1Smtp.doPoll();
m_network.processStatusChange(new Date());
pDot1Icmp.doPoll();
m_network.processStatusChange(new Date());
assertUp(pDot1);
verifyAnticipated();
}
@Test
public void testPollUnresponsiveWithOutage() {
m_pollContext.setServiceUnresponsiveEnabled(true);
anticipateUnresponsive(mDot1);
mDot1.bringUnresponsive();
pDot1Smtp.doPoll();
m_network.processStatusChange(new Date());
pDot1Icmp.doPoll();
m_network.processStatusChange(new Date());
assertUp(pDot1);
verifyAnticipated();
anticipateDown(mDot1);
mDot1.bringDown();
pDot1Smtp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
anticipateUp(mDot1);
mDot1.bringUp();
pDot1Icmp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
anticipateUnresponsive(mDot1);
mDot1.bringUnresponsive();
pDot1Smtp.doPoll();
m_network.processStatusChange(new Date());
pDot1Icmp.doPoll();
m_network.processStatusChange(new Date());
assertUp(pDot1);
verifyAnticipated();
}
@Test
public void testNoEventsOnNoOutages() throws Exception {
// poll expecting no events
pDot1Smtp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
}
@Test
public void testPollService() throws Exception {
PollableService pSvc = pDot1Smtp;
MockService mSvc = mDot1Smtp;
pSvc.doPoll();
assertUp(pSvc);
assertUnchanged(pSvc);
mSvc.bringDown();
pSvc.doPoll();
assertDown(pSvc);
assertChanged(pSvc);
pSvc.resetStatusChanged();
mSvc.bringUp();
pSvc.doPoll();
assertUp(pSvc);
assertChanged(pSvc);
pSvc.recalculateStatus();
}
@Test
public void testPollAllUp() throws Exception {
pDot1Icmp.doPoll();
assertUp(pDot1Icmp);
assertUp(pDot1);
assertUnchanged(pDot1Icmp);
assertUnchanged(pDot1);
assertPoll(mDot1Icmp);
assertNoPoll(m_mockNetwork);
}
@Test
public void testPollIfUpNonCritSvcDown() throws Exception {
mDot1Smtp.bringDown();
pDot1Smtp.doPoll();
assertDown(pDot1Smtp);
assertUp(pDot1);
assertChanged(pDot1Smtp);
assertUnchanged(pDot1);
assertPoll(mDot1Smtp);
assertPoll(mDot1Icmp);
assertNoPoll(m_mockNetwork);
}
@Test
public void testPollIfUpCritSvcDownPoll() throws Exception {
mDot1Icmp.bringDown();
pDot1Icmp.doPoll();
assertDown(pDot1Icmp);
assertDown(pDot1);
assertChanged(pDot1Icmp);
assertChanged(pDot1);
assertPoll(mDot1Icmp);
assertPoll(mDot2Icmp);
assertNoPoll(m_mockNetwork);
}
@Test
public void testPollIfDownNonCritSvcUp() throws Exception {
mDot1.bringDown();
pDot1.updateStatus(PollStatus.down());
pDot1Icmp.updateStatus(PollStatus.down());
m_network.recalculateStatus();
m_network.resetStatusChanged();
assertDown(pDot1Icmp);
assertDown(pDot1);
mDot1Smtp.bringUp();
pDot1Smtp.doPoll();
assertDown(pDot1Icmp);
assertDown(pDot1);
assertUnchanged(pDot1Icmp);
assertUnchanged(pDot1);
assertNoPoll(m_mockNetwork);
}
@Test
public void testPollIfDownCritSvcUp() throws Exception {
mDot1.bringDown();
pDot1.updateStatus(PollStatus.down());
pDot1Icmp.updateStatus(PollStatus.down());
pDot1.setCause(new DbPollEvent(1, EventConstants.INTERFACE_DOWN_EVENT_UEI, new Date()));
m_network.recalculateStatus();
m_network.resetStatusChanged();
assertDown(pDot1Icmp);
assertDown(pDot1);
mDot1Icmp.bringUp();
pDot1Icmp.doPoll();
assertDown(pDot1Smtp);
assertUp(pDot1Icmp);
assertUp(pDot1);
assertChanged(pDot1Icmp);
assertChanged(pDot1);
assertPoll(mDot1Smtp);
assertPoll(mDot1Icmp);
assertNoPoll(m_mockNetwork);
}
@Test
public void testPollIfUpCritSvcUndefSvcDown() throws Exception {
m_pollContext.setCriticalServiceName(null);
mDot1Smtp.bringDown();
pDot1Smtp.doPoll();
assertDown(pDot1Smtp);
assertUp(pDot1);
assertChanged(pDot1Smtp);
assertUnchanged(pDot1);
assertPoll(mDot1Smtp);
assertPoll(mDot1Icmp);
assertNoPoll(m_mockNetwork);
}
@Test
public void testPollIfDownCritSvcUndefSvcDown() throws Exception {
m_pollContext.setCriticalServiceName(null);
mDot1.bringDown();
pDot1.updateStatus(PollStatus.down());
pDot1Icmp.updateStatus(PollStatus.down());
pDot1Smtp.updateStatus(PollStatus.down());
m_network.recalculateStatus();
m_network.resetStatusChanged();
assertDown(pDot1Smtp);
assertDown(pDot1Icmp);
assertDown(pDot1);
mDot1Smtp.bringUp();
pDot1Smtp.doPoll();
assertUp(pDot1Smtp);
assertDown(pDot1Icmp);
assertUp(pDot1);
assertChanged(pDot1Smtp);
assertUnchanged(pDot1Icmp);
assertChanged(pDot1);
assertPoll(mDot1Smtp);
assertPoll(mDot1Icmp);
assertNoPoll(m_mockNetwork);
}
@Test
public void testPollIfUpCritSvcUndefSvcDownNoPoll() throws Exception {
m_pollContext.setCriticalServiceName(null);
m_pollContext.setPollingAllIfCritServiceUndefined(false);
mDot1Smtp.bringDown();
pDot1Smtp.doPoll();
assertDown(pDot1Smtp);
assertUp(pDot1);
assertChanged(pDot1Smtp);
assertUnchanged(pDot1);
assertPoll(mDot1Smtp);
assertNoPoll(m_mockNetwork);
}
@Test
public void testPollIfDownCritSvcUndefSvcDownNoPoll() throws Exception {
m_pollContext.setCriticalServiceName(null);
m_pollContext.setPollingAllIfCritServiceUndefined(false);
mDot1.bringDown();
pDot1.updateStatus(PollStatus.down());
pDot1Icmp.updateStatus(PollStatus.down());
pDot1Smtp.updateStatus(PollStatus.down());
m_network.recalculateStatus();
m_network.resetStatusChanged();
assertDown(pDot1Smtp);
assertDown(pDot1Icmp);
assertDown(pDot1);
mDot1Smtp.bringUp();
pDot1Smtp.doPoll();
assertUp(pDot1Smtp);
assertDown(pDot1Icmp);
assertUp(pDot1);
assertChanged(pDot1Smtp);
assertUnchanged(pDot1Icmp);
assertChanged(pDot1);
assertPoll(mDot1Smtp);
assertNoPoll(m_mockNetwork);
}
@Test
public void testPollNode() throws Exception {
mNode1.bringDown();
pDot1Smtp.doPoll();
assertDown(pDot1Smtp);
assertDown(pDot1Icmp);
assertDown(pDot2Icmp);
assertDown(pNode1);
assertPoll(mDot1Smtp);
assertPoll(mDot1Icmp);
assertPoll(mDot2Icmp);
assertNoPoll(m_mockNetwork);
}
@Test
public void testNodeProcessingDisabled() {
m_pollContext.setNodeProcessingEnabled(false);
// anticipate nothing
pDot1Smtp.run();
verifyAnticipated();
anticipateDown(mDot1Smtp);
mDot1Smtp.bringDown();
pDot1Smtp.run();
verifyAnticipated();
// anticipate nothing since its still down
pDot1Smtp.run();
verifyAnticipated();
anticipateUp(mDot1Smtp);
mDot1Smtp.bringUp();
pDot1Smtp.run();
verifyAnticipated();
}
@Test
public void testServiceEvent() throws Exception {
MockService mSvc = mDot1Smtp;
PollableService pSvc = pDot1Smtp;
anticipateDown(mSvc);
mSvc.bringDown();
pSvc.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
// anticipate nothin since service is still down
pSvc.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
anticipateUp(mSvc);
mSvc.bringUp();
pSvc.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
}
@Test
public void testInterfaceEvent() throws Exception {
anticipateDown(mDot1);
mDot1.bringDown();
pDot1Smtp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
anticipateUp(mDot1);
mDot1.bringUp();
pDot1Icmp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
}
@Test
public void testNodeEvent() throws Exception {
anticipateDown(mNode1);
mNode1.bringDown();
pDot1Smtp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
anticipateUp(mNode1);
mNode1.bringUp();
pDot1Icmp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
}
@Test
public void testLingeringSvcDownOnIfUp() throws Exception {
anticipateDown(mDot1);
mDot1.bringDown();
pDot1Smtp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
anticipateUp(mDot1);
anticipateDown(mDot1Smtp);
mDot1.bringUp();
mDot1Smtp.bringDown();
pDot1Icmp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
anticipateUp(mDot1Smtp);
mDot1Smtp.bringUp();
pDot1Smtp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
}
@Test
public void testLingeringSvcDownOnNodeUp() throws Exception {
anticipateDown(mNode1);
mNode1.bringDown();
pDot1Smtp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
anticipateUp(mNode1);
anticipateDown(mDot1);
mNode1.bringUp();
mDot1Icmp.bringDown();
pDot2Icmp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
anticipateUp(mDot1);
anticipateDown(mDot1Smtp);
mDot1.bringUp();
mDot1Smtp.bringDown();
pDot1Icmp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
}
@Test
public void testSvcOutage() {
anticipateDown(mDot1Smtp);
mDot1Smtp.bringDown();
pDot1Smtp.doPoll();
pDot1Smtp.processStatusChange(new Date());
verifyAnticipated();
anticipateUp(mDot1Smtp);
mDot1Smtp.bringUp();
pDot1Smtp.doPoll();
pDot1Smtp.processStatusChange(new Date());
verifyAnticipated();
}
@Test
public void testIfOutage() {
anticipateDown(mDot1);
mDot1.bringDown();
pDot1Smtp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
anticipateUp(mDot1);
mDot1.bringUp();
pDot1Icmp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
}
@Test
public void testCause() {
anticipateDown(mDot1Smtp);
mDot1Smtp.bringDown();
pDot1Smtp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
anticipateDown(mDot1);
mDot1.bringDown();
pDot1Icmp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
PollEvent cause = pDot1.getCause();
assertNotNull(cause);
assertEquals(cause, pDot1.getCause());
assertEquals(cause, pDot1Icmp.getCause());
assertFalse(cause.equals(pDot1Smtp.getCause()));
}
@Test
public void testIndependentOutageEventsUpTogether() throws Exception {
anticipateDown(mDot1Smtp);
mDot1Smtp.bringDown();
pDot1Smtp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
anticipateDown(mNode1);
mNode1.bringDown();
pDot1Icmp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
anticipateUp(mDot1Smtp);
anticipateUp(mNode1);
mNode1.bringUp();
pDot1Icmp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
}
@Test
public void testIndependentOutageEventsUpSeparately() throws Exception {
anticipateDown(mDot1Smtp);
mDot1Smtp.bringDown();
pDot1Smtp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
anticipateDown(mNode1);
mNode1.bringDown();
pDot1Icmp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
anticipateUp(mNode1);
m_outageAnticipator.deanticipateOutageClosed(mDot1Smtp, mNode1.createUpEvent());
mNode1.bringUp();
mDot1Smtp.bringDown();
pDot1Icmp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
anticipateUp(mDot1Smtp);
mDot1Smtp.bringUp();
pDot1Smtp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
}
@Test
public void testDowntimeInterval() {
// HERE ARE the calls to setup the downtime model
// m_pollerConfig.addDowntime(100L, 0L, 500L, false);
// m_pollerConfig.addDowntime(200L, 500L, 1500L, false);
// m_pollerConfig.addDowntime(500L, 1500L, -1L, true);
Package pkg = m_pollerConfig.getPackage("TestPackage");
PollableServiceConfig pollConfig = new PollableServiceConfig(pDot1Smtp, m_pollerConfig, m_pollerConfig, pkg, m_timer);
m_timer.setCurrentTime(1000L);
pDot1Smtp.updateStatus(PollStatus.down());
assertEquals(1000, pDot1Smtp.getStatusChangeTime());
assertDown(pDot1Smtp);
pDot1.resetStatusChanged();
assertEquals(100L, pollConfig.getInterval());
m_timer.setCurrentTime(1234L);
assertEquals(100L, pollConfig.getInterval());
m_timer.setCurrentTime(1500L);
assertEquals(200L, pollConfig.getInterval());
m_timer.setCurrentTime(1700L);
assertEquals(200L, pollConfig.getInterval());
m_timer.setCurrentTime(2500L);
assertEquals(-1L, pollConfig.getInterval());
//assertTrue(pDot1Smtp.isDeleted());
}
@Test
public void testSchedule() {
pDot1Smtp.getSchedule().schedule();
m_scheduler.next();
assertPoll(mDot1Smtp);
assertTime(0);
assertUp(pDot1Smtp);
assertUnchanged(pDot1Smtp);
mDot1Smtp.bringDown();
m_scheduler.next();
assertPoll(mDot1Smtp);
assertTime(1000);
assertDown(pDot1Smtp);
assertChanged(pDot1Smtp);
pDot1Smtp.resetStatusChanged();
// test scheduling for downTime model
for(int downFor = 100; downFor < 500; downFor += 100) {
m_scheduler.next();
assertPoll(mDot1Smtp);
assertTime(1000+downFor);
}
for(int downFor = 500; downFor < 1500; downFor += 200) {
m_scheduler.next();
assertPoll(mDot1Smtp);
assertTime(1000+downFor);
}
mDot1Smtp.bringUp();
m_scheduler.next();
assertPoll(mDot1Smtp);
assertUp(pDot1Smtp);
assertChanged(pDot1Smtp);
pDot1Smtp.recalculateStatus();
}
@Test
public void testScheduleAdjust() {
// change SMTP so it is only polled every 10 secs rather than 1 sec
m_pollerConfig.setPollInterval(m_pollerConfig.getPackage("TestPackage"), "SMTP", 10000L);
pDot1Icmp.getSchedule().schedule();
pDot1Smtp.getSchedule().schedule();
// get the immediate polls out of the way
m_scheduler.next();
m_scheduler.next();
assertTime(0);
assertPoll(mDot1Icmp);
assertPoll(mDot1Smtp);
assertUp(pDot1Smtp);
assertUp(pDot1Icmp);
assertUnchanged(pDot1Smtp);
assertUnchanged(pDot1Icmp);
// not we should come to the poll for icmp
m_scheduler.next();
// icmp should be polled but not smtp and they both should be up
assertTime(1000);
assertPoll(mDot1Icmp);
assertNoPoll(mDot1Smtp);
assertUp(pDot1Smtp);
assertUp(pDot1Icmp);
assertUnchanged(pDot1Smtp);
assertUnchanged(pDot1Icmp);
// now bring down both services
mDot1.bringDown();
// we come to the next icmp poll still not time to poll smtp
m_scheduler.next();
// no need to poll smtp because icmp reports itself down
assertTime(2000);
assertPoll(mDot1Icmp);
assertNoPoll(mDot1Smtp);
assertUp(pDot1Smtp); // TODO: i wonder if this matters... its really down (the outage does get created)
assertDown(pDot1Icmp);
assertUnchanged(pDot1Smtp);
assertChanged(pDot1Icmp);
// now we bring icmp back up but not smtp. it is still not time for a scheduled smtp poll
mDot1Icmp.bringUp();
// we come to the next icmp poll in only 100ms according to the downtime model
m_scheduler.next();
// since icmp came up we do an unscheduled poll of smtp and find its down
assertTime(2100);
assertPoll(mDot1Icmp);
assertPoll(mDot1Smtp);
assertDown(pDot1Smtp);
assertUp(pDot1Icmp);
assertChanged(pDot1Smtp);
assertChanged(pDot1Icmp);
// since smtp is now down, the schedule for smtp should be adjusted according
// to the downtime model so we expect the next poll for it in only 100ms
m_scheduler.next();
// this time we should poll only smtp and find it still down
assertTime(2200);
assertNoPoll(mDot1Icmp);
assertPoll(mDot1Smtp);
assertDown(pDot1Smtp);
assertUp(pDot1Icmp);
assertUnchanged(pDot1Smtp);
assertUnchanged(pDot1Icmp);
mDot1Smtp.bringUp();
// another downtime model poll of smtp
m_scheduler.next();
assertTime(2300);
assertNoPoll(mDot1Icmp);
assertPoll(mDot1Smtp);
assertUp(pDot1Smtp);
assertUp(pDot1Icmp);
assertChanged(pDot1Smtp);
assertUnchanged(pDot1Icmp);
// now the next one should be the next scheduled icmp poll
m_scheduler.next();
assertTime(3100);
assertPoll(mDot1Icmp);
assertNoPoll(mDot1Smtp);
assertUp(pDot1Smtp);
assertUp(pDot1Icmp);
assertUnchanged(pDot1Smtp);
assertUnchanged(pDot1Icmp);
}
@Test
public void testComputeScheduledOutageTime() {
Package pkg = m_pollerConfig.getPackage("TestPackage");
m_pollerConfig.addScheduledOutage(pkg, "first", 3000, 5000, "192.168.1.1");
PollableServiceConfig pollConfig = new PollableServiceConfig(pDot1Smtp, m_pollerConfig, m_pollerConfig, pkg, m_timer);
m_timer.setCurrentTime(2000L);
assertFalse(pollConfig.scheduledSuspension());
m_timer.setCurrentTime(4000L);
assertTrue(pollConfig.scheduledSuspension());
}
@Test
public void testScheduledOutage() {
m_pollerConfig.addScheduledOutage(m_pollerConfig.getPackage("TestPackage"), "first", 3000, 5000, "192.168.1.1");
pDot1Smtp.getSchedule().schedule();
m_scheduler.next();
assertPoll(mDot1Smtp);
assertTime(0);
assertUp(pDot1Smtp);
assertUnchanged(pDot1Smtp);
m_scheduler.next();
assertPoll(mDot1Smtp);
assertTime(1000);
assertUp(pDot1Smtp);
assertUnchanged(pDot1Smtp);
m_scheduler.next();
assertPoll(mDot1Smtp);
assertTime(2000);
assertUp(pDot1Smtp);
assertUnchanged(pDot1Smtp);
m_scheduler.next();
assertNoPoll(mDot1Smtp);
assertTime(3000);
assertUp(pDot1Smtp);
assertUnchanged(pDot1Smtp);
m_scheduler.next();
assertNoPoll(mDot1Smtp);
assertTime(4000);
assertUp(pDot1Smtp);
assertUnchanged(pDot1Smtp);
m_scheduler.next();
assertNoPoll(mDot1Smtp);
assertTime(5000);
assertUp(pDot1Smtp);
assertUnchanged(pDot1Smtp);
m_scheduler.next();
assertPoll(mDot1Smtp);
assertTime(6000);
assertUp(pDot1Smtp);
assertUnchanged(pDot1Smtp);
}
@Test
public void testMidnightOutageBug1122() throws ParseException {
m_pollerConfig.addScheduledOutage(m_pollerConfig.getPackage("TestPackage"), "first", "monday", "23:59:57", "23:59:59", "192.168.1.1");
m_pollerConfig.addScheduledOutage(m_pollerConfig.getPackage("TestPackage"), "second", "tuesday", "00:00:00", "00:00:02", "192.168.1.1");
final SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss");
Date start = dateFormat.parse("21-FEB-2005 23:59:56");
long startTime = start.getTime();
m_timer.setCurrentTime(startTime);
pDot1Smtp.getSchedule().schedule();
m_scheduler.next();
assertPoll(mDot1Smtp);
assertTime(startTime+0); // 23:59:56 should poll
assertUp(pDot1Smtp);
assertUnchanged(pDot1Smtp);
m_scheduler.next();
assertNoPoll(mDot1Smtp);
assertTime(startTime+1000); // 23:59:57 should not poll
assertUp(pDot1Smtp);
assertUnchanged(pDot1Smtp);
m_scheduler.next();
assertNoPoll(mDot1Smtp);
assertTime(startTime+2000); // 23:59:58 should not poll
assertUp(pDot1Smtp);
assertUnchanged(pDot1Smtp);
m_scheduler.next();
assertNoPoll(mDot1Smtp);
assertTime(startTime+3000); // 23:59:59 should not poll
assertUp(pDot1Smtp);
assertUnchanged(pDot1Smtp);
m_scheduler.next();
assertNoPoll(mDot1Smtp);
assertTime(startTime+4000); // 00:00:00 should not poll
assertUp(pDot1Smtp);
assertUnchanged(pDot1Smtp);
m_scheduler.next();
assertNoPoll(mDot1Smtp);
assertTime(startTime+5000); // 00:00:01 should not poll
assertUp(pDot1Smtp);
assertUnchanged(pDot1Smtp);
m_scheduler.next();
assertNoPoll(mDot1Smtp);
assertTime(startTime+6000); // 00:00:02 should not poll
assertUp(pDot1Smtp);
assertUnchanged(pDot1Smtp);
m_scheduler.next();
assertPoll(mDot1Smtp);
assertTime(startTime+7000); // 00:00:03 should poll
assertUp(pDot1Smtp);
assertUnchanged(pDot1Smtp);
}
@Test
public void testLoadService() throws Exception {
anticipateDown(mDot1Smtp);
mDot1Smtp.bringDown();
pDot1Smtp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
// recreate the pollable network from the database
m_network = createPollableNetwork(m_db, m_scheduler, m_pollerConfig, m_pollerConfig, m_pollContext);
assignPollableMembers(m_network);
assertDown(pDot1Smtp);
anticipateUp(mDot1Smtp);
mDot1Smtp.bringUp();
pDot1Smtp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
}
@Test
public void testAddUpServiceToUpNodeWithCritSvc() throws Exception {
testAddUpSvcToUpNode(1, "Router", "192.168.1.1", "SMTP", "HTTP");
}
@Test
public void testAddUpServiceToUpNodeHasNoCritSvc() throws Exception {
testAddUpSvcToUpNode(3, "Firewall", "192.168.1.4", "SMTP", "SNMP");
}
private void testAddUpSvcToUpNode(int nodeId, String nodeLabel,
String ipAddr, String existingSvcName, String newSvcName) {
PollableService pExistingSvc = m_network.getService(nodeId, getInetAddress(ipAddr), existingSvcName);
assertNotNull(pExistingSvc);
PollableInterface pIface = pExistingSvc.getInterface();
PollableNode pNode = pIface.getNode();
pExistingSvc.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
MockService mSvc = m_mockNetwork.addService(nodeId, ipAddr, newSvcName);
m_db.writeService(mSvc);
PollableService pSvc = addServiceToNetwork(nodeId, nodeLabel, ipAddr, newSvcName);
assertNotNull(pSvc);
assertElementHasNullCause(pSvc);
assertElementHasNullCause(pExistingSvc);
assertElementHasNullCause(pIface);
assertElementHasNullCause(pNode);
assertUp(pSvc);
assertUp(pExistingSvc);
assertUp(pIface);
assertUp(pNode);
anticipateDown(mSvc);
mSvc.bringDown();
pSvc.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
}
@Test
public void testAddDownServiceToDownNodeWithCritSvc() throws Exception {
addDownServiceToDownNode(1, "Router", "192.168.1.1", "SMTP", "HTTP");
}
@Test
public void testAddDownServiceToDownNodeHasNoCritSvc() throws Exception {
addDownServiceToDownNode(3, "Firewall", "192.168.1.4", "SMTP", "SNMP");
}
private void addDownServiceToDownNode(int nodeId, String nodeLabel,
String ipAddr, String existingSvcName, String newSvcName) {
MockNode mNode = m_mockNetwork.getNode(nodeId);
PollableService pExistingSvc = m_network.getService(nodeId, getInetAddress(ipAddr), existingSvcName);
PollableInterface pIface = pExistingSvc.getInterface();
PollableNode pNode = pExistingSvc.getNode();
// before we start make sure the node is down
anticipateDown(mNode);
mNode.bringDown();
pExistingSvc.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
// ok the node is down.. here is the cause
PollEvent nodeCause = pNode.getCause();
// add a new mock service
MockService mSvc = m_mockNetwork.addService(nodeId, ipAddr, newSvcName);
m_db.writeService(mSvc);
// that is down
mSvc.bringDown();
// expect nothing since we already have node down event outstanding
// simulate a nodeGainedService event
PollableService pSvc = addServiceToNetwork(nodeId, nodeLabel, ipAddr, newSvcName);
assertNotNull(pSvc);
// before the first poll everthing should have the node down cause
assertElementHasCause(pSvc, nodeCause);
assertElementHasCause(pExistingSvc, nodeCause);
assertElementHasCause(pIface, nodeCause);
assertElementHasCause(pNode, nodeCause);
// and should be mored down
assertDown(pSvc);
assertDown(pExistingSvc);
assertDown(pIface);
assertDown(pNode);
// now to the first poll
pSvc.doPoll();
// everything should still be down
assertDown(pSvc);
assertDown(pExistingSvc);
assertDown(pIface);
assertDown(pNode);
m_network.processStatusChange(new Date());
// and should have the same node down cause
assertElementHasCause(pSvc, nodeCause);
assertElementHasCause(pExistingSvc, nodeCause);
assertElementHasCause(pIface, nodeCause);
assertElementHasCause(pNode, nodeCause);
// verify we've received no events
verifyAnticipated();
}
@Test
public void testAddDownServiceToUpNodeWithCritSvc() throws Exception {
testAddDownServiceToUpNode(1, "Router", "192.168.1.1", "SMTP", "HTTP");
}
@Test
public void testAddDownServiceToUpNodeHasNoCritSvc() throws Exception {
testAddDownServiceToUpNode(3, "Firewal", "192.168.1.4", "SMTP", "SNMP");
}
private void testAddDownServiceToUpNode(int nodeId, String nodeLabel,
String ipAddr, String existingSvcName, String newSvcName) {
PollableService pExistingSvc = m_network.getService(nodeId, getInetAddress(ipAddr), existingSvcName);
PollableInterface pIface = pExistingSvc.getInterface();
PollableNode pNode = pExistingSvc.getNode();
// first we cause a poll for the up node just be make sure everythings working
pExistingSvc.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
// no we add the mock serve
MockService mSvc = m_mockNetwork.addService(nodeId, ipAddr, newSvcName);
m_db.writeService(mSvc);
// bring down the service
mSvc.bringDown();
// expect a nodeLostService event
anticipateDown(mSvc);
// add the service to the PollableNetowrk (simulates nodeGainedService event)
PollableService pSvc = addServiceToNetwork(nodeId, nodeLabel, ipAddr, newSvcName);
assertNotNull(pSvc);
// before the first call nothing has a cause
assertElementHasNullCause(pSvc);
assertElementHasNullCause(pExistingSvc);
assertElementHasNullCause(pIface);
assertElementHasNullCause(pNode);
// and everything is up
assertUp(pSvc);
assertUp(pExistingSvc);
assertUp(pIface);
assertUp(pNode);
// now poll
pSvc.doPoll();
// expect the svc to be down and everythign else up
assertDown(pSvc);
assertUp(pExistingSvc);
assertUp(pIface);
assertUp(pNode);
// no we send the events and update the causes
m_network.processStatusChange(new Date());
// only the svc has a cause
assertNotNull(pSvc.getCause());
assertElementHasNullCause(pExistingSvc);
assertElementHasNullCause(pIface);
assertElementHasNullCause(pNode);
verifyAnticipated();
}
@Test
public void testLoadInterface() throws Exception {
anticipateDown(mDot1);
mDot1.bringDown();
pDot1Smtp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
PollEvent ifCause = pDot1.getCause();
// recreate the pollable network from the database
m_network = createPollableNetwork(m_db, m_scheduler, m_pollerConfig, m_pollerConfig, m_pollContext);
assignPollableMembers(m_network);
assertElementHasCause(pDot1Smtp, ifCause);
assertElementHasCause(pDot1Icmp, ifCause);
assertElementHasCause(pDot1, ifCause);
assertElementHasNullCause(pNode1);
assertDown(pDot1Smtp);
assertDown(pDot1Icmp);
anticipateUp(mDot1);
mDot1.bringUp();
pDot1Icmp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
}
@Test
public void testLoadInterfaceWithMissingOutage() throws Exception {
// create an outage for only the SMTP svc but with an if down event
mDot4.bringDown();
Event ifDownEvent = mDot4.createDownEvent();
m_db.writeEvent(ifDownEvent);
m_db.createOutage(mDot4Smtp, ifDownEvent);
// recreate the pollable network from the database
m_network = createPollableNetwork(m_db, m_scheduler, m_pollerConfig, m_pollerConfig, m_pollContext);
assignPollableMembers(m_network);
resetAnticipated();
assertElementHasCause(pDot4Smtp, ifDownEvent);
assertElementHasCause(pDot4, ifDownEvent);
// see if cause is pushed down to service without outage
assertElementHasCause(pDot4Http, ifDownEvent);
assertDown(pDot4Smtp);
assertDown(pDot4Http);
anticipateUp(mDot4);
mDot4.bringUp();
pDot4Http.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
}
private void assertElementHasCause(PollableElement element, Event causeEvent) {
if (causeEvent == null) {
assertElementHasNullCause(element);
} else {
if (element.getCause() == null || element.getCause().getEventId() != causeEvent.getDbid()) {
failCause(element, causeEvent);
}
}
}
private void assertElementHasNullCause(PollableElement element) {
assertNull("Unexpected cause for element "+element+": Expected cause to be null", element.getCause());
}
private void assertElementHasCause(PollableElement element, PollEvent causeEvent) {
if (causeEvent == null) {
assertElementHasNullCause(element);
} else {
if (element.getCause() == null || element.getCause().getEventId() != causeEvent.getEventId()) {
failCause(element, causeEvent);
}
}
}
private void failCause(PollableElement element, Object expectedCause) {
throw new AssertionError("Unexpected cause for element "+element+" expected cause matching "+expectedCause+" but cause was "+element.getCause());
}
@Test
public void testLoadNode() throws Exception {
anticipateDown(mNode1);
mNode1.bringDown();
pDot1Smtp.doPoll();
m_network.processStatusChange(new Date());
System.out.println("Cause is "+pNode1.getCause());
verifyAnticipated();
// recreate the pollable network from the database
m_network = createPollableNetwork(m_db, m_scheduler, m_pollerConfig, m_pollerConfig, m_pollContext);
assignPollableMembers(m_network);
assertDown(pDot1Smtp);
assertDown(pDot1Icmp);
assertDown(pDot2Smtp);
assertDown(pDot2Icmp);
anticipateUp(mNode1);
mNode1.bringUp();
pDot1Icmp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
}
@Test
public void testLoadIndependentOutageEventsUpTogether() throws Exception {
anticipateDown(mDot1Smtp);
mDot1Smtp.bringDown();
pDot1Smtp.doPoll();
m_network.processStatusChange(new Date());
PollEvent svcCause = pDot1Smtp.getCause();
verifyAnticipated();
anticipateDown(mNode1);
mNode1.bringDown();
pDot1Icmp.doPoll();
m_network.processStatusChange(new Date());
PollEvent nodeCause = pNode1.getCause();
assertElementHasCause(pDot1Smtp, svcCause);
assertElementHasCause(pDot1Icmp, nodeCause);
assertElementHasCause(pNode1, nodeCause);
verifyAnticipated();
// recreate the pollable network from the database
m_network = createPollableNetwork(m_db, m_scheduler, m_pollerConfig, m_pollerConfig, m_pollContext);
assignPollableMembers(m_network);
assertElementHasCause(pDot1Smtp, svcCause);
assertElementHasCause(pDot1Icmp, nodeCause);
assertElementHasCause(pNode1, nodeCause);
assertDown(pDot1Smtp);
assertDown(pDot1Icmp);
assertDown(pDot2Smtp);
assertDown(pDot2Icmp);
assertDown(pDot1);
assertDown(pDot2);
assertDown(pNode1);
anticipateUp(mDot1Smtp);
anticipateUp(mNode1);
mNode1.bringUp();
pDot1Icmp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
}
@Test
public void testLoadIndependentOutageEventsUpSeparately() throws Exception {
anticipateDown(mDot1Smtp);
mDot1Smtp.bringDown();
pDot1Smtp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
anticipateDown(mNode1);
mNode1.bringDown();
pDot1Icmp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
// recreate the pollable network from the database
m_network = createPollableNetwork(m_db, m_scheduler, m_pollerConfig, m_pollerConfig, m_pollContext);
assignPollableMembers(m_network);
assertDown(pDot1Smtp);
assertDown(pDot1Icmp);
assertDown(pDot2Smtp);
assertDown(pDot2Icmp);
assertDown(pDot1);
assertDown(pDot2);
assertDown(pNode1);
anticipateUp(mNode1);
m_outageAnticipator.deanticipateOutageClosed(mDot1Smtp, mNode1.createUpEvent());
mNode1.bringUp();
mDot1Smtp.bringDown();
pDot1Icmp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
anticipateUp(mDot1Smtp);
mDot1Smtp.bringUp();
pDot1Smtp.doPoll();
m_network.processStatusChange(new Date());
verifyAnticipated();
}
@Test
public void testLock() throws Exception {
final Runnable r = new Runnable() {
public void run() {
m_lockCount++;
assertEquals(1, m_lockCount);
try { Thread.sleep(3000); } catch (InterruptedException e) {}
m_lockCount--;
assertEquals(0, m_lockCount);
}
};
final Runnable locker = new Runnable() {
public void run() {
pNode1.withTreeLock(r);
}
};
Thread[] threads = new Thread[5];
for(int i = 0; i < 5; i++) {
threads[i] = new Thread(locker);
threads[i].start();
}
for(int i = 0; i < 5; i++) {
threads[i].join();
}
}
@Test
public void testLockTimeout() throws Exception {
final Runnable r = new Runnable() {
public void run() {
m_lockCount++;
assertEquals(1, m_lockCount);
try { Thread.sleep(5000); } catch (InterruptedException e) {}
m_lockCount--;
assertEquals(0, m_lockCount);
}
};
final Runnable locker = new Runnable() {
public void run() {
pNode1.withTreeLock(r);
}
};
final Runnable lockerWithTimeout = new Runnable() {
public void run() {
try {
pNode1.withTreeLock(r, 500);
fail("Expected LockUnavailable");
} catch (LockUnavailable e) {
MockUtil.println("Received expected exception "+e);
}
}
};
Thread[] threads = new Thread[5];
threads[0] = new Thread(locker);
threads[0].start();
for(int i = 1; i < 5; i++) {
threads[i] = new Thread(lockerWithTimeout);
threads[i].start();
}
for(int i = 0; i < 5; i++) {
threads[i].join();
}
}
/**
* @param i
*/
private void assertTime(long time) {
assertEquals("Unexpected time", time, m_scheduler.getCurrentTime());
}
/**
*
*/
private void verifyAnticipated() {
m_eventMgr.finishProcessingEvents();
MockEventUtil.printEvents("Missing Anticipated Events: ", m_anticipator.getAnticipatedEvents());
assertTrue("Expected events not forthcoming", m_anticipator.getAnticipatedEvents().isEmpty());
MockEventUtil.printEvents("Unanticipated: ", m_anticipator.unanticipatedEvents());
assertEquals("Received unexpected events", 0, m_anticipator.unanticipatedEvents().size());
assertEquals("Wrong number of outages opened", m_outageAnticipator.getExpectedOpens(), m_outageAnticipator.getActualOpens());
assertEquals("Wrong number of outages in outage table", m_outageAnticipator.getExpectedOutages(), m_outageAnticipator.getActualOutages());
assertTrue("Created outages don't match the expected outages", m_outageAnticipator.checkAnticipated());
resetAnticipated();
}
/**
*
*/
private void resetAnticipated() {
m_anticipator.reset();
m_outageAnticipator.reset();
}
/**
* @param svc
*/
private void anticipateUp(MockElement element) {
Event event = element.createUpEvent();
m_anticipator.anticipateEvent(event);
m_outageAnticipator.anticipateOutageClosed(element, event);
}
/**
* @param svc
*/
private void anticipateDown(MockElement element) {
Event event = element.createDownEvent();
m_anticipator.anticipateEvent(event);
m_outageAnticipator.anticipateOutageOpened(element, event);
}
private void anticipateUnresponsive(MockElement element) {
MockVisitor visitor = new MockVisitorAdapter() {
public void visitService(MockService svc) {
m_anticipator.anticipateEvent(svc.createUnresponsiveEvent());
}
};
element.visit(visitor);
}
private void anticipateResponsive(MockElement element) {
MockVisitor visitor = new MockVisitorAdapter() {
public void visitService(MockService svc) {
m_anticipator.anticipateEvent(svc.createResponsiveEvent());
}
};
element.visit(visitor);
}
private void assertPoll(MockService svc) {
assertEquals(1, svc.getPollCount());
svc.resetPollCount();
}
/**
* @param network
*/
private void assertNoPoll(MockElement elem) {
MockVisitor zeroAsserter = new MockVisitorAdapter() {
public void visitService(MockService svc) {
assertEquals("Unexpected poll count for "+svc, 0, svc.getPollCount());
}
};
elem.visit(zeroAsserter);
}
private void assertChanged(PollableElement elem) {
assertEquals(true, elem.isStatusChanged());
}
private void assertUnchanged(PollableElement elem) {
assertEquals(false, elem.isStatusChanged());
}
private void assertUp(PollableElement elem) {
assertEquals(PollStatus.up(), elem.getStatus());
}
private void assertDown(PollableElement elem) {
assertEquals(PollStatus.down(), elem.getStatus());
}
protected Package findPackageForService(PollerConfig pollerConfig, String ipAddr, String serviceName) {
Enumeration<Package> en = pollerConfig.enumeratePackage();
Package lastPkg = null;
while (en.hasMoreElements()) {
Package pkg = (Package)en.nextElement();
if (pollableServiceInPackage(pollerConfig, ipAddr, serviceName, pkg))
lastPkg = pkg;
}
return lastPkg;
}
private boolean pollableServiceInPackage(PollerConfig pollerConfig, String ipAddr, String serviceName, Package pkg) {
return (pollerConfig.isServiceInPackageAndEnabled(serviceName, pkg)
&& pollerConfig.isInterfaceInPackage(ipAddr, pkg));
}
private InetAddress getInetAddress(String ipAddr) {
InetAddress addr;
addr = InetAddressUtils.addr(ipAddr);
if (addr == null) {
// in 'real life' I would just log this and contine with the others
throw new RuntimeException("Error converting "+ipAddr+" to an InetAddress");
}
return addr;
}
private PollableService addServiceToNetwork(final int nodeId, final String nodeLabel, final String ipAddr, final String serviceName) {
final PollableNode svcNode = m_network.createNodeIfNecessary(nodeId, nodeLabel);
return svcNode.withTreeLock(new Callable<PollableService>() {
public PollableService call() throws Exception {
PollableService svc = addServiceToNetwork(m_network, nodeId, nodeLabel, ipAddr, serviceName, null, null, null, m_scheduler, m_pollerConfig, m_pollerConfig);
//svcNode.recalculateStatus();
//svcNode.processStatusChange(new Date());
return svc;
}
});
}
private PollableService addServiceToNetwork(final PollableNetwork pNetwork,
int nodeId, String nodeLabel, String ipAddr, String serviceName,
Number svcLostEventId, String svcLostUei,
Date svcLostTime, final ScheduleTimer scheduler,
final PollerConfig pollerConfig,
final PollOutagesConfig pollOutageConfig) {
InetAddress addr = getInetAddress(ipAddr);
Package pkg = findPackageForService(pollerConfig, ipAddr, serviceName);
if (pkg == null) {
MockUtil.println("No package for service "+serviceName+" with ipAddr "+ipAddr);
return null;
}
PollableService svc = pNetwork.createService(nodeId, nodeLabel, addr, serviceName);
PollableServiceConfig pollConfig = new PollableServiceConfig(svc, pollerConfig, pollOutageConfig, pkg, scheduler);
svc.setPollConfig(pollConfig);
synchronized (svc) {
if (svc.getSchedule() == null) {
Schedule schedule = new Schedule(svc, pollConfig, scheduler);
svc.setSchedule(schedule);
}
}
//MockUtil.println("svcLostEventId for "+svc+" is "+svcLostEventId);
if (svcLostEventId == null) {
if (svc.getParent().getStatus().isUnknown()) {
svc.updateStatus(PollStatus.up());
} else {
svc.updateStatus(svc.getParent().getStatus());
svc.setCause(svc.getParent().getCause());
}
}
else {
svc.updateStatus(PollStatus.down());
PollEvent cause = new DbPollEvent(svcLostEventId.intValue(), svcLostUei, svcLostTime);
svc.setCause(cause);
}
return svc;
}
}