View Javadoc

1   package com.atlassian.plugin.loaders.classloading;
2   
3   import com.atlassian.plugin.Plugin;
4   import com.atlassian.plugin.PluginArtifact;
5   import com.atlassian.plugin.PluginArtifactFactory;
6   import com.atlassian.plugin.event.PluginEventManager;
7   import com.atlassian.plugin.event.impl.DefaultPluginEventManager;
8   import com.atlassian.plugin.factories.PluginFactory;
9   import com.atlassian.plugin.impl.UnloadablePlugin;
10  import com.atlassian.plugin.loaders.ScanningPluginLoader;
11  import junit.framework.TestCase;
12  import static org.mockito.Matchers.anyObject;
13  import static org.mockito.Mockito.mock;
14  import static org.mockito.Mockito.verify;
15  import static org.mockito.Mockito.when;
16  import static org.mockito.Mockito.never;
17  
18  import java.io.File;
19  import java.util.Arrays;
20  import java.util.Collection;
21  import java.util.Collections;
22  import java.util.concurrent.atomic.AtomicBoolean;
23  import java.net.URI;
24  
25  public class TestScanningPluginLoader extends TestCase
26  {
27  
28      private PluginEventManager pluginEventManager;
29  
30      @Override
31      public void setUp() throws Exception
32      {
33          super.setUp();
34          pluginEventManager = new DefaultPluginEventManager();
35      }
36  
37      public void testOnShutdown()
38      {
39          PluginArtifactFactory artFactory = mock(PluginArtifactFactory.class);
40          PluginArtifact art = mock(PluginArtifact.class);
41          when(artFactory.create((URI)anyObject())).thenReturn(art);
42  
43          DeploymentUnit unit = new DeploymentUnit(new File("foo.jar"));
44          Scanner scanner = mock(Scanner.class);
45          when(scanner.getDeploymentUnits()).thenReturn(Collections.singletonList(unit));
46          PluginFactory factory = mock(PluginFactory.class);
47          Plugin plugin = mock(Plugin.class);
48          when(plugin.isUninstallable()).thenReturn(true);
49  
50          when(factory.canCreate(art)).thenReturn("foo");
51          when(factory.create(art, null)).thenReturn(plugin);
52  
53          ScanningPluginLoader loader = new ScanningPluginLoader(scanner, Arrays.asList(factory), artFactory, pluginEventManager);
54          loader.loadAllPlugins(null);
55          loader.onShutdown(null);
56          verify(plugin).uninstall();
57      }
58  
59      public void testFactoryThrowsRuntimeException()
60      {
61          testFactoryThrowsThrowable(new IllegalArgumentException());
62      }
63  
64      public void testFactoryThrowsError()
65      {
66          testFactoryThrowsThrowable(new NoClassDefFoundError());
67      }
68  
69      private void testFactoryThrowsThrowable(Throwable e)
70      {
71          PluginArtifactFactory artFactory = mock(PluginArtifactFactory.class);
72          PluginArtifact art = mock(PluginArtifact.class);
73          when(artFactory.create((URI)anyObject())).thenReturn(art);
74  
75  
76          DeploymentUnit unit = new DeploymentUnit(new File("foo.jar"));
77          Scanner scanner = mock(Scanner.class);
78          when(scanner.getDeploymentUnits()).thenReturn(Collections.singletonList(unit));
79          PluginFactory factory = mock(PluginFactory.class);
80  
81          when(factory.canCreate(art)).thenReturn("foo");
82          when(factory.create(art, null)).thenThrow(e);
83  
84          ScanningPluginLoader loader = new ScanningPluginLoader(scanner, Arrays.asList(factory), artFactory, pluginEventManager);
85          Collection<Plugin> plugins = loader.loadAllPlugins(null);
86          assertNotNull(plugins);
87          assertEquals(1, plugins.size());
88          assertTrue(plugins.iterator().next() instanceof UnloadablePlugin);
89      }
90  
91      public void testOnShutdownButUninstallable()
92      {
93          PluginArtifactFactory artFactory = mock(PluginArtifactFactory.class);
94          PluginArtifact art = mock(PluginArtifact.class);
95          when(artFactory.create((URI)anyObject())).thenReturn(art);
96  
97          DeploymentUnit unit = new DeploymentUnit(new File("foo.jar"));
98          Scanner scanner = mock(Scanner.class);
99          when(scanner.getDeploymentUnits()).thenReturn(Collections.singletonList(unit));
100         PluginFactory factory = mock(PluginFactory.class);
101         Plugin plugin = mock(Plugin.class);
102         when(plugin.isUninstallable()).thenReturn(false);
103 
104         when(factory.canCreate(art)).thenReturn("foo");
105         when(factory.create(art, null)).thenReturn(plugin);
106 
107         ScanningPluginLoader loader = new ScanningPluginLoader(scanner, Arrays.asList(factory), artFactory, pluginEventManager);
108         loader.loadAllPlugins(null);
109         loader.onShutdown(null);
110         verify(plugin, never()).uninstall();
111     }
112 
113     public void testPostProcessCalledAlways()
114     {
115         final AtomicBoolean called = new AtomicBoolean(false);
116         PluginArtifactFactory artFactory = mock(PluginArtifactFactory.class);
117         PluginArtifact art = mock(PluginArtifact.class);
118         when(artFactory.create((URI)anyObject())).thenReturn(art);
119 
120         DeploymentUnit unit = new DeploymentUnit(new File("foo.jar"));
121         Scanner scanner = mock(Scanner.class);
122         when(scanner.getDeploymentUnits()).thenReturn(Collections.singletonList(unit));
123         PluginFactory factory = mock(PluginFactory.class);
124         Plugin plugin = mock(Plugin.class);
125         when(plugin.isUninstallable()).thenReturn(true);
126 
127         when(factory.canCreate(art)).thenReturn("foo");
128         when(factory.create(art, null)).thenReturn(plugin);
129         ScanningPluginLoader loader = new ScanningPluginLoader(scanner, Arrays.asList(factory), artFactory, pluginEventManager)
130         {
131             @Override
132             protected Plugin postProcess(Plugin plugin)
133             {
134                 called.set(true);
135                 return plugin;
136             }
137         };
138         loader.loadAllPlugins(null);
139         assertTrue(called.get());
140 
141         called.set(false);
142         DeploymentUnit unit2 = new DeploymentUnit(new File("bar.jar"));
143         when(scanner.scan()).thenReturn(Collections.singletonList(unit2));
144         PluginArtifact art2 = mock(PluginArtifact.class);
145         when(artFactory.create((URI)anyObject())).thenReturn(art2);
146         when(factory.canCreate(art2)).thenReturn("bar");
147         when(factory.create(art2, null)).thenReturn(plugin);
148         loader.addFoundPlugins(null);
149         assertTrue(called.get());
150     }
151 }