1 package com.atlassian.plugin.manager;
2
3 import com.atlassian.plugin.Plugin;
4 import com.atlassian.plugin.PluginAccessor;
5 import com.atlassian.plugin.PluginController;
6 import com.atlassian.plugin.PluginException;
7 import com.atlassian.plugin.PluginState;
8 import com.atlassian.plugin.exception.PluginExceptionInterception;
9 import org.junit.Before;
10 import org.junit.Rule;
11 import org.junit.Test;
12 import org.junit.contrib.java.lang.system.RestoreSystemProperties;
13 import org.junit.runner.RunWith;
14 import org.mockito.Mock;
15 import org.mockito.runners.MockitoJUnitRunner;
16
17 import java.util.Arrays;
18
19 import static com.atlassian.plugin.util.PluginUtils.ATLASSIAN_PLUGINS_ENABLE_WAIT;
20 import static org.hamcrest.MatcherAssert.assertThat;
21 import static org.hamcrest.Matchers.is;
22 import static org.hamcrest.Matchers.lessThan;
23 import static org.mockito.Mockito.mock;
24 import static org.mockito.Mockito.verify;
25
26 @RunWith(MockitoJUnitRunner.class)
27 public class TestPluginEnabler {
28 @Rule
29 public RestoreSystemProperties restoreSystemProperties =
30 new RestoreSystemProperties(ATLASSIAN_PLUGINS_ENABLE_WAIT);
31
32 @Mock
33 private PluginAccessor pluginAccessor;
34 @Mock
35 private PluginController pluginController;
36 @Mock
37 private PluginExceptionInterception pluginExceptionInterception;
38
39 private PluginEnabler pluginEnabler;
40
41 @Before
42 public void setUp() {
43 pluginEnabler = new PluginEnabler(pluginAccessor, pluginController, pluginExceptionInterception);
44 }
45
46 @Test
47 public void enablePlugin() {
48 final Plugin plugin = new PluginWithDeps("foo");
49
50 pluginEnabler.enable(Arrays.asList(plugin));
51 assertThat(plugin.getPluginState(), is(PluginState.ENABLED));
52 }
53
54 @Test
55 public void enableResolvesPlugins() {
56 final Plugin plugin = mock(Plugin.class);
57 pluginEnabler.enable(Arrays.asList(plugin));
58 verify(plugin).resolve();
59 verify(plugin).enable();
60 }
61
62 @Test
63 public void customTimeoutTimesOut() {
64 final Plugin plugin = new PluginWithDeps("foo") {
65 @Override
66 protected PluginState enableInternal() throws PluginException {
67 return PluginState.ENABLING;
68 }
69 };
70
71 System.setProperty(ATLASSIAN_PLUGINS_ENABLE_WAIT, "1");
72 final long start = System.currentTimeMillis();
73 pluginEnabler = new PluginEnabler(mock(PluginAccessor.class), mock(PluginController.class), pluginExceptionInterception);
74 pluginEnabler.enable(Arrays.asList(plugin));
75 final long end = System.currentTimeMillis();
76 assertThat(end - start, lessThan(5000L));
77 assertThat(plugin.getPluginState(), is(PluginState.ENABLING));
78 }
79
80 @Test
81 public void enableMultiplePluginsWithDependencies() {
82 final Plugin plugin = new PluginWithDeps("foo", "foo2");
83 final Plugin plugin2 = new PluginWithDeps("foo2", "foo3");
84 final Plugin plugin3 = new PluginWithDeps("foo3");
85
86 pluginEnabler.enable(Arrays.asList(plugin, plugin2, plugin3));
87 assertThat(plugin.getPluginState(), is(PluginState.ENABLED));
88 assertThat(plugin2.getPluginState(), is(PluginState.ENABLED));
89 assertThat(plugin3.getPluginState(), is(PluginState.ENABLED));
90 }
91
92 @Test
93 public void canEnableCircularlyDependentPlugins() {
94 final Plugin plugin = new PluginWithDeps("foo", "foo2");
95 final Plugin plugin2 = new PluginWithDeps("foo2", "foo3");
96 final Plugin plugin3 = new PluginWithDeps("foo3", "foo");
97
98 pluginEnabler.enable(Arrays.asList(plugin, plugin2, plugin3));
99 assertThat(plugin.getPluginState(), is(PluginState.ENABLED));
100 assertThat(plugin2.getPluginState(), is(PluginState.ENABLED));
101 assertThat(plugin3.getPluginState(), is(PluginState.ENABLED));
102 }
103
104 @Test
105 public void failedEnableIsPassedToPluginInterception() {
106 final RuntimeException runtimeException = new RuntimeException();
107 final Plugin plugin = new PluginWithDeps("foo") {
108 @Override
109 protected PluginState enableInternal() throws PluginException {
110 throw runtimeException;
111 }
112 };
113
114 pluginEnabler.enable(Arrays.asList(plugin));
115 verify(pluginExceptionInterception).onEnableException(plugin, runtimeException);
116 }
117 }