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 testRemoveNoErrorWhenNotExist()
76      {
77          File pluginsDirectory = pluginsTestDir;
78          File paddington = new File(pluginsDirectory, "paddington-test-plugin.jar");
79  
80          assertTrue(paddington.exists());
81  
82          DirectoryScanner scanner = new DirectoryScanner(pluginsDirectory);
83          scanner.scan();
84          assertEquals(2, scanner.getDeploymentUnits().size());
85          DeploymentUnit paddingtonUnit = scanner.locateDeploymentUnit(paddington);
86          assertTrue(paddington.exists());
87          assertTrue(paddington.delete());
88          scanner.remove(paddingtonUnit);
89  
90          assertFalse(paddington.exists());
91          assertEquals(1, scanner.getDeploymentUnits().size());
92      }
93  
94      public void testAddAndRemoveJarFromOutsideScanner() throws Exception
95      {
96          File pluginsDirectory = pluginsTestDir;
97          File paddington = new File(pluginsDirectory, "paddington-test-plugin.jar");
98          File duplicate = new File(pluginsDirectory, "duplicate-test-plugin.jar");
99  
100         // make sure it's not there already from a bad test
101         if (duplicate.canRead())
102             duplicate.delete();
103 
104         // should be 2 to start with
105         Scanner scanner = new DirectoryScanner(pluginsDirectory);
106         scanner.scan();
107         assertEquals(2, scanner.getDeploymentUnits().size());
108 
109         // copy and scan - should have 3 files
110         FileUtils.copyFile(paddington, duplicate);
111         scanner.scan();
112         assertEquals(3, scanner.getDeploymentUnits().size());
113 
114         // delete and we should have 2!
115         duplicate.delete();
116         scanner.scan();
117         assertEquals(2, scanner.getDeploymentUnits().size());
118     }
119 
120     public void testModifyJar() throws Exception
121     {
122         // Note windows is a piece of shit (can't modify files in the classpath) so
123         // we need to create a temporary directory outside the classpath where we can modify files freely.
124         File pluginsDirectory = pluginsTestDir;
125         File paddington = new File(pluginsDirectory, "paddington-test-plugin.jar");
126 
127         File testTempDirectory = PluginTestUtils.createTempDirectory(TestDirectoryScanner.class);
128 
129         File newPaddington = new File(testTempDirectory, "paddington-test-plugin.jar");
130         FileUtils.copyFile(paddington, newPaddington);
131 
132         // set the original mod date - must be a multiple of 1000 on most (all?) file systems
133         long originalModification = System.currentTimeMillis();
134         originalModification = originalModification - (originalModification % 1000) - 3000;
135         newPaddington.setLastModified(originalModification);
136         assertEquals(originalModification, newPaddington.lastModified());
137 
138         // should be 2 to start with
139         DirectoryScanner scanner = new DirectoryScanner(testTempDirectory);
140         scanner.scan();
141         assertEquals(1, scanner.getDeploymentUnits().size());
142 
143         DeploymentUnit newPaddingtonUnit = scanner.locateDeploymentUnit(newPaddington);
144         assertEquals(originalModification, newPaddingtonUnit.lastModified());
145 
146         // modify the JAR file
147         long secondModification = originalModification + 2000;
148         newPaddington.setLastModified(secondModification);
149         scanner.scan();
150 
151         newPaddingtonUnit = scanner.locateDeploymentUnit(newPaddington);
152         assertEquals(secondModification, newPaddingtonUnit.lastModified());
153     }
154 
155 }