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.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 }