package org.opennms.netmgt.snmp.mock;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.math.BigInteger;
import java.net.InetAddress;
import java.nio.ByteBuffer;
import java.util.Arrays;
import org.junit.Before;
import org.junit.Test;
import org.opennms.core.test.MockLogAppender;
import org.opennms.core.utils.InetAddressUtils;
import org.opennms.netmgt.snmp.SnmpObjId;
import org.opennms.netmgt.snmp.SnmpUtils;
import org.opennms.netmgt.snmp.SnmpValue;
import org.opennms.netmgt.snmp.SnmpValueFactory;
import org.opennms.netmgt.snmp.joesnmp.JoeSnmpValueFactory;
import org.opennms.netmgt.snmp.snmp4j.Snmp4JValueFactory;
public class SnmpValueTest {
private static final SnmpValueFactory[] m_factories = new SnmpValueFactory[] {
new Snmp4JValueFactory(),
new JoeSnmpValueFactory(),
new MockSnmpValueFactory()
};
@Before
public void setUp() {
MockLogAppender.setupLogging();
}
@Test
public void testParseHex() {
final String trimmed = "00 24 81 8F 40 17";
final ByteBuffer bb = ByteBuffer.allocate(trimmed.length());
for (final String chunk : trimmed.split("[ :]")) {
short s = Short.valueOf(chunk, 16);
final byte b = (byte)(s & 0xFF);
bb.put(b);
}
final byte[] parsed = new byte[bb.position()];
bb.flip();
bb.get(parsed);
assertArrayEquals(new byte[] { (byte)0x0, (byte)0x24, (byte)0x81, (byte)0x8f, (byte)0x40, (byte)0x17 }, parsed);
}
@Test
public void testCounter32() {
for (final SnmpValueFactory factory : m_factories) {
final String methodName = "Counter32";
final String stringResult = "42";
final Long numberResult = 42L;
final SnmpValue value = factory.getCounter32(numberResult);
final String className = factory.getClass().getName();
doNumericCheck(className, methodName, value, stringResult, numberResult);
}
}
@Test
public void testCounter64() {
for (final SnmpValueFactory factory : m_factories) {
final String methodName = "Counter64";
final String stringResult = "42";
final Long numberResult = 42L;
final SnmpValue value = factory.getCounter64(BigInteger.valueOf(numberResult));
final String className = factory.getClass().getName();
doNumericCheck(className, methodName, value, stringResult, numberResult);
}
}
@Test
public void testGauge32() {
for (final SnmpValueFactory factory : m_factories) {
final String methodName = "Gauge32";
final String stringResult = "42";
final Long numberResult = 42L;
final SnmpValue value = factory.getGauge32(numberResult);
final String className = factory.getClass().getName();
doNumericCheck(className, methodName, value, stringResult, numberResult);
}
}
@Test
public void testInt32() {
for (final SnmpValueFactory factory : m_factories) {
final String methodName = "Int32";
final String stringResult = "42";
final Long numberResult = 42L;
final SnmpValue value = factory.getInt32(numberResult.intValue());
final String className = factory.getClass().getName();
doNumericCheck(className, methodName, value, stringResult, numberResult);
}
}
@Test
public void testNull() {
for (final SnmpValueFactory factory : m_factories) {
final SnmpValue value = factory.getNull();
final String factoryClassName = factory.getClass().getName();
assertFalse(factoryClassName + ": Null isDisplayable should be false", value.isDisplayable());
assertTrue(factoryClassName + ": Null isNull should be true", value.isNull());
assertFalse(factoryClassName + ": Null isEndOfMib should be false", value.isEndOfMib());
assertFalse(factoryClassName + ": Null isError should be false", value.isError());
}
}
@Test
public void testInetAddress() {
for (final SnmpValueFactory factory : m_factories) {
final InetAddress address = InetAddressUtils.addr("192.168.0.1");
final SnmpValue value = factory.getIpAddress(address);
final String className = factory.getClass().getName();
assertTrue(className + ": getInetAddress isDisplayable should be true", value.isDisplayable());
assertEquals(className + ": getInetAddress to InetAddress should return 192.168.0.1", address, value.toInetAddress());
assertEquals(className + ": getInetAddress to String should return 192.168.0.1", "192.168.0.1", value.toString());
assertEquals(className + ": getInetAddress to DisplayString should return 192.168.0.1", "192.168.0.1", value.toDisplayString());
try {
value.toInt();
fail(className + ": getInetAddress to int should throw an IllegalArgumentException");
} catch (final IllegalArgumentException e) { /* expected */ }
try {
value.toLong();
fail(className + ": getInetAddress to long should throw an IllegalArgumentException");
} catch (final IllegalArgumentException e) { /* expected */ }
try {
value.toBigInteger();
fail(className + ": getInetAddress to BigInteger should throw an IllegalArgumentException");
} catch (final IllegalArgumentException e) { /* expected */ }
try {
value.toHexString();
fail(className + ": getInetAddress to HexString should throw an IllegalArgumentException");
} catch (final IllegalArgumentException e) { /* expected */ }
try {
value.toSnmpObjId();
fail(className + ": getInetAddress to SnmpObjId should throw an IllegalArgumentException");
} catch (final IllegalArgumentException e) { /* expected */ }
}
}
@Test
public void testSnmpObjId() {
for (final SnmpValueFactory factory : m_factories) {
final String oid = ".1.3.6.1.4.1.2925.4.5.2.1.1";
final SnmpObjId id = SnmpObjId.get(oid);
final SnmpValue value = factory.getObjectId(id);
final String className = factory.getClass().getName();
assertTrue(className + ": getInetAddress isDisplayable should be true", value.isDisplayable());
assertEquals(className + ": getObjectId to SnmpObjId should return " + oid, id, value.toSnmpObjId());
assertEquals(className + ": getObjectId to String should return " + oid, oid, value.toString());
assertEquals(className + ": getObjectId to DisplayString should return " + oid, oid, value.toDisplayString());
try {
value.toInt();
fail(className + ": getObjectId to int should throw an IllegalArgumentException");
} catch (final IllegalArgumentException e) { /* expected */ }
try {
value.toLong();
fail(className + ": getObjectId to long should throw an IllegalArgumentException");
} catch (final IllegalArgumentException e) { /* expected */ }
try {
value.toBigInteger();
fail(className + ": getObjectId to BigInteger should throw an IllegalArgumentException");
} catch (final IllegalArgumentException e) { /* expected */ }
try {
value.toHexString();
fail(className + ": getObjectId to HexString should throw an IllegalArgumentException");
} catch (final IllegalArgumentException e) { /* expected */ }
try {
value.toInetAddress();
fail(className + ": getObjectId to InetAddress should throw an IllegalArgumentException");
} catch (final IllegalArgumentException e) { /* expected */ }
}
}
@Test
public void testTimeTicks() {
for (final SnmpValueFactory factory : m_factories) {
final String className = factory.getClass().getName();
final SnmpValue[] values = { factory.getTimeTicks(42) };
for (final SnmpValue value : values) {
assertTrue(className + ": getInetAddress isDisplayable should be true", value.isDisplayable());
assertEquals(className + ": getTimeTicks to int should return " + value.toInt(), 42, value.toInt());
assertEquals(className + ": getTimeTicks to long should return " + value.toLong(), 42, value.toLong());
assertEquals(className + ": getTimeTicks to BigInteger should return " + value.toBigInteger(), BigInteger.valueOf(42), value.toBigInteger());
assertEquals(className + ": getTimeTicks to String should return 42", "42", value.toString());
assertEquals(className + ": getTimeTicks to DisplayString should return 42", "42", value.toDisplayString());
try {
value.toHexString();
fail(className + ": getTimeTicks to HexString should throw an IllegalArgumentException");
} catch (final IllegalArgumentException e) { /* expected */ }
try {
value.toInetAddress();
fail(className + ": getTimeTicks to InetAddress should throw an IllegalArgumentException");
} catch (final IllegalArgumentException e) { /* expected */ }
try {
value.toSnmpObjId();
fail(className + ": getTimeTicks to SnmpObjId should throw an IllegalArgumentException");
} catch (final IllegalArgumentException e) { /* expected */ }
}
}
}
@Test
public void testMacAddressOctetString() {
for (final SnmpValueFactory factory : m_factories) {
final String hexString = "005056e7a72f";
final byte[] rawBytes = { 0, (byte)0x50, (byte)0x56, (byte)0xe7, (byte)0xa7, (byte)0x2f };
final String stringBytes = "." + new String(Arrays.copyOfRange(rawBytes, 1, rawBytes.length));
final String className = factory.getClass().getName();
final SnmpValue value = factory.getOctetString(rawBytes);
assertArrayEquals(className + ": getOctetString bytes should match", rawBytes, value.getBytes());
assertFalse(className + ": getOctetString displayable should be false", value.isDisplayable());
assertEquals(className + ": getOctetString to String should return " + stringBytes, stringBytes, value.toString());
assertEquals(className + ": getOctetString to DisplayString should return " + stringBytes, stringBytes, value.toDisplayString());
assertEquals(className + ": getOctetString to HexString should return " + hexString, hexString, value.toHexString());
try {
value.toInt();
fail(className + ": getOctetString to int should throw an IllegalArgumentException");
} catch (final IllegalArgumentException e) { /* expected */ }
try {
value.toLong();
fail(className + ": getOctetString to long should throw an IllegalArgumentException");
} catch (final IllegalArgumentException e) { /* expected */ }
try {
value.toBigInteger();
fail(className + ": getOctetString to BigInteger should throw an IllegalArgumentException");
} catch (final IllegalArgumentException e) { /* expected */ }
}
}
@Test
public void testOtherAddressOctetString() {
for (final SnmpValueFactory factory : m_factories) {
final String hexString = "abcd";
final byte[] rawBytes = { (byte)0xab, (byte)0xcd };
final String stringBytes = new String(rawBytes);
final String className = factory.getClass().getName();
final SnmpValue value = factory.getOctetString(rawBytes);
assertArrayEquals(className + ": getOctetString bytes should match", rawBytes, value.getBytes());
assertFalse(className + ": getOctetString displayable should be false", value.isDisplayable());
assertEquals(className + ": getOctetString to String should return " + stringBytes, stringBytes, value.toString());
assertEquals(className + ": getOctetString to DisplayString should return " + stringBytes, stringBytes, value.toDisplayString());
assertEquals(className + ": getOctetString to HexString should return " + hexString, hexString, value.toHexString());
try {
value.toInt();
fail(className + ": getOctetString to int should throw an IllegalArgumentException");
} catch (final IllegalArgumentException e) { /* expected */ }
try {
value.toLong();
fail(className + ": getOctetString to long should throw an IllegalArgumentException");
} catch (final IllegalArgumentException e) { /* expected */ }
try {
value.toBigInteger();
fail(className + ": getOctetString to BigInteger should throw an IllegalArgumentException");
} catch (final IllegalArgumentException e) { /* expected */ }
}
}
@Test
public void testNormalString() {
for (final SnmpValueFactory factory : m_factories) {
final String text = "I like cheese!";
final String hex = "49206c696b652063686565736521";
final byte[] rawBytes = text.getBytes();
final String className = factory.getClass().getName();
final SnmpValue value = factory.getOctetString(rawBytes);
assertArrayEquals(className + ": getOctetString bytes should match", rawBytes, value.getBytes());
assertTrue(className + ": getOctetString displayable should be true", value.isDisplayable());
assertEquals(className + ": getOctetString to String should return " + text, text, value.toString());
assertEquals(className + ": getOctetString to DisplayString should return " + text, text, value.toDisplayString());
assertEquals(className + ": getOctetString to HexString should return " + hex, hex, value.toHexString());
try {
value.toInt();
fail(className + ": getOctetString to int should throw an IllegalArgumentException");
} catch (final IllegalArgumentException e) { /* expected */ }
try {
value.toLong();
fail(className + ": getOctetString to long should throw an IllegalArgumentException");
} catch (final IllegalArgumentException e) { /* expected */ }
try {
value.toBigInteger();
fail(className + ": getOctetString to BigInteger should throw an IllegalArgumentException");
} catch (final IllegalArgumentException e) { /* expected */ }
}
}
private void doNumericCheck(final String className, final String methodName, final SnmpValue result, final String expectedResultString, final Long expectedResultNumber) {
assertTrue(className + ": " + methodName + " isDisplayable should be true", result.isDisplayable());
assertEquals(className + ": " + methodName + " to int should return " + expectedResultString, expectedResultNumber.intValue(), result.toInt());
assertEquals(className + ": " + methodName + " to long should return " + expectedResultString, expectedResultNumber.longValue(), result.toLong());
assertEquals(className + ": " + methodName + " to BigInteger should return " + expectedResultString, BigInteger.valueOf(expectedResultNumber.longValue()), result.toBigInteger());
assertEquals(className + ": " + methodName + " to String should return " + expectedResultString, expectedResultString, result.toString());
assertEquals(className + ": " + methodName + " to DisplayString should return " + expectedResultString, expectedResultString, result.toDisplayString());
assertEquals(className + ": " + methodName + " to bytes should return [" + expectedResultString + "]", "[" + expectedResultString + "]", Arrays.toString(result.getBytes()));
try {
result.toHexString();
fail(className + ": " + methodName + " to HexString should throw an IllegalArgumentException");
} catch (final IllegalArgumentException e) { /* expected */ }
try {
result.toInetAddress();
fail(className + ": " + methodName + " to InetAddress should throw an IllegalArgumentException");
} catch (final IllegalArgumentException e) { /* expected */ }
try {
result.toSnmpObjId();
fail(className + ": " + methodName + " to SnmpObjId should throw an IllegalArgumentException");
} catch (final IllegalArgumentException e) { /* expected */ }
}
}