/*******************************************************************************
* This file is part of OpenNMS(R).
*
* Copyright (C) 2008-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.statsd;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import junit.framework.TestCase;
import org.easymock.EasyMock;
import org.easymock.IAnswer;
import org.opennms.netmgt.dao.FilterDao;
import org.opennms.netmgt.dao.ResourceDao;
import org.opennms.netmgt.dao.RrdDao;
import org.opennms.netmgt.dao.castor.statsd.PackageReport;
import org.opennms.netmgt.dao.castor.statsd.StatsdPackage;
import org.opennms.netmgt.dao.support.BottomNAttributeStatisticVisitor;
import org.opennms.netmgt.dao.support.MockResourceType;
import org.opennms.netmgt.model.AttributeStatisticVisitorWithResults;
import org.opennms.netmgt.model.EntityVisitor;
import org.opennms.netmgt.model.ExternalValueAttribute;
import org.opennms.netmgt.model.OnmsAttribute;
import org.opennms.netmgt.model.OnmsNode;
import org.opennms.netmgt.model.OnmsResource;
import org.opennms.netmgt.model.RrdGraphAttribute;
import org.opennms.test.ThrowableAnticipator;
import org.opennms.test.mock.EasyMockUtils;
/**
*
* @author <a href="mailto:dj@opennms.org">DJ Gregor</a>
*/
public class ReportDefinitionTest extends TestCase {
private EasyMockUtils m_mocks = new EasyMockUtils();
private ResourceDao m_resourceDao = m_mocks.createMock(ResourceDao.class);
private RrdDao m_rrdDao = m_mocks.createMock(RrdDao.class);
private FilterDao m_filterDao = m_mocks.createMock(FilterDao.class);
@Override
protected void runTest() throws Throwable {
super.runTest();
m_mocks.verifyAll();
}
@SuppressWarnings("unchecked")
public void testBogusReportClass() throws Exception {
// Not replaying anything, but need to do it before verifyAll() happens
m_mocks.replayAll();
ReportDefinition def = new ReportDefinition();
Class<? extends AttributeStatisticVisitorWithResults> clazz = (Class<? extends AttributeStatisticVisitorWithResults>) Class.forName("java.lang.String");
ThrowableAnticipator ta = new ThrowableAnticipator();
ta.anticipate(new IllegalArgumentException(ThrowableAnticipator.IGNORE_MESSAGE));
try {
def.setReportClass(clazz);
} catch (Throwable t) {
ta.throwableReceived(t);
}
ta.verifyAnticipated();
}
public void testAfterPropertiesSet() {
// Not replaying anything, but need to do it before verifyAll() happens
m_mocks.replayAll();
createReportDefinition();
}
public void testReportWalking() throws Exception {
EasyMock.expect(m_resourceDao.findTopLevelResources()).andReturn(new ArrayList<OnmsResource>(0));
ReportDefinition def = createReportDefinition();
def.setResourceAttributeKey("ifSpeed");
def.setResourceAttributeValueMatch("100000000");
ReportInstance report = def.createReport(m_resourceDao, m_rrdDao, m_filterDao);
m_mocks.replayAll();
report.walk();
assertEquals("results size", 0, report.getResults().size());
}
public void testUnfilteredResourceAttributeFilteringWithNoMatch() throws Exception {
MockResourceType resourceType = new MockResourceType();
resourceType.setName("interfaceSnmp");
OnmsAttribute attribute = new RrdGraphAttribute("IfInOctets", "something", "something else");
OnmsResource resource = new OnmsResource("1", "Node One", resourceType, Collections.singleton(attribute));
EasyMock.expect(m_resourceDao.findTopLevelResources()).andReturn(Collections.singletonList(resource));
ReportDefinition def = createReportDefinition();
def.setResourceAttributeKey("ifSpeed");
def.setResourceAttributeValueMatch("100000000");
ReportInstance report = def.createReport(m_resourceDao, m_rrdDao, m_filterDao);
m_mocks.replayAll();
report.walk();
assertEquals("results size", 0, report.getResults().size());
}
public void testUnfilteredResourceAttributeFilteringWithMatch() throws Exception {
OnmsAttribute rrdAttribute = new RrdGraphAttribute("IfInOctets", "something", "something else");
ExternalValueAttribute externalValueAttribute = new ExternalValueAttribute("ifSpeed", "100000000");
Set<OnmsAttribute> attributes = new HashSet<OnmsAttribute>();
attributes.add(rrdAttribute);
attributes.add(externalValueAttribute);
MockResourceType resourceType = new MockResourceType();
resourceType.setName("interfaceSnmp");
OnmsResource resource = new OnmsResource("1", "Node One", resourceType, attributes);
EasyMock.expect(m_resourceDao.findTopLevelResources()).andReturn(Collections.singletonList(resource));
ReportDefinition def = createReportDefinition();
def.setResourceAttributeKey(externalValueAttribute.getName());
def.setResourceAttributeValueMatch(externalValueAttribute.getValue());
ReportInstance report = def.createReport(m_resourceDao, m_rrdDao, m_filterDao);
EasyMock.expect(m_rrdDao.getPrintValue(rrdAttribute, def.getConsolidationFunction(), report.getStartTime(), report.getEndTime())).andReturn(1.0);
m_mocks.replayAll();
report.walk();
m_mocks.verifyAll();
assertEquals("results size", 1, report.getResults().size());
m_mocks.replayAll();
}
public void testFilteredResourceAttributeFilteringWithNoMatch() throws Exception {
final OnmsNode node = new OnmsNode();
node.setId(1);
node.setLabel("Node One");
MockResourceType resourceType = new MockResourceType();
resourceType.setName("interfaceSnmp");
OnmsAttribute attribute = new RrdGraphAttribute("IfInOctets", "something", "something else");
OnmsResource resource = new OnmsResource(node.getId().toString(), node.getLabel(), resourceType, Collections.singleton(attribute));
ReportDefinition def = createReportDefinition();
def.getReport().getPackage().setFilter("");
def.setResourceAttributeKey("ifSpeed");
def.setResourceAttributeValueMatch("100000000");
ReportInstance report = def.createReport(m_resourceDao, m_rrdDao, m_filterDao);
m_filterDao.walkMatchingNodes(EasyMock.eq(""), EasyMock.isA(EntityVisitor.class));
EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
public Object answer() throws Throwable {
((EntityVisitor) EasyMock.getCurrentArguments()[1]).visitNode(node);
return null;
}
});
EasyMock.expect(m_resourceDao.getResourceForNode(node)).andReturn(resource);
m_mocks.replayAll();
report.walk();
assertEquals("results size", 0, report.getResults().size());
}
public void testFilteredResourceAttributeFilteringWithMatch() throws Exception {
OnmsAttribute rrdAttribute = new RrdGraphAttribute("IfInOctets", "something", "something else");
ExternalValueAttribute externalValueAttribute = new ExternalValueAttribute("ifSpeed", "100000000");
Set<OnmsAttribute> attributes = new HashSet<OnmsAttribute>();
attributes.add(rrdAttribute);
attributes.add(externalValueAttribute);
final OnmsNode node = new OnmsNode();
node.setId(1);
node.setLabel("Node One");
MockResourceType resourceType = new MockResourceType();
resourceType.setName("interfaceSnmp");
OnmsResource resource = new OnmsResource(node.getId().toString(), node.getLabel(), resourceType, attributes);
ReportDefinition def = createReportDefinition();
def.getReport().getPackage().setFilter("");
def.setResourceAttributeKey(externalValueAttribute.getName());
def.setResourceAttributeValueMatch(externalValueAttribute.getValue());
ReportInstance report = def.createReport(m_resourceDao, m_rrdDao, m_filterDao);
m_filterDao.walkMatchingNodes(EasyMock.eq(""), EasyMock.isA(EntityVisitor.class));
EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
public Object answer() throws Throwable {
((EntityVisitor) EasyMock.getCurrentArguments()[1]).visitNode(node);
return null;
}
});
EasyMock.expect(m_resourceDao.getResourceForNode(node)).andReturn(resource);
EasyMock.expect(m_rrdDao.getPrintValue(rrdAttribute, def.getConsolidationFunction(), report.getStartTime(), report.getEndTime())).andReturn(1.0);
m_mocks.replayAll();
report.walk();
assertEquals("results size", 1, report.getResults().size());
}
private ReportDefinition createReportDefinition() {
ReportDefinition def;
def = new ReportDefinition();
def.setReport(createPackageReport());
def.setCount(10);
def.setConsolidationFunction("AVERAGE");
def.setRelativeTime(RelativeTime.LASTHOUR);
def.setResourceTypeMatch("interfaceSnmp");
def.setAttributeMatch("IfInOctets");
def.setReportClass(BottomNAttributeStatisticVisitor.class);
def.afterPropertiesSet();
return def;
}
private PackageReport createPackageReport() {
PackageReport packageReport;
packageReport = new PackageReport();
packageReport.setDescription("a package!");
packageReport.setEnabled(true);
packageReport.setPackage(new StatsdPackage());
packageReport.setReport(null);
packageReport.setRetainInterval(new Long(86400 * 1000));
packageReport.setSchedule("hmm");
return packageReport;
}
}