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