com.logsniffer.event.h2.H2SnifferPersistenceTest.java Source code

Java tutorial

Introduction

Here is the source code for com.logsniffer.event.h2.H2SnifferPersistenceTest.java

Source

/*******************************************************************************
 * logsniffer, open source tool for viewing, monitoring and analysing log data.
 * Copyright (c) 2015 Scaleborn UG, www.scaleborn.com
 *
 * logsniffer 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.
 *
 * logsniffer 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 this program.  If not, see <http://www.gnu.org/licenses/>.
 *******************************************************************************/
package com.logsniffer.event.h2;

import java.io.IOException;
import java.util.Collections;
import java.util.Date;

import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.quartz.Scheduler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.HttpMethod;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.logsniffer.app.CoreAppConfig;
import com.logsniffer.app.QaDataSourceAppConfig;
import com.logsniffer.config.BeanConfigFactoryManager;
import com.logsniffer.config.ConfigException;
import com.logsniffer.event.IncrementData;
import com.logsniffer.event.Publisher;
import com.logsniffer.event.Scanner;
import com.logsniffer.event.Scanner.LogEntryReaderStrategyWrapper;
import com.logsniffer.event.Sniffer;
import com.logsniffer.event.SnifferPersistence.AspectSniffer;
import com.logsniffer.event.SnifferPersistence.SnifferChangedEvent;
import com.logsniffer.event.SnifferScheduler;
import com.logsniffer.event.SnifferScheduler.ScheduleInfo;
import com.logsniffer.event.filter.FilteredScanner;
import com.logsniffer.event.processing.ScheduleInfoAccess;
import com.logsniffer.event.processing.SnifferJobManager;
import com.logsniffer.event.publisher.MailPublisher;
import com.logsniffer.event.publisher.http.HttpPublisher;
import com.logsniffer.event.support.LevelScanner;
import com.logsniffer.event.support.MinBAmountReadStrategy;
import com.logsniffer.model.Log;
import com.logsniffer.model.LogInputStream;
import com.logsniffer.model.LogPointer;
import com.logsniffer.model.LogRawAccess;
import com.logsniffer.model.LogSource;
import com.logsniffer.model.file.WildcardLogsSource;
import com.logsniffer.model.h2.H2LogSourceProvider;

/**
 * Tets for {@link H2SnifferPersistence}.
 * 
 * @author mbok
 * 
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { H2SnifferPersistenceTest.class, CoreAppConfig.class,
        QaDataSourceAppConfig.class })
@Configuration
public class H2SnifferPersistenceTest {
    @Bean
    H2SnifferPersistence snifferPersistence() {
        return new H2SnifferPersistence();
    }

    @Bean
    H2LogSourceProvider sourceProvider() {
        return new H2LogSourceProvider();
    }

    @Bean
    ScheduleInfoAccess scheduleInfoAccess() {
        return new ScheduleInfoAccess();
    }

    @Bean
    SnifferScheduler snifferScheduler() {
        return new SnifferJobManager();
    }

    @Bean
    Scheduler scheduler() {
        return Mockito.mock(Scheduler.class);
    }

    @Bean
    @Primary
    ApplicationEventPublisher mockPublisher() {
        return Mockito.mock(ApplicationEventPublisher.class);
    }

    @Autowired
    private ApplicationEventPublisher mockAppEventPublisher;

    @Autowired
    private SnifferScheduler snifferScheduler;

    @Autowired
    private ScheduleInfoAccess scheduleInfoAccess;

    @Autowired
    private BeanConfigFactoryManager configManager;

    @Autowired
    private H2SnifferPersistence snifferPersistence;

    @Autowired
    private H2LogSourceProvider sourceProvider;

    @Autowired
    private JdbcTemplate jdbcTpl;

    private WildcardLogsSource source1, source2;

    @Before
    public void setUp() {
        source1 = new WildcardLogsSource();
        source1.setName("Source 1");
        source1.setId(sourceProvider.createSource(source1));

        source2 = new WildcardLogsSource();
        source2.setName("Source 2");
        source2.setId(sourceProvider.createSource(source2));
    }

    @Test
    @DirtiesContext
    public void testGetPersistentSniffers() throws ConfigException {
        Assert.assertEquals(0, snifferPersistence.getSnifferListBuilder().list().getItems().size());
        final Sniffer s1 = createTestSniffer();
        final long sid = snifferPersistence.createSniffer(s1);
        Assert.assertEquals(1, snifferPersistence.getSnifferListBuilder().list().getItems().size());
        Sniffer checkSniffer = snifferPersistence.getSnifferListBuilder().list().getItems().get(0);
        Mockito.verify(mockAppEventPublisher, Mockito.times(1))
                .publishEvent(Mockito.argThat(new BaseMatcher<SnifferChangedEvent>() {
                    @Override
                    public boolean matches(final Object arg0) {
                        return ((SnifferChangedEvent) arg0).getSniffer().getId() == sid;
                    }

                    @Override
                    public void describeTo(final Description arg0) {
                    }
                }));

        // Verify
        checkSniffer = snifferPersistence.getSniffer(sid);
        checkS1Sniffer(checkSniffer);

        // Update
        checkSniffer.setName("S2");
        checkSniffer.setLogSourceId(source2.getId());
        snifferPersistence.updateSniffer(checkSniffer);
        Mockito.verify(mockAppEventPublisher, Mockito.times(2))
                .publishEvent(Mockito.argThat(new BaseMatcher<SnifferChangedEvent>() {
                    @Override
                    public boolean matches(final Object arg0) {
                        return ((SnifferChangedEvent) arg0).getSniffer().getId() == sid;
                    }

                    @Override
                    public void describeTo(final Description arg0) {
                    }
                }));
        final Sniffer checkSnifferUpd = snifferPersistence.getSniffer(sid);
        Assert.assertEquals("S2", checkSnifferUpd.getName());
        Assert.assertEquals(source2.getId(), checkSnifferUpd.getLogSourceId());

        // Schedule info adaptor
        AspectSniffer as = snifferPersistence.getSnifferListBuilder()
                .withScheduleInfo(snifferScheduler.getScheduleInfoAspectAdaptor()).list().getItems().get(0);
        ScheduleInfo scheduleInfo = snifferScheduler.getScheduleInfoAspectAdaptor().getApsect(as);
        Assert.assertEquals(false, scheduleInfo.isScheduled());
        Assert.assertNull(scheduleInfo.getLastFireTime());
        scheduleInfo.setScheduled(true);
        scheduleInfo.setLastFireTime(new Date());
        scheduleInfoAccess.updateScheduleInfo(as.getId(), scheduleInfo);
        as = snifferPersistence.getSnifferListBuilder()
                .withScheduleInfo(snifferScheduler.getScheduleInfoAspectAdaptor()).list().getItems().get(0);
        scheduleInfo = snifferScheduler.getScheduleInfoAspectAdaptor().getApsect(as);
        Assert.assertEquals(true, scheduleInfo.isScheduled());
        Assert.assertEquals(true, new Date().getTime() - scheduleInfo.getLastFireTime().getTime() < 1000);

        // Delete
        Sniffer checkSnifferDel = snifferPersistence.getSniffer(sid);
        Assert.assertNotNull(checkSnifferDel);
        snifferPersistence.deleteSniffer(checkSnifferDel);
        checkSnifferDel = snifferPersistence.getSniffer(sid);
        Assert.assertNull(checkSnifferDel);
        Mockito.verifyNoMoreInteractions(mockAppEventPublisher);
    }

    private Sniffer createTestSniffer() {
        final Sniffer s1 = new Sniffer();
        s1.setName("S1");
        s1.setScheduleCronExpression("-");
        s1.setLogSourceId(source1.getId());
        final LevelScanner levelScanner = new LevelScanner();
        levelScanner.setSeverityNumber(5);
        s1.setScanner(new FilteredScanner(levelScanner));
        s1.setPublishers(Collections.singletonList((Publisher) new MailPublisher()));
        s1.setReaderStrategy(new MinBAmountReadStrategy(2));
        return s1;
    }

    private void checkS1Sniffer(final Sniffer checkSniffer) {
        Assert.assertEquals("S1", checkSniffer.getName());
        Assert.assertEquals(source1.getId(), checkSniffer.getLogSourceId());
        Assert.assertEquals(true, checkSniffer.getScanner() instanceof Scanner);
        Assert.assertNotNull(checkSniffer.getScanner());
        Assert.assertEquals(1, checkSniffer.getPublishers().size());
        Assert.assertNotNull(checkSniffer.getReaderStrategy());
        Assert.assertTrue(((LogEntryReaderStrategyWrapper) checkSniffer.getReaderStrategy())
                .getWrappedStrategy() instanceof MinBAmountReadStrategy);
        Assert.assertEquals(2,
                ((MinBAmountReadStrategy) ((LogEntryReaderStrategyWrapper) checkSniffer.getReaderStrategy())
                        .getWrappedStrategy()).getMinBytesAmount());
        // Check scanner
        Assert.assertTrue(checkSniffer.getScanner().getTargetScanner() instanceof LevelScanner);
    }

    @SuppressWarnings("unchecked")
    @Test
    @DirtiesContext
    public void testIncData() throws IOException {
        final Sniffer s1 = new Sniffer();
        s1.setName("S1");
        s1.setScheduleCronExpression("-");
        s1.setLogSourceId(source1.getId());
        final LevelScanner ls = new LevelScanner();
        ls.setSeverityNumber(5);
        s1.setScanner(new FilteredScanner(ls));

        snifferPersistence.createSniffer(s1);
        Log log1 = Mockito.mock(Log.class);
        LogRawAccess<LogInputStream> log1Access = Mockito.mock(LogRawAccess.class);
        Mockito.when(log1.getPath()).thenReturn("abc");
        Mockito.when(log1Access.getFromJSON(Mockito.anyString())).thenThrow(new IOException("Not expected"));
        final LogSource<LogRawAccess<LogInputStream>> mockedSource1 = Mockito.mock(LogSource.class);
        Mockito.when(mockedSource1.getId()).thenReturn(source1.getId());
        Mockito.when(mockedSource1.getLogs()).thenReturn(Collections.singletonList(log1));
        Mockito.when(mockedSource1.getLogAccess(log1)).thenReturn(log1Access);
        final IncrementData inc = snifferPersistence.getIncrementData(s1, source1, log1);
        Assert.assertNull(inc.getNextOffset());
        Assert.assertEquals(0, inc.getData().size());
        Assert.assertEquals(1, snifferPersistence.getIncrementDataByLog(s1, mockedSource1).size());
        Assert.assertEquals("abc",
                snifferPersistence.getIncrementDataByLog(s1, mockedSource1).keySet().iterator().next().getPath());
        Assert.assertEquals(0, snifferPersistence.getIncrementDataByLog(s1, mockedSource1).values().iterator()
                .next().getData().size());

        // Update
        log1 = Mockito.mock(Log.class);
        log1Access = Mockito.mock(LogRawAccess.class);
        Mockito.when(mockedSource1.getLogs()).thenReturn(Collections.singletonList(log1));
        Mockito.when(mockedSource1.getLogAccess(log1)).thenReturn(log1Access);
        Mockito.when(log1.getPath()).thenReturn("abc");
        final LogPointer myPointer = Mockito.mock(LogPointer.class);
        Mockito.when(myPointer.getJson()).thenReturn("my-pos");
        inc.setNextOffset(myPointer);
        inc.getData().element("index", 125);
        snifferPersistence.storeIncrementalData(s1, source1, log1, inc);
        Mockito.when(log1Access.getFromJSON("my-pos")).thenReturn(myPointer);
        final IncrementData inc2 = snifferPersistence.getIncrementData(s1, source1, log1);
        Assert.assertEquals("my-pos", inc2.getNextOffset().getJson());
        Assert.assertEquals(125, inc2.getData().getInt("index"));
        Assert.assertEquals(1, snifferPersistence.getIncrementDataByLog(s1, mockedSource1).size());
        Assert.assertEquals("abc",
                snifferPersistence.getIncrementDataByLog(s1, mockedSource1).keySet().iterator().next().getPath());
        Assert.assertEquals(125, snifferPersistence.getIncrementDataByLog(s1, mockedSource1).values().iterator()
                .next().getData().getInt("index"));

        // Update again
        inc2.getData().element("top", 789);
        snifferPersistence.storeIncrementalData(s1, source1, log1, inc2);

        final IncrementData inc3 = snifferPersistence.getIncrementData(s1, source1, log1);
        Assert.assertEquals("my-pos", inc3.getNextOffset().getJson());
        Assert.assertEquals(125, inc3.getData().getInt("index"));
        Assert.assertEquals(789, inc3.getData().getInt("top"));

        // Update with null next start offset
        inc3.setNextOffset(null);
        snifferPersistence.storeIncrementalData(s1, source1, log1, inc3);
        IncrementData inc4 = snifferPersistence.getIncrementData(s1, source1, log1);
        Assert.assertNull(inc4.getNextOffset());
        Assert.assertEquals(125, inc4.getData().getInt("index"));
        Assert.assertEquals(789, inc4.getData().getInt("top"));

        // Delete sniffer
        snifferPersistence.deleteSniffer(s1);
        inc4 = snifferPersistence.getIncrementData(s1, source1, log1);
        Assert.assertNull(inc4.getNextOffset());
        Assert.assertEquals(0, inc4.getData().size());
    }

    @Test
    @DirtiesContext
    public void testModelPrior_4_2_1() {
        final String snifferInsert = "INSERT INTO PUBLIC.SNIFFERS(ID, NAME, CRON_EXPR, SOURCE, SCANNER_CONFIG, READER_STRATEGY_CONFIG, PUBLISHERS_CONFIG) VALUES(1, 'S1', '-', 1, '{\"@type\":\"LevelScanner\",\"severityNumber\":5,\"comparator\":\"EQ_OR_GREATER\",\"fieldTypes\":{}}', '{\"@type\":\"MinBAmountReadStrategy\",\"minBytesAmount\":2}', '[{\"@type\":\"MailPublisher\",\"to\":null,\"subject\":null,\"from\":null,\"textMessage\":\"Event link: $eventLink\"}]')";
        jdbcTpl.update(snifferInsert);
        final Sniffer checkSniffer = snifferPersistence.getSniffer(1);
        Assert.assertNotNull(checkSniffer);
        Assert.assertTrue(checkSniffer.getScanner() instanceof FilteredScanner);
        checkS1Sniffer(checkSniffer);

    }

    /**
     * Reported by https://github.com/logsniffer/logsniffer/issues/78
     */
    @Test
    @DirtiesContext
    public void testDeserializationOfPublishersWithRawJsonData() {
        final HttpPublisher publisher = new HttpPublisher();
        publisher.setMethod(HttpMethod.POST);
        publisher.setUrl("http://localhost");
        publisher.setBody(
                "{\"channel\":\"#test\",\"username\":\"webhookbot\",\"text\":\"This is posted to #test and comes from a bot named webhookbot.\",\"icon_emoji\":\":ghost:\"}");

        final Sniffer s1 = createTestSniffer();
        s1.setPublishers(Collections.singletonList((Publisher) publisher));
        final long sid = snifferPersistence.createSniffer(s1);
        final Sniffer test = snifferPersistence.getSniffer(sid);
        Assert.assertNotNull(test);
        Assert.assertNotNull(test.getPublishers().get(0) instanceof HttpPublisher);
    }
}