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
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
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 }