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 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
101 if (duplicate.canRead())
102 duplicate.delete();
103
104
105 Scanner scanner = new DirectoryScanner(pluginsDirectory);
106 scanner.scan();
107 assertEquals(2, scanner.getDeploymentUnits().size());
108
109
110 FileUtils.copyFile(paddington, duplicate);
111 scanner.scan();
112 assertEquals(3, scanner.getDeploymentUnits().size());
113
114
115 duplicate.delete();
116 scanner.scan();
117 assertEquals(2, scanner.getDeploymentUnits().size());
118 }
119
120 public void testModifyJar() throws Exception
121 {
122
123
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
133 long originalModification = System.currentTimeMillis();
134 originalModification = originalModification - (originalModification % 1000) - 3000;
135 newPaddington.setLastModified(originalModification);
136 assertEquals(originalModification, newPaddington.lastModified());
137
138
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
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 }