/**
* $URL: https://source.sakaiproject.org/svn/sitestats/trunk/sitestats-impl/src/test/org/sakaiproject/sitestats/test/StatsUpdateManagerTest.java $
* $Id: StatsUpdateManagerTest.java 116373 2012-11-14 18:40:48Z matthew.buckett@it.ox.ac.uk $
*
* Copyright (c) 2006-2009 The Sakai Foundation
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.opensource.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sakaiproject.sitestats.test;
import static org.easymock.EasyMock.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
import org.sakaiproject.event.api.Event;
import org.sakaiproject.event.api.EventTrackingService;
import org.sakaiproject.exception.IdUnusedException;
import org.sakaiproject.site.api.Site;
import org.sakaiproject.site.api.SiteService;
import org.sakaiproject.sitestats.api.EventStat;
import org.sakaiproject.sitestats.api.JobRun;
import org.sakaiproject.sitestats.api.ResourceStat;
import org.sakaiproject.sitestats.api.SiteActivity;
import org.sakaiproject.sitestats.api.SitePresence;
import org.sakaiproject.sitestats.api.SiteVisits;
import org.sakaiproject.sitestats.api.StatsManager;
import org.sakaiproject.sitestats.api.StatsUpdateManager;
import org.sakaiproject.sitestats.impl.CustomEventImpl;
import org.sakaiproject.sitestats.impl.EventStatImpl;
import org.sakaiproject.sitestats.impl.JobRunImpl;
import org.sakaiproject.sitestats.impl.ResourceStatImpl;
import org.sakaiproject.sitestats.impl.SiteActivityImpl;
import org.sakaiproject.sitestats.impl.SitePresenceImpl;
import org.sakaiproject.sitestats.impl.SiteVisitsImpl;
import org.sakaiproject.sitestats.impl.StatsUpdateManagerImpl;
import org.sakaiproject.sitestats.test.data.FakeData;
import org.sakaiproject.sitestats.test.mocks.FakeEvent;
import org.sakaiproject.sitestats.test.mocks.FakeEventRegistryService;
import org.sakaiproject.sitestats.test.mocks.FakeSite;
import org.springframework.test.annotation.AbstractAnnotationAwareTransactionalTests;
public class StatsUpdateManagerTest extends AbstractAnnotationAwareTransactionalTests {
// AbstractAnnotationAwareTransactionalTests / AbstractTransactionalSpringContextTests
private StatsUpdateManager M_sum;
private StatsManager M_sm;
private DB db;
private SiteService M_ss;
private EventTrackingService M_ets;
private FakeEventRegistryService M_ers;
// Spring configuration
public void setStatsUpdateManager(StatsUpdateManager M_sum) {
this.M_sum = M_sum;
}
public void setEventTrackingService(EventTrackingService M_ets) {
this.M_ets = M_ets;
}
public void setDb(DB db) {
this.db = db;
}
public void setEventRegistryService(FakeEventRegistryService M_ers) {
this.M_ers = M_ers;
}
@Override
protected String[] getConfigLocations() {
return new String[] { "hbm-db.xml", "hibernate-test.xml" };
}
// run this before each test starts
protected void onSetUpBeforeTransaction() throws Exception {
// Site Service
M_ss = createMock(SiteService.class);
// Site A has SiteStats
Site siteA = new FakeSite(FakeData.SITE_A_ID, StatsManager.SITESTATS_TOOLID);
expect(M_ss.getSite(FakeData.SITE_A_ID)).andStubReturn(siteA);
expect(M_ss.isUserSite(FakeData.SITE_A_ID)).andStubReturn(false);
expect(M_ss.isSpecialSite(FakeData.SITE_A_ID)).andStubReturn(false);
// Site B don't have SiteStats
FakeSite siteB = new FakeSite(FakeData.SITE_B_ID);
expect(M_ss.getSite(FakeData.SITE_B_ID)).andStubReturn(siteB);
expect(M_ss.isUserSite(FakeData.SITE_B_ID)).andStubReturn(false);
expect(M_ss.isSpecialSite(FakeData.SITE_B_ID)).andStubReturn(false);
// Site 'non_existent_site' doesn't exist
expect(M_ss.getSite("non_existent_site")).andThrow(new IdUnusedException("non_existent_site")).anyTimes();
expect(M_ss.isUserSite("non_existent_site")).andStubReturn(false);
expect(M_ss.isSpecialSite("non_existent_site")).andStubReturn(false);
// apply
replay(M_ss);
((StatsUpdateManagerImpl)M_sum).setSiteService(M_ss);
// Stats Manager
M_sm = createMock(StatsManager.class);
// Default values
expect(M_sm.isEventContextSupported()).andStubReturn(true);
expect(M_sm.isShowAnonymousAccessEvents()).andStubReturn(true);
expect(M_sm.isEnableSitePresences()).andStubReturn(true);
// apply
replay(M_sm);
((StatsUpdateManagerImpl)M_sum).setStatsManager(M_sm);
// Setups fake dependencies.
M_ers.setStatsManager(M_sm);
}
// run this before each test starts and as part of the transaction
protected void onSetUpInTransaction() {
db.deleteAll();
}
// ---- TESTS ----
// Basic tests: not much to test, work is on other methods...
@SuppressWarnings("unchecked")
public void testCollectEvent() {
FakeEvent e1 = new FakeEvent(FakeData.EVENT_CHATNEW, "/chat/msg/"+FakeData.SITE_A_ID, true, 0);
assertTrue(M_sum.collectEvent(e1));
Event e2 = M_sum.buildEvent(new Date(), FakeData.EVENT_CHATNEW, "/chat/msg/"+FakeData.SITE_A_ID, FakeData.SITE_A_ID, "FakeData.USER_A_ID", "session-id-a");
assertTrue(M_sum.collectEvent(e2));
// check results
List<EventStat> results = (List<EventStat>) db.getResultsForClass(EventStatImpl.class);
assertEquals(2, results.size());
EventStat es1 = results.get(0);
assertEquals(e1.getContext() ,es1.getSiteId());
assertEquals(e1.getUserId(), es1.getUserId());
assertEquals(e1.getEvent(), es1.getEventId());
assertEquals(1, es1.getCount());
EventStat es2 = results.get(1);
assertEquals(e2.getContext(), es2.getSiteId());
assertEquals(e2.getUserId(), es2.getUserId());
assertEquals(e2.getEvent(), es2.getEventId());
assertEquals(1, es2.getCount());
}
// Test invalid events
@SuppressWarnings("unchecked")
public void testInvalidEvents() {
// #1: send invalid events
Event e3 = M_sum.buildEvent(new Date(), "unknown.event", "/chat/msg/"+FakeData.SITE_A_ID, FakeData.SITE_A_ID, FakeData.USER_A_ID, "session-id-a");
Event e4 = M_sum.buildEvent(new Date(), FakeData.EVENT_CONTENTNEW, "no_context", null, FakeData.USER_A_ID, "session-id-a");
Event e5 = M_sum.buildEvent(new Date(), FakeData.EVENT_CHATNEW, "/chat/msg/"+FakeData.SITE_A_ID, FakeData.SITE_A_ID, null, null);
Event e6 = M_sum.buildEvent(new Date(), StatsManager.SITEVISIT_EVENTID, "no_context", null, FakeData.USER_A_ID, "session-id-a");
Event e7 = M_sum.buildEvent(new Date(), StatsManager.SITEVISIT_EVENTID, "no_context", null, null, null);
Event e8 = M_sum.buildEvent(new Date(), FakeData.EVENT_CONTENTNEW, "/content/group/"+FakeData.SITE_A_ID, FakeData.SITE_A_ID, FakeData.USER_A_ID, "session-id-a");
Event e9 = M_sum.buildEvent(new Date(), FakeData.EVENT_CONTENTNEW, "/content/group/"+FakeData.SITE_A_ID, FakeData.SITE_A_ID, null, null);
Event e10 = M_sum.buildEvent(new Date(), StatsManager.SITEVISIT_EVENTID, "/presence/non_existent_site-presence", null, FakeData.USER_A_ID, "session-id-a");
Event e11 = M_sum.buildEvent(new Date(), FakeData.EVENT_CONTENTNEW, "/content/user/something", FakeData.SITE_A_ID, FakeData.USER_A_ID, "session-id-a");
Event e12 = M_sum.buildEvent(new Date(), FakeData.EVENT_CONTENTNEW, "/content/attachment/something", FakeData.SITE_A_ID, FakeData.USER_A_ID, "session-id-a");
Event e13 = M_sum.buildEvent(new Date(), FakeData.EVENT_CONTENTNEW, "/content/group/small_ref", FakeData.SITE_A_ID, FakeData.USER_A_ID, "session-id-a");
Event e14 = M_sum.buildEvent(new Date(), FakeData.EVENT_CONTENTNEW, "/content/group/private", FakeData.SITE_A_ID, FakeData.USER_A_ID, "session-id-a");
Event e15 = M_sum.buildEvent(new Date(), FakeData.EVENT_CONTENTNEW, "/content/group-user/small_ref", FakeData.SITE_A_ID, FakeData.USER_A_ID, "session-id-a");
Event e16 = M_sum.buildEvent(new Date(), FakeData.EVENT_CONTENTNEW, "", FakeData.SITE_A_ID, FakeData.USER_A_ID, "session-id-a");
((Observer)M_sum).update(new Observable(), "this_is_not_an_event");
assertTrue(M_sum.collectEvents((List<Event>)null));
assertTrue(M_sum.collectEvents(new ArrayList<Event>()));
assertTrue(M_sum.collectEvents(new Event[]{}));
assertTrue(M_sum.collectEvents(Arrays.asList(null, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16)));
assertTrue(M_sum.collectEvents(new Event[]{null, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16}));
assertTrue(M_sum.collectEvent(null));
assertTrue(M_sum.collectEvent(e3));
assertTrue(M_sum.collectEvent(e4));
assertTrue(M_sum.collectEvent(e5));
assertTrue(M_sum.collectEvent(e6));
assertTrue(M_sum.collectEvent(e7));
assertTrue(M_sum.collectEvent(e8));
assertTrue(M_sum.collectEvent(e9));
assertTrue(M_sum.collectEvent(e10));
assertTrue(M_sum.collectEvent(e11));
assertTrue(M_sum.collectEvent(e12));
assertTrue(M_sum.collectEvent(e13));
assertTrue(M_sum.collectEvent(e14));
assertTrue(M_sum.collectEvent(e15));
assertTrue(M_sum.collectEvent(e16));
// #1: SST_EVENTS
List<EventStat> r1 = (List<EventStat>) db.getResultsForClass(EventStatImpl.class);
assertEquals(0, r1.size());
// #1: SST_SITEVISITS
List<SiteVisits> r2 = (List<SiteVisits>) db.getResultsForClass(SiteVisitsImpl.class);
assertEquals(0, r2.size());
// #1: SST_SITEACTIVITY
List<SiteActivity> r3 = (List<SiteActivity>) db.getResultsForClass(SiteActivityImpl.class);
assertEquals(0, r3.size());
// #1: SST_RESOURCES
List<ResourceStat> r4 = (List<ResourceStat>) db.getResultsForClass(ResourceStatImpl.class);
assertEquals(0, r4.size());
}
// Site visits tests
@SuppressWarnings("unchecked")
public void testSiteVisits() {
// #1 Test: 2 site visit (different users)
Event eSV1 = M_sum.buildEvent(new Date(), StatsManager.SITEVISIT_EVENTID, "/presence/"+FakeData.SITE_A_ID+"-presence", null, FakeData.USER_A_ID, "session-id-a");
Event eSV2 = M_sum.buildEvent(new Date(), StatsManager.SITEVISIT_EVENTID, "/presence/"+FakeData.SITE_A_ID+"-presence", null, FakeData.USER_B_ID, "session-id-b");
assertTrue(M_sum.collectEvents(Arrays.asList(eSV1, eSV2)));
// #1: SST_EVENTS
List<EventStat> r1 = (List<EventStat>) db.getResultsForClass(EventStatImpl.class);
assertEquals(2, r1.size());
EventStat es1 = r1.get(0);
EventStat es2 = r1.get(1);
assertEquals(FakeData.SITE_A_ID, es1.getSiteId());
assertEquals(FakeData.SITE_A_ID, es2.getSiteId());
assertEquals(eSV1.getEvent(), es1.getEventId());
assertEquals(eSV2.getEvent(), es2.getEventId());
if(eSV1.getUserId().equals(es1.getUserId())) {
assertEquals(eSV1.getUserId(), es1.getUserId());
assertEquals(eSV2.getUserId(), es2.getUserId());
}else{
assertEquals(eSV1.getUserId(), es2.getUserId());
assertEquals(eSV2.getUserId(), es1.getUserId());
}
assertEquals(1, es1.getCount());
assertEquals(1, es2.getCount());
// #1: SST_SITEVISITS
List<SiteVisits> r2 = (List<SiteVisits>) db.getResultsForClass(SiteVisitsImpl.class);
assertEquals(1, r2.size());
SiteVisits sv = r2.get(0);
assertEquals(FakeData.SITE_A_ID, sv.getSiteId());
assertEquals(2, sv.getTotalVisits());
assertEquals(2, sv.getTotalUnique());
// #1: SST_SITEACTIVITY
List<SiteActivity> r3 = (List<SiteActivity>) db.getResultsForClass(SiteActivityImpl.class);
assertEquals(0, r3.size());
// #1: SST_RESOURCES
List<ResourceStat> r4 = (List<ResourceStat>) db.getResultsForClass(ResourceStatImpl.class);
assertEquals(0, r4.size());
// #2 Test: 2 site visit (same users)
db.deleteAll();
eSV1 = M_sum.buildEvent(new Date(), StatsManager.SITEVISIT_EVENTID, "/presence/"+FakeData.SITE_A_ID+"-presence", null, FakeData.USER_A_ID, "session-id-a");
eSV2 = M_sum.buildEvent(new Date(), StatsManager.SITEVISIT_EVENTID, "/presence/"+FakeData.SITE_A_ID+"-presence", null, FakeData.USER_A_ID, "session-id-a");
assertTrue(M_sum.collectEvents(Arrays.asList(eSV1, eSV2)));
// #2: SST_EVENTS
r1 = (List<EventStat>) db.getResultsForClass(EventStatImpl.class);
assertEquals(1, r1.size());
es1 = r1.get(0);
assertEquals(FakeData.SITE_A_ID, es1.getSiteId());
assertEquals(eSV1.getEvent(), es1.getEventId());
assertEquals(eSV1.getUserId(), es1.getUserId());
assertEquals(2, es1.getCount());
// #2: SST_SITEVISITS
r2 = (List<SiteVisits>) db.getResultsForClass(SiteVisitsImpl.class);
assertEquals(1, r2.size());
sv = r2.get(0);
assertEquals(FakeData.SITE_A_ID, sv.getSiteId());
assertEquals(2, sv.getTotalVisits());
assertEquals(1, sv.getTotalUnique());
// #2: SST_SITEACTIVITY
r3 = (List<SiteActivity>) db.getResultsForClass(SiteActivityImpl.class);
assertEquals(0, r3.size());
// #2: SST_RESOURCES
r4 = (List<ResourceStat>) db.getResultsForClass(ResourceStatImpl.class);
assertEquals(0, r4.size());
}
// Activity tests
@SuppressWarnings("unchecked")
public void testActivityEvent() {
// #1 Test: 2 new chat msg (different users)
Event eSV1 = M_sum.buildEvent(new Date(), FakeData.EVENT_CHATNEW, "/chat/msg/"+FakeData.SITE_A_ID, FakeData.SITE_A_ID, FakeData.USER_A_ID, "session-id-a");
Event eSV2 = M_sum.buildEvent(new Date(), FakeData.EVENT_CHATNEW, "/chat/msg/"+FakeData.SITE_A_ID, FakeData.SITE_A_ID, FakeData.USER_B_ID, "session-id-a");
assertTrue(M_sum.collectEvents(Arrays.asList(eSV1, eSV2)));
// #1: SST_EVENTS
List<EventStat> r1 = (List<EventStat>) db.getResultsForClass(EventStatImpl.class);
assertEquals(2, r1.size());
EventStat es1 = r1.get(0);
EventStat es2 = r1.get(1);
assertEquals(FakeData.SITE_A_ID, es1.getSiteId());
assertEquals(FakeData.SITE_A_ID, es2.getSiteId());
assertEquals(eSV1.getEvent(), es1.getEventId());
assertEquals(eSV2.getEvent(), es2.getEventId());
assertEquals(1, es1.getCount());
assertEquals(1, es2.getCount());
if(eSV1.getUserId().equals(es1.getUserId())) {
assertEquals(eSV1.getUserId(), es1.getUserId());
assertEquals(eSV2.getUserId(), es2.getUserId());
}else{
assertEquals(eSV1.getUserId(), es2.getUserId());
assertEquals(eSV2.getUserId(), es1.getUserId());
}
// #1: SST_SITEVISITS
List<SiteVisits> r2 = (List<SiteVisits>) db.getResultsForClass(SiteVisitsImpl.class);
assertEquals(0, r2.size());
// #1: SST_SITEACTIVITY
List<SiteActivity> r3 = (List<SiteActivity>) db.getResultsForClass(SiteActivityImpl.class);
assertEquals(1, r3.size());
SiteActivity sa = r3.get(0);
assertEquals(FakeData.SITE_A_ID, sa.getSiteId());
assertEquals(FakeData.EVENT_CHATNEW, sa.getEventId());
assertEquals(2, sa.getCount());
// #1: SST_RESOURCES
List<ResourceStat> r4 = (List<ResourceStat>) db.getResultsForClass(ResourceStatImpl.class);
assertEquals(0, r4.size());
// #2 Test: 2 new chat msg (same users)
db.deleteAll();
eSV1 = M_sum.buildEvent(new Date(), FakeData.EVENT_CHATNEW, "/chat/msg/"+FakeData.SITE_A_ID, FakeData.SITE_A_ID, FakeData.USER_A_ID, "session-id-a");
eSV2 = M_sum.buildEvent(new Date(), FakeData.EVENT_CHATNEW, "/chat/msg/"+FakeData.SITE_A_ID, FakeData.SITE_A_ID, FakeData.USER_A_ID, "session-id-a");
assertTrue(M_sum.collectEvents(Arrays.asList(eSV1, eSV2)));
// #2: SST_EVENTS
r1 = (List<EventStat>) db.getResultsForClass(EventStatImpl.class);
assertEquals(1, r1.size());
es1 = r1.get(0);
assertEquals(FakeData.SITE_A_ID, es1.getSiteId());
assertEquals(eSV1.getEvent(), es1.getEventId());
assertEquals(eSV1.getUserId(), es1.getUserId());
assertEquals(2, es1.getCount());
// #2: SST_SITEVISITS
r2 = (List<SiteVisits>) db.getResultsForClass(SiteVisitsImpl.class);
assertEquals(0, r2.size());
// #2: SST_SITEACTIVITY
r3 = (List<SiteActivity>) db.getResultsForClass(SiteActivityImpl.class);
assertEquals(1, r3.size());
sa = r3.get(0);
assertEquals(FakeData.SITE_A_ID, sa.getSiteId());
assertEquals(FakeData.EVENT_CHATNEW, sa.getEventId());
assertEquals(2, sa.getCount());
// #2: SST_RESOURCES
r4 = (List<ResourceStat>) db.getResultsForClass(ResourceStatImpl.class);
assertEquals(0, r4.size());
}
// Resource tests
@SuppressWarnings("unchecked")
public void testResourceActivity() {
// #1 Test:
// 2 new resource (site-a, user-a and user-b)
// 2 new resource (site-b, 2x user-a)
// 1 resource revise (site-b, user-b)
Event e1 = M_sum.buildEvent(new Date(), FakeData.EVENT_CONTENTNEW, "/content/group/"+FakeData.SITE_A_ID+"/resource_id", FakeData.SITE_A_ID, FakeData.USER_A_ID, "session-id-a");
Event e2 = M_sum.buildEvent(new Date(), FakeData.EVENT_CONTENTNEW, "/content/group/"+FakeData.SITE_A_ID+"/resource_id", FakeData.SITE_A_ID, FakeData.USER_B_ID, "session-id-a");
Event e3 = M_sum.buildEvent(new Date(), FakeData.EVENT_CONTENTNEW, "/content/group/"+FakeData.SITE_B_ID+"/resource_id", FakeData.SITE_B_ID, FakeData.USER_A_ID, "session-id-a");
Event e4 = M_sum.buildEvent(new Date(), FakeData.EVENT_CONTENTNEW, "/content/group/"+FakeData.SITE_B_ID+"/resource_id", FakeData.SITE_B_ID, FakeData.USER_A_ID, "session-id-a");
Event e5 = M_sum.buildEvent(new Date(), FakeData.EVENT_CONTENTREV, "/content/group/"+FakeData.SITE_B_ID+"/resource_id", FakeData.SITE_B_ID, FakeData.USER_B_ID, "session-id-a");
assertTrue(M_sum.collectEvents(Arrays.asList(e1, e2, e3, e4, e5)));
// #1: SST_EVENTS
List<EventStat> r1 = (List<EventStat>) db.getResultsForClass(EventStatImpl.class);
assertEquals(4, r1.size());
// #1: SST_SITEVISITS
List<SiteVisits> r2 = (List<SiteVisits>) db.getResultsForClass(SiteVisitsImpl.class);
assertEquals(0, r2.size());
// #1: SST_SITEACTIVITY
List<SiteActivity> r3 = (List<SiteActivity>) db.getResultsForClass(SiteActivityImpl.class);
assertEquals(3, r3.size());
// #1: SST_RESOURCES
List<ResourceStat> r4 = (List<ResourceStat>) db.getResultsForClass(ResourceStatImpl.class);
assertEquals(4, r4.size());
// #2 Test: valid resource events
db.deleteAll();
Event e6 = M_sum.buildEvent(new Date(), FakeData.EVENT_CONTENTNEW, "/content/attachment/something/more/and/more", FakeData.SITE_A_ID, FakeData.USER_A_ID, "session-id-a");
Event e7 = M_sum.buildEvent(new Date(), FakeData.EVENT_CONTENTNEW, "/content/group/something/more/and/more", FakeData.SITE_A_ID, FakeData.USER_A_ID, "session-id-a");
Event e8 = M_sum.buildEvent(new Date(), FakeData.EVENT_CONTENTNEW, "/content/group-user/something/more/and/more", FakeData.SITE_A_ID, FakeData.USER_A_ID, "session-id-a");
assertTrue(M_sum.collectEvents(Arrays.asList(e6, e7, e8)));
// #1: SST_EVENTS
r1 = (List<EventStat>) db.getResultsForClass(EventStatImpl.class);
assertEquals(1, r1.size());
// #1: SST_SITEVISITS
r2 = (List<SiteVisits>) db.getResultsForClass(SiteVisitsImpl.class);
assertEquals(0, r2.size());
// #1: SST_SITEACTIVITY
r3 = (List<SiteActivity>) db.getResultsForClass(SiteActivityImpl.class);
assertEquals(1, r3.size());
// #1: SST_RESOURCES
r4 = (List<ResourceStat>) db.getResultsForClass(ResourceStatImpl.class);
assertEquals(3, r4.size());
}
// Site visits, presence time tests
@SuppressWarnings("unchecked")
public void testSitePresences() {
//System.out.println("--- testSitePresences() :: START ---");
long minPresenceTime = 100;
// #1 Test : 2 site visit (different users)
// BEGIN SITE PRESENCE
Date now = new Date();
Event eSV1 = M_sum.buildEvent(now, StatsManager.SITEVISIT_EVENTID, "/presence/"+FakeData.SITE_A_ID+"-presence", null, FakeData.USER_A_ID, "session-id-a");
Event eSV2 = M_sum.buildEvent(now, StatsManager.SITEVISIT_EVENTID, "/presence/"+FakeData.SITE_A_ID+"-presence", null, FakeData.USER_B_ID, "session-id-b");
assertTrue(M_sum.collectEvents(Arrays.asList(eSV1, eSV2)));
// ... check SST_PRESENCES
List<SitePresence> r1 = (List<SitePresence>) db.getResultsForClass(SitePresenceImpl.class);
assertEquals(2, r1.size());
SitePresence es1 = r1.get(0);
SitePresence es2 = r1.get(1);
assertEquals(FakeData.SITE_A_ID, es1.getSiteId());
assertEquals(FakeData.SITE_A_ID, es2.getSiteId());
if(eSV1.getUserId().equals(es1.getUserId())) {
assertEquals(eSV1.getUserId(), es1.getUserId());
assertEquals(eSV2.getUserId(), es2.getUserId());
}else{
assertEquals(eSV1.getUserId(), es2.getUserId());
assertEquals(eSV2.getUserId(), es1.getUserId());
}
assertNotNull(es1.getLastVisitStartTime());
assertNotNull(es2.getLastVisitStartTime());
assertTrue(es1.getLastVisitStartTime().equals(now) || es1.getLastVisitStartTime().before(now));
assertTrue(es2.getLastVisitStartTime().equals(now) || es2.getLastVisitStartTime().before(now));
// END SITE PRESENCE
try{
// give it time before ending presence
Thread.sleep(minPresenceTime);
}catch(Exception e) {}
now = new Date();
Event eSV1e = M_sum.buildEvent(now, StatsManager.SITEVISITEND_EVENTID, "/presence/"+FakeData.SITE_A_ID+"-presence", null, FakeData.USER_A_ID, "session-id-a");
Event eSV2e = M_sum.buildEvent(now, StatsManager.SITEVISITEND_EVENTID, "/presence/"+FakeData.SITE_A_ID+"-presence", null, FakeData.USER_B_ID, "session-id-b");
assertTrue(M_sum.collectEvents(Arrays.asList(eSV1e, eSV2e)));
// ... check SST_PRESENCES
r1 = (List<SitePresence>) db.getResultsForClass(SitePresenceImpl.class);
assertEquals(2, r1.size());
es1 = r1.get(0);
es2 = r1.get(1);
assertEquals(FakeData.SITE_A_ID, es1.getSiteId());
assertEquals(FakeData.SITE_A_ID, es2.getSiteId());
if(eSV1.getUserId().equals(es1.getUserId())) {
assertEquals(eSV1.getUserId(), es1.getUserId());
assertEquals(eSV2.getUserId(), es2.getUserId());
}else{
assertEquals(eSV1.getUserId(), es2.getUserId());
assertEquals(eSV2.getUserId(), es1.getUserId());
}
assertNull(es1.getLastVisitStartTime());
assertNull(es2.getLastVisitStartTime());
assertTrue(es1.getDuration() >= minPresenceTime);
assertTrue(es2.getDuration() >= minPresenceTime);
// #2 Test: 2 site visit (same users)
db.deleteAll();
//System.out.println("--- testSitePresences() :: START II ---");
// BEGIN SITE PRESENCE
now = new Date();
eSV1 = M_sum.buildEvent(now, StatsManager.SITEVISIT_EVENTID, "/presence/"+FakeData.SITE_A_ID+"-presence", null, FakeData.USER_A_ID, "session-id-a");
assertTrue(M_sum.collectEvents(Arrays.asList(eSV1)));
try{
// give it time before ending presence
minPresenceTime = 150;
Thread.sleep(minPresenceTime);
}catch(Exception e) {}
Date now2 = new Date();
long secondDuration = now2.getTime() - now.getTime();
eSV2 = M_sum.buildEvent(now2, StatsManager.SITEVISITEND_EVENTID, "/presence/"+FakeData.SITE_A_ID+"-presence", null, FakeData.USER_A_ID, "session-id-a");
assertTrue(M_sum.collectEvents(Arrays.asList(eSV2)));
// ... check SST_PRESENCES
r1 = (List<SitePresence>) db.getResultsForClass(SitePresenceImpl.class);
assertEquals(1, r1.size());
es1 = r1.get(0);
assertEquals(FakeData.SITE_A_ID, es1.getSiteId());
assertEquals(eSV1.getUserId(), es1.getUserId());
assertNull(es1.getLastVisitStartTime());
long totalDuration = es1.getDuration();
long firstDuration = totalDuration;
assertTrue(totalDuration == secondDuration);
// END SITE PRESENCE
now = new Date();
eSV1e = M_sum.buildEvent(now, StatsManager.SITEVISIT_EVENTID, "/presence/"+FakeData.SITE_A_ID+"-presence", null, FakeData.USER_A_ID, "session-id-a");
assertTrue(M_sum.collectEvents(Arrays.asList(eSV1e)));
try{
// give it time before ending presence
minPresenceTime = 250;
Thread.sleep(minPresenceTime);
}catch(Exception e) {}
now2 = new Date();
secondDuration = now2.getTime() - now.getTime();
eSV2e = M_sum.buildEvent(now2, StatsManager.SITEVISITEND_EVENTID, "/presence/"+FakeData.SITE_A_ID+"-presence", null, FakeData.USER_A_ID, "session-id-a");
assertTrue(M_sum.collectEvents(Arrays.asList(eSV2e)));
// ... check SST_PRESENCES
r1 = (List<SitePresence>) db.getResultsForClass(SitePresenceImpl.class);
assertEquals(1, r1.size());
es1 = r1.get(0);
assertEquals(FakeData.SITE_A_ID, es1.getSiteId());
assertEquals(eSV1.getUserId(), es1.getUserId());
assertNull(es1.getLastVisitStartTime());
totalDuration = es1.getDuration();
//System.out.println("1. totalDuration: "+totalDuration);
//System.out.println("1. firstDuration: "+firstDuration);
//System.out.println("1. secondDuration: "+secondDuration);
assertTrue(totalDuration == firstDuration + secondDuration);
// #3 Test: one pres.end (with one pres.begin already on db)
db.deleteAll();
// insert related pres.begin directly on db
now = new Date();
Date dbDate = getTruncatedDate(now);
firstDuration = 10000;
SitePresence sp1 = new SitePresenceImpl();
sp1.setSiteId(FakeData.SITE_A_ID);
sp1.setDate(dbDate);
sp1.setUserId(FakeData.USER_A_ID);
sp1.setDuration(firstDuration);
sp1.setLastVisitStartTime(now);
db.insertObject(sp1);
assertTrue(db.getResultsForClass(SitePresenceImpl.class).size() == 1);
// generate pres.end for processing in SST
try{
// give it time before ending presence
minPresenceTime = 300;
Thread.sleep(minPresenceTime);
}catch(Exception e) {}
now2 = new Date();
secondDuration = now2.getTime() - now.getTime();
eSV2e = M_sum.buildEvent(now2, StatsManager.SITEVISITEND_EVENTID, "/presence/"+FakeData.SITE_A_ID+"-presence", null, FakeData.USER_A_ID, "session-id-a");
assertTrue(M_sum.collectEvents(Arrays.asList(eSV2e)));
r1 = (List<SitePresence>) db.getResultsForClass(SitePresenceImpl.class);
assertEquals(1, r1.size());
es1 = r1.get(0);
assertEquals(FakeData.SITE_A_ID, es1.getSiteId());
assertEquals(eSV1.getUserId(), es1.getUserId());
assertNull(es1.getLastVisitStartTime());
totalDuration = es1.getDuration();
//System.out.println("2. totalDuration: "+totalDuration);
//System.out.println("2. firstDuration: "+firstDuration);
//System.out.println("2. secondDuration: "+secondDuration);
assertTrue(totalDuration == firstDuration + secondDuration);
//System.out.println("--- testSitePresences() :: END ---");
// #4 Test: one pres.end (with one pres.begin already on db, with duration = 0)
db.deleteAll();
// insert related pres.begin directly on db
now = new Date();
firstDuration = 0;
sp1 = new SitePresenceImpl();
sp1.setSiteId(FakeData.SITE_A_ID);
sp1.setDate(dbDate);
sp1.setUserId(FakeData.USER_A_ID);
sp1.setDuration(firstDuration);
sp1.setLastVisitStartTime(now);
db.insertObject(sp1);
assertTrue(db.getResultsForClass(SitePresenceImpl.class).size() == 1);
// generate pres.end for processing in SST
try{
// give it time before ending presence
minPresenceTime = 300;
Thread.sleep(minPresenceTime);
}catch(Exception e) {}
now2 = new Date();
secondDuration = now2.getTime() - now.getTime();
eSV2e = M_sum.buildEvent(now2, StatsManager.SITEVISITEND_EVENTID, "/presence/"+FakeData.SITE_A_ID+"-presence", null, FakeData.USER_A_ID, "session-id-a");
assertTrue(M_sum.collectEvents(Arrays.asList(eSV2e)));
r1 = (List<SitePresence>) db.getResultsForClass(SitePresenceImpl.class);
assertEquals(1, r1.size());
es1 = r1.get(0);
assertEquals(FakeData.SITE_A_ID, es1.getSiteId());
assertEquals(eSV1.getUserId(), es1.getUserId());
assertNull(es1.getLastVisitStartTime());
totalDuration = es1.getDuration();
//System.out.println("3. totalDuration: "+totalDuration);
//System.out.println("3. firstDuration: "+firstDuration);
//System.out.println("3. secondDuration: "+secondDuration);
assertTrue(totalDuration == firstDuration + secondDuration);
//System.out.println("--- testSitePresences() :: END ---");
}
// Test (remaining) CustomEventImpl fields
public void testCustomEventImpl() {
CustomEventImpl e1 = new CustomEventImpl(new Date(), FakeData.EVENT_CHATNEW, "/chat/msg/"+FakeData.SITE_A_ID, FakeData.SITE_A_ID, FakeData.USER_A_ID, "session-id-a", '-');
assertEquals(false, e1.getModify());
assertEquals(0, e1.getPriority());
e1 = new CustomEventImpl(new Date(), FakeData.EVENT_CHATNEW, "/chat/msg/"+FakeData.SITE_A_ID, FakeData.SITE_A_ID, FakeData.USER_A_ID, "session-id-a", 'm');
assertEquals(true, e1.getModify());
}
// Basic configuration test
@SuppressWarnings("unchecked")
public void testConfigIsCollectThreadEnabled() {
db.deleteAll();
M_sum.setCollectThreadUpdateInterval(50);
// #1: collect thread enabled/disabled
assertEquals(true, M_sum.isCollectThreadEnabled());
// turn it off
M_sum.setCollectThreadEnabled(false);
assertEquals(false, M_sum.isCollectThreadEnabled());
try{
// give it time to stop thread
Thread.sleep(200);
}catch(Exception e) {}
Event e1 = M_sum.buildEvent(new Date(), FakeData.EVENT_CHATNEW, "/chat/msg/"+FakeData.SITE_A_ID, FakeData.USER_A_ID, "session-id-a");
M_ets.post(e1);
List<EventStat> results = (List<EventStat>) db.getResultsForClass(EventStatImpl.class);
assertEquals(0, results.size());
// turn it on again
M_sum.setCollectThreadEnabled(true);
assertEquals(true, M_sum.isCollectThreadEnabled());
try{
// give it time to start thread
Thread.sleep(200);
}catch(Exception e) {}
M_ets.post(e1);
while(!M_sum.isIdle()) {
try{
// give it time to process event
Thread.sleep(300);
}catch(Exception e) {}
}
results = (List<EventStat>) db.getResultsForClass(EventStatImpl.class);
assertEquals(1, results.size());
}
@SuppressWarnings("unchecked")
public void testConfigCollectThreadUpdateInterval() {
db.deleteAll();
// #2: collect thread update interval
assertEquals(50, M_sum.getCollectThreadUpdateInterval());
// make sure it processes
Event e1 = M_sum.buildEvent(new Date(), FakeData.EVENT_CHATNEW, "/chat/msg/"+FakeData.SITE_A_ID, FakeData.USER_A_ID, "session-id-a");
M_ets.post(e1);
int tries = 0;
List<EventStat> results = new ArrayList<EventStat>();
while(results.size() == 0 && tries++ < 3) {
results = (List<EventStat>) db.getResultsForClass(EventStatImpl.class);
try{
// give it time to process event
Thread.sleep(500);
}catch(Exception e) {/* ignore */}
}
assertEquals(1, results.size());
// make sure it doesn't process it
M_sum.setCollectThreadUpdateInterval(500);
assertEquals(500, M_sum.getCollectThreadUpdateInterval());
e1 = M_sum.buildEvent(new Date(), FakeData.EVENT_CHATNEW, "/chat/msg/"+FakeData.SITE_A_ID, FakeData.USER_B_ID, "session-id-a");
M_ets.post(e1);
results = (List<EventStat>) db.getResultsForClass(EventStatImpl.class);
assertEquals(1, results.size());
M_sum.setCollectThreadUpdateInterval(50);
assertEquals(50, M_sum.getCollectThreadUpdateInterval());
tries = 0;
while(results.size() == 1 && tries++ < 3) {
results = (List<EventStat>) db.getResultsForClass(EventStatImpl.class);
try{
// give it time to process event before finish
Thread.sleep(500);
}catch(Exception e) {/* ignore */}
}
assertEquals(2, results.size());
}
@SuppressWarnings("unchecked")
public void testConfigIsCollectAdminEvents() {
db.deleteAll();
// #3: collect admin events
assertEquals(true, M_sum.isCollectAdminEvents());
// make sure it processes admin events
Event e1 = M_sum.buildEvent(new Date(), StatsManager.SITEVISIT_EVENTID, "/presence/"+FakeData.SITE_A_ID+"-presence", null, "admin", "session-id-a");
Event e2 = M_sum.buildEvent(new Date(), StatsManager.SITEVISIT_EVENTID, "/presence/"+FakeData.SITE_A_ID+"-presence", null, FakeData.USER_A_ID, "session-id-a");
M_sum.collectEvents(Arrays.asList(e1, e2));
List<SiteVisits> results2 = (List<SiteVisits>) db.getResultsForClass(SiteVisitsImpl.class);
assertEquals(1, results2.size());
assertEquals(2, results2.get(0).getCount());
// make sure it doesn't processes admin events
M_sum.setCollectAdminEvents(false);
assertEquals(false, M_sum.isCollectAdminEvents());
M_sum.collectEvents(Arrays.asList(e1, e2));
results2 = (List<SiteVisits>) db.getResultsForClass(SiteVisitsImpl.class);
assertEquals(1, results2.size());
assertEquals(3, results2.get(0).getCount());
M_sum.setCollectAdminEvents(true);
assertEquals(true, M_sum.isCollectAdminEvents());
}
@SuppressWarnings("unchecked")
public void testConfigIsCollectEventsForSiteWithToolOnly() {
db.deleteAll();
// #4: collect for sites with SiteStats only
assertEquals(false, M_sum.isCollectEventsForSiteWithToolOnly());
// make sure events get processed for sites with SiteStats only
M_sum.setCollectEventsForSiteWithToolOnly(true);
assertEquals(true, M_sum.isCollectEventsForSiteWithToolOnly());
Event e1 = M_sum.buildEvent(new Date(), StatsManager.SITEVISIT_EVENTID, "/presence/"+FakeData.SITE_A_ID+"-presence", null, FakeData.USER_A_ID, "session-id-a");
M_sum.collectEvent(e1);
List<SiteVisits> results2 = (List<SiteVisits>) db.getResultsForClass(SiteVisitsImpl.class);
assertEquals(1, results2.size());
e1 = M_sum.buildEvent(new Date(), StatsManager.SITEVISIT_EVENTID, "/presence/"+FakeData.SITE_B_ID+"-presence", null, FakeData.USER_A_ID, "session-id-a");
M_sum.collectEvent(e1);
results2 = (List<SiteVisits>) db.getResultsForClass(SiteVisitsImpl.class);
assertEquals(1, results2.size());
// make sure events get processed for any sites
db.deleteAll();
M_sum.setCollectEventsForSiteWithToolOnly(false);
assertEquals(false, M_sum.isCollectEventsForSiteWithToolOnly());
e1 = M_sum.buildEvent(new Date(), StatsManager.SITEVISIT_EVENTID, "/presence/"+FakeData.SITE_A_ID+"-presence", null, FakeData.USER_A_ID, "session-id-a");
M_sum.collectEvent(e1);
results2 = (List<SiteVisits>) db.getResultsForClass(SiteVisitsImpl.class);
assertEquals(1, results2.size());
e1 = M_sum.buildEvent(new Date(), StatsManager.SITEVISIT_EVENTID, "/presence/"+FakeData.SITE_B_ID+"-presence", null, FakeData.USER_A_ID, "session-id-a");
M_sum.collectEvent(e1);
results2 = (List<SiteVisits>) db.getResultsForClass(SiteVisitsImpl.class);
assertEquals(2, results2.size());
}
@SuppressWarnings("unchecked")
public void testConfigIsShowAnonymousAccessEvents() {
db.deleteAll();
// #3: ShowAnonymousAccessEvents
assertEquals(true, M_sm.isShowAnonymousAccessEvents());
// make sure it processes access events from anonymous
Event e1 = M_sum.buildEvent(new Date(), FakeData.EVENT_CONTENTNEW, "/content/group/"+FakeData.SITE_A_ID+"/resource_id", FakeData.SITE_A_ID, "?", "session-id-a");
Event e2 = M_sum.buildEvent(new Date(), FakeData.EVENT_CONTENTNEW, "/content/group/"+FakeData.SITE_A_ID+"/resource_id", FakeData.SITE_A_ID, FakeData.USER_A_ID, "session-id-a");
M_sum.collectEvents(Arrays.asList(e1, e2));
List<ResourceStat> results = (List<ResourceStat>) db.getResultsForClass(ResourceStatImpl.class);
assertEquals(2, results.size());
// make sure it doesn't processes access events from anonymous
reset(M_sm);
expect(M_sm.isEventContextSupported()).andReturn(true).anyTimes();
expect(M_sm.isShowAnonymousAccessEvents()).andReturn(false).anyTimes();
expect(M_sm.isEnableSitePresences()).andReturn(true).anyTimes();
replay(M_sm);
((StatsUpdateManagerImpl)M_sum).setStatsManager(M_sm);
assertEquals(false, M_sm.isShowAnonymousAccessEvents());
M_sum.collectEvents(Arrays.asList(e1, e2));
results = (List<ResourceStat>) db.getResultsForClass(ResourceStatImpl.class);
assertEquals(2, results.size());
// revert setting
reset(M_sm);
expect(M_sm.isEventContextSupported()).andReturn(true).anyTimes();
expect(M_sm.isShowAnonymousAccessEvents()).andReturn(true).anyTimes();
replay(M_sm);
assertEquals(true, M_sm.isShowAnonymousAccessEvents());
}
@SuppressWarnings("unchecked")
public void testConfigIsEventContextSupported() {
db.deleteAll();
// #3: EventContextSupported
assertEquals(true, M_sm.isEventContextSupported());
// make sure it processes both events
Event e1 = M_sum.buildEvent(new Date(), FakeData.EVENT_CONTENTNEW, "/content/group/non_existent_site/resource_id", FakeData.SITE_A_ID, FakeData.USER_A_ID, "session-id-a");
Event e2 = M_sum.buildEvent(new Date(), FakeData.EVENT_CONTENTNEW, "/content/group/"+FakeData.SITE_A_ID+"/resource_id", null, FakeData.USER_B_ID, "session-id-a");
M_sum.collectEvents(Arrays.asList(e1, e2));
List<EventStat> results = (List<EventStat>) db.getResultsForClass(EventStatImpl.class);
assertEquals(2, results.size());
// make sure it processes one of the events
reset(M_sm);
expect(M_sm.isEventContextSupported()).andReturn(false).anyTimes();
expect(M_sm.isShowAnonymousAccessEvents()).andReturn(true).anyTimes();
expect(M_sm.isEnableSitePresences()).andReturn(true).anyTimes();
replay(M_sm);
((StatsUpdateManagerImpl)M_sum).setStatsManager(M_sm);
assertEquals(false, M_sm.isEventContextSupported());
e1 = M_sum.buildEvent(new Date(), FakeData.EVENT_CONTENTNEW, "/content/group/non_existent_site/resource_id", FakeData.SITE_A_ID, FakeData.USER_A_ID, "session-id-a");
e2 = M_sum.buildEvent(new Date(), FakeData.EVENT_CONTENTNEW, "/content/group/"+FakeData.SITE_B_ID+"/resource_id", null, FakeData.USER_B_ID, "session-id-a");
M_sum.collectEvents(Arrays.asList(e1, e2));
results = (List<EventStat>) db.getResultsForClass(EventStatImpl.class);
assertEquals(3, results.size());
// revert setting
reset(M_sm);
expect(M_sm.isEventContextSupported()).andReturn(true).anyTimes();
expect(M_sm.isShowAnonymousAccessEvents()).andReturn(true).anyTimes();
replay(M_sm);
assertEquals(true, M_sm.isEventContextSupported());
}
// Test JobRun related methods
public void testJobRunMethods() {
Date now = new Date();
Date twentyMinBefore = new Date(now.getTime() - 1200*1000);
Date fifteenMinBefore = new Date(now.getTime() - 900*1000);
Date tenMinBefore = new Date(now.getTime() - 600*1000);
Date fiveMinBefore = new Date(now.getTime() - 300*1000);
// setup JobRun objects
JobRun jobRun1 = new JobRunImpl();
jobRun1.setStartEventId(1);
jobRun1.setEndEventId(10);
jobRun1.setJobStartDate(fifteenMinBefore);
jobRun1.setJobEndDate(tenMinBefore);
jobRun1.setLastEventDate(twentyMinBefore);
JobRun jobRun2 = new JobRunImpl();
jobRun2.setStartEventId(11);
jobRun2.setEndEventId(20);
jobRun2.setJobStartDate(tenMinBefore);
jobRun2.setJobEndDate(fiveMinBefore);
jobRun2.setLastEventDate(fifteenMinBefore);
// test getEventDateFromLatestJobRun() == null
try{
assertNull(M_sum.getEventDateFromLatestJobRun());
}catch(Exception e){
fail("There should be no JobRun in database! [1]");
}
// test getLatestJobRun() == null
try{
assertNull(M_sum.getLatestJobRun());
}catch(Exception e){
fail("There should be no JobRun in database! [2]");
}
// test save of null JobRun
assertFalse(M_sum.saveJobRun(null));
// save objects to db
assertTrue(M_sum.saveJobRun(jobRun1));
assertTrue(M_sum.saveJobRun(jobRun2));
// test getLatestJobRun()
JobRun jr = null;
try{
jr = M_sum.getLatestJobRun();
}catch(Exception e){
fail("There is no JobRun in database! [1]");
}
assertEquals(jobRun2.getStartEventId(), jr.getStartEventId());
assertEquals(jobRun2.getEndEventId(), jr.getEndEventId());
assertEquals(jobRun2.getJobStartDate(), jr.getJobStartDate());
assertEquals(jobRun2.getJobEndDate(), jr.getJobEndDate());
assertEquals(jobRun2.getLastEventDate(), jr.getLastEventDate());
// test getEventDateFromLatestJobRun()
try{
assertEquals(jobRun2.getLastEventDate(), M_sum.getEventDateFromLatestJobRun());
}catch(Exception e){
fail("There is no JobRun in database! [2]");
}
}
private Date getTruncatedDate(Date date) {
if(date == null) return null;
Calendar c = Calendar.getInstance();
c.setTime(date);
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
return c.getTime();
}
}