/******************************************************************************* * This file is part of OpenNMS(R). * * Copyright (C) 2007-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.config; import static org.junit.Assert.*; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import java.util.regex.MatchResult; import org.apache.commons.io.FileUtils; import org.junit.Ignore; import org.junit.Test; import org.opennms.netmgt.config.snmp.SnmpConfig; import org.opennms.netmgt.model.discovery.IPAddress; import org.opennms.netmgt.model.discovery.IPAddressRange; import org.opennms.netmgt.model.discovery.IPAddressRangeSet; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; /** * JUnit tests for the configureSNMP event handling and optimization of * the SNMP configuration XML. * * @author <a href="mailto:david@opennms.org>David Hustace</a> * */ public class SnmpEventInfoTest { @Test(expected=IllegalArgumentException.class) public void testConfigRangeCreateOutOfOrder() { new IPAddressRange("192.168.1.2", "192.168.1.1"); } @Test public void testAddressIncr() { IPAddress ipA = new IPAddress("::5"); assertEquals("::6", ipA.incr().toString()); IPAddress ipB = new IPAddress("::ffff:ffff"); assertEquals("::1:0:0", ipB.incr().toString()); IPAddress ipC = new IPAddress("::ff00:ffff"); assertEquals("::ff01:0", ipC.incr().toString()); IPAddress ipD = new IPAddress("::ff00:7fff"); assertEquals("::ff00:8000", ipD.incr().toString()); } @Test public void testConfigAddressDecr() { IPAddress a = new IPAddress("::6"); assertEquals("::5", a.decr().toString()); IPAddress b = new IPAddress("::1:0:0"); assertEquals("::ffff:ffff", b.decr().toString()); IPAddress c = new IPAddress("ff::ffff:1:0"); assertEquals("ff::ffff:0:ffff", c.decr().toString()); IPAddress d = new IPAddress("ff::ffff:1:8000"); assertEquals("ff::ffff:1:7fff", d.decr().toString()); } @Test public void testContainsAddr() { IPAddressRange range = new IPAddressRange("192.168.1.1", "192.168.1.3"); assertFalse(range.contains("192.168.0.1")); assertTrue(range.contains("192.168.1.1")); assertTrue(range.contains("192.168.1.2")); assertTrue(range.contains("192.168.1.3")); assertFalse(range.contains("192.168.1.4")); } @Test public void testFollows() { IPAddressRange s = new IPAddressRange("192.168.1.5", "192.168.1.6"); IPAddressRange q = new IPAddressRange("192.168.1.1", "192.168.1.2"); IPAddressRange r = new IPAddressRange("192.168.1.3", "192.168.1.4"); assertTrue(r.comesAfter(q)); assertFalse(r.comesAfter(r)); assertFalse(r.comesAfter(s)); } @Test public void testContainsAddrIPv6() { IPAddressRange r = new IPAddressRange("2001:db8::10", "2001:db8::20"); assertFalse(r.contains("192.168.0.1")); assertFalse(r.contains("2001:db8::1")); assertTrue(r.contains("2001:db8::10")); assertTrue(r.contains("2001:db8::15")); assertTrue(r.contains("2001:db8::20")); assertFalse(r.contains("2001:db8::21")); } @Test public void testContainsRange() { IPAddressRange r = new IPAddressRange("192.168.1.1", "192.168.1.10"); assertTrue(r.contains(new IPAddressRange("192.168.1.1", "192.168.1.1"))); assertTrue(r.contains(new IPAddressRange("192.168.1.10", "192.168.1.10"))); assertTrue(r.contains(new IPAddressRange("192.168.1.2", "192.168.1.7"))); assertFalse(r.contains(new IPAddressRange("192.168.1.0", "192.168.1.1"))); assertFalse(r.contains(new IPAddressRange("192.168.1.2", "192.168.1.11"))); assertFalse(r.contains(new IPAddressRange("192.168.1.0", "192.168.1.11"))); } @Test public void testPreceedsRange() { IPAddressRange r = new IPAddressRange("192.168.1.10", "192.168.1.20"); assertTrue(r.comesBefore(new IPAddressRange("192.168.1.21", "192.168.1.30"))); assertTrue(r.comesBefore(new IPAddressRange("192.168.1.21", "192.168.1.21"))); assertFalse(r.comesBefore(new IPAddressRange("192.168.1.20", "192.168.1.30"))); assertFalse(r.comesBefore(new IPAddressRange("192.168.1.7", "192.168.1.9"))); } @Test public void testOverlapsRange() { IPAddressRange r = new IPAddressRange("192.168.1.10", "192.168.1.20"); assertTrue(r.overlaps(new IPAddressRange("192.168.1.10", "192.168.1.10"))); assertTrue(r.overlaps(new IPAddressRange("192.168.1.20", "192.168.1.20"))); assertTrue(r.overlaps(new IPAddressRange("192.168.1.10", "192.168.1.20"))); assertTrue(r.overlaps(new IPAddressRange("192.168.1.9", "192.168.1.22"))); assertTrue(r.overlaps(new IPAddressRange("192.168.1.15", "192.168.1.22"))); assertTrue(r.overlaps(new IPAddressRange("192.168.1.9", "192.168.1.15"))); assertTrue(r.overlaps(new IPAddressRange("192.168.1.11", "192.168.1.19"))); assertFalse(r.overlaps(new IPAddressRange("192.168.1.5", "192.168.1.9"))); assertFalse(r.overlaps(new IPAddressRange("192.168.1.21", "192.168.1.22"))); } @Test public void testAdjacentRange() { IPAddressRange r = new IPAddressRange("192.168.1.10", "192.168.1.20"); assertTrue(r.adjoins(new IPAddressRange("192.168.1.7", "192.168.1.9"))); assertFalse(r.adjoins(new IPAddressRange("192.168.1.7", "192.168.1.8"))); assertFalse(r.adjoins(new IPAddressRange("192.168.1.7", "192.168.1.21"))); assertTrue(r.adjoins(new IPAddressRange("192.168.1.21", "192.168.1.21"))); } @Test public void testConfigRangeEquals() { IPAddressRange r = new IPAddressRange("192.168.1.10", "192.168.1.20"); assertEquals(r, r); assertEquals(r, new IPAddressRange("192.168.1.10", "192.168.1.20")); assertFalse(r.equals(new IPAddressRange("192.168.1.10", "192.168.1.19"))); } @Test public void testCombine() { IPAddressRange rr = new IPAddressRange("192.168.1.10", "192.168.1.20"); assertEquals(rr, rr.combine(new IPAddressRange("192.168.1.10", "192.168.1.20"))); assertEquals(rr, rr.combine(new IPAddressRange("192.168.1.11", "192.168.1.20"))); assertEquals(rr, rr.combine(new IPAddressRange("192.168.1.10", "192.168.1.19"))); assertEquals(rr, rr.combine(new IPAddressRange("192.168.1.11", "192.168.1.19"))); assertEquals(new IPAddressRange("192.168.1.9", "192.168.1.20"), rr.combine(new IPAddressRange("192.168.1.9", "192.168.1.12"))); assertEquals(new IPAddressRange("192.168.1.10", "192.168.1.22"), rr.combine(new IPAddressRange("192.168.1.13", "192.168.1.22"))); assertEquals(new IPAddressRange("192.168.1.9", "192.168.1.22"), rr.combine(new IPAddressRange("192.168.1.9", "192.168.1.22"))); assertEquals(new IPAddressRange("192.168.1.7", "192.168.1.20"), rr.combine(new IPAddressRange("192.168.1.7", "192.168.1.9"))); assertEquals(new IPAddressRange("192.168.1.10", "192.168.1.24"), rr.combine(new IPAddressRange("192.168.1.21", "192.168.1.24"))); } @Test public void testRemove() { IPAddressRange r = new IPAddressRange("192.168.1.10", "192.168.1.20"); assertArrayEquals(new IPAddressRange[0], r.remove(r)); assertArrayEquals(new IPAddressRange[0], r.remove(new IPAddressRange("192.168.1.5", "192.168.1.27"))); assertArrayEquals(new IPAddressRange[] { r }, r.remove(new IPAddressRange("192.168.1.5", "192.168.1.7"))); assertArrayEquals(new IPAddressRange[] { r }, r.remove(new IPAddressRange("192.168.1.22", "192.168.1.27"))); assertArrayEquals(new IPAddressRange[] { new IPAddressRange("192.168.1.15", "192.168.1.20") }, r.remove(new IPAddressRange("192.168.1.5", "192.168.1.14"))); assertArrayEquals(new IPAddressRange[] { new IPAddressRange("192.168.1.10", "192.168.1.14") }, r.remove(new IPAddressRange("192.168.1.15", "192.168.1.24"))); assertArrayEquals(new IPAddressRange[] { new IPAddressRange("192.168.1.10", "192.168.1.14"), new IPAddressRange("192.168.1.16", "192.168.1.20") }, r.remove(new IPAddressRange("192.168.1.15", "192.168.1.15"))); } @Test public void testListAdd() { IPAddressRange r = new IPAddressRange("192.168.1.10", "192.168.1.20"); IPAddressRangeSet ranges = new IPAddressRangeSet(); ranges.add(r); assertArrayEquals(new IPAddressRange[] { r }, ranges.toArray()); IPAddressRange s = new IPAddressRange("192.168.1.30", "192.168.1.40"); ranges.add(s); assertArrayEquals(new IPAddressRange[] { r, s }, ranges.toArray()); IPAddressRange t = new IPAddressRange("192.168.1.2", "192.168.1.8"); ranges.add(t); assertArrayEquals(new IPAddressRange[] { t, r, s }, ranges.toArray()); IPAddressRange u = new IPAddressRange("192.168.1.22", "192.168.1.28"); ranges.add(u); assertArrayEquals(new IPAddressRange[] { t, r, u, s }, ranges.toArray()); ranges.add(new IPAddressRange("192.168.1.18", "192.168.1.24")); assertArrayEquals(new IPAddressRange[] { t, new IPAddressRange("192.168.1.10", "192.168.1.28"), s }, ranges.toArray()); ranges.add(new IPAddressRange("192.168.1.9", "192.168.1.9")); assertArrayEquals(new IPAddressRange[] { new IPAddressRange("192.168.1.2", "192.168.1.28"), s }, ranges.toArray()); } @Test public void testListRemove() { IPAddressRange r = new IPAddressRange("192.168.1.1", "192.168.1.100"); //{[1..100]} IPAddressRangeSet ranges = new IPAddressRangeSet(); ranges.add(r); IPAddressRange s = new IPAddressRange("192.168.1.30", "192.168.1.40"); ranges.remove(s); //{[1..29],[41..100]} assertArrayEquals(new IPAddressRange[] { new IPAddressRange("192.168.1.1", "192.168.1.29"), new IPAddressRange("192.168.1.41", "192.168.1.100") }, ranges.toArray()); IPAddressRange t = new IPAddressRange("192.168.1.20", "192.168.1.35"); ranges.remove(t); //{[1..19],[41..100]} assertArrayEquals(new IPAddressRange[] { new IPAddressRange("192.168.1.1", "192.168.1.19"), new IPAddressRange("192.168.1.41", "192.168.1.100") }, ranges.toArray()); IPAddressRange u = new IPAddressRange("192.168.1.35", "192.168.1.50"); ranges.remove(u); //{[1..19],[51..100]} assertArrayEquals(new IPAddressRange[] { new IPAddressRange("192.168.1.1", "192.168.1.19"), new IPAddressRange("192.168.1.51", "192.168.1.100") }, ranges.toArray()); ranges.remove(new IPAddressRange("192.168.1.60", "192.168.1.70")); //{1..19],[51..59],[71..100]} assertArrayEquals(new IPAddressRange[] { new IPAddressRange("192.168.1.1", "192.168.1.19"), new IPAddressRange("192.168.1.51", "192.168.1.59"), new IPAddressRange("192.168.1.71", "192.168.1.100") }, ranges.toArray()); ranges.remove(new IPAddressRange("192.168.1.10", "192.168.1.80")); //{1..9],[81..100} assertArrayEquals(new IPAddressRange[] { new IPAddressRange("192.168.1.1", "192.168.1.9"), new IPAddressRange("192.168.1.81", "192.168.1.100") }, ranges.toArray()); } /** * This tests the ability of a configureSNMP event to change the community * string of a specific address. * * @throws MarshalException * @throws ValidationException * @throws IOException */ @Test public final void testModifySpecificInDef() throws IOException { String snmpConfigXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <specific>192.168.0.5</specific>\n" + " </definition>\n" + "</snmp-config>\n" + ""; String expectedConfig = "" + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition read-community=\"abc\">\n" + " <specific>192.168.0.5</specific>\n" + " </definition>\n" + "</snmp-config>\n" + ""; SnmpPeerFactory.setInstance(new SnmpPeerFactory(snmpConfigXml)); assertEquals(snmpConfigXml, SnmpPeerFactory.marshallConfig()); SnmpEventInfo info = new SnmpEventInfo(); info.setCommunityString("abc"); info.setFirstIPAddress("192.168.0.5"); SnmpPeerFactory.getInstance().define(info); String actualConfig = SnmpPeerFactory.marshallConfig(); assertEquals(expectedConfig, actualConfig); } /** * This tests the ability of a configureSNMP event to change the community * string of a specific address. * * @throws MarshalException * @throws ValidationException * @throws IOException */ @Test public final void testModifySpecificInDefIPv6() throws IOException { String snmpConfigXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <specific>2001:db8::10</specific>\n" + " </definition>\n" + "</snmp-config>\n" + ""; String expectedConfig = "" + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition read-community=\"abc\">\n" + " <specific>2001:db8::10</specific>\n" + " </definition>\n" + "</snmp-config>\n" + ""; SnmpPeerFactory.setInstance(new SnmpPeerFactory(snmpConfigXml)); assertEquals(snmpConfigXml, SnmpPeerFactory.marshallConfig()); SnmpEventInfo info = new SnmpEventInfo(); info.setCommunityString("abc"); info.setFirstIPAddress("2001:db8::10"); SnmpPeerFactory.getInstance().define(info); String actualConfig = SnmpPeerFactory.marshallConfig(); assertEquals(expectedConfig, actualConfig); } /** * This tests the merging of a new specific into a definition that already contains a specific * that is adjacent. The two specifics should be converted to a single range in the definition. * * @throws MarshalException * @throws ValidationException * @throws IOException */ @Test public final void testAddAdjacentSpecificToDef() throws IOException { String snmpConfigXml = "" + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <specific>192.168.0.5</specific>\n" + " </definition>\n" + "</snmp-config>\n" + ""; String expectedConfig = "" + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <range begin=\"192.168.0.5\" end=\"192.168.0.6\"/>\n" + " </definition>\n" + "</snmp-config>\n" + ""; SnmpPeerFactory.setInstance(new SnmpPeerFactory(snmpConfigXml)); assertEquals(snmpConfigXml, SnmpPeerFactory.marshallConfig()); SnmpEventInfo info = new SnmpEventInfo(); info.setVersion("v2c"); info.setFirstIPAddress("192.168.0.6"); SnmpPeerFactory.getInstance().define(info); String actualConfig = SnmpPeerFactory.marshallConfig(); assertEquals(expectedConfig, actualConfig); } /** * This tests the merging of a new specific into a definition that already contains a specific * that is adjacent. The two specifics should be converted to a single range in the definition. * * @throws MarshalException * @throws ValidationException * @throws IOException */ @Test public final void testAddAdjacentSpecificToDefIPv6() throws IOException { String snmpConfigXml = "" + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <specific>2001:db8::10</specific>\n" + " </definition>\n" + "</snmp-config>\n" + ""; String expectedConfig = "" + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <range begin=\"2001:db8::10\" end=\"2001:db8::11\"/>\n" + " </definition>\n" + "</snmp-config>\n" + ""; SnmpPeerFactory.setInstance(new SnmpPeerFactory(snmpConfigXml)); assertEquals(snmpConfigXml, SnmpPeerFactory.marshallConfig()); SnmpEventInfo info = new SnmpEventInfo(); info.setVersion("v2c"); info.setFirstIPAddress("2001:db8::11"); SnmpPeerFactory.getInstance().define(info); String actualConfig = SnmpPeerFactory.marshallConfig(); assertEquals(expectedConfig, actualConfig); } /** * This tests the merging of a new specific into a definition that already contains a specific * that is adjacent. The two specifics should be converted to a single range in the definition. * * @throws MarshalException * @throws ValidationException * @throws IOException */ @Test public final void testAddSpecificBetweenAdjacentsSpecifics() throws IOException { String snmpConfigXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <specific>192.168.0.5</specific>\n" + " <specific>192.168.0.7</specific>\n" + " </definition>\n" + "</snmp-config>\n" + ""; String expectedConfig = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <range begin=\"192.168.0.5\" end=\"192.168.0.7\"/>\n" + " </definition>\n" + "</snmp-config>\n" + ""; SnmpPeerFactory.setInstance(new SnmpPeerFactory(snmpConfigXml)); assertEquals(snmpConfigXml, SnmpPeerFactory.marshallConfig()); SnmpEventInfo info = new SnmpEventInfo(); info.setVersion("v2c"); info.setFirstIPAddress("192.168.0.6"); SnmpPeerFactory.getInstance().define(info); String actualConfig = SnmpPeerFactory.marshallConfig(); assertEquals(expectedConfig, actualConfig); } /** * This tests the merging of a new specific into a definition that already contains a specific * that is adjacent. The two specifics should be converted to a single range in the definition. * * @throws MarshalException * @throws ValidationException * @throws IOException */ @Test public final void testAddSpecificBetweenAdjacentsSpecificsMostlyZeros() throws IOException { String snmpConfigXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <specific>0.0.0.5</specific>\n" + " <specific>0.0.0.7</specific>\n" + " </definition>\n" + "</snmp-config>\n" + ""; String expectedConfig = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <range begin=\"0.0.0.5\" end=\"0.0.0.7\"/>\n" + " </definition>\n" + "</snmp-config>\n" + ""; SnmpPeerFactory.setInstance(new SnmpPeerFactory(snmpConfigXml)); assertEquals(snmpConfigXml, SnmpPeerFactory.marshallConfig()); SnmpEventInfo info = new SnmpEventInfo(); info.setVersion("v2c"); info.setFirstIPAddress("0.0.0.6"); SnmpPeerFactory.getInstance().define(info); String actualConfig = SnmpPeerFactory.marshallConfig(); assertEquals(expectedConfig, actualConfig); } /** * This tests the merging of a new specific into a definition that already contains a specific * that is adjacent. The two specifics should be converted to a single range in the definition. * * @throws MarshalException * @throws ValidationException * @throws IOException */ @Test public final void testAddSpecificBetweenAdjacentsSpecificsIPv6() throws IOException { String snmpConfigXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <specific>::5</specific>\n" + " <specific>::7</specific>\n" + " </definition>\n" + "</snmp-config>\n" + ""; String expectedConfig = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <range begin=\"::5\" end=\"::7\"/>\n" + " </definition>\n" + "</snmp-config>\n" + ""; SnmpPeerFactory.setInstance(new SnmpPeerFactory(snmpConfigXml)); assertEquals(snmpConfigXml, SnmpPeerFactory.marshallConfig()); SnmpEventInfo info = new SnmpEventInfo(); info.setVersion("v2c"); info.setFirstIPAddress("::6"); SnmpPeerFactory.getInstance().define(info); String actualConfig = SnmpPeerFactory.marshallConfig(); assertEquals(expectedConfig, actualConfig); } @Test public final void testAddSpecificBetweenAdjacentSpecificAndRange() throws IOException { String snmpConfigXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <range begin=\"192.168.0.7\" end=\"192.168.0.9\"/>\n" + " <specific>192.168.0.5</specific>\n" + " </definition>\n" + "</snmp-config>\n" + ""; String expectedConfig = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <range begin=\"192.168.0.5\" end=\"192.168.0.9\"/>\n" + " </definition>\n" + "</snmp-config>\n" + ""; SnmpPeerFactory.setInstance(new SnmpPeerFactory(snmpConfigXml)); assertEquals(snmpConfigXml, SnmpPeerFactory.marshallConfig()); SnmpEventInfo info = new SnmpEventInfo(); info.setVersion("v2c"); info.setFirstIPAddress("192.168.0.6"); SnmpPeerFactory.getInstance().define(info); String actualConfig = SnmpPeerFactory.marshallConfig(); assertEquals(expectedConfig, actualConfig); } /** * This tests the ability to add a new range of IPs that create a new definition and these IPs * were previously defined withing the a range of a current definition. The result should be * that the previous range is split into 2 ranges and the new range is now contained in a new * separate definition. * * @throws MarshalException * @throws ValidationException * @throws IOException */ @Test public void testSplitRange() throws IOException { String snmpConfigXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <range begin=\"192.168.1.100\" end=\"192.168.1.200\"/>\n" + " </definition>\n" + "</snmp-config>\n" + ""; String expectedConfig = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <range begin=\"192.168.1.100\" end=\"192.168.1.119\"/>\n" + " <range begin=\"192.168.1.131\" end=\"192.168.1.200\"/>\n" + " </definition>\n" + " <definition version=\"v1\">\n" + " <range begin=\"192.168.1.120\" end=\"192.168.1.130\"/>\n" + " </definition>\n" + "</snmp-config>\n" + ""; SnmpPeerFactory.setInstance(new SnmpPeerFactory(snmpConfigXml)); assertEquals(snmpConfigXml, SnmpPeerFactory.marshallConfig()); SnmpEventInfo info = new SnmpEventInfo(); info.setVersion("v1"); info.setFirstIPAddress("192.168.1.120"); info.setLastIPAddress("192.168.1.130"); SnmpPeerFactory.getInstance().define(info); // String config = SnmpPeerFactory.marshallConfig(); // System.err.println(config); String actualConfig = SnmpPeerFactory.marshallConfig(); assertEquals(expectedConfig, actualConfig); } /** * This tests the ability to create a new definition from an IP that was previously covered by * a range in an existing definition. The result should be the previous range is converted into 2 * new ranges and the new specific is added to a new definition in the config. * * @throws MarshalException * @throws ValidationException * @throws IOException */ @Test public void testRemoveSpecificFromRange() throws IOException { String snmpConfigXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <range begin=\"192.168.1.100\" end=\"192.168.1.200\"/>\n" + " </definition>\n" + "</snmp-config>\n" + ""; String expectedConfig = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <range begin=\"192.168.1.100\" end=\"192.168.1.119\"/>\n" + " <range begin=\"192.168.1.121\" end=\"192.168.1.200\"/>\n" + " </definition>\n" + " <definition version=\"v1\">\n" + " <specific>192.168.1.120</specific>\n" + " </definition>\n" + "</snmp-config>\n" + ""; SnmpPeerFactory.setInstance(new SnmpPeerFactory(snmpConfigXml)); assertEquals(snmpConfigXml, SnmpPeerFactory.marshallConfig()); SnmpEventInfo info = new SnmpEventInfo(); info.setVersion("v1"); info.setFirstIPAddress("192.168.1.120"); SnmpPeerFactory.getInstance().define(info); // String config = SnmpPeerFactory.marshallConfig(); // System.err.println(config); String actualConfig = SnmpPeerFactory.marshallConfig(); assertEquals(expectedConfig, actualConfig); } @Test public void testRemoveSpecificNearEndOfRange() throws IOException { String snmpConfigXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <range begin=\"192.168.1.100\" end=\"192.168.1.200\"/>\n" + " </definition>\n" + "</snmp-config>\n" + ""; String expectedConfig = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <range begin=\"192.168.1.100\" end=\"192.168.1.198\"/>\n" + " <specific>192.168.1.200</specific>\n" + " </definition>\n" + " <definition version=\"v1\">\n" + " <specific>192.168.1.199</specific>\n" + " </definition>\n" + "</snmp-config>\n" + ""; SnmpPeerFactory.setInstance(new SnmpPeerFactory(snmpConfigXml)); assertEquals(snmpConfigXml, SnmpPeerFactory.marshallConfig()); SnmpEventInfo info = new SnmpEventInfo(); info.setVersion("v1"); info.setFirstIPAddress("192.168.1.199"); SnmpPeerFactory.getInstance().define(info); // String config = SnmpPeerFactory.marshallConfig(); // System.err.println(config); String actualConfig = SnmpPeerFactory.marshallConfig(); assertEquals(expectedConfig, actualConfig); } @Test public void testRemoveSpecificAtEndOfRange() throws IOException { String snmpConfigXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <range begin=\"192.168.1.100\" end=\"192.168.1.200\"/>\n" + " </definition>\n" + "</snmp-config>\n" + ""; String expectedConfig = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <range begin=\"192.168.1.100\" end=\"192.168.1.199\"/>\n" + " </definition>\n" + " <definition version=\"v1\">\n" + " <specific>192.168.1.200</specific>\n" + " </definition>\n" + "</snmp-config>\n" + ""; SnmpPeerFactory.setInstance(new SnmpPeerFactory(snmpConfigXml)); assertEquals(snmpConfigXml, SnmpPeerFactory.marshallConfig()); SnmpEventInfo info = new SnmpEventInfo(); info.setVersion("v1"); info.setFirstIPAddress("192.168.1.200"); SnmpPeerFactory.getInstance().define(info); // String config = SnmpPeerFactory.marshallConfig(); // System.err.println(config); String actualConfig = SnmpPeerFactory.marshallConfig(); assertEquals(expectedConfig, actualConfig); } /** * This tests the ability to move a specific from one definition into a range of another definition. The * results should be that the 2 ranges in the first definition are recombined into a single range based on * the single IP address that was in a different existing defintion that will now be removed and the definition * deleted. * * @throws MarshalException * @throws ValidationException * @throws IOException */ @Test public void testRecombineSpecificIntoRange() throws IOException { String snmpConfigXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <range begin=\"192.168.1.10\" end=\"192.168.1.14\"/>\n" + " <range begin=\"192.168.1.16\" end=\"192.168.1.40\"/>\n" + " </definition>\n" + " <definition version=\"v1\">\n" + " <specific>192.168.1.15</specific>\n" + " </definition>\n" + "</snmp-config>\n" + ""; String expectedConfig = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <range begin=\"192.168.1.10\" end=\"192.168.1.40\"/>\n" + " </definition>\n" + "</snmp-config>\n" + ""; SnmpPeerFactory.setInstance(new SnmpPeerFactory(snmpConfigXml)); assertEquals(snmpConfigXml, SnmpPeerFactory.marshallConfig()); SnmpEventInfo info = new SnmpEventInfo(); info.setVersion("v2c"); info.setFirstIPAddress("192.168.1.15"); SnmpPeerFactory.getInstance().define(info); // String config = SnmpPeerFactory.marshallConfig(); // System.err.println(config); String actualConfig = SnmpPeerFactory.marshallConfig(); assertEquals(expectedConfig, actualConfig); } /** * This tests the ability to remove a specific IP from one definition with a newly specified range. * * @throws MarshalException * @throws ValidationException * @throws IOException */ @Test public void testRemoveSpecificInSeparateDefWithNewRange() throws IOException { String snmpConfigXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <specific>192.168.1.30</specific>\n" + " <specific>10.1.1.1</specific>\n" + " </definition>\n" + "</snmp-config>\n" + ""; String expectedConfig = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <specific>10.1.1.1</specific>\n" + " </definition>\n" + " <definition version=\"v1\">\n" + " <range begin=\"192.168.1.15\" end=\"192.168.1.35\"/>\n" + " </definition>\n" + "</snmp-config>\n" + ""; SnmpPeerFactory.setInstance(new SnmpPeerFactory(snmpConfigXml)); assertEquals(snmpConfigXml, SnmpPeerFactory.marshallConfig()); SnmpEventInfo info = new SnmpEventInfo(); info.setVersion("v1"); info.setFirstIPAddress("192.168.1.15"); info.setLastIPAddress("192.168.1.35"); SnmpPeerFactory.getInstance().define(info); // String config = SnmpPeerFactory.marshallConfig(); // System.err.println(config); String actualConfig = SnmpPeerFactory.marshallConfig(); assertEquals(expectedConfig, actualConfig); } @Test public void testRemoveTrivialEntry() throws IOException { String snmpConfigXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <specific>192.168.1.30</specific>\n" + " <specific>10.1.1.1</specific>\n" + " </definition>\n" + "</snmp-config>\n" + ""; String expectedConfig = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <specific>10.1.1.1</specific>\n" + " </definition>\n" + "</snmp-config>\n" + ""; SnmpPeerFactory.setInstance(new SnmpPeerFactory(snmpConfigXml)); assertEquals(snmpConfigXml, SnmpPeerFactory.marshallConfig()); SnmpEventInfo info = new SnmpEventInfo(); info.setFirstIPAddress("192.168.1.30"); SnmpPeerFactory.getInstance().define(info); // String config = SnmpPeerFactory.marshallConfig(); // System.err.println(config); String actualConfig = SnmpPeerFactory.marshallConfig(); assertEquals(expectedConfig, actualConfig); } /** * This tests the behavior of specifying an invalid range. * * @throws MarshalException * @throws ValidationException * @throws IOException */ @Test public void testInvalidRange() throws IOException { String snmpConfigXml = "<?xml version=\"1.0\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <range begin=\"192.168.0.3\" end=\"192.168.0.100\"/>" + " </definition>\n" + "\n" + "</snmp-config>\n" + ""; SnmpPeerFactory.setInstance(new SnmpPeerFactory(snmpConfigXml)); SnmpEventInfo info = new SnmpEventInfo(); info.setVersion("v1"); info.setFirstIPAddress("192.168.0.3"); info.setLastIPAddress("192.168.0.1"); try { SnmpPeerFactory.getInstance().define(info); fail("Expected IllegalArgumentException."); } catch (IllegalArgumentException e) { } } /** * This tests the addition of a new specific definition that is the same address as the beginning of * a range in a current definition. * * @throws MarshalException * @throws ValidationException * @throws IOException */ @Test public void testNewSpecifcSameAsBeginInOldDef() throws IOException { String snmpConfigXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <range begin=\"192.168.0.3\" end=\"192.168.0.100\"/>\n" + " </definition>\n" + "</snmp-config>\n" + ""; String expectedConfig = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <range begin=\"192.168.0.4\" end=\"192.168.0.100\"/>\n" + " </definition>\n" + " <definition version=\"v1\">\n" + " <specific>192.168.0.3</specific>\n" + " </definition>\n" + "</snmp-config>\n" + ""; SnmpPeerFactory.setInstance(new SnmpPeerFactory(snmpConfigXml)); assertEquals(snmpConfigXml, SnmpPeerFactory.marshallConfig()); SnmpEventInfo info = new SnmpEventInfo(); info.setVersion("v1"); info.setFirstIPAddress("192.168.0.3"); SnmpPeerFactory.getInstance().define(info); // String config = SnmpPeerFactory.marshallConfig(); // System.err.println(config); String actualConfig = SnmpPeerFactory.marshallConfig(); assertEquals(expectedConfig, actualConfig); } /** * This tests the merging of a new definition that contains a range of IP addresses that overlaps * the end of one range and the beginning of another range in a current definition. * * @throws MarshalException * @throws ValidationException * @throws IOException */ @Test public void testOverlapsTwoRanges() throws IOException { String snmpConfigXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <range begin=\"192.168.1.10\" end=\"192.168.1.20\"/>\n" + " <range begin=\"192.168.1.30\" end=\"192.168.1.40\"/>\n" + " </definition>\n" + "</snmp-config>\n" + ""; String expectedConfig = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <range begin=\"192.168.1.10\" end=\"192.168.1.14\"/>\n" + " <range begin=\"192.168.1.36\" end=\"192.168.1.40\"/>\n" + " </definition>\n" + " <definition version=\"v1\">\n" + " <range begin=\"192.168.1.15\" end=\"192.168.1.35\"/>\n" + " </definition>\n" + "</snmp-config>\n" + ""; SnmpPeerFactory.setInstance(new SnmpPeerFactory(snmpConfigXml)); assertEquals(snmpConfigXml, SnmpPeerFactory.marshallConfig()); SnmpEventInfo info = new SnmpEventInfo(); info.setVersion("v1"); info.setFirstIPAddress("192.168.1.15"); info.setLastIPAddress("192.168.1.35"); SnmpPeerFactory.getInstance().define(info); String actualConfig = SnmpPeerFactory.marshallConfig(); assertEquals(expectedConfig, actualConfig); } public void testOverlapsTwoRangesAndCombinesThem(String firstIp, String lastIp) throws IOException { String snmpConfigXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <range begin=\"192.168.1.10\" end=\"192.168.1.20\"/>\n" + " <range begin=\"192.168.1.30\" end=\"192.168.1.40\"/>\n" + " </definition>\n" + "</snmp-config>\n" + ""; String expectedConfig = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <range begin=\"192.168.1.10\" end=\"192.168.1.40\"/>\n" + " </definition>\n" + "</snmp-config>\n" + ""; SnmpPeerFactory.setInstance(new SnmpPeerFactory(snmpConfigXml)); assertEquals(snmpConfigXml, SnmpPeerFactory.marshallConfig()); SnmpEventInfo info = new SnmpEventInfo(); info.setVersion("v2c"); info.setFirstIPAddress(firstIp); info.setLastIPAddress(lastIp); SnmpPeerFactory.getInstance().define(info); String actualConfig = SnmpPeerFactory.marshallConfig(); assertEquals(expectedConfig, actualConfig); } @Test public void testCombineOverlappingRanges() throws Exception { testOverlapsTwoRangesAndCombinesThem("192.168.1.15", "192.168.1.35"); testOverlapsTwoRangesAndCombinesThem("192.168.1.10", "192.168.1.35"); testOverlapsTwoRangesAndCombinesThem("192.168.1.20", "192.168.1.35"); testOverlapsTwoRangesAndCombinesThem("192.168.1.21", "192.168.1.35"); testOverlapsTwoRangesAndCombinesThem("192.168.1.15", "192.168.1.40"); testOverlapsTwoRangesAndCombinesThem("192.168.1.21", "192.168.1.30"); testOverlapsTwoRangesAndCombinesThem("192.168.1.21", "192.168.1.29"); testOverlapsTwoRangesAndCombinesThem("192.168.1.10", "192.168.1.40"); } /** * This tests moving a range that from one defintion into another defintion for which it overlaps * one range in the merging definition and creates 2 adjacent ranges that should be merged together. * * @throws MarshalException * @throws ValidationException * @throws IOException */ @Test public void testRecombineRanges() throws IOException { String snmpConfigXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <range begin=\"192.168.1.10\" end=\"192.168.1.14\"/>\n" + " <range begin=\"192.168.1.36\" end=\"192.168.1.40\"/>\n" + " </definition>\n" + " <definition version=\"v1\">\n" + " <range begin=\"192.168.1.15\" end=\"192.168.1.35\"/>\n" + " </definition>\n" + "</snmp-config>\n" + ""; String expectedConfig = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <range begin=\"192.168.1.10\" end=\"192.168.1.40\"/>\n" + " </definition>\n" + "</snmp-config>\n" + ""; SnmpPeerFactory.setInstance(new SnmpPeerFactory(snmpConfigXml)); assertEquals(snmpConfigXml, SnmpPeerFactory.marshallConfig()); SnmpEventInfo info = new SnmpEventInfo(); info.setVersion("v2c"); info.setFirstIPAddress("192.168.1.15"); info.setLastIPAddress("192.168.1.35"); SnmpPeerFactory.getInstance().define(info); String actualConfig = SnmpPeerFactory.marshallConfig(); assertEquals(expectedConfig, actualConfig); } /** * This tests recombing a range into an existing defintion for which the new range overlaps the current definition's * range and overlaps the end of one range and the beginning of another range of the merging definition. * * @throws MarshalException * @throws ValidationException * @throws IOException */ @Test public void testRecombineRangesNonAdjacentRange() throws IOException { String snmpConfigXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <range begin=\"192.168.1.10\" end=\"192.168.1.14\"/>\n" + " <range begin=\"192.168.1.36\" end=\"192.168.1.40\"/>\n" + " </definition>\n" + " <definition version=\"v1\">\n" + " <range begin=\"192.168.1.15\" end=\"192.168.1.35\"/>\n" + " </definition>\n" + "</snmp-config>\n" + ""; String expectedConfig = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <range begin=\"192.168.1.10\" end=\"192.168.1.40\"/>\n" + " </definition>\n" + "</snmp-config>\n" + ""; SnmpPeerFactory.setInstance(new SnmpPeerFactory(snmpConfigXml)); assertEquals(snmpConfigXml, SnmpPeerFactory.marshallConfig()); SnmpEventInfo info = new SnmpEventInfo(); info.setVersion("v2c"); info.setFirstIPAddress("192.168.1.12"); info.setLastIPAddress("192.168.1.38"); SnmpPeerFactory.getInstance().define(info); String actualConfig = SnmpPeerFactory.marshallConfig(); assertEquals(expectedConfig, actualConfig); } /** * This tests moving the specific from a current defition to a new defintion. * * @throws MarshalException * @throws ValidationException * @throws IOException */ @Test public final void testAddNewSpecificToConfig() throws IOException { String snmpConfigXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <specific>192.168.0.5</specific>\n" + " <specific>192.168.0.6</specific>\n" + " </definition>\n" + "</snmp-config>\n" + ""; String expectedConfig = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <specific>192.168.0.5</specific>\n" + " </definition>\n" + " <definition version=\"v1\">\n" + " <specific>192.168.0.6</specific>\n" + " </definition>\n" + "</snmp-config>\n" + ""; SnmpPeerFactory.setInstance(new SnmpPeerFactory(snmpConfigXml)); assertEquals(snmpConfigXml, SnmpPeerFactory.marshallConfig()); SnmpEventInfo info = new SnmpEventInfo(); info.setVersion("v1"); info.setFirstIPAddress("192.168.0.6"); SnmpPeerFactory.getInstance().define(info); String actualConfig = SnmpPeerFactory.marshallConfig(); assertEquals(expectedConfig, actualConfig); } /** * Test method for {@link org.opennms.netmgt.config.SnmpEventInfo#optimizeAllDefs()}. * @throws ValidationException * @throws MarshalException * @throws IOException */ @Test @Ignore("This is no longer really valid since we don't have to optimize in a separate pass") public final void testOptimizeAllDefs() throws IOException { String snmpConfigXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <specific>192.168.0.5</specific>\n" + " </definition>\n" + " <definition read-community=\"opennmsrules\">\n" + " <range begin=\"192.168.100.1\" end=\"192.168.100.254\"/>\n" + " <range begin=\"192.168.101.1\" end=\"192.168.101.254\"/>\n" + " <range begin=\"192.168.102.1\" end=\"192.168.102.254\"/>\n" + " <range begin=\"192.168.103.1\" end=\"192.168.103.254\"/>\n" + " <range begin=\"192.168.104.1\" end=\"192.168.104.254\"/>\n" + " <range begin=\"192.168.105.1\" end=\"192.168.105.254\"/>\n" + " <range begin=\"192.168.106.1\" end=\"192.168.106.254\"/>\n" + " <range begin=\"192.168.107.1\" end=\"192.168.107.254\"/>\n" + " <range begin=\"192.168.0.1\" end=\"192.168.0.10\"/>\n" + " </definition>\n" + " <definition read-community=\"opennmsrules2\">\n" + " <range begin=\"192.168.100.0\" end=\"192.168.100.255\"/>\n" + " <range begin=\"192.168.101.0\" end=\"192.168.101.255\"/>\n" + " <range begin=\"192.168.102.0\" end=\"192.168.102.255\"/>\n" + " <range begin=\"192.168.103.0\" end=\"192.168.103.255\"/>\n" + " <range begin=\"192.168.104.0\" end=\"192.168.104.255\"/>\n" + " <range begin=\"192.168.105.0\" end=\"192.168.105.255\"/>\n" + " <range begin=\"192.168.106.0\" end=\"192.168.106.255\"/>\n" + " <range begin=\"192.168.107.0\" end=\"192.168.107.255\"/>\n" + " <range begin=\"192.168.0.1\" end=\"192.168.0.10\"/>\n" + " </definition>\n" + " <definition read-community=\"splice-test\" version=\"v2c\">\n" + " <range begin=\"10.1.2.1\" end=\"10.1.2.100\"/>\n" + " <range begin=\"11.1.2.1\" end=\"11.1.2.100\"/>\n" + " <range begin=\"12.1.2.1\" end=\"12.1.2.100\"/>\n" + " <specific>10.1.1.1</specific>\n" + " <specific>10.1.1.2</specific>\n" + " <specific>10.1.1.3</specific>\n" + " <specific>10.1.1.5</specific>\n" + " <specific>10.1.1.6</specific>\n" + " <specific>10.1.1.10</specific>\n" + " </definition>\n" + " <definition read-community=\"splice2-test\">\n" + " <range begin=\"10.1.1.11\" end=\"10.1.1.100\"/>\n" + " <range begin=\"11.1.2.1\" end=\"11.1.2.100\"/>\n" + " <range begin=\"12.1.2.1\" end=\"12.1.2.100\"/>\n" + " <specific>10.1.1.10</specific>\n" + " </definition>\n" + " <definition read-community=\"splice3-test\">\n" + " <range begin=\"10.1.1.11\" end=\"10.1.1.100\"/>\n" + " <range begin=\"11.1.2.1\" end=\"11.1.2.1\"/>\n" + " <range begin=\"12.1.2.1\" end=\"12.1.2.1\"/>\n" + " <specific>10.1.1.10</specific>\n" + " <specific>10.1.1.12</specific>\n" + " </definition>\n" + "</snmp-config>\n" + ""; String expectedConfig = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> standalone=\"yes\"\n" + "<snmp-config retry=\"3\" timeout=\"800\" read-community=\"public\" write-community=\"private\" xmlns=\"http://xmlns.opennms.org/xsd/config/snmp\">\n" + " <definition version=\"v2c\">\n" + " <specific>192.168.0.5</specific>\n" + " </definition>\n" + " <definition read-community=\"opennmsrules\">\n" + " <range begin=\"192.168.0.1\" end=\"192.168.0.10\"/>\n" + " <range begin=\"192.168.100.1\" end=\"192.168.100.254\"/>\n" + " <range begin=\"192.168.101.1\" end=\"192.168.101.254\"/>\n" + " <range begin=\"192.168.102.1\" end=\"192.168.102.254\"/>\n" + " <range begin=\"192.168.103.1\" end=\"192.168.103.254\"/>\n" + " <range begin=\"192.168.104.1\" end=\"192.168.104.254\"/>\n" + " <range begin=\"192.168.105.1\" end=\"192.168.105.254\"/>\n" + " <range begin=\"192.168.106.1\" end=\"192.168.106.254\"/>\n" + " <range begin=\"192.168.107.1\" end=\"192.168.107.254\"/>\n" + " </definition>\n" + " <definition read-community=\"opennmsrules2\">\n" + " <range begin=\"192.168.0.1\" end=\"192.168.0.10\"/>\n" + " <range begin=\"192.168.100.0\" end=\"192.168.107.255\"/>\n" + " </definition>\n" + " <definition read-community=\"splice-test\" version=\"v2c\">\n" + " <range begin=\"10.1.1.1\" end=\"10.1.1.3\"/>\n" + " <range begin=\"10.1.1.5\" end=\"10.1.1.6\"/>\n" + " <range begin=\"10.1.2.1\" end=\"10.1.2.100\"/>\n" + " <range begin=\"11.1.2.1\" end=\"11.1.2.100\"/>\n" + " <range begin=\"12.1.2.1\" end=\"12.1.2.100\"/>\n" + " <specific>10.1.1.10</specific>\n" + " </definition>\n" + " <definition read-community=\"splice2-test\">\n" + " <range begin=\"10.1.1.10\" end=\"10.1.1.100\"/>\n" + " <range begin=\"11.1.2.1\" end=\"11.1.2.100\"/>\n" + " <range begin=\"12.1.2.1\" end=\"12.1.2.100\"/>\n" + " </definition>\n" + " <definition read-community=\"splice3-test\">\n" + " <range begin=\"10.1.1.10\" end=\"10.1.1.100\"/>\n" + " <specific>11.1.2.1</specific>\n" + " <specific>12.1.2.1</specific>\n" + " </definition>\n" + "</snmp-config>\n" + ""; SnmpPeerFactory.setInstance(new SnmpPeerFactory(snmpConfigXml)); assertEquals(snmpConfigXml, SnmpPeerFactory.marshallConfig()); SnmpEventInfo info = new SnmpEventInfo(); SnmpConfig config = SnmpPeerFactory.getSnmpConfig(); assertEquals(6, config.getDefinitionCount()); info.setCommunityString("opennmsrules2"); //do bunch more... new SnmpConfigManager(config).optimizeAllDefs(); // String config = SnmpPeerFactory.marshallConfig(); // System.err.println(config); String actualConfig = SnmpPeerFactory.marshallConfig(); assertEquals(expectedConfig, actualConfig); } @Test @Ignore public void testAddSpecificToBigFile() throws Exception { Resource res = new FileSystemResource("/Users/brozow/big-snmp-config.xml"); SnmpPeerFactory.setInstance(new SnmpPeerFactory(res)); SnmpEventInfo info = new SnmpEventInfo(); info.setCommunityString("th3l04n3r"); info.setFirstIPAddress("192.168.1.15"); info.setLastIPAddress("192.168.1.35"); SnmpPeerFactory.getInstance().define(info); String actualConfig = SnmpPeerFactory.marshallConfig(); System.err.println(actualConfig); //assertEquals(expectedConfig, actualConfig); } @Test @Ignore public void testConfigTheHeckOutOfIt() throws Exception { Resource configResource = new FileSystemResource("/Users/brozow/big-snmp-config.xml"); Resource events = new FileSystemResource("/Users/brozow/support/NEN/palin/wave-events.txt"); File configDir = new File("/Users/brozow/support/NEN/palin/configs"); configDir.mkdirs(); SnmpEventInfo[] updates = readEventInfo(events.getInputStream()); assertNotNull(updates); SnmpPeerFactory.setInstance(new SnmpPeerFactory(configResource)); int index = 0; for (SnmpEventInfo update : updates) { try { File dir = new File(configDir, String.format("%03d", index)); dir.mkdirs(); SnmpPeerFactory.saveToFile(new File(dir, "pre-config.xml")); SnmpPeerFactory.getInstance().define(update); File saveUpdate = new File(dir, "update"); FileUtils.writeStringToFile(saveUpdate, String.format("%s %s %s\n", update.getFirstIPAddress(), update.getLastIPAddress(), update.getCommunityString())); SnmpPeerFactory.saveToFile(new File(dir, "post-config.xml")); } catch (Exception e) { e.printStackTrace(); fail(String.format("Applying update with index %d change community string for %s to %s failed.", index, update.getFirstIPAddress(), update.getCommunityString())); } index++; } String actualConfig = SnmpPeerFactory.marshallConfig(); System.err.println(actualConfig); //assertEquals(expectedConfig, actualConfig); } private SnmpEventInfo[] readEventInfo(InputStream in) throws UnknownHostException { List<SnmpEventInfo> updates = new ArrayList<SnmpEventInfo>(500); Scanner s = new Scanner(in); int lineCount = 0; while(s.hasNextLine()) { lineCount++; s.findInLine("\\s*firstIPAddress=([0-9.]+) communityString=([^ ]*) lastIPAddress=([0-9.]+)\\s*"); MatchResult result = s.match(); System.out.printf("%d: %s - %s: %s\n", lineCount, result.group(1), result.group(3), result.group(2)); SnmpEventInfo info = new SnmpEventInfo(); info.setFirstIPAddress(result.group(1)); info.setLastIPAddress(result.group(3)); info.setCommunityString(result.group(2)); updates.add(info); s.nextLine(); } s.close(); return updates.toArray(new SnmpEventInfo[0]); } }