1 package com.atlassian.plugin.metadata;
2
3 import com.atlassian.plugin.MockModuleDescriptor;
4 import com.atlassian.plugin.ModuleDescriptor;
5 import com.atlassian.plugin.Plugin;
6 import com.atlassian.plugin.descriptors.CannotDisable;
7 import org.junit.Test;
8
9 import static org.junit.Assert.assertFalse;
10 import static org.junit.Assert.assertTrue;
11
12 public class TestDefaultPluginMetadataManager {
13
14 @Test
15 public void testIsUserInstalledPlugin() {
16 final Plugin plugin = new MockPlugin("my.plugin");
17 assertTrue(new DefaultPluginMetadataManager(new EmptyPluginMetadata()).isUserInstalled(plugin));
18 }
19
20 @Test
21 public void testIsNotUserInstalledPluginIfApplicationSupplied() {
22 final Plugin plugin = new MockPlugin("my.plugin");
23 assertFalse(new DefaultPluginMetadataManager(new ApplicationPluginMetadata()).isUserInstalled(plugin));
24 }
25
26 @Test
27 public void testPluginIsNotUserInstalledBecauseItIsBundled() {
28 final Plugin plugin = new MockBundledPlugin("my.plugin");
29 assertFalse(new DefaultPluginMetadataManager(new EmptyPluginMetadata()).isUserInstalled(plugin));
30 }
31
32 @Test
33 public void testPluginIsRequired() {
34 final Plugin plugin = new MockPlugin("my.plugin");
35 assertFalse(new DefaultPluginMetadataManager(new RequiredPluginMetadata()).isOptional(plugin));
36 }
37
38 @Test
39 public void testPluginIsOptional() {
40 final Plugin plugin = new MockPlugin("my.plugin");
41 assertTrue(new DefaultPluginMetadataManager(new EmptyPluginMetadata()).isOptional(plugin));
42 }
43
44 @Test
45 public void testPluginWithModulesIsOptional() {
46 final Plugin plugin = new MockPlugin("my.plugin");
47 final ModuleDescriptor<?> moduleDescriptor = new MockModuleDescriptor<>(plugin, "my.plugin.c-mod3", null);
48 plugin.addModuleDescriptor(moduleDescriptor);
49 assertTrue(new DefaultPluginMetadataManager(new EmptyPluginMetadata()).isOptional(plugin));
50 }
51
52 @Test
53 public void testPluginIsRequiredBecauseOfRequiredModule() {
54 final Plugin plugin = new MockPlugin("my.plugin");
55 final ModuleDescriptor<?> moduleDescriptor = new MockModuleDescriptor<>(plugin, "my.plugin.c-mod3", null);
56 plugin.addModuleDescriptor(moduleDescriptor);
57 assertFalse(new DefaultPluginMetadataManager(new ModuleRequiredPluginMetadata()).isOptional(plugin));
58 }
59
60 @Test
61 public void testModuleIsRequired() {
62 final ModuleDescriptor<?> moduleDescriptor = new MockModuleDescriptor<>(null, "my.plugin.c-mod3", null);
63 assertFalse(new DefaultPluginMetadataManager(new ModuleRequiredPluginMetadata()).isOptional(moduleDescriptor));
64 }
65
66 @Test
67 public void testModuleIsRequiredBecauseParentPluginIsRequired() {
68 final Plugin plugin = new MockPlugin("my.plugin");
69 final ModuleDescriptor<?> moduleDescriptor = new MockModuleDescriptor<>(plugin, "my.plugin.c-mod3", null);
70 plugin.addModuleDescriptor(moduleDescriptor);
71 assertFalse(new DefaultPluginMetadataManager(new RequiredPluginMetadata()).isOptional(moduleDescriptor));
72 }
73
74 @Test
75 public void testModuleIsNotMadeRequiredBecauseSiblingModuleIsRequired() {
76 final Plugin plugin = new MockPlugin("my.plugin");
77 final MockModuleDescriptor<Object> required = new MockModuleDescriptor<>(plugin, "required", null);
78 plugin.addModuleDescriptor(required);
79 final ModuleDescriptor<?> moduleDescriptor = new MockModuleDescriptor<>(plugin, "not-required", null);
80 plugin.addModuleDescriptor(moduleDescriptor);
81 assertTrue(new DefaultPluginMetadataManager(new EmptyPluginMetadata() {
82 @Override
83 public boolean required(final ModuleDescriptor<?> descriptor) {
84 return descriptor == required;
85 }
86 }).isOptional(moduleDescriptor));
87 }
88
89 @Test
90 public void testModuleIsRequiredTypeMarkedByAnnotation() {
91 final Plugin plugin = new MockPlugin("my.plugin");
92
93 final ModuleDescriptor<?> moduleDescriptor = new CannotDisableModuleDescriptorType(plugin, "my.plugin.c-mod3");
94
95 assertFalse(new DefaultPluginMetadataManager(new EmptyPluginMetadata()).isOptional(moduleDescriptor));
96 }
97
98 @Test
99 public void testModuleIsOptional() {
100 final Plugin plugin = new MockPlugin("my.plugin");
101 final ModuleDescriptor<?> moduleDescriptor = new MockModuleDescriptor<>(plugin, "my.plugin.c-mod3", null);
102 plugin.addModuleDescriptor(moduleDescriptor);
103 assertTrue(new DefaultPluginMetadataManager(new EmptyPluginMetadata()).isOptional(moduleDescriptor));
104 }
105
106 @Test(expected = NullPointerException.class)
107 public void testIsOptionalPluginNullPlugin() {
108 new DefaultPluginMetadataManager(new EmptyPluginMetadata()).isOptional((Plugin) null);
109 }
110
111 @Test(expected = NullPointerException.class)
112 public void testIsOptionalModuleNullModule() {
113 new DefaultPluginMetadataManager(new EmptyPluginMetadata()).isOptional((ModuleDescriptor<?>) null);
114 }
115
116 @Test(expected = NullPointerException.class)
117 public void testIsUserInstalledPluginNullPlugin() {
118 new DefaultPluginMetadataManager(new EmptyPluginMetadata()).isUserInstalled(null);
119 }
120
121 class MockPlugin extends com.atlassian.plugin.MockPlugin {
122 MockPlugin(final String key) {
123 super(key, TestDefaultPluginMetadataManager.this.getClass().getClassLoader());
124 }
125 }
126
127 class MockBundledPlugin extends MockPlugin {
128 MockBundledPlugin(final String key) {
129 super(key);
130 }
131
132 @Override
133 public boolean isBundledPlugin() {
134 return true;
135 }
136 }
137
138 @CannotDisable
139 class CannotDisableModuleDescriptorType extends MockModuleDescriptor<Object> implements ModuleDescriptor<Object> {
140 CannotDisableModuleDescriptorType(final Plugin plugin, final String completeKey) {
141 super(plugin, completeKey, null);
142 }
143 }
144
145 class EmptyPluginMetadata implements PluginMetadata {
146 public boolean applicationProvided(final Plugin plugin) {
147 return false;
148 }
149
150 public boolean required(final Plugin plugin) {
151 return false;
152 }
153
154 public boolean required(final ModuleDescriptor<?> descriptor) {
155 return false;
156 }
157 }
158
159 class ApplicationPluginMetadata extends EmptyPluginMetadata {
160 @Override
161 public boolean applicationProvided(final Plugin plugin) {
162 return true;
163 }
164 }
165
166 class RequiredPluginMetadata extends EmptyPluginMetadata {
167 @Override
168 public boolean required(final Plugin plugin) {
169 return true;
170 }
171 }
172
173 class ModuleRequiredPluginMetadata extends EmptyPluginMetadata {
174 @Override
175 public boolean required(final ModuleDescriptor<?> descriptor) {
176 return true;
177 }
178 }
179 }