org.eclipse.skalli.core.rest.admin.StatisticsQueryTest.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.skalli.core.rest.admin.StatisticsQueryTest.java

Source

/*******************************************************************************
 * Copyright (c) 2010-2014 SAP AG and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     SAP AG - initial API and implementation
 *******************************************************************************/
package org.eclipse.skalli.core.rest.admin;

import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import javax.xml.bind.DatatypeConverter;

import org.apache.commons.lang.StringUtils;
import org.eclipse.skalli.commons.CollectionUtils;
import org.eclipse.skalli.testutil.AssertUtils;
import org.junit.Assert;
import org.junit.Test;

@SuppressWarnings("nls")
public class StatisticsQueryTest {

    @Test
    public void testPeriod() throws Exception {
        assertPeriodQuery(null, 1, TimeUnit.DAYS);
        assertPeriodQuery("", 1, TimeUnit.DAYS);
        assertPeriodQuery("0", 1, TimeUnit.DAYS);
        assertPeriodQuery("1d", 1, TimeUnit.DAYS);
        assertPeriodQuery("27D", 27, TimeUnit.DAYS);
        assertPeriodQuery("3", 3, TimeUnit.DAYS);
        assertPeriodQuery("4711", 4711, TimeUnit.DAYS);
        assertPeriodQuery("d", 1, TimeUnit.DAYS);
        assertPeriodQuery("D", 1, TimeUnit.DAYS);
        assertPeriodQuery("5h", 5, TimeUnit.HOURS);
        assertPeriodQuery("15h", 15, TimeUnit.HOURS);
        assertPeriodQuery("h", 1, TimeUnit.HOURS);
        assertPeriodQuery("H", 1, TimeUnit.HOURS);
        assertPeriodQuery("4711m", 4711, TimeUnit.MINUTES);
        assertPeriodQuery("3M", 3, TimeUnit.MINUTES);
        assertPeriodQuery("m", 1, TimeUnit.MINUTES);
        assertPeriodQuery("M", 1, TimeUnit.MINUTES);
    }

    @Test
    public void testNegativePeriod() throws Exception {
        assertPeriodQuery("-1M", 1, TimeUnit.MINUTES);
        assertPeriodQuery("-12h", 12, TimeUnit.HOURS);
        assertPeriodQuery("-1", 1, TimeUnit.DAYS);
        assertPeriodQuery("-4711", 4711, TimeUnit.DAYS);
        assertPeriodQuery("-H", 1, TimeUnit.HOURS);
        assertPeriodQuery("-", 1, TimeUnit.DAYS);
        assertPeriodQuery("-0", 1, TimeUnit.DAYS);
    }

    @Test
    public void testNonNumericalPeriod() throws Exception {
        assertPeriodQuery("hugo", 1, TimeUnit.DAYS);
        assertPeriodQuery("hugod", 1, TimeUnit.DAYS);
        assertPeriodQuery("hugoD", 1, TimeUnit.DAYS);
        assertPeriodQuery("hugom", 1, TimeUnit.MINUTES);
        assertPeriodQuery("hugoM", 1, TimeUnit.MINUTES);
        assertPeriodQuery("hugoh", 1, TimeUnit.HOURS);
        assertPeriodQuery("hugoH", 1, TimeUnit.HOURS);
    }

    private void assertPeriodQuery(String period, int value, TimeUnit unit) {
        long now = System.currentTimeMillis();
        StatisticsQuery query = new StatisticsQuery(getParams(null, null, period), now);
        Assert.assertEquals(now - TimeUnit.MILLISECONDS.convert(value, unit), query.getFrom());
        Assert.assertEquals(now, query.getTo());
    }

    @Test
    public void testFromQuery() throws Exception {
        Calendar cal = Calendar.getInstance();
        long now = cal.getTimeInMillis();
        long fromMillis = now - TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS);
        cal.setTimeInMillis(fromMillis);
        String fromStr = DatatypeConverter.printDateTime(cal);
        StatisticsQuery query = new StatisticsQuery(getParams(fromStr, null, null), now);
        Assert.assertEquals(fromMillis, query.getFrom());
        Assert.assertEquals(now, query.getTo());
    }

    @Test
    public void testToQuery() throws Exception {
        Calendar cal = Calendar.getInstance();
        long now = cal.getTimeInMillis();
        long toMillis = now - TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS);
        cal.setTimeInMillis(toMillis);
        String toStr = DatatypeConverter.printDateTime(cal);
        StatisticsQuery query = new StatisticsQuery(getParams(null, toStr, null), now);
        Assert.assertEquals(0, query.getFrom());
        Assert.assertEquals(toMillis, query.getTo());
    }

    @Test
    public void testToPeriodQuery() throws Exception {
        assertToPeriodQuery("3m", 3, TimeUnit.MINUTES);
        assertToPeriodQuery("-3m", 3, TimeUnit.MINUTES);
    }

    @Test
    public void testFromToQuery() throws Exception {
        Calendar cal = Calendar.getInstance();
        long now = cal.getTimeInMillis();
        long fromMillis = now - TimeUnit.MILLISECONDS.convert(2, TimeUnit.DAYS);
        long toMillis = now - TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS);
        cal.setTimeInMillis(fromMillis);
        String fromStr = DatatypeConverter.printDateTime(cal);
        cal.setTimeInMillis(toMillis);
        String toStr = DatatypeConverter.printDateTime(cal);
        StatisticsQuery query = new StatisticsQuery(getParams(fromStr, toStr, null), now);
        Assert.assertEquals(fromMillis, query.getFrom());
        Assert.assertEquals(toMillis, query.getTo());

        // period is ignored, if both from and to are specified
        query = new StatisticsQuery(getParams(fromStr, toStr, "3d"), now);
        Assert.assertEquals(fromMillis, query.getFrom());
        Assert.assertEquals(toMillis, query.getTo());

        // from == to
        query = new StatisticsQuery(getParams(fromStr, fromStr, null), now);
        Assert.assertEquals(fromMillis, query.getFrom());
        Assert.assertEquals(fromMillis, query.getTo());

        // from > to
        query = new StatisticsQuery(getParams(toStr, fromStr, null), now);
        Assert.assertEquals(fromMillis, query.getFrom());
        Assert.assertEquals(fromMillis, query.getTo());
    }

    @Test
    public void testFromToIntervals() throws Exception {
        long now = System.currentTimeMillis();
        StatisticsQuery query = new StatisticsQuery(getParams("-1d", null, null), now);
        Assert.assertEquals(now - TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS), query.getFrom());
        Assert.assertEquals(now, query.getTo());

        query = new StatisticsQuery(getParams(null, "-1d", null), now);
        Assert.assertEquals(0, query.getFrom());
        Assert.assertEquals(now - TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS), query.getTo());

        query = new StatisticsQuery(getParams("-2d", "-1d", null), now);
        Assert.assertEquals(now - TimeUnit.MILLISECONDS.convert(2, TimeUnit.DAYS), query.getFrom());
        Assert.assertEquals(now - TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS), query.getTo());

        query = new StatisticsQuery(getParams("-1d", null, "1h"), now);
        Assert.assertEquals(now - TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS), query.getFrom());
        Assert.assertEquals(now - TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS)
                + TimeUnit.MILLISECONDS.convert(1, TimeUnit.HOURS), query.getTo());

        query = new StatisticsQuery(getParams(null, "-1d", "1h"), now);
        Assert.assertEquals(now - TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS)
                - TimeUnit.MILLISECONDS.convert(1, TimeUnit.HOURS), query.getFrom());
        Assert.assertEquals(now - TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS), query.getTo());

        // from + period > now => to = now
        query = new StatisticsQuery(getParams("-1d", null, "2d"), now);
        Assert.assertEquals(now - TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS), query.getFrom());
        Assert.assertEquals(now, query.getTo());

        // period is ignored, if from and to are specified
        query = new StatisticsQuery(getParams("-2d", "-1d", "1h"), now);
        Assert.assertEquals(now - TimeUnit.MILLISECONDS.convert(2, TimeUnit.DAYS), query.getFrom());
        Assert.assertEquals(now - TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS), query.getTo());

        // positive to interval is treated as not specified => to = now
        query = new StatisticsQuery(getParams("-1d", "4711d", null), now);
        Assert.assertEquals(now - TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS), query.getFrom());
        Assert.assertEquals(now, query.getTo());

        // positive from interval is treated as not specified => from = 0
        query = new StatisticsQuery(getParams("4711d", "-1d", null), now);
        Assert.assertEquals(0, query.getFrom());
        Assert.assertEquals(now - TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS), query.getTo());

        // positive from interval are treated as not specified => show 1 day
        query = new StatisticsQuery(getParams("4711d", "4711d", null), now);
        Assert.assertEquals(now - TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS), query.getFrom());
        Assert.assertEquals(now, query.getTo());
    }

    @Test
    public void testFromToNow() throws Exception {
        Calendar cal = Calendar.getInstance();
        long now = cal.getTimeInMillis();

        StatisticsQuery query = new StatisticsQuery(getParams(null, "now", null), now);
        Assert.assertEquals(0, query.getFrom());
        Assert.assertEquals(now, query.getTo());

        query = new StatisticsQuery(getParams("-1h", "now", null), now);
        Assert.assertEquals(now - TimeUnit.MILLISECONDS.convert(1, TimeUnit.HOURS), query.getFrom());
        Assert.assertEquals(now, query.getTo());

        long fromMillis = now - TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS);
        cal.setTimeInMillis(fromMillis);
        String fromStr = DatatypeConverter.printDateTime(cal);
        query = new StatisticsQuery(getParams(fromStr, "now", null), now);
        Assert.assertEquals(fromMillis, query.getFrom());
        Assert.assertEquals(now, query.getTo());

        query = new StatisticsQuery(getParams("now", null, null), now);
        Assert.assertEquals(now, query.getFrom());
        Assert.assertEquals(now, query.getTo());

        query = new StatisticsQuery(getParams("now", "now", null), now);
        Assert.assertEquals(now, query.getFrom());
        Assert.assertEquals(now, query.getTo());

        // period is ignored, if from and to are specified
        query = new StatisticsQuery(getParams("now", "now", "1d"), now);
        Assert.assertEquals(now, query.getFrom());
        Assert.assertEquals(now, query.getTo());
    }

    @Test
    public void testFromPeriodQuery() throws Exception {
        assertFromPeriodQuery("3m", 3, TimeUnit.MINUTES);
        assertFromPeriodQuery("2d", 1, TimeUnit.DAYS); // to must not be in the future
        assertFromPeriodQuery("-3m", 3, TimeUnit.MINUTES);
    }

    @Test
    public void testAllQuery() throws Exception {
        HashMap<String, String> params = new HashMap<String, String>();
        params.put("all", null);
        StatisticsQuery query = new StatisticsQuery(params, System.currentTimeMillis());
        Assert.assertEquals(0, query.getFrom());
        Assert.assertEquals(0, query.getTo());
    }

    @Test
    public void testSection() throws Exception {
        HashMap<String, String> params = new HashMap<String, String>();
        params.put("include", "a,b");
        params.put("exclude", "c");
        StatisticsQuery query = new StatisticsQuery(params, System.currentTimeMillis());
        query.setSection("foobar");
        Assert.assertTrue(query.showSection("foobar"));
        Assert.assertFalse(query.showSection("a"));
        Assert.assertFalse(query.showSection("b"));
        Assert.assertFalse(query.showSection("c"));
    }

    @Test
    public void testNoFilters() throws Exception {
        HashMap<String, String> params = new HashMap<String, String>();
        StatisticsQuery query = new StatisticsQuery(params, System.currentTimeMillis());
        Assert.assertTrue(query.showByFilter("byDate"));
    }

    @Test
    public void testSetFilter() throws Exception {
        HashMap<String, String> params = new HashMap<String, String>();
        StatisticsQuery query = new StatisticsQuery(params, System.currentTimeMillis());
        query.setFilter("byDate");
        Assert.assertTrue(query.showByFilter("byDate"));
        Assert.assertFalse(query.showByFilter("foobar"));
    }

    @Test
    public void testFiltersAttribute() throws Exception {
        HashMap<String, String> params = new HashMap<String, String>();
        params.put("filters", "byDate,byRole");
        StatisticsQuery query = new StatisticsQuery(params, System.currentTimeMillis());
        Assert.assertTrue(query.showByFilter("byDate"));
        Assert.assertTrue(query.showByFilter("byRole"));
        Assert.assertFalse(query.showByFilter("foobar"));
    }

    @Test
    public void testSetFilterOverwritesFiltersAttribute() throws Exception {
        HashMap<String, String> params = new HashMap<String, String>();
        params.put("filters", "byDate,byRole");
        StatisticsQuery query = new StatisticsQuery(params, System.currentTimeMillis());
        query.setFilter("byDate");
        Assert.assertTrue(query.showByFilter("byDate"));
        Assert.assertFalse(query.showByFilter("byRole"));
        Assert.assertFalse(query.showByFilter("foobar"));
    }

    @Test
    public void testSummaryFilter() throws Exception {
        HashMap<String, String> params = new HashMap<String, String>();
        params.put("filters", "byDate,byRole,summary");
        StatisticsQuery query = new StatisticsQuery(params, System.currentTimeMillis());
        Assert.assertFalse(query.showByFilter("byDate"));
        Assert.assertFalse(query.showByFilter("byRole"));
        Assert.assertTrue(query.showByFilter("summary"));
    }

    @Test
    public void testShowSection() throws Exception {
        assertShow(new String[] { "a", "b", "c" }, new String[] { "foo" }, "a,b,c", null);
        assertShow(new String[] { "a;b;c" }, new String[] { "a", "b", "c", "foo" }, "a;b;c", null);
        assertShow(new String[] { "a", "b", "c" }, new String[] { "a;b;c" }, null, "a;b;c");
        assertShow(new String[] { "a", "b", "c" }, new String[] { "foo" }, "a,b,c", "");
        assertShow(new String[] { "foo", "bar" }, new String[] { "a", "b", "c" }, null, "a,b,c");
        assertShow(new String[] { "foo", "bar" }, new String[] { "a", "b", "c" }, "", "a,b,c");
        assertShow(new String[] { "foo", "bar" }, new String[] { "a", "b", "c", "foobar" }, "foo,bar", "a,b,c");
        assertShow(new String[] { "a", "b", "c" }, new String[0], null, null);
        assertShow(new String[] { "a", "b", "c" }, new String[0], "", "");
    }

    @Test
    public void testIncluded() throws Exception {
        HashMap<String, String> params = new HashMap<String, String>();
        params.put("include", "a,b,c");
        StatisticsQuery query = new StatisticsQuery(params, System.currentTimeMillis());
        AssertUtils.assertEqualsAnyOrder("includes", CollectionUtils.asSet("a", "b", "c"), query.getIncluded());
    }

    @Test
    public void testExcluded() throws Exception {
        HashMap<String, String> params = new HashMap<String, String>();
        params.put("exclude", "foo,bar");
        StatisticsQuery query = new StatisticsQuery(params, System.currentTimeMillis());
        AssertUtils.assertEqualsAnyOrder("includes", CollectionUtils.asSet("foo", "bar"), query.getExcluded());
    }

    private void assertShow(String[] included, String[] excluded, String include, String exclude) {
        HashMap<String, String> params = new HashMap<String, String>();
        params.put("include", include);
        params.put("exclude", exclude);
        StatisticsQuery query = new StatisticsQuery(params, System.currentTimeMillis());
        for (String s : included) {
            Assert.assertTrue(query.showSection(s));
        }
        for (String s : excluded) {
            Assert.assertFalse(query.showSection(s));
        }
    }

    private void assertFromPeriodQuery(String period, int value, TimeUnit unit) {
        Calendar cal = Calendar.getInstance();
        long now = cal.getTimeInMillis();
        long fromMillis = now - TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS);
        cal.setTimeInMillis(fromMillis);
        String fromStr = DatatypeConverter.printDateTime(cal);
        StatisticsQuery query = new StatisticsQuery(getParams(fromStr, null, period), now);
        Assert.assertEquals(fromMillis, query.getFrom());
        Assert.assertEquals(fromMillis + TimeUnit.MILLISECONDS.convert(value, unit), query.getTo());
    }

    private void assertToPeriodQuery(String period, int value, TimeUnit unit) {
        Calendar cal = Calendar.getInstance();
        long now = cal.getTimeInMillis();
        long toMillis = now - TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS);
        cal.setTimeInMillis(toMillis);
        String toStr = DatatypeConverter.printDateTime(cal);
        StatisticsQuery query = new StatisticsQuery(getParams(null, toStr, period), now);
        Assert.assertEquals(toMillis - TimeUnit.MILLISECONDS.convert(value, unit), query.getFrom());
        Assert.assertEquals(toMillis, query.getTo());
    }

    private Map<String, String> getParams(String from, String to, String period) {
        HashMap<String, String> params = new HashMap<String, String>();
        if (StringUtils.isNotBlank(from)) {
            params.put(StatisticsQuery.PARAM_FROM, from);
        }
        if (StringUtils.isNotBlank(to)) {
            params.put(StatisticsQuery.PARAM_TO, to);
        }
        if (StringUtils.isNotBlank(period)) {
            params.put(StatisticsQuery.PARAM_PERIOD, period);
        }
        return params;
    }
}