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.junit.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 final RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties();
30
31 @Mock
32 private PluginAccessor pluginAccessor;
33 @Mock
34 private PluginController pluginController;
35 @Mock
36 private PluginExceptionInterception pluginExceptionInterception;
37
38 private PluginEnabler pluginEnabler;
39
40 @Before
41 public void setUp() {
42 pluginEnabler = new PluginEnabler(pluginAccessor, pluginController, pluginExceptionInterception);
43 }
44
45 @Test
46 public void enablePlugin() {
47 final Plugin plugin = new PluginWithDeps("foo");
48
49 pluginEnabler.enable(Arrays.asList(plugin));
50 assertThat(plugin.getPluginState(), is(PluginState.ENABLED));
51 }
52
53 @Test
54 public void enableResolvesPlugins() {
55 final Plugin plugin = mock(Plugin.class);
56 pluginEnabler.enable(Arrays.asList(plugin));
57 verify(plugin).resolve();
58 verify(plugin).enable();
59 }
60
61 @Test
62 public void customTimeoutTimesOut() {
63 final Plugin plugin = new PluginWithDeps("foo") {
64 @Override
65 protected PluginState enableInternal() throws PluginException {
66 return PluginState.ENABLING;
67 }
68 };
69
70 System.setProperty(ATLASSIAN_PLUGINS_ENABLE_WAIT, "1");
71 final long start = System.currentTimeMillis();
72 pluginEnabler = new PluginEnabler(mock(PluginAccessor.class), mock(PluginController.class), pluginExceptionInterception);
73 pluginEnabler.enable(Arrays.asList(plugin));
74 final long end = System.currentTimeMillis();
75 assertThat(end - start, lessThan(5000L));
76 assertThat(plugin.getPluginState(), is(PluginState.ENABLING));
77 }
78
79 @Test
80 public void enableMultiplePluginsWithDependencies() {
81 final Plugin plugin = new PluginWithDeps("foo", "foo2");
82 final Plugin plugin2 = new PluginWithDeps("foo2", "foo3");
83 final Plugin plugin3 = new PluginWithDeps("foo3");
84
85 pluginEnabler.enable(Arrays.asList(plugin, plugin2, plugin3));
86 assertThat(plugin.getPluginState(), is(PluginState.ENABLED));
87 assertThat(plugin2.getPluginState(), is(PluginState.ENABLED));
88 assertThat(plugin3.getPluginState(), is(PluginState.ENABLED));
89 }
90
91 @Test
92 public void canEnableCircularlyDependentPlugins() {
93 final Plugin plugin = new PluginWithDeps("foo", "foo2");
94 final Plugin plugin2 = new PluginWithDeps("foo2", "foo3");
95 final Plugin plugin3 = new PluginWithDeps("foo3", "foo");
96
97 pluginEnabler.enable(Arrays.asList(plugin, plugin2, plugin3));
98 assertThat(plugin.getPluginState(), is(PluginState.ENABLED));
99 assertThat(plugin2.getPluginState(), is(PluginState.ENABLED));
100 assertThat(plugin3.getPluginState(), is(PluginState.ENABLED));
101 }
102
103 @Test
104 public void failedEnableIsPassedToPluginInterception() {
105 final RuntimeException runtimeException = new RuntimeException();
106 final Plugin plugin = new PluginWithDeps("foo") {
107 @Override
108 protected PluginState enableInternal() throws PluginException {
109 throw runtimeException;
110 }
111 };
112
113 pluginEnabler.enable(Arrays.asList(plugin));
114 verify(pluginExceptionInterception).onEnableException(plugin, runtimeException);
115 }
116 }