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