View Javadoc

1   package com.atlassian.plugin.loaders;
2   
3   import com.atlassian.plugin.loaders.classloading.DirectoryPluginLoaderUtils;
4   import org.apache.commons.io.FileUtils;
5   
6   import java.io.File;
7   import java.io.IOException;
8   import java.util.Collection;
9   import java.util.Iterator;
10  
11  import com.atlassian.plugin.loaders.classloading.Scanner;
12  import com.atlassian.plugin.loaders.classloading.DeploymentUnit;
13  import com.atlassian.plugin.test.PluginTestUtils;
14  import org.apache.commons.lang.SystemUtils;
15  import org.junit.Assume;
16  import org.junit.Before;
17  import org.junit.Test;
18  
19  import static com.atlassian.plugin.loaders.classloading.DirectoryPluginLoaderUtils.PADDINGTON_JAR;
20  import static com.atlassian.plugin.loaders.classloading.DirectoryPluginLoaderUtils.POOH_JAR;
21  import static org.junit.Assert.*;
22  
23  public class TestDirectoryScanner
24  {
25      private File pluginsTestDir;
26  
27      @Before
28      public void createFillAndCleanTempPluginDirectory() throws IOException
29      {
30          final DirectoryPluginLoaderUtils.ScannerDirectories directories = DirectoryPluginLoaderUtils.createFillAndCleanTempPluginDirectory();
31          pluginsTestDir = directories.pluginsTestDir;
32      }
33  
34      @Test
35      public void testNormalOperation() throws Exception
36      {
37          File pluginsDirectory = pluginsTestDir;
38          Scanner scanner = new DirectoryScanner(pluginsDirectory);
39          scanner.scan();
40          Collection<DeploymentUnit> deployedUnits = scanner.getDeploymentUnits();
41          assertEquals(2, deployedUnits.size());
42  
43          // units should be returned ordered alphabetically
44          Iterator iterator = deployedUnits.iterator();
45          DeploymentUnit unit = (DeploymentUnit) iterator.next();
46          assertEquals(PADDINGTON_JAR, unit.getPath().getName());
47  
48          unit = (DeploymentUnit) iterator.next();
49          assertEquals(POOH_JAR, unit.getPath().getName());
50      }
51  
52      @Test
53      public void testSkipDot() throws Exception
54      {
55          File pluginsDirectory = pluginsTestDir;
56          assertNotNull(File.createTempFile(".asdf", ".jar", pluginsDirectory));
57          Scanner scanner = new DirectoryScanner(pluginsDirectory);
58          scanner.scan();
59          Collection<DeploymentUnit> deployedUnits = scanner.getDeploymentUnits();
60          assertEquals(2, deployedUnits.size());
61  
62          // units should be returned ordered alphabetically
63          Iterator iterator = deployedUnits.iterator();
64          DeploymentUnit unit = (DeploymentUnit) iterator.next();
65          assertEquals(PADDINGTON_JAR, unit.getPath().getName());
66  
67          unit = (DeploymentUnit) iterator.next();
68          assertEquals(POOH_JAR, unit.getPath().getName());
69      }
70  
71      @Test
72      public void testRemove()
73      {
74          File pluginsDirectory = pluginsTestDir;
75          File paddington = new File(pluginsDirectory, PADDINGTON_JAR);
76  
77          assertTrue(paddington.exists());
78  
79          DirectoryScanner scanner = new DirectoryScanner(pluginsDirectory);
80          scanner.scan();
81          assertEquals(2, scanner.getDeploymentUnits().size());
82          DeploymentUnit paddingtonUnit = scanner.locateDeploymentUnit(paddington);
83          scanner.remove(paddingtonUnit);
84  
85          assertFalse(paddington.exists());
86          assertEquals(1, scanner.getDeploymentUnits().size());
87      }
88  
89      @Test
90      public void testRemoveFromReadOnlySource()
91      {
92          // Windows does not support read only directories
93          Assume.assumeTrue(!SystemUtils.IS_OS_WINDOWS);
94  
95          File pluginsDirectory = pluginsTestDir;
96          File paddington = new File(pluginsDirectory, PADDINGTON_JAR);
97          try {
98              // Disallow deleting of the file.
99              paddington.getParentFile().setWritable(false);
100 
101             assertTrue(paddington.exists());
102 
103             DirectoryScanner scanner = new DirectoryScanner(pluginsDirectory);
104             scanner.scan();
105             assertEquals(2, scanner.getDeploymentUnits().size());
106 
107             DeploymentUnit paddingtonUnit = scanner.locateDeploymentUnit(paddington);
108             scanner.remove(paddingtonUnit);
109 
110             // The file should still exist!
111             assertTrue(paddington.exists());
112             assertEquals(1, scanner.getDeploymentUnits().size());
113         }
114         finally {
115             // Reset to writable when we are done
116             paddington.getParentFile().setWritable(true);
117         }
118     }
119 
120     @Test
121     public void testRemoveNoErrorWhenNotExist()
122     {
123         File pluginsDirectory = pluginsTestDir;
124         File paddington = new File(pluginsDirectory, PADDINGTON_JAR);
125 
126         assertTrue(paddington.exists());
127 
128         DirectoryScanner scanner = new DirectoryScanner(pluginsDirectory);
129         scanner.scan();
130         assertEquals(2, scanner.getDeploymentUnits().size());
131         DeploymentUnit paddingtonUnit = scanner.locateDeploymentUnit(paddington);
132         assertTrue(paddington.exists());
133         assertTrue(paddington.delete());
134         scanner.remove(paddingtonUnit);
135 
136         assertFalse(paddington.exists());
137         assertEquals(1, scanner.getDeploymentUnits().size());
138     }
139 
140     @Test
141     public void testAddAndRemoveJarFromOutsideScanner() throws Exception
142     {
143         File pluginsDirectory = pluginsTestDir;
144         File paddington = new File(pluginsDirectory, PADDINGTON_JAR);
145         File duplicate = new File(pluginsDirectory, "duplicate-test-plugin.jar");
146 
147         // make sure it's not there already from a bad test
148         if (duplicate.canRead())
149             duplicate.delete();
150 
151         // should be 2 to start with
152         Scanner scanner = new DirectoryScanner(pluginsDirectory);
153         scanner.scan();
154         assertEquals(2, scanner.getDeploymentUnits().size());
155 
156         // copy and scan - should have 3 files
157         FileUtils.copyFile(paddington, duplicate);
158         scanner.scan();
159         assertEquals(3, scanner.getDeploymentUnits().size());
160 
161         // delete and we should have 2!
162         duplicate.delete();
163         scanner.scan();
164         assertEquals(2, scanner.getDeploymentUnits().size());
165     }
166 
167     @Test
168     public void testModifyJar() throws Exception
169     {
170         // Note windows is a piece of shit (can't modify files in the classpath) so
171         // we need to create a temporary directory outside the classpath where we can modify files freely.
172         File pluginsDirectory = pluginsTestDir;
173         File paddington = new File(pluginsDirectory, PADDINGTON_JAR);
174 
175         File testTempDirectory = PluginTestUtils.createTempDirectory(TestDirectoryScanner.class);
176 
177         File newPaddington = new File(testTempDirectory, PADDINGTON_JAR);
178         FileUtils.copyFile(paddington, newPaddington);
179 
180         // set the original mod date - must be a multiple of 1000 on most (all?) file systems
181         long originalModification = System.currentTimeMillis();
182         originalModification = originalModification - (originalModification % 1000) - 3000;
183         newPaddington.setLastModified(originalModification);
184         assertEquals(originalModification, newPaddington.lastModified());
185 
186         // should be 2 to start with
187         DirectoryScanner scanner = new DirectoryScanner(testTempDirectory);
188         scanner.scan();
189         assertEquals(1, scanner.getDeploymentUnits().size());
190 
191         DeploymentUnit newPaddingtonUnit = scanner.locateDeploymentUnit(newPaddington);
192         assertEquals(originalModification, newPaddingtonUnit.lastModified());
193 
194         // modify the JAR file
195         long secondModification = originalModification + 2000;
196         newPaddington.setLastModified(secondModification);
197         scanner.scan();
198 
199         newPaddingtonUnit = scanner.locateDeploymentUnit(newPaddington);
200         assertEquals(secondModification, newPaddingtonUnit.lastModified());
201     }
202 
203 }