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
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
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
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
93 assertTrue(paddington.exists());
94 assertEquals(1, scanner.getDeploymentUnits().size());
95 }
96 finally {
97
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
128 if (duplicate.canRead())
129 duplicate.delete();
130
131
132 Scanner scanner = new DirectoryScanner(pluginsDirectory);
133 scanner.scan();
134 assertEquals(2, scanner.getDeploymentUnits().size());
135
136
137 FileUtils.copyFile(paddington, duplicate);
138 scanner.scan();
139 assertEquals(3, scanner.getDeploymentUnits().size());
140
141
142 duplicate.delete();
143 scanner.scan();
144 assertEquals(2, scanner.getDeploymentUnits().size());
145 }
146
147 public void testModifyJar() throws Exception
148 {
149
150
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
160 long originalModification = System.currentTimeMillis();
161 originalModification = originalModification - (originalModification % 1000) - 3000;
162 newPaddington.setLastModified(originalModification);
163 assertEquals(originalModification, newPaddington.lastModified());
164
165
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
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 }