| /******************************************************************************* |
| * 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.commons; |
| |
| import static org.junit.Assert.*; |
| |
| import java.util.SortedSet; |
| |
| import org.apache.commons.codec.digest.DigestUtils; |
| import org.eclipse.skalli.commons.Statistics.BrowserInfo; |
| import org.eclipse.skalli.commons.Statistics.RefererInfo; |
| import org.eclipse.skalli.commons.Statistics.ResponseTimeInfo; |
| import org.eclipse.skalli.commons.Statistics.SearchInfo; |
| import org.eclipse.skalli.commons.Statistics.StatisticsInfo; |
| import org.eclipse.skalli.commons.Statistics.UsageInfo; |
| import org.eclipse.skalli.commons.Statistics.UserInfo; |
| import org.junit.Test; |
| |
| @SuppressWarnings("nls") |
| public class StatisticsTest { |
| |
| @Test |
| public void testStatisticsInfo() throws Exception { |
| long now = System.currentTimeMillis(); |
| StatisticsInfo info = new StatisticsInfo("homer", 4711L); |
| assertEquals(DigestUtils.shaHex("homer"), info.getUserHash()); |
| assertEquals(4711L, info.getSequenceNumber()); |
| assertTrue(info.getTimestamp() >= now); |
| } |
| |
| @Test |
| public void testStatisticsInfoInRange() throws Exception { |
| StatisticsInfo info = new StatisticsInfo("homer", 4711L); |
| long timestamp = info.getTimestamp(); |
| assertTrue(info.inRange(timestamp - 10L, timestamp + 10L)); |
| assertTrue(info.inRange(timestamp, timestamp)); |
| assertTrue(info.inRange(0, timestamp + 10L)); |
| assertTrue(info.inRange(-1L, timestamp + 10L)); |
| assertTrue(info.inRange(timestamp - 10L, 0)); |
| assertTrue(info.inRange(timestamp - 10L, -1L)); |
| assertTrue(info.inRange(0, 0)); |
| assertTrue(info.inRange(-1L, -1L)); |
| assertFalse(info.inRange(timestamp + 1L, timestamp + 10L)); |
| assertFalse(info.inRange(timestamp -10L, timestamp - 1L)); |
| assertFalse(info.inRange(timestamp + 1L, timestamp - 1L)); |
| assertFalse(info.inRange(0, timestamp - 1L)); |
| assertFalse(info.inRange(timestamp + 1L, 0)); |
| } |
| |
| @Test |
| public void testStatisticsInfoCompareTo() throws Exception { |
| StatisticsInfo info1 = new StatisticsInfo("homer", 4711L); |
| StatisticsInfo info2 = new StatisticsInfo("homer", 815L); |
| StatisticsInfo info3 = new StatisticsInfo("marge", 4711L); |
| assertEquals(1, info1.compareTo(info2)); |
| assertEquals(-1, info2.compareTo(info1)); |
| assertEquals(0, info1.compareTo(info1)); |
| assertEquals(0, info2.compareTo(info2)); |
| assertEquals(0, info1.compareTo(info3)); |
| assertEquals(0, info3.compareTo(info1)); |
| assertEquals(1, info3.compareTo(info2)); |
| assertEquals(-1, info2.compareTo(info3)); |
| } |
| |
| @Test |
| public void testTrackUsage() throws Exception { |
| long now = System.currentTimeMillis(); |
| Statistics stats = new Statistics(now, 0, 0, 0); |
| stats.trackUsage("homer", "/projects", "x"); |
| stats.trackUsage("marge", "/projects/a", "y"); |
| stats.trackUsage("marge", "/projects/b", "z"); |
| stats.trackUsage("homer", "/projects", "y"); |
| stats.trackUsage("bart", "/projects/a", "y"); |
| SortedSet<UsageInfo> info = stats.getUsageInfo(); |
| assertInfoSet(stats, info); |
| assertEquals(DigestUtils.shaHex("bart"), info.last().getUserHash()); |
| assertEquals("/projects/a", info.last().getPath()); |
| assertEquals("y", info.last().getReferer()); |
| } |
| |
| @Test |
| public void testTrackUser() throws Exception { |
| long now = System.currentTimeMillis(); |
| Statistics stats = new Statistics(now, 0, 0, 0); |
| stats.trackUser("homer", "A", "X"); |
| stats.trackUser("marge", "B", "Y"); |
| stats.trackUser("homer", "A", "X"); |
| stats.trackUser("bart", "C", "Z"); |
| SortedSet<UserInfo> info = stats.getUserInfo(); |
| assertInfoSet(stats, info); |
| assertEquals(DigestUtils.shaHex("bart"), info.last().getUserHash()); |
| assertEquals("C", info.last().getDepartment()); |
| assertEquals("Z", info.last().getLocation()); |
| } |
| |
| @Test |
| public void testTrackBrowser() throws Exception { |
| long now = System.currentTimeMillis(); |
| Statistics stats = new Statistics(now, 0, 0, 0); |
| stats.trackBrowser("homer", "UserAgent1"); |
| stats.trackBrowser("marge", "UserAgent2"); |
| stats.trackBrowser("bart", "UserAgent1"); |
| SortedSet<BrowserInfo> info = stats.getBrowserInfo(); |
| assertInfoSet(stats, info); |
| assertEquals(DigestUtils.shaHex("bart"), info.last().getUserHash()); |
| assertEquals("UserAgent1", info.last().getUserAgent()); |
| } |
| |
| @Test |
| public void testTrackSearch() throws Exception { |
| long now = System.currentTimeMillis(); |
| Statistics stats = new Statistics(now, 0, 0, 0); |
| stats.trackSearch("homer", "queryA", 25, 1234L); |
| stats.trackSearch("marge", "queryB", 2, 344L); |
| stats.trackSearch("bart", "queryC", 0, 723L); |
| stats.trackSearch("marge", "queryC", 0, 567L); |
| SortedSet<SearchInfo> info = stats.getSearchInfo(); |
| assertInfoSet(stats, info); |
| assertEquals(DigestUtils.shaHex("marge"), info.last().getUserHash()); |
| assertEquals("queryC", info.last().getQueryString()); |
| assertEquals(0, info.last().getResultCount()); |
| assertEquals(567L, info.last().getDuration()); |
| } |
| |
| @Test |
| public void testTrackReferer() throws Exception { |
| long now = System.currentTimeMillis(); |
| Statistics stats = new Statistics(now, 0, 0, 0); |
| stats.trackReferer("homer", "ref35"); |
| stats.trackReferer("marge", null); |
| stats.trackReferer("bart", "ref12"); |
| SortedSet<RefererInfo> info = stats.getRefererInfo(); |
| assertInfoSet(stats, info); |
| assertEquals(DigestUtils.shaHex("bart"), info.last().getUserHash()); |
| assertEquals("ref12", info.last().getReferer()); |
| } |
| |
| @Test |
| public void testResponseTime() throws Exception { |
| long now = System.currentTimeMillis(); |
| Statistics stats = new Statistics(now, 0, 0, 0); |
| stats.trackResponseTime("homer", "/projects", 12L); |
| stats.trackResponseTime("marge", "/favorites", 2837L); |
| stats.trackResponseTime("bart", "/projects/a", 54L); |
| SortedSet<ResponseTimeInfo> info = stats.getResponseTimeInfo(); |
| assertInfoSet(stats, info); |
| assertEquals(DigestUtils.shaHex("bart"), info.last().getUserHash()); |
| assertEquals("/projects/a", info.last().getPath()); |
| assertEquals(54L, info.last().getResponseTime()); |
| } |
| |
| @Test |
| public void testMixedInfo() throws Exception { |
| long now = System.currentTimeMillis(); |
| Statistics stats = initMixedStatistics(now); |
| assertEquals(now, stats.getStartupTime()); |
| assertEquals(stats.getUserInfo().first().getTimestamp(), stats.getStartDate()); |
| assertEquals(stats.getUsageInfo().last().getTimestamp(), stats.getEndDate()); |
| assertEquals(10, stats.getSequenceNumber()); |
| assertMixedStatistics(stats); |
| } |
| |
| @Test |
| public void testStatisticsCopyAll() throws Exception { |
| long now = System.currentTimeMillis(); |
| Statistics source = initMixedStatistics(now); |
| assertMixedStatistics(source); |
| Statistics target = new Statistics(source, source.getStartDate(), source.getEndDate()); |
| assertMixedStatistics(target); |
| assertEquals(now, target.getStartupTime()); |
| assertEquals(source.getStartDate(), target.getStartDate()); |
| assertEquals(source.getEndDate(), target.getEndDate()); |
| assertEquals(10, target.getSequenceNumber()); |
| } |
| |
| @Test |
| public void testStatisticsCopySelected() throws Exception { |
| long now = System.currentTimeMillis(); |
| Statistics source = initMixedStatistics(now); |
| assertMixedStatistics(source); |
| long startDate = source.getSearchInfo().first().getTimestamp(); // copy from first SearchInfo entry |
| long endDate = source.getResponseTimeInfo().first().getTimestamp(); // to ResponseTimeInfo entry |
| Statistics target = new Statistics(source, startDate, endDate); |
| assertEquals(now, target.getStartupTime()); |
| assertEquals(startDate, target.getStartDate()); |
| assertEquals(endDate, target.getEndDate()); |
| |
| // note: only 6 entries are actually copied, but |
| // sequenceNumber of ResponseTimeInfo entry was 7, |
| // so the new global sequence number becomes 8 |
| assertEquals(8, target.getSequenceNumber()); |
| } |
| |
| @Test |
| public void testClearAll() throws Exception { |
| long now = System.currentTimeMillis(); |
| Statistics stats = initMixedStatistics(now); |
| stats.clear(); |
| assertEquals(now, stats.getStartupTime()); |
| assertEquals(now, stats.getStartDate()); |
| assertEquals(0, stats.getSequenceNumber()); |
| } |
| |
| @Test |
| public void testClearRange() throws Exception { |
| long now = System.currentTimeMillis(); |
| Statistics stats = initMixedStatistics(now); |
| long startDate = stats.getSearchInfo().first().getTimestamp(); // delete from first SearchInfo entry |
| long endDate = stats.getResponseTimeInfo().first().getTimestamp(); // to ResponseTimeInfo entry |
| stats.clear(startDate, endDate); |
| assertEquals(stats.getUserInfo().first().getTimestamp(), stats.getStartDate()); |
| assertEquals(stats.getUsageInfo().last().getTimestamp(), stats.getEndDate()); |
| assertEquals(10, stats.getSequenceNumber()); |
| } |
| |
| @Test |
| public void testClearHead() throws Exception { |
| long now = System.currentTimeMillis(); |
| Statistics stats = initMixedStatistics(now); |
| long startDate = stats.getStartDate(); // delete from start date |
| long endDate = stats.getSearchInfo().first().getTimestamp(); // to first SearchInfo entry |
| stats.clear(startDate, endDate); |
| assertEquals(stats.getRefererInfo().first().getTimestamp(), stats.getStartDate()); |
| assertEquals(stats.getUsageInfo().last().getTimestamp(), stats.getEndDate()); |
| assertEquals(10, stats.getSequenceNumber()); |
| } |
| |
| @Test |
| public void testClearTail() throws Exception { |
| long now = System.currentTimeMillis(); |
| Statistics stats = initMixedStatistics(now); |
| long startDate = stats.getSearchInfo().first().getTimestamp(); // delete from first SearchInfo entry |
| long endDate = stats.getEndDate(); // to end of dataset |
| stats.clear(startDate, endDate); |
| |
| assertEquals(stats.getUserInfo().first().getTimestamp(), stats.getStartDate()); |
| |
| // dataset now ends with first UsageInfo! |
| assertEquals(stats.getUsageInfo().first().getTimestamp(), stats.getEndDate()); |
| assertEquals(2, stats.getSequenceNumber()); |
| } |
| |
| @Test |
| public void testStatisticsRestore() throws Exception { |
| long now = System.currentTimeMillis(); |
| Statistics source = initMixedStatistics(now); |
| assertMixedStatistics(source); |
| Statistics target = new Statistics(now + 1000L, 0, 0, 0); |
| target.restore(source); |
| assertEquals(now + 1000L, target.getStartupTime()); |
| assertEquals(source.getStartDate(), target.getStartDate()); |
| assertEquals(source.getEndDate(), target.getEndDate()); |
| assertEquals(source.getSequenceNumber(), target.getSequenceNumber()); |
| assertMixedStatistics(target); |
| } |
| |
| // Thread.sleep() between tracking calls ensure that |
| // entries have the different timestamps |
| private Statistics initMixedStatistics(long now) throws Exception { |
| Statistics stats = new Statistics(now, 0, 0, 0); |
| stats.trackUser("homer", "A", "X"); |
| Thread.sleep(10L); |
| stats.trackUsage("marge", "/projects/b", "z"); |
| Thread.sleep(5L); |
| stats.trackSearch("homer", "queryA", 25, 1234L); |
| Thread.sleep(3L); |
| stats.trackReferer("marge", null); |
| Thread.sleep(27L); |
| stats.trackUsage("marge", "/projects", "x"); |
| Thread.sleep(3L); |
| stats.trackUser("bart", "B", "Y"); |
| Thread.sleep(1L); |
| stats.trackBrowser("bart", "UserAgent1"); |
| Thread.sleep(10L); |
| stats.trackResponseTime("marge", "/favorites", 2837L); |
| Thread.sleep(6L); |
| stats.trackSearch("marge", "queryB", 2, 344L); |
| Thread.sleep(8L); |
| stats.trackUsage("homer", "/projects", "y"); |
| return stats; |
| } |
| |
| private void assertMixedStatistics(Statistics stats) { |
| SortedSet<UsageInfo> usageInfo = stats.getUsageInfo(); |
| assertEquals(3, usageInfo.size()); |
| SortedSet<UserInfo> userInfo = stats.getUserInfo(); |
| assertEquals(2, userInfo.size()); |
| assertEquals(0, userInfo.first().getSequenceNumber()); |
| assertEquals(5, userInfo.last().getSequenceNumber()); |
| SortedSet<BrowserInfo> browserInfo = stats.getBrowserInfo(); |
| assertEquals(1, browserInfo.size()); |
| assertEquals(6, browserInfo.first().getSequenceNumber()); |
| SortedSet<SearchInfo> searchInfo = stats.getSearchInfo(); |
| assertEquals(2, searchInfo.size()); |
| assertEquals(2, searchInfo.first().getSequenceNumber()); |
| assertEquals(8, searchInfo.last().getSequenceNumber()); |
| SortedSet<RefererInfo> referInfo = stats.getRefererInfo(); |
| assertEquals(1, referInfo.size()); |
| assertEquals(3, referInfo.first().getSequenceNumber()); |
| SortedSet<ResponseTimeInfo> responseInfo = stats.getResponseTimeInfo(); |
| assertEquals(1, responseInfo.size()); |
| assertEquals(7, responseInfo.first().getSequenceNumber()); |
| |
| assertEquals(userInfo.first().getTimestamp(), stats.getStartDate()); |
| assertEquals(usageInfo.last().getTimestamp(), stats.getEndDate()); |
| assertEquals(usageInfo.last().getSequenceNumber() + 1, stats.getSequenceNumber()); |
| } |
| |
| private <T extends StatisticsInfo> void assertInfoSet(Statistics stats, SortedSet<T> info) { |
| assertEquals(info.size(), stats.getSequenceNumber()); |
| assertEquals(info.last().getSequenceNumber() + 1, stats.getSequenceNumber()); |
| assertEquals(info.first().getTimestamp(), stats.getStartDate()); |
| assertEquals(info.last().getTimestamp(), stats.getEndDate()); |
| int i = 0; |
| for (T next: info) { |
| assertEquals(i, next.getSequenceNumber()); |
| ++i; |
| } |
| } |
| } |