1 package com.atlassian.plugin.manager;
2
3 import com.atlassian.plugin.ModuleDescriptor;
4 import com.atlassian.plugin.PluginRestartState;
5 import com.atlassian.plugin.descriptors.AbstractModuleDescriptor;
6 import com.atlassian.plugin.impl.StaticPlugin;
7 import com.atlassian.plugin.module.ModuleFactory;
8 import org.junit.Test;
9
10 import java.util.Collections;
11 import java.util.Map;
12
13 import static org.hamcrest.MatcherAssert.assertThat;
14 import static org.hamcrest.Matchers.hasKey;
15 import static org.junit.Assert.assertEquals;
16 import static org.junit.Assert.assertFalse;
17 import static org.junit.Assert.assertNotEquals;
18 import static org.junit.Assert.assertTrue;
19
20 public class TestDefaultPluginPersistentState {
21 @Test
22 public void testSetEnabledPlugin() {
23 PluginPersistentState state = PluginPersistentState.builder().toState();
24 final StaticPlugin plugin = createMockPlugin("mock.plugin.key", true);
25 state = PluginPersistentState.Builder.create(state).setEnabled(plugin, true).toState();
26 assertTrue(state.isEnabled(plugin));
27 state = PluginPersistentState.Builder.create(state).setEnabled(plugin, false).toState();
28 assertFalse(state.isEnabled(plugin));
29 }
30
31 @Test
32 public void testSetEnabledModuleDescriptor() {
33 PluginPersistentState state = PluginPersistentState.builder().toState();
34 final ModuleDescriptor<?> module = createModule("mock.plugin.key", "module.key");
35 state = PluginPersistentState.Builder.create(state).setEnabled(module, true).toState();
36 assertTrue(state.isEnabled(module));
37 state = PluginPersistentState.Builder.create(state).setEnabled(module, false).toState();
38 assertFalse(state.isEnabled(module));
39 }
40
41 @Test
42 public void testGetPluginStateMap() {
43 final StaticPlugin plugin1 = createMockPlugin("mock.plugin.key", true);
44 final StaticPlugin plugin2 = createMockPlugin("two.mock.plugin.key", true);
45 final ModuleDescriptor<?> module1 = createModule("mock.plugin.key", "module.key.1");
46 final ModuleDescriptor<?> module2 = createModule("mock.plugin.key", "module.key.2");
47 final ModuleDescriptor<?> module3 = createModule("mock.plugin.key", "module.key.3");
48
49
50 final PluginPersistentState.Builder builder = PluginPersistentState.Builder.create();
51 builder.setEnabled(plugin1, !plugin1.isEnabledByDefault());
52 builder.setEnabled(plugin2, !plugin1.isEnabledByDefault());
53 builder.setEnabled(module1, !module1.isEnabledByDefault());
54 builder.setEnabled(module2, !module2.isEnabledByDefault());
55 builder.setEnabled(module3, !module3.isEnabledByDefault());
56
57 final PluginPersistentState state = builder.toState();
58 final Map<String, PluginEnabledState> pluginStateMap = state.getPluginEnabledStateMap(plugin1);
59 final PluginPersistentState pluginState = PluginPersistentState.builder()
60 .addPluginEnabledState(pluginStateMap)
61 .toState();
62
63 assertNotEquals(pluginState.isEnabled(plugin1), plugin1.isEnabledByDefault());
64 assertNotEquals(pluginState.isEnabled(module1), module1.isEnabledByDefault());
65 assertNotEquals(pluginState.isEnabled(module2), module2.isEnabledByDefault());
66 assertNotEquals(pluginState.isEnabled(module3), module3.isEnabledByDefault());
67
68 assertEquals(pluginState.isEnabled(plugin2), plugin2.isEnabledByDefault());
69 }
70
71 @Test
72 public void testDefaultModuleStateShouldBeStored() {
73 final String pluginKey = "mock.plugin.key";
74 StaticPlugin plugin = createMockPlugin(pluginKey, true);
75 final PluginPersistentState.Builder builder = PluginPersistentState.Builder.create();
76 builder.setEnabled(plugin, true);
77 Map<String, PluginEnabledState> pluginStateMap = builder.toState().getPluginEnabledStateMap(plugin);
78 assertThat(pluginStateMap, hasKey(pluginKey));
79
80 builder.setEnabled(plugin, false);
81 pluginStateMap = builder.toState().getPluginEnabledStateMap(plugin);
82 assertFalse(pluginStateMap.isEmpty());
83
84 builder.removeState(pluginKey);
85
86 plugin = createMockPlugin(pluginKey, false);
87 builder.setEnabled(plugin, false);
88 pluginStateMap = builder.toState().getPluginEnabledStateMap(plugin);
89 assertThat(pluginStateMap, hasKey(pluginKey));
90 builder.setEnabled(plugin, true);
91 pluginStateMap = builder.toState().getPluginEnabledStateMap(plugin);
92 assertFalse(pluginStateMap.isEmpty());
93 }
94
95 @Test
96 public void testPluginRestartState() {
97 PluginPersistentState state = PluginPersistentState.builder().toState();
98 assertEquals(PluginRestartState.NONE, state.getPluginRestartState("foo"));
99
100 state = PluginPersistentState.Builder.create(state).setPluginRestartState("foo", PluginRestartState.REMOVE).toState();
101 assertEquals(PluginRestartState.REMOVE, state.getPluginRestartState("foo"));
102
103 PluginPersistentState stateCopy = PluginPersistentState.builder(state).toState();
104 assertEquals(PluginRestartState.REMOVE, stateCopy.getPluginRestartState("foo"));
105 stateCopy = PluginPersistentState.Builder.create(state).clearPluginRestartState().toState();
106 assertEquals(PluginRestartState.NONE, stateCopy.getPluginRestartState("foo"));
107 assertEquals(PluginRestartState.REMOVE, state.getPluginRestartState("foo"));
108 }
109
110 @Test
111 public void testPluginRestartStateRemoveExisting() {
112 final PluginPersistentState.Builder builder = PluginPersistentState.Builder.create();
113 builder.setPluginRestartState("foo", PluginRestartState.UPGRADE);
114 assertEquals(PluginRestartState.UPGRADE, builder.toState().getPluginRestartState("foo"));
115 builder.setPluginRestartState("foo", PluginRestartState.REMOVE);
116 assertEquals(PluginRestartState.REMOVE, builder.toState().getPluginRestartState("foo"));
117 }
118
119 private <T> ModuleDescriptor<T> createModule(final String pluginKey, final String moduleKey) {
120 return new AbstractModuleDescriptor<T>(ModuleFactory.LEGACY_MODULE_FACTORY) {
121 @Override
122 public T getModule() {
123 return null;
124 }
125
126 @Override
127 public String getCompleteKey() {
128 return pluginKey + ':' + moduleKey;
129 }
130 };
131 }
132
133 private StaticPlugin createMockPlugin(final String pluginKey, final boolean enabledByDefault) {
134 final StaticPlugin plugin = new StaticPlugin();
135 plugin.setKey(pluginKey);
136 plugin.setEnabledByDefault(enabledByDefault);
137 return plugin;
138 }
139
140 }