/******************************************************************************* * Copyright (c) 2010, 2011 Tasktop Technologies 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: * Tasktop Technologies - initial API and implementation *******************************************************************************/ package org.eclipse.mylyn.commons.activity.tests; import junit.framework.TestCase; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.mylyn.internal.commons.activity.ui.IUserActivityManagerCallback; import org.eclipse.mylyn.internal.commons.activity.ui.MonitorUserActivityJob; /** * @author Steffen Pingel */ public class MonitorUserActivityJobTest extends TestCase { private StubCallback callback; private TestableCheckActivityJob job; @Override protected void setUp() throws Exception { callback = new StubCallback(); job = new TestableCheckActivityJob(callback); } public void testInactivityTimeout() throws Exception { callback.lastEventTime = System.currentTimeMillis() - 201; job.setInactivityTimeout(200); job.run(); assertFalse(job.isActive()); job.run(); assertFalse(job.isActive()); callback.lastEventTime = System.currentTimeMillis(); job.run(); assertTrue(job.isActive()); assertEquals(0, callback.activeTime); Thread.sleep(6); job.run(); long slept = System.currentTimeMillis() - callback.lastEventTime; assertTrue(job.isActive()); assertTrue("expected less than 5 < activeTime < 40, got " + callback.activeTime + " (slept " + slept + " ms)", callback.activeTime > 5 && callback.activeTime < 40); } public void testResumeFromSleepNoTimeout() throws Exception { job.setInactivityTimeout(0); job.run(); assertTrue(job.isActive()); job.run(); assertTrue(job.isActive()); assertEquals(1, callback.eventCount); job.run(); assertEquals(2, callback.eventCount); assertTrue(job.isActive()); Thread.sleep(11); job.run(); assertTrue(job.isActive()); assertTrue("expected more than 10 ms, got " + callback.activeTime, callback.activeTime > 10); assertEquals(3, callback.eventCount); } public void testResumeFromSleepTimeoutNoEvent() throws Exception { callback.lastEventTime = System.currentTimeMillis(); job.setInactivityTimeout(20); job.setTick(20); job.run(); assertTrue(job.isActive()); job.run(); assertTrue(job.isActive()); assertEquals(1, callback.eventCount); Thread.sleep(61); // resume from sleep past timeout job.run(); assertFalse(job.isActive()); job.run(); assertFalse(job.isActive()); assertTrue("expected less than 10 ms, got " + callback.activeTime, callback.activeTime < 10); assertEquals(1, callback.eventCount); assertEquals(callback.lastEventTime, callback.startTime); } public void testResumeFromSleepTimeoutEvent() throws Exception { callback.lastEventTime = System.currentTimeMillis(); job.setInactivityTimeout(20); job.setTick(20); job.run(); assertTrue(job.isActive()); job.run(); assertTrue(job.isActive()); assertEquals(1, callback.eventCount); Thread.sleep(41); // resume from sleep past timeout job.run(); assertTrue(callback.inactive); assertFalse(job.isActive()); Thread.sleep(11); // should still discard events job.run(); assertFalse(job.isActive()); // start activity callback.lastEventTime = System.currentTimeMillis(); job.run(); assertTrue(job.isActive()); assertEquals(1, callback.eventCount); Thread.sleep(11); job.run(); // check if time sleeping was logged long slept = System.currentTimeMillis() - callback.lastEventTime; assertTrue("expected less than 10 < activeTime < 20, got " + callback.activeTime + " (slept " + slept + " ms)", callback.activeTime > 10 && callback.activeTime < 20); assertEquals(2, callback.eventCount); } public void testResumeFromSleepTimeoutEventDiscarded() throws Exception { // record one tick callback.lastEventTime = System.currentTimeMillis(); job.setInactivityTimeout(20); job.setTick(20); job.run(); assertTrue(job.isActive()); job.run(); assertTrue(job.isActive()); assertEquals(1, callback.eventCount); // resume from sleep past timeout callback.activeTime = 0; Thread.sleep(61); callback.lastEventTime = System.currentTimeMillis(); job.run(); assertFalse(callback.inactive); assertTrue(job.isActive()); assertEquals(0, callback.activeTime); // record another tick Thread.sleep(6); job.run(); long slept = System.currentTimeMillis() - callback.lastEventTime; assertTrue(job.isActive()); // check if time sleeping was logged assertEquals(2, callback.eventCount); assertTrue("expected less than 5 < activeTime < 40, got " + callback.activeTime + " (slept " + slept + " ms)", callback.activeTime > 5 && callback.activeTime < 40); } private class TestableCheckActivityJob extends MonitorUserActivityJob { public TestableCheckActivityJob(IUserActivityManagerCallback callback) { super(callback); } public IStatus run() { return super.run(new NullProgressMonitor()); } @Override protected boolean isEnabled() { return true; } public void setTick(long tick) { this.tick = tick; } @Override public void reschedule() { // ignore, job is called explicitly from test } } private class StubCallback implements IUserActivityManagerCallback { private boolean inactive; private long lastEventTime; private long activeTime; private long eventCount; private long startTime; public void addMonitoredActivityTime(long startTime, long endTime) { this.startTime = startTime; this.activeTime += endTime - startTime; this.eventCount++; } public void inactive() { this.inactive = true; } public long getLastEventTime() { return this.lastEventTime; } public void active() { } } }