org.opennms.web.rest.RemotePollerAvailabilityRestServiceTest.java Source code

Java tutorial

Introduction

Here is the source code for org.opennms.web.rest.RemotePollerAvailabilityRestServiceTest.java

Source

/*******************************************************************************
 * This file is part of OpenNMS(R).
 *
 * Copyright (C) 2011-2014 The OpenNMS Group, Inc.
 * OpenNMS(R) is Copyright (C) 1999-2014 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 Affero 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 Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero 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.FileInputStream;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.ws.rs.core.MediaType;

import org.apache.commons.io.IOUtils;
import org.json.JSONObject;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.opennms.core.test.MockLogAppender;
import org.opennms.core.test.OpenNMSJUnit4ClassRunner;
import org.opennms.core.test.db.annotations.JUnitTemporaryDatabase;
import org.opennms.core.test.rest.AbstractSpringJerseyRestTestCase;
import org.opennms.netmgt.dao.DatabasePopulator;
import org.opennms.netmgt.dao.api.ApplicationDao;
import org.opennms.netmgt.dao.api.LocationMonitorDao;
import org.opennms.netmgt.dao.api.MonitoredServiceDao;
import org.opennms.netmgt.model.OnmsApplication;
import org.opennms.netmgt.model.OnmsLocationMonitor;
import org.opennms.netmgt.model.OnmsLocationMonitor.MonitorStatus;
import org.opennms.netmgt.model.OnmsLocationSpecificStatus;
import org.opennms.netmgt.model.OnmsMonitoredService;
import org.opennms.netmgt.poller.PollStatus;
import org.opennms.test.JUnitConfigurationEnvironment;
import org.opennms.web.rest.AvailCalculator.UptimeCalculator;
import org.opennms.web.rest.support.TimeChunker;
import org.skyscreamer.jsonassert.JSONAssert;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;

@RunWith(OpenNMSJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = { "classpath:/META-INF/opennms/applicationContext-soa.xml",
        "classpath:/META-INF/opennms/applicationContext-commonConfigs.xml",
        "classpath:/META-INF/opennms/applicationContext-minimal-conf.xml",
        "classpath:/META-INF/opennms/applicationContext-dao.xml",
        "classpath*:/META-INF/opennms/component-service.xml", "classpath*:/META-INF/opennms/component-dao.xml",
        "classpath:/META-INF/opennms/applicationContext-databasePopulator.xml",
        "classpath:/META-INF/opennms/applicationContext-mockEventProxy.xml",
        "file:src/main/webapp/WEB-INF/applicationContext-svclayer.xml",
        "file:src/main/webapp/WEB-INF/applicationContext-jersey.xml",

        "classpath:/org/opennms/web/rest/applicationContext-test.xml" })
@JUnitConfigurationEnvironment
@JUnitTemporaryDatabase
@Transactional
public class RemotePollerAvailabilityRestServiceTest extends AbstractSpringJerseyRestTestCase {

    @Autowired
    ApplicationDao m_applicationDao;

    @Autowired
    LocationMonitorDao m_locationMonitorDao;

    @Autowired
    MonitoredServiceDao m_monServiceDao;

    @Autowired
    DatabasePopulator m_databasePopulator;

    public static final String BASE_REST_URL = "/remotelocations/availability";

    @Override
    protected void afterServletStart() {
        MockLogAppender.setupLogging();

        m_databasePopulator = getBean("databasePopulator", DatabasePopulator.class);

        m_applicationDao = getBean("applicationDao", ApplicationDao.class);
        m_locationMonitorDao = getBean("locationMonitorDao", LocationMonitorDao.class);
        m_monServiceDao = getBean("monitoredServiceDao", MonitoredServiceDao.class);

        m_databasePopulator.populateDatabase();

        try {
            createLocationMonitors();
        } catch (final InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }

    @Test
    public void testGetAvailability() {
        final long endMillis = System.currentTimeMillis();
        final long startMillis = endMillis - 12000;
        final long totalTime = endMillis - startMillis;

        TransactionTemplate txTemplate = getBean("transactionTemplate", TransactionTemplate.class);
        txTemplate.execute(new TransactionCallbackWithoutResult() {

            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                final TimeChunker timeChunker = new TimeChunker(totalTime, new Date(startMillis),
                        new Date(endMillis));
                // increment the time segment
                timeChunker.getNextSegment();
                final Collection<OnmsLocationSpecificStatus> allStatusChanges = m_locationMonitorDao
                        .getStatusChangesForApplicationBetween(new Date(startMillis), new Date(endMillis), "IPv6");
                final AvailCalculator calc = new AvailCalculator(timeChunker);

                for (final OnmsLocationSpecificStatus statusChange : allStatusChanges) {
                    calc.onStatusChange(statusChange);
                }

                final Collection<OnmsMonitoredService> svcs = m_monServiceDao
                        .findByApplication(m_applicationDao.findByName("IPv6"));
                final double avail = calc.getAvailabilityFor(svcs, 0);
                assertEquals(0.8333, avail, 0.0333);
            }
        });

    }

    @Test
    public void testGetLocations() throws Exception {
        String url = "/remotelocations";
        String responseString = sendRequest(GET, url, 200);

        assertTrue(responseString != null);
    }

    @Test
    public void testGetLocationsJson() throws Exception {
        String url = "/remotelocations";

        // GET all users
        MockHttpServletRequest jsonRequest = createRequest(getServletContext(), GET, url);
        jsonRequest.addHeader("Accept", MediaType.APPLICATION_JSON);
        String json = sendRequest(jsonRequest, 200);

        JSONObject restObject = new JSONObject(json);
        JSONObject expectedObject = new JSONObject(
                IOUtils.toString(new FileInputStream("src/test/resources/v1/remotelocations.json")));
        JSONAssert.assertEquals(expectedObject, restObject, true);
    }

    @Test
    public void testGetParticipants() throws Exception {
        String url = "/remotelocations/participants";
        String responseString = sendRequest(GET, url, 200);

        assertTrue(responseString != null);
    }

    @Test
    public void testRemotePollerAvailability() throws Exception {
        long startTime = System.currentTimeMillis();
        String url = BASE_REST_URL;
        Map<String, String> parameters = new HashMap<String, String>();
        parameters.put("resolution", "minute");

        String responseString = sendRequest(GET, url, parameters, 200);

        assertTrue(responseString.contains("IPv6"));
        assertTrue(responseString.contains("IPv4"));

        System.err.println("total time taken: " + (System.currentTimeMillis() - startTime)
                + "UptimeCalculator.count = " + UptimeCalculator.count);

        Thread.sleep(2000);

        startTime = System.currentTimeMillis();
        responseString = sendRequest(GET, url, parameters, 200);

        assertTrue(responseString.contains("IPv6"));
        assertTrue(responseString.contains("IPv4"));

        System.err.println("total time taken for cache: " + (System.currentTimeMillis() - startTime)
                + "UptimeCalculator.count = " + UptimeCalculator.count);
    }

    @Test
    public void testRemotePollerAvailabilitySingleLocation() throws Exception {
        final long startTime = System.currentTimeMillis();
        final String url = BASE_REST_URL + "/RDU";
        final Map<String, String> parameters = new HashMap<String, String>();
        parameters.put("resolution", "minute");
        addStartTime(parameters);
        addEndTime(parameters);

        final String responseString = sendRequest(GET, url, parameters, 200);

        assertTrue(responseString.contains("IPv6"));
        assertTrue(responseString.contains("IPv4"));

        System.err.println("total time taken: " + (System.currentTimeMillis() - startTime));
    }

    private void addEndTime(final Map<String, String> parameters) {
        parameters.put("endTime", "" + System.currentTimeMillis());
    }

    private void addStartTime(final Map<String, String> parameters) {
        parameters.put("startTime", "" + (System.currentTimeMillis() - 300001));
    }

    @Test
    public void testRemotePollerAvailabilityFiveMinutes() throws Exception {
        String url = BASE_REST_URL;
        Map<String, String> parameters = new HashMap<String, String>();
        parameters.put("startTime", "" + (new Date().getTime() - (86400000 * 2)));
        parameters.put("endTime", "" + (new Date().getTime() - 86400000));
        parameters.put("resolution", "minute");

        String responseString = sendRequest(GET, url, parameters, 200);

        assertTrue(responseString.contains("IPv6"));
        assertTrue(responseString.contains("IPv4"));

    }

    private void createLocationMonitors() throws InterruptedException {
        TransactionTemplate txTemplate = getBean("transactionTemplate", TransactionTemplate.class);
        txTemplate.execute(new TransactionCallbackWithoutResult() {

            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {

                System.err.println("======= Starting createLocationMonitors() ======");
                OnmsLocationMonitor locMon1 = new OnmsLocationMonitor();
                locMon1.setDefinitionName("RDU");
                locMon1.setLastCheckInTime(new Date());
                locMon1.setStatus(MonitorStatus.STARTED);
                m_locationMonitorDao.save(locMon1);

                OnmsApplication ipv6App = new OnmsApplication();
                ipv6App.setName("IPv6");
                m_applicationDao.saveOrUpdate(ipv6App);

                OnmsApplication ipv4App = new OnmsApplication();
                ipv4App.setName("IPv4");
                m_applicationDao.saveOrUpdate(ipv4App);

                OnmsMonitoredService service2 = m_monServiceDao.findByType("HTTP").get(1);
                service2.addApplication(ipv4App);
                ipv4App.addMonitoredService(service2);
                m_monServiceDao.saveOrUpdate(service2);
                m_applicationDao.saveOrUpdate(ipv4App);

                List<OnmsMonitoredService> services = m_monServiceDao.findByType("HTTP");
                for (OnmsMonitoredService service : services) {

                    service = m_monServiceDao.findByType("HTTP").get(0);
                    service.addApplication(ipv6App);
                    ipv6App.addMonitoredService(service);
                    m_monServiceDao.saveOrUpdate(service);
                    m_applicationDao.saveOrUpdate(ipv6App);

                    OnmsLocationMonitor locMon = m_locationMonitorDao.findAll().get(0);
                    OnmsLocationSpecificStatus statusChange = new OnmsLocationSpecificStatus();
                    statusChange.setLocationMonitor(locMon);
                    statusChange.setPollResult(PollStatus.available());
                    statusChange.setMonitoredService(service);
                    m_locationMonitorDao.saveStatusChange(statusChange);
                }

                System.err.println("======= End createLocationMonitors() ======");

            }
        });

        Thread.sleep(2000L);

        txTemplate.execute(new TransactionCallbackWithoutResult() {

            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                List<OnmsMonitoredService> services = m_monServiceDao.findByType("HTTP");
                for (OnmsMonitoredService service : services) {

                    OnmsLocationMonitor locMon = m_locationMonitorDao.findAll().get(0);
                    OnmsLocationSpecificStatus statusChange = new OnmsLocationSpecificStatus();
                    statusChange.setLocationMonitor(locMon);
                    statusChange.setPollResult(PollStatus.unavailable());
                    statusChange.setMonitoredService(service);

                    m_locationMonitorDao.saveStatusChange(statusChange);
                }
            }
        });

        Thread.sleep(2000L);

        txTemplate.execute(new TransactionCallbackWithoutResult() {

            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                List<OnmsMonitoredService> services = m_monServiceDao.findByType("HTTP");
                for (OnmsMonitoredService service : services) {

                    OnmsLocationMonitor locMon = m_locationMonitorDao.findAll().get(0);
                    OnmsLocationSpecificStatus statusChange = new OnmsLocationSpecificStatus();
                    statusChange.setLocationMonitor(locMon);
                    statusChange.setPollResult(PollStatus.available());
                    statusChange.setMonitoredService(service);

                    m_locationMonitorDao.saveStatusChange(statusChange);
                }
            }
        });

    }
}