/******************************************************************************* * 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; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.junit.Before; import org.junit.Test; /** * @author brozow */ public class SnmpTableResultTest { private SnmpTableResult m_tableResult; private TestRowCallback m_rowCallback; private SnmpObjId[] m_columns; private List<SnmpRowResult> m_anticipatedRows = new ArrayList<SnmpRowResult>(); private List<SnmpRowResult> m_receivedRows = new ArrayList<SnmpRowResult>(); private class TestRowCallback implements RowCallback { private int m_rowCount = 0; public int getRowCount() { return m_rowCount; } public void rowCompleted(SnmpRowResult result) { m_rowCount++; m_receivedRows.add(result); System.err.println("Received Row: "+result); } public void reset() { m_rowCount = 0; } } public SnmpValue value(String val) { return SnmpUtils.getValueFactory().getOctetString(val.getBytes()); } public SnmpResult result(SnmpObjId base, String inst) { return new SnmpResult(base, new SnmpInstId(inst), value(inst)); } public void verifyRowCount(int expected) { assertEquals(expected, m_rowCallback.getRowCount()); } @Before public void setUp() throws Exception { m_rowCallback = new TestRowCallback(); m_columns = new SnmpObjId[] { SnmpTrackerTest.SnmpTableConstants.ifIndex, SnmpTrackerTest.SnmpTableConstants.ifDescr, SnmpTrackerTest.SnmpTableConstants.ifMtu }; m_tableResult = new SnmpTableResult(m_rowCallback, m_columns); System.err.println("---"); } public void anticipateRows(String... instances) { for(String inst : instances) { SnmpRowResult row = new SnmpRowResult(m_columns.length, new SnmpInstId(inst)); m_anticipatedRows.add(row); } } public void verifyRows() { Iterator<SnmpRowResult> anticipated = m_anticipatedRows.iterator(); Iterator<SnmpRowResult> received = m_receivedRows.iterator(); int count = 1; for(; anticipated.hasNext(); ) { assertTrue("expected more rows but received none!", received.hasNext()); SnmpRowResult anticipatedRow = anticipated.next(); SnmpRowResult receivedRow = received.next(); assertEquals("Unexpected instance id for row "+count+": ", anticipatedRow.getInstance(), receivedRow.getInstance()); count++; } if (received.hasNext()) { StringBuilder buf = new StringBuilder(); while(received.hasNext()) { buf.append("Unexpected Row: ").append(received.next()).append('\n'); } fail(buf.toString()); } m_anticipatedRows.clear(); m_receivedRows.clear(); } /* * propagate maxRepetitions to children/columns * * handle timeout * handle errors * * work inside an aggregate tracker * * ensure 'processedRows' are 'freed' * * properly handle maxVarsPerPdu correctly */ @Test public void testSimple() { anticipateRows("1"); m_tableResult.storeResult(result(SnmpTrackerTest.SnmpTableConstants.ifIndex, "1")); m_tableResult.storeResult(result(SnmpTrackerTest.SnmpTableConstants.ifDescr, "1")); m_tableResult.storeResult(result(SnmpTrackerTest.SnmpTableConstants.ifMtu, "1")); verifyRows(); anticipateRows("2"); m_tableResult.storeResult(result(SnmpTrackerTest.SnmpTableConstants.ifIndex, "2")); m_tableResult.storeResult(result(SnmpTrackerTest.SnmpTableConstants.ifDescr, "2")); m_tableResult.storeResult(result(SnmpTrackerTest.SnmpTableConstants.ifMtu, "2")); verifyRows(); for (SnmpObjId m_column : m_columns) { m_tableResult.columnFinished(m_column); } m_tableResult.tableFinished(); verifyRows(); } @Test public void testInitialValueMissingForColumn() { anticipateRows("1", "2"); m_tableResult.storeResult(result(SnmpTrackerTest.SnmpTableConstants.ifIndex, "1")); m_tableResult.storeResult(result(SnmpTrackerTest.SnmpTableConstants.ifMtu, "1")); /* no way to tell that a result is not coming for ifDescr so no rows * expected */ verifyRowCount(0); m_tableResult.storeResult(result(SnmpTrackerTest.SnmpTableConstants.ifIndex, "2")); m_tableResult.storeResult(result(SnmpTrackerTest.SnmpTableConstants.ifDescr, "2")); m_tableResult.storeResult(result(SnmpTrackerTest.SnmpTableConstants.ifMtu, "2")); verifyRows(); for (SnmpObjId m_column : m_columns) { m_tableResult.columnFinished(m_column); } m_tableResult.tableFinished(); verifyRows(); } @Test public void testColumnIncomplete() { anticipateRows("1", "2", "3"); m_tableResult.storeResult(result(SnmpTrackerTest.SnmpTableConstants.ifIndex, "1")); m_tableResult.storeResult(result(SnmpTrackerTest.SnmpTableConstants.ifDescr, "1")); m_tableResult.storeResult(result(SnmpTrackerTest.SnmpTableConstants.ifMtu, "1")); m_tableResult.storeResult(result(SnmpTrackerTest.SnmpTableConstants.ifIndex, "2")); m_tableResult.storeResult(result(SnmpTrackerTest.SnmpTableConstants.ifDescr, "2")); m_tableResult.columnFinished(SnmpTrackerTest.SnmpTableConstants.ifMtu); m_tableResult.storeResult(result(SnmpTrackerTest.SnmpTableConstants.ifIndex, "3")); m_tableResult.storeResult(result(SnmpTrackerTest.SnmpTableConstants.ifDescr, "3")); m_tableResult.columnFinished(SnmpTrackerTest.SnmpTableConstants.ifIndex); m_tableResult.columnFinished(SnmpTrackerTest.SnmpTableConstants.ifDescr); m_tableResult.tableFinished(); verifyRows(); } @Test public void testNonIntInstances() { anticipateRows("127.0.0.1"); /* yes, yes, I know these are not the right places to put them in The Real World ;) */ m_tableResult.storeResult(result(SnmpTrackerTest.SnmpTableConstants.ifIndex, "127.0.0.1")); m_tableResult.storeResult(result(SnmpTrackerTest.SnmpTableConstants.ifDescr, "127.0.0.1")); m_tableResult.storeResult(result(SnmpTrackerTest.SnmpTableConstants.ifMtu, "127.0.0.1")); m_tableResult.columnFinished(SnmpTrackerTest.SnmpTableConstants.ifIndex); m_tableResult.columnFinished(SnmpTrackerTest.SnmpTableConstants.ifDescr); m_tableResult.columnFinished(SnmpTrackerTest.SnmpTableConstants.ifMtu); m_tableResult.tableFinished(); verifyRows(); } }