/*
* 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;
import rabbit.tracking.ITracker;
import rabbit.tracking.internal.TrackingPlugin;
import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableSet;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.junit.Test;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Set;
/**
* Test for {@link TrackingPlugin}
*/
public class TrackingPluginTest {
private static TrackingPlugin plugin = TrackingPlugin.getDefault();
/**
* Gets the trackers from the private field.
*
* @param target The target to get the field from.
* @return The trackers.
*/
@SuppressWarnings("unchecked")
private static Collection<ITracker<?>> getTrackers(TrackingPlugin target)
throws Exception {
Field f = TrackingPlugin.class.getDeclaredField("trackers");
f.setAccessible(true);
return (Collection<ITracker<?>>) f.get(target);
}
@Test
@SuppressWarnings("unchecked")
public void testCreateTrackers() throws Exception {
Method createTrackers = TrackingPlugin.class
.getDeclaredMethod("createTrackers");
createTrackers.setAccessible(true);
Collection<ITracker<?>> trackers = (Collection<ITracker<?>>) createTrackers
.invoke(plugin);
assertNotNull(trackers);
// This may fail if one or more of the trackers (mainly our trackers)
// are failed
// to load:
IConfigurationElement[] elements = Platform.getExtensionRegistry()
.getConfigurationElementsFor(TrackingPlugin.TRACKER_EXTENSION_ID);
assertEquals(elements.length, trackers.size());
// if (elements.length != trackers.size()) {
// System.err.println("WARNING: numElements=" + elements.length +
// " numTrackers=" + trackers.size());
// }
}
@Test
public void testGetIdleDetector() {
assertNotNull(plugin.getIdleDetector());
}
@Test
public void testIdleDetectorState() {
assertTrue(plugin.getIdleDetector().getIdleInterval() == 60000);
assertTrue(plugin.getIdleDetector().getRunDelay() == 1000);
}
@Test
public void testPluginId() {
assertEquals(TrackingPlugin.PLUGIN_ID, plugin.getBundle().getSymbolicName());
}
@Test
public void testPreShutdown() throws Exception {
assertTrue(plugin.preShutdown(null, false));
for (ITracker<?> tracker : getTrackers(plugin)) {
assertFalse(tracker.isEnabled());
}
}
@Test
public void testSaveCurrentData() throws Exception {
ITracker<Object> tracker = TestUtil.newTracker();
tracker.getData().add(new Object());
tracker.getData().add(new Object());
assertFalse(tracker.getData().isEmpty());
TrackingPlugin rc = new TrackingPlugin();
rc.start(plugin.getBundle().getBundleContext());
Field field = TrackingPlugin.class.getDeclaredField("trackers");
field.setAccessible(true);
field.set(rc, ImmutableSet.<ITracker<?>> of(tracker));
rc.saveCurrentData();
assertTrue(tracker.getData().isEmpty());
rc.stop(rc.getBundle().getBundleContext());
}
@Test
public void testSetEnableTrackers() throws Exception {
Method m = TrackingPlugin.class.getDeclaredMethod("setEnableTrackers",
ImmutableCollection.class, boolean.class);
m.setAccessible(true);
Set<ITracker<Object>> trackers = ImmutableSet.of(
TestUtil.newTracker(),
TestUtil.newTracker(),
TestUtil.newTracker());
// Test all trackers are disable.
m.invoke(plugin, trackers, false);
for (ITracker<?> tracker : trackers) {
assertFalse(tracker.isEnabled());
}
// Test all trackers are enabled.
m.invoke(plugin, trackers, true);
for (ITracker<?> tracker : trackers) {
assertTrue(tracker.isEnabled());
}
// Test all trackers are disable, again.
m.invoke(plugin, trackers, false);
for (ITracker<?> tracker : trackers) {
assertFalse(tracker.isEnabled());
}
}
@Test
public void testStart() throws Exception {
TrackingPlugin rc = new TrackingPlugin();
rc.start(plugin.getBundle().getBundleContext());
// It's already started by now.
assertTrue(rc.getIdleDetector().isRunning());
// Errors or may have loaded the wrong extension point:
assertFalse(getTrackers(rc).isEmpty());
for (ITracker<?> t : getTrackers(rc)) {
assertTrue(t.toString(), t.isEnabled());
}
rc.stop(rc.getBundle().getBundleContext());
}
/**
* Place this test at end of all tests.
*/
@Test
public void testStop() throws Exception {
TrackingPlugin rc = new TrackingPlugin();
rc.start(plugin.getBundle().getBundleContext());
for (ITracker<?> o : getTrackers(rc)) {
assertTrue(o.isEnabled());
}
rc.stop(rc.getBundle().getBundleContext());
for (ITracker<?> o : getTrackers(rc)) {
assertFalse(o.isEnabled());
}
assertFalse(rc.getIdleDetector().isRunning());
}
@Test
public void testTrackerExtensionPointId() {
assertTrue(Platform.getExtensionRegistry().getConfigurationElementsFor(
TrackingPlugin.TRACKER_EXTENSION_ID).length > 0);
}
}