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
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
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
93 Assume.assumeTrue(!SystemUtils.IS_OS_WINDOWS);
94
95 File pluginsDirectory = pluginsTestDir;
96 File paddington = new File(pluginsDirectory, PADDINGTON_JAR);
97 try {
98
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
111 assertTrue(paddington.exists());
112 assertEquals(1, scanner.getDeploymentUnits().size());
113 }
114 finally {
115
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
148 if (duplicate.canRead())
149 duplicate.delete();
150
151
152 Scanner scanner = new DirectoryScanner(pluginsDirectory);
153 scanner.scan();
154 assertEquals(2, scanner.getDeploymentUnits().size());
155
156
157 FileUtils.copyFile(paddington, duplicate);
158 scanner.scan();
159 assertEquals(3, scanner.getDeploymentUnits().size());
160
161
162 duplicate.delete();
163 scanner.scan();
164 assertEquals(2, scanner.getDeploymentUnits().size());
165 }
166
167 @Test
168 public void testModifyJar() throws Exception
169 {
170
171
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
181 long originalModification = System.currentTimeMillis();
182 originalModification = originalModification - (originalModification % 1000) - 3000;
183 newPaddington.setLastModified(originalModification);
184 assertEquals(originalModification, newPaddington.lastModified());
185
186
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
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 }