1 package com.atlassian.plugin.manager;
2
3 import com.atlassian.plugin.MockPluginAccessor;
4 import com.atlassian.plugin.Plugin;
5 import com.atlassian.plugin.PluginAccessor;
6 import com.atlassian.plugin.PluginController;
7 import com.atlassian.plugin.PluginException;
8 import com.atlassian.plugin.PluginState;
9 import com.atlassian.plugin.exception.NoOpPluginExceptionInterception;
10 import com.atlassian.plugin.exception.PluginExceptionInterception;
11 import com.atlassian.plugin.util.PluginUtils;
12 import com.atlassian.plugin.impl.StaticPlugin;
13 import com.mockobjects.dynamic.Mock;
14 import junit.framework.TestCase;
15
16 import java.util.Arrays;
17 import java.util.HashSet;
18 import java.util.Set;
19
20 import static org.mockito.Mockito.mock;
21
22 public class TestPluginEnabler extends TestCase
23 {
24 private Mock mockAccessor;
25 private Mock mockController;
26 private PluginEnabler enabler;
27 private PluginExceptionInterception pluginExceptionInterception;
28
29 @Override
30 public void setUp()
31 {
32 mockAccessor = new Mock(PluginAccessor.class);
33 mockController = new Mock(PluginController.class);
34 pluginExceptionInterception = NoOpPluginExceptionInterception.NOOP_INTERCEPTION;
35 enabler = new PluginEnabler((PluginAccessor) mockAccessor.proxy(), (PluginController) mockController.proxy(), pluginExceptionInterception);
36 }
37
38 public void testEnable()
39 {
40 Plugin plugin = new MyPlugin("foo");
41
42 enabler.enable(Arrays.asList(plugin));
43 assertEquals(PluginState.ENABLED, plugin.getPluginState());
44 }
45
46 public void testEnableWithCustomTimeout()
47 {
48
49 Plugin plugin = new MyPlugin("foo") {
50 @Override
51 protected PluginState enableInternal() throws PluginException
52 {
53 return PluginState.ENABLING;
54 }
55 };
56
57 try
58 {
59 System.setProperty(PluginUtils.ATLASSIAN_PLUGINS_ENABLE_WAIT, "1");
60 long start = System.currentTimeMillis();
61 enabler = new PluginEnabler(mock(PluginAccessor.class), mock(PluginController.class), pluginExceptionInterception);
62 enabler.enable(Arrays.asList(plugin));
63 long end = System.currentTimeMillis();
64 assertTrue(end - start < 5000);
65 assertEquals(PluginState.ENABLING, plugin.getPluginState());
66 }
67 finally
68 {
69 System.clearProperty(PluginUtils.ATLASSIAN_PLUGINS_ENABLE_WAIT);
70 }
71 }
72
73 public void testRecursiveEnable()
74 {
75 Plugin plugin = new MyPlugin("foo", "foo2");
76 Plugin plugin2 = new MyPlugin("foo2", "foo3");
77 Plugin plugin3 = new MyPlugin("foo3");
78
79 enabler.enable(Arrays.asList(plugin, plugin2, plugin3));
80 assertEquals(PluginState.ENABLED, plugin.getPluginState());
81 assertEquals(PluginState.ENABLED, plugin2.getPluginState());
82 assertEquals(PluginState.ENABLED, plugin3.getPluginState());
83 }
84
85 public void testEnableAllRecursivelyEnablesDependencies()
86 {
87 Plugin plugin = new MyPlugin("foo", "foo2");
88 Plugin plugin2 = new MyPlugin("foo2", "foo3");
89 Plugin plugin3 = new MyPlugin("foo3");
90 MockPluginAccessor accessor = new MockPluginAccessor();
91 accessor.addPlugin(plugin);
92 accessor.addPlugin(plugin2);
93 accessor.addPlugin(plugin3);
94
95 enabler = new PluginEnabler(accessor, mock(PluginController.class), pluginExceptionInterception);
96
97
98 enabler.enableAllRecursively(Arrays.asList(plugin));
99 assertEquals(PluginState.ENABLED, plugin.getPluginState());
100 assertEquals(PluginState.ENABLED, plugin2.getPluginState());
101 assertEquals(PluginState.ENABLED, plugin3.getPluginState());
102 }
103
104 public void testRecursiveCircular()
105 {
106 Plugin plugin = new MyPlugin("foo", "foo2");
107 Plugin plugin2 = new MyPlugin("foo2", "foo3");
108 Plugin plugin3 = new MyPlugin("foo3", "foo");
109
110 enabler.enable(Arrays.asList(plugin, plugin2, plugin3));
111 assertEquals(PluginState.ENABLED, plugin.getPluginState());
112 assertEquals(PluginState.ENABLED, plugin2.getPluginState());
113 assertEquals(PluginState.ENABLED, plugin3.getPluginState());
114 }
115
116 public static class MyPlugin extends StaticPlugin
117 {
118 private final Set<String> deps;
119
120 public MyPlugin(String key, String... deps)
121 {
122 setKey(key);
123 this.deps = new HashSet<String>(Arrays.asList(deps));
124 setPluginState(PluginState.DISABLED);
125 }
126
127 @Override
128 public Set<String> getRequiredPlugins()
129 {
130 return deps;
131 }
132 }
133 }