View Javadoc
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 }