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
8 import junit.framework.TestCase;
9
10 public class TestDefaultPluginMetadataManager extends TestCase
11 {
12 public void testIsUserInstalledPlugin()
13 {
14 final Plugin plugin = new MockPlugin("my.plugin");
15 assertTrue(new DefaultPluginMetadataManager(new EmptyPluginMetadata()).isUserInstalled(plugin));
16 }
17
18 public void testIsNotUserInstalledPluginIfApplicationSupplied()
19 {
20 final Plugin plugin = new MockPlugin("my.plugin");
21 assertFalse(new DefaultPluginMetadataManager(new ApplicationPluginMetadata()).isUserInstalled(plugin));
22 }
23
24 public void testPluginIsNotUserInstalledBecauseItIsBundled()
25 {
26 final Plugin plugin = new MockBundledPlugin("my.plugin");
27 assertFalse(new DefaultPluginMetadataManager(new EmptyPluginMetadata()).isUserInstalled(plugin));
28 }
29
30 public void testPluginIsRequired()
31 {
32 final Plugin plugin = new MockPlugin("my.plugin");
33 assertFalse(new DefaultPluginMetadataManager(new RequiredPluginMetadata()).isOptional(plugin));
34 }
35
36 public void testPluginIsOptional()
37 {
38 final Plugin plugin = new MockPlugin("my.plugin");
39 assertTrue(new DefaultPluginMetadataManager(new EmptyPluginMetadata()).isOptional(plugin));
40 }
41
42 public void testPluginWithModulesIsOptional()
43 {
44 final Plugin plugin = new MockPlugin("my.plugin");
45 final ModuleDescriptor<?> moduleDescriptor = new MockModuleDescriptor<Object>(plugin, "my.plugin.c-mod3", null);
46 plugin.addModuleDescriptor(moduleDescriptor);
47 assertTrue(new DefaultPluginMetadataManager(new EmptyPluginMetadata()).isOptional(plugin));
48 }
49
50 public void testPluginIsRequiredBecauseOfRequiredModule()
51 {
52 final Plugin plugin = new MockPlugin("my.plugin");
53 final ModuleDescriptor<?> moduleDescriptor = new MockModuleDescriptor<Object>(plugin, "my.plugin.c-mod3", null);
54 plugin.addModuleDescriptor(moduleDescriptor);
55 assertFalse(new DefaultPluginMetadataManager(new ModuleRequiredPluginMetadata()).isOptional(plugin));
56 }
57
58 public void testModuleIsRequired()
59 {
60 final ModuleDescriptor<?> moduleDescriptor = new MockModuleDescriptor<Object>(null, "my.plugin.c-mod3", null);
61 assertFalse(new DefaultPluginMetadataManager(new ModuleRequiredPluginMetadata()).isOptional(moduleDescriptor));
62 }
63
64 public void testModuleIsRequiredBecauseParentPluginIsRequired()
65 {
66 final Plugin plugin = new MockPlugin("my.plugin");
67 final ModuleDescriptor<?> moduleDescriptor = new MockModuleDescriptor<Object>(plugin, "my.plugin.c-mod3", null);
68 plugin.addModuleDescriptor(moduleDescriptor);
69 assertFalse(new DefaultPluginMetadataManager(new RequiredPluginMetadata()).isOptional(moduleDescriptor));
70 }
71
72 public void testModuleIsNotMadeRequiredBecauseSiblingModuleIsRequired()
73 {
74 final Plugin plugin = new MockPlugin("my.plugin");
75 final MockModuleDescriptor<Object> required = new MockModuleDescriptor<Object>(plugin, "required", null);
76 plugin.addModuleDescriptor(required);
77 final ModuleDescriptor<?> moduleDescriptor = new MockModuleDescriptor<Object>(plugin, "not-required", null);
78 plugin.addModuleDescriptor(moduleDescriptor);
79 assertTrue(new DefaultPluginMetadataManager(new EmptyPluginMetadata()
80 {
81 @Override
82 public boolean required(final ModuleDescriptor<?> descriptor)
83 {
84 return descriptor == required;
85 }
86 }).isOptional(moduleDescriptor));
87 }
88
89 public void testModuleIsRequiredTypeMarkedByAnnotation()
90 {
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 public void testModuleIsOptional()
99 {
100 final Plugin plugin = new MockPlugin("my.plugin");
101 final ModuleDescriptor<?> moduleDescriptor = new MockModuleDescriptor<Object>(plugin, "my.plugin.c-mod3", null);
102 plugin.addModuleDescriptor(moduleDescriptor);
103 assertTrue(new DefaultPluginMetadataManager(new EmptyPluginMetadata()).isOptional(moduleDescriptor));
104 }
105
106 public void testIsOptionalPluginNullPlugin()
107 {
108 try
109 {
110 new DefaultPluginMetadataManager(new EmptyPluginMetadata()).isOptional((Plugin) null);
111 fail("Expected NPE");
112 }
113 catch (final NullPointerException expected)
114 {}
115 }
116
117 public void testIsOptionalModuleNullModule()
118 {
119 try
120 {
121 new DefaultPluginMetadataManager(new EmptyPluginMetadata()).isOptional((ModuleDescriptor<?>) null);
122 fail("Expected NPE");
123 }
124 catch (final NullPointerException expected)
125 {}
126 }
127
128 public void testIsUserInstalledPluginNullPlugin()
129 {
130 try
131 {
132 new DefaultPluginMetadataManager(new EmptyPluginMetadata()).isUserInstalled(null);
133 fail("Expected NPE");
134 }
135 catch (final NullPointerException expected)
136 {}
137 }
138
139 class MockPlugin extends com.atlassian.plugin.MockPlugin
140 {
141 MockPlugin(final String key)
142 {
143 super(key, TestDefaultPluginMetadataManager.this.getClass().getClassLoader());
144 }
145 }
146
147 class MockBundledPlugin extends MockPlugin
148 {
149 public MockBundledPlugin(final String key)
150 {
151 super(key);
152 }
153
154 @Override
155 public boolean isBundledPlugin()
156 {
157 return true;
158 }
159 }
160
161 @CannotDisable
162 class CannotDisableModuleDescriptorType extends MockModuleDescriptor<Object> implements ModuleDescriptor<Object>
163 {
164 CannotDisableModuleDescriptorType(final Plugin plugin, final String completeKey)
165 {
166 super(plugin, completeKey, null);
167 }
168 }
169
170 class EmptyPluginMetadata implements PluginMetadata
171 {
172 public boolean applicationProvided(final Plugin plugin)
173 {
174 return false;
175 }
176
177 public boolean required(final Plugin plugin)
178 {
179 return false;
180 }
181
182 public boolean required(final ModuleDescriptor<?> descriptor)
183 {
184 return false;
185 }
186 }
187
188 class ApplicationPluginMetadata extends EmptyPluginMetadata
189 {
190 @Override
191 public boolean applicationProvided(final Plugin plugin)
192 {
193 return true;
194 }
195 }
196
197 class RequiredPluginMetadata extends EmptyPluginMetadata
198 {
199 @Override
200 public boolean required(final Plugin plugin)
201 {
202 return true;
203 }
204 }
205
206 class ModuleRequiredPluginMetadata extends EmptyPluginMetadata
207 {
208 @Override
209 public boolean required(final ModuleDescriptor<?> descriptor)
210 {
211 return true;
212 }
213 }
214 }