/******************************************************************************* * 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.web.rest; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.StringReader; import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.TreeSet; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.xml.bind.JAXBContext; import javax.xml.bind.Unmarshaller; import org.junit.Test; import org.opennms.core.test.MockLogAppender; import org.opennms.core.utils.LogUtils; import org.opennms.core.xml.JaxbUtils; import org.opennms.netmgt.model.OnmsNode; import org.opennms.netmgt.model.OnmsNodeList; import org.springframework.mock.web.MockHttpServletRequest; /* * TODO * 1. Need to figure it out how to create a Mock for EventProxy to validate events sent by RESTful service */ public class NodeRestServiceTest extends AbstractSpringJerseyRestTestCase { private static int m_nodeCounter = 0; @Override protected void afterServletStart() throws Exception { MockLogAppender.setupLogging(); m_nodeCounter = 0; } @Test public void testNode() throws Exception { // Testing POST createNode(); String url = "/nodes"; // Testing GET Collection String xml = sendRequest(GET, url, 200); assertTrue(xml.contains("Darwin TestMachine 9.4.0 Darwin Kernel Version 9.4.0")); OnmsNodeList list = JaxbUtils.unmarshal(OnmsNodeList.class, xml); assertEquals(1, list.getNodes().size()); assertEquals(xml, "TestMachine0", list.getNodes().get(0).getLabel()); // Testing orderBy xml = sendRequest(GET, url, parseParamData("orderBy=sysObjectId"), 200); list = JaxbUtils.unmarshal(OnmsNodeList.class, xml); assertEquals(1, list.getNodes().size()); assertEquals("TestMachine0", list.getNodes().get(0).getLabel()); // Add 4 more nodes for (m_nodeCounter = 1; m_nodeCounter < 5; m_nodeCounter++) { createNode(); } // Testing limit/offset xml = sendRequest(GET, url, parseParamData("limit=3&offset=0&orderBy=label"), 200); list = JaxbUtils.unmarshal(OnmsNodeList.class, xml); assertEquals(3, list.getNodes().size()); assertEquals(3, list.getCount()); assertEquals(5, list.getTotalCount()); assertEquals("TestMachine0", list.getNodes().get(0).getLabel()); assertEquals("TestMachine1", list.getNodes().get(1).getLabel()); assertEquals("TestMachine2", list.getNodes().get(2).getLabel()); // This filter should match xml = sendRequest(GET, url, parseParamData("comparator=like&label=%25Test%25"), 200); LogUtils.infof(this, xml); list = JaxbUtils.unmarshal(OnmsNodeList.class, xml); assertEquals(5, list.getCount()); assertEquals(5, list.getTotalCount()); // This filter should fail (return 0 results) xml = sendRequest(GET, url, parseParamData("comparator=like&label=%25DOES_NOT_MATCH%25"), 200); LogUtils.infof(this, xml); list = JaxbUtils.unmarshal(OnmsNodeList.class, xml); assertEquals(0, list.getCount()); assertEquals(0, list.getTotalCount()); // Testing PUT url += "/1"; sendPut(url, "sysContact=OpenNMS&assetRecord.manufacturer=Apple&assetRecord.operatingSystem=MacOSX Leopard"); // Testing GET Single Object xml = sendRequest(GET, url, 200); assertTrue(xml.contains("<sysContact>OpenNMS</sysContact>")); assertTrue(xml.contains("<operatingSystem>MacOSX Leopard</operatingSystem>")); // Testing DELETE sendRequest(DELETE, url, 200); sendRequest(GET, url, 204); } @Test public void testPutNode() throws Exception { JAXBContext context = JAXBContext.newInstance(OnmsNodeList.class); Unmarshaller unmarshaller = context.createUnmarshaller(); // Testing POST createNode(); String url = "/nodes"; // Testing GET Collection String xml = sendRequest(GET, url, 200); assertTrue(xml.contains("Darwin TestMachine 9.4.0 Darwin Kernel Version 9.4.0")); OnmsNodeList list = (OnmsNodeList)unmarshaller.unmarshal(new StringReader(xml)); assertEquals(1, list.getNodes().size()); assertEquals("TestMachine0", list.getNodes().get(0).getLabel()); // Testing PUT url += "/1"; sendPut(url, "sysContact=OpenNMS&assetRecord.manufacturer=Apple&assetRecord.operatingSystem=MacOSX Leopard"); // Testing GET Single Object to make sure that the parameters changed xml = sendRequest(GET, url, 200); assertTrue(xml.contains("<sysContact>OpenNMS</sysContact>")); assertTrue(xml.contains("<operatingSystem>MacOSX Leopard</operatingSystem>")); // Testing DELETE sendRequest(DELETE, url, 200); sendRequest(GET, url, 204); } @Test public void testLimits() throws Exception { JAXBContext context = JAXBContext.newInstance(OnmsNodeList.class); Unmarshaller unmarshaller = context.createUnmarshaller(); // Testing POST for (m_nodeCounter = 0; m_nodeCounter < 20; m_nodeCounter++) { createNode(); } String url = "/nodes"; // Testing GET Collection Map<String,String> parameters = new HashMap<String,String>(); parameters.put("limit", "10"); parameters.put("orderBy", "id"); String xml = sendRequest(GET, url, parameters, 200); assertTrue(xml, xml.contains("Darwin TestMachine 9.4.0 Darwin Kernel Version 9.4.0")); Pattern p = Pattern.compile("<node [^>]*\\s*id=", Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE); Matcher m = p.matcher(xml); int count = 0; while (m.find()) { count++; } assertEquals("should get 10 nodes back", 10, count); // Validate object by unmarshalling OnmsNodeList list = (OnmsNodeList)unmarshaller.unmarshal(new StringReader(xml)); assertEquals(10, list.getCount()); assertEquals(10, list.getNodes().size()); assertEquals(20, list.getTotalCount()); int i = 0; Set<OnmsNode> sortedNodes = new TreeSet<OnmsNode>(new Comparator<OnmsNode>() { public int compare(OnmsNode o1, OnmsNode o2) { if (o1 == null && o2 == null) { return 0; } else if (o1 == null) { return 1; } else if (o2 == null) { return -1; } else { if (o1.getId() == null) { throw new IllegalStateException("Null ID on node: " + o1.toString()); } return o1.getId().compareTo(o2.getId()); } } }); // Sort the nodes by ID sortedNodes.addAll(list.getNodes()); for (OnmsNode node : sortedNodes) { assertEquals(node.toString(), "TestMachine" + i++, node.getLabel()); } } @Test public void testIpInterface() throws Exception { createIpInterface(); String url = "/nodes/1/ipinterfaces"; String xml = sendRequest(GET, url, 200); assertTrue(xml.contains("<ipAddress>10.10.10.10</ipAddress>")); url += "/10.10.10.10"; sendPut(url, "isManaged=U"); xml = sendRequest(GET, url, 200); assertTrue(xml.contains("isManaged=\"U\"")); sendRequest(DELETE, url, 200); sendRequest(GET, url, 204); } @Test public void testIpInterfaceLimit() throws Exception{ createTwoIpInterface(); String url = "/nodes/1/ipinterfaces"; String xml = sendRequest(GET, url, parseParamData("limit=1"), 200); assertTrue(xml.contains("count=\"1\"")); url += "/10.10.10.10"; sendPut(url, "isManaged=U"); xml = sendRequest(GET, url, 200); assertTrue(xml.contains("isManaged=\"U\"")); sendRequest(DELETE, url, 200); sendRequest(GET, url, 204); } @Test public void testIpInterfaceByIpAddress() throws Exception{ createTwoIpInterface(); String url = "/nodes/1/ipinterfaces"; String xml = sendRequest(GET, url, parseParamData("ipAddress=11&comparator=contains"), 200); assertTrue(xml.contains("count=\"1\"")); } @Test public void testIpInterfaceIpLikeFilter() throws Exception{ createTwoIpInterface(); String url = "/nodes/1/ipinterfaces"; String xml = sendRequest(GET, url, parseParamData("ipAddress=*.*.*.11&comparator=iplike"), 200); assertTrue(xml.contains("count=\"1\"")); } @Test public void testSnmpInterface() throws Exception { createSnmpInterface(); String url = "/nodes/1/snmpinterfaces"; String xml = sendRequest(GET, url, 200); assertTrue(xml.contains("ifIndex=\"6\"")); url += "/6"; sendPut(url, "ifName=eth0"); xml = sendRequest(GET, url, 200); assertTrue(xml.contains("<ifName>eth0</ifName>")); sendRequest(DELETE, url, 200); sendRequest(GET, url, 204); } @Test public void testMonitoredService() throws Exception { createService(); String url = "/nodes/1/ipinterfaces/10.10.10.10/services"; String xml = sendRequest(GET, url, 200); assertTrue(xml.contains("<name>ICMP</name>")); url += "/ICMP"; sendPut(url, "status=A"); xml = sendRequest(GET, url, 200); assertTrue(xml.contains("status=\"A\"")); sendRequest(DELETE, url, 200); sendRequest(GET, url, 204); } @Test public void testCategory() throws Exception { createCategory(); String url = "/nodes/1/categories"; String xml = sendRequest(GET, url, 200); assertTrue(xml.contains("name=\"Routers\"")); url += "/Routers"; sendPut(url, "description=My Equipment"); xml = sendRequest(GET, url, 200); assertTrue(xml.contains("<description>My Equipment</description>")); sendRequest(DELETE, url, 200); sendRequest(GET, url, 204); } @Test public void testNodeComboQuery() throws Exception { String url = "/nodes"; MockHttpServletRequest request = createRequest(GET, url); request.addParameter("_dc", "1235761409572"); request.addParameter("start", "0"); request.addParameter("limit", "10"); request.addParameter("query", "hell"); sendRequest(request, 200); } @Test public void testIPhoneNodeSearch() throws Exception { createIpInterface(); String url = "/nodes"; String xml = sendRequest(GET, url, parseParamData("comparator=ilike&match=any&label=1%25&ipInterface.ipAddress=1%25&ipInterface.ipHostName=1%25"), 200); assertTrue(xml, xml.contains("<node type=\"A\" id=\"1\" label=\"TestMachine0\">")); assertTrue(xml, xml.contains("count=\"1\"")); assertTrue(xml, xml.contains("totalCount=\"1\"")); xml = sendRequest(GET, url, parseParamData("comparator=ilike&match=any&label=8%25&ipInterface.ipAddress=8%25&ipInterface.ipHostName=8%25"), 200); // Make sure that there were no matches assertTrue(xml, xml.contains("count=\"0\"")); assertTrue(xml, xml.contains("totalCount=\"0\"")); } @Override protected void createNode() throws Exception { String node = "<node type=\"A\" label=\"TestMachine" + m_nodeCounter + "\">" + "<labelSource>H</labelSource>" + "<sysContact>The Owner</sysContact>" + "<sysDescription>" + "Darwin TestMachine 9.4.0 Darwin Kernel Version 9.4.0: Mon Jun 9 19:30:53 PDT 2008; root:xnu-1228.5.20~1/RELEASE_I386 i386" + "</sysDescription>" + "<sysLocation>DevJam</sysLocation>" + "<sysName>TestMachine" + m_nodeCounter + "</sysName>" + "<sysObjectId>.1.3.6.1.4.1.8072.3.2.255</sysObjectId>" + "</node>"; sendPost("/nodes", node); } @Override protected void createIpInterface() throws Exception { createNode(); String ipInterface = "<ipInterface isManaged=\"M\" snmpPrimary=\"P\">" + "<ipAddress>10.10.10.10</ipAddress>" + "<hostName>TestMachine" + m_nodeCounter + "</hostName>" + "</ipInterface>"; sendPost("/nodes/1/ipinterfaces", ipInterface); } protected void createTwoIpInterface() throws Exception { createNode(); String ipInterface = "<ipInterface isManaged=\"M\" snmpPrimary=\"P\">" + "<ipAddress>10.10.10.10</ipAddress>" + "<hostName>TestMachine" + m_nodeCounter + "</hostName>" + "</ipInterface>"; sendPost("/nodes/1/ipinterfaces", ipInterface); String ipInterface2 = "<ipInterface isManaged=\"M\" snmpPrimary=\"P\">" + "<ipAddress>10.10.10.11</ipAddress>" + "<hostName>TestMachine" + (m_nodeCounter + 1) + "</hostName>" + "</ipInterface>"; sendPost("/nodes/1/ipinterfaces", ipInterface2); } }