package org.easyrec.plugin.support; import org.easyrec.plugin.Executable; import org.easyrec.plugin.Plugin; import org.easyrec.plugin.exception.PluginException; import org.easyrec.plugin.support.testplugin.ExampleGenerator; import org.easyrec.plugin.support.testplugin.ForeverExecutingExampleGenerator; import org.easyrec.plugin.util.Observer; import org.junit.Test; import static org.junit.Assert.*; public class PluginSupportTests { @Test public void testNormalCase() throws Exception { ExampleGenerator generator = new ExampleGenerator(); assertEquals(Plugin.LifecyclePhase.NOT_INSTALLED, generator.getLifecyclePhase()); generator.install(true); assertEquals(Plugin.LifecyclePhase.INSTALLED, generator.getLifecyclePhase()); generator.initialize(); assertEquals(Plugin.LifecyclePhase.INITIALIZED, generator.getLifecyclePhase()); generator.execute(); assertEquals(Executable.ExecutionState.STOPPED, generator.getExecutionState()); generator.cleanup(); assertEquals(Plugin.LifecyclePhase.INSTALLED, generator.getLifecyclePhase()); generator.uninstall(); assertEquals(Plugin.LifecyclePhase.NOT_INSTALLED, generator.getLifecyclePhase()); } @Test public void testExceptionInInit() throws Exception { ExampleGenerator generator = new ExampleGenerator(); generator.install(true); assertEquals(Plugin.LifecyclePhase.INSTALLED, generator.getLifecyclePhase()); generator.setThrowException(true); try { generator.initialize(); fail("should have thrown PluginException"); } catch (PluginException e) { } assertEquals(Plugin.LifecyclePhase.INIT_FAILED, generator.getLifecyclePhase()); } @Test public void testExceptionInExec() throws Exception { ExampleGenerator generator = new ExampleGenerator(); generator.install(true); assertEquals(Plugin.LifecyclePhase.INSTALLED, generator.getLifecyclePhase()); generator.initialize(); assertEquals(Plugin.LifecyclePhase.INITIALIZED, generator.getLifecyclePhase()); generator.setThrowException(true); try { generator.execute(); fail("should have thrown PluginException"); } catch (PluginException e) { } assertEquals(Executable.ExecutionState.STOPPED, generator.getExecutionState()); } @Test public void testExceptionInCleanup() throws Exception { ExampleGenerator generator = new ExampleGenerator(); generator.install(true); assertEquals(Plugin.LifecyclePhase.INSTALLED, generator.getLifecyclePhase()); generator.initialize(); assertEquals(Plugin.LifecyclePhase.INITIALIZED, generator.getLifecyclePhase()); generator.execute(); assertEquals(Executable.ExecutionState.STOPPED, generator.getExecutionState()); generator.setThrowException(true); try { generator.cleanup(); fail("should have thrown PluginException"); } catch (PluginException e) { } assertEquals(Plugin.LifecyclePhase.CLEANUP_FAILED, generator.getLifecyclePhase()); } @Test public void testAbort() throws Exception { final Object lock = new Object(); final ExampleGenerator generator = new ForeverExecutingExampleGenerator(lock); generator.install(true); assertEquals(Plugin.LifecyclePhase.INSTALLED, generator.getLifecyclePhase()); generator.initialize(); assertEquals(Plugin.LifecyclePhase.INITIALIZED, generator.getLifecyclePhase()); new Thread(new Runnable() { public void run() { try { generator.execute(); } catch (Exception e) { e.printStackTrace(); } } }).start(); synchronized (lock) { lock.wait(); } generator.abort(); assertEquals(Executable.ExecutionState.ABORT_REQUESTED, generator.getExecutionState()); } @Test public void testPluginObserver() throws Exception { final boolean[] observerCalled = new boolean[1]; Observer<Plugin> pluginObserver = new Observer<Plugin>() { public void stateChanged(Plugin target) { observerCalled[0] = true; } }; ExampleGenerator generator = new ExampleGenerator(); generator.install(true); generator.getPluginObserverRegistry().addObserver(pluginObserver); observerCalled[0] = false; generator.initialize(); assertTrue(observerCalled[0]); observerCalled[0] = false; generator.execute(); assertFalse(observerCalled[0]); // execute does not trigger plugin // observers! observerCalled[0] = false; generator.cleanup(); assertTrue(observerCalled[0]); observerCalled[0] = false; } @Test public void testExecutableObserver() throws Exception { final int[] observerCalled = new int[1]; Observer<Executable> executableObserver = new Observer<Executable>() { public void stateChanged(Executable target) { observerCalled[0]++; } }; ExampleGenerator generator = new ExampleGenerator(); generator.install(true); generator.getExecutableObserverRegistry().addObserver(executableObserver); observerCalled[0] = 0; generator.initialize(); assertEquals(0, observerCalled[0]); generator.execute(); // we were called 5 times: 3 from the doExecute method, and 2 times for // the // execution state changes assertEquals(5, observerCalled[0]); generator.cleanup(); assertEquals(5, observerCalled[0]); } }