/******************************************************************************* * This file is part of OpenNMS(R). * * Copyright (C) 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.snmp.mock; import java.util.NoSuchElementException; import java.util.Properties; import junit.framework.TestCase; import org.opennms.netmgt.snmp.SnmpObjId; import org.opennms.netmgt.snmp.SnmpValue; public class TestAgentTest extends TestCase { private static final int columnLength = 10; private static final String col3Base = ".1.3.5.1.2.3"; private static final String col2Base = ".1.3.5.1.2.2"; private static final String col1Base = ".1.3.5.1.2.1"; private static final String zeroInst2Base = ".1.3.5.1.1.2"; private static final String zeroInst1Base = ".1.3.5.1.1.1"; private static final String invalid = ".1.5.5.5"; private TestAgent m_agent; protected void setUp() throws Exception { m_agent = new TestAgent(); Properties agentData = new Properties(); addZeroInstance(agentData, zeroInst1Base); addZeroInstance(agentData, zeroInst2Base); addColumn(agentData, col1Base, 1, columnLength); addColumn(agentData, col2Base, 1, columnLength); addColumn(agentData, col3Base, 1, columnLength); m_agent.setAgentData(agentData); } private void addColumn(Properties agentData, String base, int start, int end) { for(int inst = start; inst <= end; inst++) { addInstance(agentData, base, inst); } } private void addZeroInstance(Properties agentData, String oid) { addInstance(agentData, oid, 0); } private void addInstance(Properties agentData, String oid, int inst) { agentData.put(oid+"."+inst, "STRING: "+getValueFor(oid+"."+inst).toString()); } private Object getValueFor(String oid) { return getValueFor(SnmpObjId.get(oid)); } private Object getValueFor(SnmpObjId oid) { return new MockSnmpValue(SnmpValue.SNMP_OCTET_STRING, oid+"-value"); } public void testConstantObjects() { assertEquals("noSuchObject", MockSnmpValue.NO_SUCH_OBJECT.toString()); assertEquals("noSuchInstance", MockSnmpValue.NO_SUCH_INSTANCE.toString()); assertEquals("endOfMibView", MockSnmpValue.END_OF_MIB.toString()); } public void testEmptyAgent() { TestAgent agent = new TestAgent(); SnmpObjId z1 = SnmpObjId.get(zeroInst1Base, "0"); try { agent.getValueFor(z1); fail("Expected exception"); } catch (AgentNoSuchObjectException e) { } } public void testLoadSnmpData() throws Exception { TestAgent agent = new TestAgent(); agent.loadSnmpTestData(getClass(), "/loadSnmpDataTest.properties"); SnmpObjId z1 = SnmpObjId.get(zeroInst1Base, "0"); assertEquals("TestData", agent.getValueFor(z1).toString()); } public void testAgentValueFor() { SnmpObjId z1 = SnmpObjId.get(zeroInst1Base, "0"); SnmpObjId z2 = SnmpObjId.get(zeroInst2Base, "0"); assertEquals(getValueFor(z1).toString(), m_agent.getValueFor(z1).toString()); assertEquals(getValueFor(z2).toString(), m_agent.getValueFor(z2).toString()); // make sure they are not the same assertFalse(getValueFor(z2).equals(m_agent.getValueFor(z1))); // try a column for(int i = 1; i <= columnLength; i++) { SnmpObjId colOid = SnmpObjId.get(col2Base, ""+i); assertEquals(getValueFor(colOid).toString(), m_agent.getValueFor(colOid).toString()); } // what should it do if you ask for an invalid one - return null try { m_agent.getValueFor(SnmpObjId.get(".1.1.1.1.1")); fail("expected an exception"); } catch (AgentNoSuchObjectException e) { } SnmpObjId objId = SnmpObjId.get(zeroInst1Base, "1"); try { m_agent.getValueFor(objId); fail("Expected no such instance exception"); } catch (AgentNoSuchInstanceException e) { } RuntimeException exception = m_agent.introduceGenErr(objId); try { m_agent.getValueFor(objId); } catch (RuntimeException e) { assertSame(exception, e); } } public void testFollowingOid() { SnmpObjId z1 = SnmpObjId.get(zeroInst1Base); SnmpObjId z2 = SnmpObjId.get(zeroInst2Base); SnmpObjId z1dot0 = SnmpObjId.get(z1, "0"); SnmpObjId z2dot0 = SnmpObjId.get(z2, "0"); SnmpObjId col1 = SnmpObjId.get(col1Base); SnmpObjId col1dot1 = SnmpObjId.get(col1, "1"); SnmpObjId col2 = SnmpObjId.get(col2Base); SnmpObjId col2dot1 = SnmpObjId.get(col2, "1"); SnmpObjId col2dot10 = SnmpObjId.get(col2, "10"); SnmpObjId col3 = SnmpObjId.get(col3Base); SnmpObjId col3dot1 = SnmpObjId.get(col3, "1"); SnmpObjId col3dot10 = SnmpObjId.get(col3, "10"); assertEquals(z1dot0, m_agent.getFollowingObjId(z1)); assertEquals(z2dot0, m_agent.getFollowingObjId(z1dot0)); assertEquals(z2dot0, m_agent.getFollowingObjId(z2)); assertEquals(col1dot1, m_agent.getFollowingObjId(z2dot0)); assertEquals(col1dot1, m_agent.getFollowingObjId(col1)); assertEquals(col3dot1, m_agent.getFollowingObjId(col2dot10)); try { m_agent.getFollowingObjId(col3dot10); fail("Expected exception"); } catch (NoSuchElementException e) { } m_agent.introduceSequenceError(col2dot10, col2dot1); assertEquals(col2dot1, m_agent.getFollowingObjId(col2dot10)); } public void testGet() { GetPdu get = TestPdu.getGet(); get.addVarBind(zeroInst1Base, 0); get.addVarBind(zeroInst2Base, 0); get.addVarBind(col1Base, 1); validateGetResponse(get, m_agent.send(get)); } public void testGetTooBig() { m_agent.setBehaviorToV1(); m_agent.setMaxResponseSize(5); GetPdu get = TestPdu.getGet(); get.addVarBind(zeroInst1Base, 0); get.addVarBind(zeroInst2Base, 0); get.addVarBind(col1Base, 1); get.addVarBind(col1Base, 2); get.addVarBind(col1Base, 3); get.addVarBind(col2Base, 1); get.addVarBind(col2Base, 2); get.addVarBind(col2Base, 3); get.addVarBind(col3Base, 1); get.addVarBind(col3Base, 2); get.addVarBind(col3Base, 3); ResponsePdu resp = m_agent.send(get); assertEquals(ResponsePdu.TOO_BIG_ERR, resp.getErrorStatus()); assertEquals(0, resp.getErrorIndex()); } public void testGetWithInvalidOidV1() { m_agent.setBehaviorToV1(); GetPdu get = TestPdu.getGet(); get.addVarBind(zeroInst1Base, 0); get.addVarBind(invalid, 0); get.addVarBind(zeroInst2Base, 0); ResponsePdu resp = m_agent.send(get); assertEquals(ResponsePdu.NO_SUCH_NAME_ERR, resp.getErrorStatus()); assertEquals(2, resp.getErrorIndex()); } public void testGetWithNoInstanceV1() { m_agent.setBehaviorToV1(); GetPdu get = TestPdu.getGet(); get.addVarBind(zeroInst1Base, 0); get.addVarBind(zeroInst1Base, 1); get.addVarBind(zeroInst2Base, 0); ResponsePdu resp = m_agent.send(get); assertEquals(ResponsePdu.NO_SUCH_NAME_ERR, resp.getErrorStatus()); assertEquals(2, resp.getErrorIndex()); } public void testGetWithInvalidOidV2() { m_agent.setBehaviorToV2(); GetPdu get = TestPdu.getGet(); get.addVarBind(zeroInst1Base, 0); get.addVarBind(invalid, 0); get.addVarBind(zeroInst2Base, 0); validateGetResponse(get, m_agent.send(get)); } public void testGetWithNoInstanceV2() { m_agent.setBehaviorToV2(); GetPdu get = TestPdu.getGet(); get.addVarBind(zeroInst1Base, 0); get.addVarBind(zeroInst1Base, 1); get.addVarBind(zeroInst2Base, 0); validateGetResponse(get, m_agent.send(get)); } public void testGetWithGenErrV1() { m_agent.setBehaviorToV1(); //m_agent.setAgentValue(SnmpObjId.get(zeroInst1Base, "1"), new RuntimeException()); m_agent.introduceGenErr(SnmpObjId.get(zeroInst1Base, "1")); GetPdu get = TestPdu.getGet(); get.addVarBind(zeroInst1Base, 0); get.addVarBind(zeroInst1Base, 1); get.addVarBind(zeroInst2Base, 0); ResponsePdu resp = m_agent.send(get); assertEquals(ResponsePdu.GEN_ERR, resp.getErrorStatus()); assertEquals(2, resp.getErrorIndex()); } public void testGetNextWithGenErrV1() { m_agent.setBehaviorToV1(); //m_agent.setAgentValue(SnmpObjId.get(zeroInst1Base, "1"), new RuntimeException()); m_agent.introduceGenErr(SnmpObjId.get(zeroInst1Base, "1")); NextPdu get = TestPdu.getNext(); get.addVarBind(zeroInst1Base); get.addVarBind(zeroInst1Base, 0); get.addVarBind(zeroInst2Base); ResponsePdu resp = m_agent.send(get); assertEquals(ResponsePdu.GEN_ERR, resp.getErrorStatus()); assertEquals(2, resp.getErrorIndex()); } public void testBulkWithGenErr() { m_agent.setBehaviorToV2(); m_agent.introduceGenErr(SnmpObjId.get(zeroInst1Base, "1")); BulkPdu get = TestPdu.getBulk(); get.addVarBind(zeroInst1Base); get.setNonRepeaters(0); get.setMaxRepititions(5); ResponsePdu resp = m_agent.send(get); assertEquals(ResponsePdu.GEN_ERR, resp.getErrorStatus()); assertEquals(1, resp.getErrorIndex()); } private void validateGetResponse(GetPdu get, ResponsePdu resp) { assertNotNull(resp); assertEquals(ResponsePdu.NO_ERR, resp.getErrorStatus()); // determine if errors are expected assertEquals(get.size(), resp.size()); for(int i = 0; i < resp.size(); i++) { assertEquals(get.getVarBindAt(i).getObjId(), resp.getVarBindAt(i).getObjId()); verifyObjIdValue(resp.getVarBindAt(i)); } } public void testNext() { NextPdu pdu = TestPdu.getNext(); pdu.addVarBind(zeroInst1Base); pdu.addVarBind(zeroInst2Base); pdu.addVarBind(col1Base); pdu.addVarBind(col2Base); pdu.addVarBind(col3Base); validateNextResponse(pdu, m_agent.send(pdu)); } public void testNextInvalidOidV1() { m_agent.setBehaviorToV1(); NextPdu pdu = TestPdu.getNext(); pdu.addVarBind(zeroInst1Base); pdu.addVarBind(invalid); pdu.addVarBind(col1Base); ResponsePdu resp = m_agent.send(pdu); assertEquals(ResponsePdu.NO_SUCH_NAME_ERR, resp.getErrorStatus()); assertEquals(2, resp.getErrorIndex()); } public void testNextInvalidOidV2() { m_agent.setBehaviorToV2(); NextPdu pdu = TestPdu.getNext(); pdu.addVarBind(zeroInst1Base); pdu.addVarBind(invalid); pdu.addVarBind(col1Base); validateNextResponse(pdu, m_agent.send(pdu)); } public void testNextWithGenErrV1() { m_agent.setBehaviorToV1(); m_agent.introduceGenErr(SnmpObjId.get(zeroInst1Base, "1")); NextPdu get = TestPdu.getNext(); get.addVarBind(zeroInst1Base); get.addVarBind(zeroInst1Base, 0); get.addVarBind(zeroInst2Base); ResponsePdu resp = m_agent.send(get); assertEquals(ResponsePdu.GEN_ERR, resp.getErrorStatus()); assertEquals(2, resp.getErrorIndex()); } public void testNextWithGenErrV2() { m_agent.setBehaviorToV2(); m_agent.introduceGenErr(SnmpObjId.get(zeroInst1Base, "1")); NextPdu get = TestPdu.getNext(); get.addVarBind(zeroInst1Base); get.addVarBind(zeroInst1Base, 0); get.addVarBind(zeroInst2Base); ResponsePdu resp = m_agent.send(get); assertEquals(ResponsePdu.GEN_ERR, resp.getErrorStatus()); assertEquals(2, resp.getErrorIndex()); } private void validateNextResponse(NextPdu pdu, ResponsePdu resp) { assertNotNull(resp); assertEquals(ResponsePdu.NO_ERR, resp.getErrorStatus()); assertEquals(pdu.size(), resp.size()); for(int i = 0; i < resp.size(); i++) { verifyNextVarBind(pdu.getVarBindAt(i).getObjId(), resp.getVarBindAt(i)); } } private SnmpObjId verifyNextVarBind(SnmpObjId reqObjId, TestVarBind respVarBind) { try { SnmpObjId nextOid = m_agent.getFollowingObjId(reqObjId); assertEquals(nextOid, respVarBind.getObjId()); verifyObjIdValue(respVarBind); return nextOid; } catch (AgentEndOfMibException e) { assertEquals(reqObjId, respVarBind.getObjId()); assertEquals(MockSnmpValue.END_OF_MIB, respVarBind.getValue()); return reqObjId; } } public void testBulk() { m_agent.setBehaviorToV2(); BulkPdu pdu = TestPdu.getBulk(); pdu.addVarBind(zeroInst1Base); pdu.addVarBind(zeroInst2Base); pdu.addVarBind(col1Base); pdu.addVarBind(col2Base); pdu.addVarBind(col3Base); pdu.setNonRepeaters(2); pdu.setMaxRepititions(3); validateBulkResponse(pdu, m_agent.send(pdu)); } public void testBulkInV1() { try { m_agent.setBehaviorToV1(); BulkPdu pdu = TestPdu.getBulk(); pdu.addVarBind(zeroInst1Base); pdu.addVarBind(zeroInst2Base); pdu.addVarBind(col1Base); pdu.addVarBind(col2Base); pdu.addVarBind(col3Base); pdu.setNonRepeaters(2); pdu.setMaxRepititions(3); m_agent.send(pdu); fail("Cannot send Bulk Pdus to V1 agent"); } catch(Exception e) { e.printStackTrace(); } } public void testBulkTooBig() { m_agent.setBehaviorToV2(); m_agent.setMaxResponseSize(4); BulkPdu pdu = TestPdu.getBulk(); pdu.addVarBind(zeroInst1Base); pdu.addVarBind(zeroInst2Base); pdu.addVarBind(col1Base); pdu.addVarBind(col2Base); pdu.addVarBind(col3Base); pdu.setNonRepeaters(2); pdu.setMaxRepititions(3); validateBulkResponse(pdu, m_agent.send(pdu)); } public void testBulkInvalidOidInNonRepeaterV2() { m_agent.setBehaviorToV2(); BulkPdu pdu = TestPdu.getBulk(); pdu.addVarBind(zeroInst1Base); pdu.addVarBind(invalid); pdu.addVarBind(col1Base); pdu.addVarBind(col2Base); pdu.addVarBind(col3Base); pdu.setNonRepeaters(2); pdu.setMaxRepititions(3); validateBulkResponse(pdu, m_agent.send(pdu)); } public void testBulkInvalidOidInRepeaterV2() { m_agent.setBehaviorToV2(); BulkPdu pdu = TestPdu.getBulk(); pdu.addVarBind(zeroInst1Base); pdu.addVarBind(zeroInst2Base); pdu.addVarBind(col1Base); pdu.addVarBind(invalid); pdu.addVarBind(col3Base); pdu.setNonRepeaters(2); pdu.setMaxRepititions(3); validateBulkResponse(pdu, m_agent.send(pdu)); } public void testBulkWithGenErrInNonRepeater() { m_agent.setBehaviorToV2(); m_agent.introduceGenErr(SnmpObjId.get(zeroInst1Base, "1")); BulkPdu pdu = TestPdu.getBulk(); pdu.addVarBind(zeroInst1Base); pdu.addVarBind(zeroInst1Base, 0); pdu.addVarBind(zeroInst2Base); pdu.addVarBind(col1Base); pdu.addVarBind(col2Base); pdu.addVarBind(col3Base); pdu.setNonRepeaters(3); pdu.setMaxRepititions(3); ResponsePdu resp = m_agent.send(pdu); assertEquals(ResponsePdu.GEN_ERR, resp.getErrorStatus()); assertEquals(2, resp.getErrorIndex()); } public void testBulkWithGenErrInRepeater() { m_agent.setBehaviorToV2(); m_agent.introduceGenErr(SnmpObjId.get(col2Base, "2")); BulkPdu pdu = TestPdu.getBulk(); pdu.addVarBind(zeroInst1Base); pdu.addVarBind(zeroInst2Base); pdu.addVarBind(col1Base); pdu.addVarBind(col2Base); pdu.addVarBind(col3Base); pdu.setNonRepeaters(2); pdu.setMaxRepititions(3); ResponsePdu resp = m_agent.send(pdu); assertEquals(ResponsePdu.GEN_ERR, resp.getErrorStatus()); assertEquals(4, resp.getErrorIndex()); } private void validateBulkResponse(BulkPdu pdu, ResponsePdu resp) { assertNotNull(resp); assertEquals(ResponsePdu.NO_ERR, resp.getErrorStatus()); int nonRepeaters = pdu.getNonRepeaters(); int repeaters = (pdu.size() - nonRepeaters); // validate the length int expectedSize = Math.min(nonRepeaters+(repeaters*pdu.getMaxRepititions()), m_agent.getMaxResponseSize()); assertEquals(expectedSize, resp.size()); // validate the nonRepeaters for(int i = 0; i < nonRepeaters; i++) { verifyBulkVarBind(pdu.getVarBindAt(i).getObjId(), resp, i); } // validate the repeaters for(int i = 0; i < repeaters; i++) { SnmpObjId oid = pdu.getVarBindAt(i+nonRepeaters).getObjId(); for(int count = 0; count < pdu.getMaxRepititions(); count++) { oid = verifyBulkVarBind(oid, resp, nonRepeaters+(count*repeaters)+i); } } } private SnmpObjId verifyBulkVarBind(SnmpObjId oid, ResponsePdu resp, int index) { if (index < resp.size()) { return verifyNextVarBind(oid, resp.getVarBindAt(index)); } else { return oid; } } public Object getAgentValueFor(SnmpObjId objId) { try { return m_agent.getValueFor(objId); } catch (AgentNoSuchInstanceException e) { return MockSnmpValue.NO_SUCH_INSTANCE; } catch (AgentNoSuchObjectException e) { return MockSnmpValue.NO_SUCH_OBJECT; } } private void verifyObjIdValue(TestVarBind varbind) { assertEquals(getAgentValueFor(varbind.getObjId()), varbind.getValue()); } }