View Javadoc

1   package com.atlassian.plugin.loaders;
2   
3   import java.io.File;
4   import java.io.IOException;
5   import java.net.URI;
6   import java.util.List;
7   
8   import com.atlassian.plugin.JarPluginArtifact;
9   import com.atlassian.plugin.ModuleDescriptorFactory;
10  import com.atlassian.plugin.Plugin;
11  import com.atlassian.plugin.PluginArtifact;
12  import com.atlassian.plugin.PluginArtifactFactory;
13  import com.atlassian.plugin.event.PluginEventManager;
14  import com.atlassian.plugin.factories.PluginFactory;
15  
16  import com.google.common.collect.ImmutableList;
17  
18  import org.junit.After;
19  import org.junit.Before;
20  import org.junit.Rule;
21  import org.junit.Test;
22  import org.junit.contrib.java.lang.system.RestoreSystemProperties;
23  import org.junit.runner.RunWith;
24  import org.mockito.ArgumentCaptor;
25  import org.mockito.Captor;
26  import org.mockito.Mock;
27  import org.mockito.runners.MockitoJUnitRunner;
28  
29  import static com.atlassian.plugin.loaders.RosterFilePluginLoader.getReferenceModePropertyName;
30  import static com.atlassian.plugin.loaders.TestRosterFileScanner.backdateFile;
31  import static com.atlassian.plugin.loaders.TestRosterFileScanner.writeRosterFile;
32  import static com.atlassian.plugin.test.Matchers.uriWithPath;
33  import static com.atlassian.plugin.test.PluginTestUtils.createTempDirectory;
34  import static com.google.common.collect.Iterables.getOnlyElement;
35  import static org.apache.commons.io.FileUtils.deleteQuietly;
36  import static org.hamcrest.MatcherAssert.assertThat;
37  import static org.hamcrest.Matchers.contains;
38  import static org.hamcrest.Matchers.instanceOf;
39  import static org.hamcrest.Matchers.is;
40  import static org.mockito.Matchers.any;
41  import static org.mockito.Matchers.argThat;
42  import static org.mockito.Matchers.same;
43  import static org.mockito.Mockito.mock;
44  import static org.mockito.Mockito.verify;
45  import static org.mockito.Mockito.when;
46  
47  @RunWith (MockitoJUnitRunner.class)
48  public class TestRosterFilePluginLoader
49  {
50      @Rule
51      public RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties(getReferenceModePropertyName());
52  
53      @Mock private PluginFactory pluginFactory;
54      @Mock private PluginArtifactFactory pluginArtifactFactory;
55      @Mock private PluginEventManager pluginEventManager;
56      @Mock private ModuleDescriptorFactory moduleDescriptorFactory;
57  
58      @Captor private ArgumentCaptor<PluginArtifact> pluginArtifactCaptor;
59  
60      private File temporaryDirectory;
61      private File rosterFile;
62      private List<PluginFactory> pluginFactories;
63  
64      RosterFilePluginLoader rosterFilePluginLoader;
65  
66      @Before
67      public void setUp() throws Exception
68      {
69          temporaryDirectory = createTempDirectory(TestRosterFilePluginLoader.class);
70          rosterFile = new File(temporaryDirectory, "rosterFile.list");
71          pluginFactories = ImmutableList.of(pluginFactory);
72          rosterFilePluginLoader = new RosterFilePluginLoader(rosterFile, pluginFactories, pluginArtifactFactory, pluginEventManager);
73      }
74  
75      @After
76      public void tearDown() throws Exception
77      {
78          deleteQuietly(temporaryDirectory);
79      }
80  
81      @Test
82      public void rosterFileUsedToLoadAllPlugins() throws Exception
83      {
84          final String pluginKey = "someKey";
85          final String jarName = "somePlugin.jar";
86          final File jarFile = getOnlyElement(writeRosterFile(rosterFile, jarName));
87          final PluginArtifact pluginArtifact = mock(PluginArtifact.class);
88          final Plugin plugin = mock(Plugin.class);
89  
90          final ArgumentCaptor<URI> uriCaptor = ArgumentCaptor.forClass(URI.class);
91          when(pluginArtifactFactory.create(uriCaptor.capture())).thenReturn(pluginArtifact);
92          configurePluginFactory(pluginKey, plugin, pluginArtifact);
93  
94          final Iterable<Plugin> plugins = rosterFilePluginLoader.loadAllPlugins(moduleDescriptorFactory);
95  
96          assertThat(plugins, contains(plugin));
97          final URI uri = uriCaptor.getValue();
98          assertThat(uri, uriWithPath(jarFile.getPath()));
99          verify(pluginFactory).canCreate(pluginArtifact);
100     }
101 
102     @Test
103     public void removePluginResultsInPluginUninstall() throws Exception
104     {
105         final String pluginKey = "someKey";
106         final String oldJarName = "oldPlugin.jar";
107         final File oldJarFile = getOnlyElement(writeRosterFile(rosterFile, oldJarName));
108         // Since we need to scan again, backdate the file to ensure it appears new when rewritten
109         backdateFile(rosterFile);
110         final PluginArtifact oldPluginArtifact = mock(PluginArtifact.class);
111         final Plugin oldPlugin = mock(Plugin.class);
112         when(oldPlugin.isUninstallable()).thenReturn(true);
113 
114         when(pluginArtifactFactory.create(argThat(uriWithPath(oldJarFile.getPath())))).thenReturn(oldPluginArtifact);
115         configurePluginFactory(pluginKey, oldPlugin, oldPluginArtifact);
116 
117         rosterFilePluginLoader.loadAllPlugins(moduleDescriptorFactory);
118 
119         final String newJarName = "newPlugin.jar";
120         writeRosterFile(rosterFile, newJarName);
121 
122         // The plugin system calls PluginLoader#removePlugin when upgrading plugins, so it has to work in this scenario
123         rosterFilePluginLoader.loadFoundPlugins(moduleDescriptorFactory);
124         rosterFilePluginLoader.removePlugin(oldPlugin);
125 
126         verify(oldPlugin).uninstall();
127     }
128 
129     @Test
130     public void defaultRosterFilePluginLoaderForbidsReference() throws Exception
131     {
132         final JarPluginArtifact jarPluginArtifact = obtainPluginArtifactFromRosterFilesDefaultFactory();
133 
134         assertThat(jarPluginArtifact.allowsReference(), is(false));
135     }
136 
137     @Test
138     public void propertyCanSetRosterFilePluginLoaderToAllowReference() throws Exception
139     {
140         System.setProperty(getReferenceModePropertyName(), "PERMIT_REFERENCE");
141         final JarPluginArtifact jarPluginArtifact = obtainPluginArtifactFromRosterFilesDefaultFactory();
142 
143         assertThat(jarPluginArtifact.allowsReference(), is(true));
144     }
145 
146 
147     private JarPluginArtifact obtainPluginArtifactFromRosterFilesDefaultFactory() throws IOException
148     {
149         final String pluginKey = "someKey";
150         final String jarName = "oldPlugin.jar";
151         final Plugin plugin = mock(Plugin.class);
152 
153         writeRosterFile(rosterFile, jarName);
154         when(pluginFactory.canCreate(any(PluginArtifact.class))).thenReturn(pluginKey);
155         when(pluginFactory.create(pluginArtifactCaptor.capture(), same(moduleDescriptorFactory))).thenReturn(plugin);
156 
157         rosterFilePluginLoader = new RosterFilePluginLoader(rosterFile, pluginFactories, pluginEventManager);
158         rosterFilePluginLoader.loadAllPlugins(moduleDescriptorFactory);
159 
160         final PluginArtifact pluginArtifact = pluginArtifactCaptor.getValue();
161         assertThat(pluginArtifact, instanceOf(JarPluginArtifact.class));
162         return  (JarPluginArtifact) pluginArtifact;
163     }
164 
165     private void configurePluginFactory(final String pluginKey, final Plugin plugin, final PluginArtifact pluginArtifact)
166     {
167         when(pluginFactory.canCreate(pluginArtifact)).thenReturn(pluginKey);
168         when(pluginFactory.create(pluginArtifact, moduleDescriptorFactory)).thenReturn(plugin);
169     }
170 }