Package rabbit.tracking.internal.trackers

Source Code of rabbit.tracking.internal.trackers.SessionTrackerTest

/*
* Copyright 2010 The Rabbit Eclipse Plug-in Project
*
* Licensed under the Apache 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.apache.org/licenses/LICENSE-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 rabbit.tracking.internal.trackers;

import rabbit.data.store.model.SessionEvent;
import rabbit.tracking.internal.IdleDetector;
import rabbit.tracking.internal.TrackingPlugin;
import rabbit.tracking.internal.trackers.AbstractTracker;
import rabbit.tracking.internal.trackers.SessionTracker;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.joda.time.Interval;
import org.junit.Test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Observable;
import java.util.concurrent.TimeUnit;

/**
* @see SessionTracker
*/
public class SessionTrackerTest extends AbstractTrackerTest<SessionEvent> {

  @Test
  public void testDisabled() throws Exception {
    tracker.setEnabled(false);
    Thread.sleep(30);
    Shell shell = minimizeActiveShell();
    try {
      assertTrue(tracker.getData().isEmpty());
    } finally {
      shell.setMinimized(false);
    }
  }

  /**
   * Test when the tracker is set to be enabled, if there is no active workbench
   * window, no data will be recorded.
   */
  @Test
  public void testEnable_noActiveWorkbenchWindow() throws Exception {
    Shell shell = minimizeActiveShell();
    try {
      tracker.setEnabled(true);
      TimeUnit.MILLISECONDS.sleep(30);
      tracker.setEnabled(false);
      assertEquals(0, tracker.getData().size());
    } finally {
      shell.setMinimized(false);
    }
  }

  @Test
  public void testEnableThenDisable() throws Exception {
    long preStart = System.currentTimeMillis();
    tracker.setEnabled(true);
    long postStart = System.currentTimeMillis();

    Thread.sleep(30);

    long preEnd = System.currentTimeMillis();
    tracker.setEnabled(false);
    long postEnd = System.currentTimeMillis();

    Collection<SessionEvent> data = tracker.getData();
    assertEquals(1, data.size());
    SessionEvent event = data.iterator().next();
    long start = event.getInterval().getStartMillis();
    long end = event.getInterval().getEndMillis();
    checkTime(preStart, start, postStart, preEnd, end, postEnd);
  }

  @Test
  public void testEnableThenDisable_whenNoActiveShell() throws Exception {
    Shell shell = minimizeActiveShell();
    try {
      tracker.setEnabled(true);
      tracker.flushData();
      Thread.sleep(10);
      tracker.setEnabled(false);
      assertEquals(0, tracker.getData().size());
    } finally {
      shell.setMinimized(false);
    }
  }

  @Test
  public void testIdleDetector_whenNoActiveShell() throws Exception {
    Shell shell = minimizeActiveShell();
    try {
      tracker.setEnabled(true);
      tracker.flushData();
      Thread.sleep(10);
      callIdleDetectorToNotify();
      assertEquals(0, tracker.getData().size());
    } finally {
      shell.setMinimized(false);
    }
  }

  @Test
  public void testIdleDetector_whenTrackerIsDisabled() throws Exception {
    tracker.setEnabled(false);
    tracker.flushData();
    Thread.sleep(10);
    callIdleDetectorToNotify();
    assertEquals(0, tracker.getData().size());
  }

  @Test
  public void testIdleDetector_whenTrackerIsEnabled() throws Exception {
    long preStart = System.currentTimeMillis();
    tracker.setEnabled(true);
    long postStart = System.currentTimeMillis();

    assertEquals(0, tracker.getData().size());
    Thread.sleep(20);

    long preEnd = System.currentTimeMillis();
    callIdleDetectorToNotify();
    long postEnd = System.currentTimeMillis();

    Collection<SessionEvent> data = tracker.getData();
    assertEquals(1, data.size());
    SessionEvent event = data.iterator().next();
    long start = event.getInterval().getStartMillis();
    long end = event.getInterval().getEndMillis();
    checkTime(preStart, start, postStart, preEnd, end, postEnd);
  }

  @Test
  public void testObserverIsAdded() {
    tracker.setEnabled(false); // It should remove itself from the observable
    int count = TrackingPlugin.getDefault().getIdleDetector().countObservers();
    tracker.setEnabled(true); // It should add itself to the observable
    assertEquals(count + 1,
        TrackingPlugin.getDefault().getIdleDetector().countObservers());
  }

  protected void callIdleDetectorToNotify() throws Exception {
    Field isActive = IdleDetector.class.getDeclaredField("isActive");
    isActive.setAccessible(true);

    Method setChanged = Observable.class.getDeclaredMethod("setChanged");
    setChanged.setAccessible(true);

    Method notifyObservers = Observable.class.getDeclaredMethod("notifyObservers");
    notifyObservers.setAccessible(true);

    IdleDetector detector = TrackingPlugin.getDefault().getIdleDetector();
    detector.setRunning(true);
    isActive.set(detector, false);
    setChanged.invoke(detector);
    notifyObservers.invoke(detector);
    detector.setRunning(false);
  }

  @Override
  protected SessionEvent createEvent() {
    return new SessionEvent(new Interval(10, 2000));
  }

  @Override
  protected AbstractTracker<SessionEvent> createTracker() {
    return new SessionTracker();
  }

  private Shell minimizeActiveShell() {
    Shell shell = PlatformUI.getWorkbench().getDisplay().getActiveShell();
    shell.setMinimized(true);
    return shell;
  }
}
TOP

Related Classes of rabbit.tracking.internal.trackers.SessionTrackerTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.