View Javadoc

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