View Javadoc
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          // Looked a bit, do not think mockito can create a mock such that it has a class-level annotation
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 }