1 package com.atlassian.plugin.util.resource;
2
3 import com.atlassian.plugin.test.CapturedLogging;
4 import org.apache.commons.io.IOUtils;
5 import org.junit.Before;
6 import org.junit.Rule;
7 import org.junit.Test;
8 import org.junit.contrib.java.lang.system.RestoreSystemProperties;
9 import org.junit.rules.TemporaryFolder;
10
11 import java.io.File;
12 import java.io.InputStream;
13
14 import static com.atlassian.plugin.test.CapturedLogging.didLogDebug;
15 import static com.atlassian.plugin.test.CapturedLogging.didLogWarn;
16 import static org.hamcrest.MatcherAssert.assertThat;
17 import static org.hamcrest.Matchers.contains;
18 import static org.hamcrest.Matchers.equalTo;
19 import static org.hamcrest.Matchers.not;
20 import static org.hamcrest.Matchers.notNullValue;
21 import static org.hamcrest.Matchers.nullValue;
22
23 public class TestAlternativeDirectoryResourceLoader {
24 @Rule
25 public final RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties();
26 @Rule
27 public final TemporaryFolder temporaryFolder = new TemporaryFolder(new File("target"));
28 @Rule
29 public final CapturedLogging capturedLogging = new CapturedLogging(AlternativeDirectoryResourceLoader.class);
30
31 private File base;
32 private File classes;
33 private File com;
34
35 @Before
36 public void setUp() throws Exception {
37 base = temporaryFolder.getRoot();
38 com = temporaryFolder.newFolder("classes", "com");
39 classes = com.getParentFile();
40 temporaryFolder.newFile("kid.txt");
41 }
42
43 @Test
44 public void testGetResource() throws Exception {
45 System.setProperty(AlternativeDirectoryResourceLoader.PLUGIN_RESOURCE_DIRECTORIES, base.getAbsolutePath());
46 final AlternativeResourceLoader loader = new AlternativeDirectoryResourceLoader();
47 assertThat(loader.getResource("classes"), equalTo(classes.toURI().toURL()));
48 assertThat(loader.getResource("com"), nullValue());
49 assertThat(loader.getResource("asdfasdfasf"), nullValue());
50 }
51
52 @Test
53 public void testGetResourceWithTwoDefined() throws Exception {
54 System.setProperty(AlternativeDirectoryResourceLoader.PLUGIN_RESOURCE_DIRECTORIES,
55 base.getAbsolutePath() + "," + classes.getAbsolutePath());
56 final AlternativeResourceLoader loader = new AlternativeDirectoryResourceLoader();
57 assertThat(loader.getResource("classes"), equalTo(classes.toURI().toURL()));
58 assertThat(loader.getResource("com"), equalTo(com.toURI().toURL()));
59 assertThat(loader.getResource("asdfasdfasf"), nullValue());
60 }
61
62 @Test
63 public void testChangesInSystemPropertyAreDynamic() throws Exception {
64
65
66
67
68 final AlternativeDirectoryResourceLoader loader = new AlternativeDirectoryResourceLoader();
69 assertThat(loader.getResourceDirectories().size(),equalTo(0));
70
71
72 System.setProperty(AlternativeDirectoryResourceLoader.PLUGIN_RESOURCE_DIRECTORIES, base.getAbsolutePath());
73 assertThat(loader.getResourceDirectories().size(),equalTo(1));
74
75
76 System.setProperty(AlternativeDirectoryResourceLoader.PLUGIN_RESOURCE_DIRECTORIES,
77 base.getAbsolutePath() + "," + classes.getAbsolutePath());
78 assertThat(loader.getResourceDirectories().size(),equalTo(2));
79
80
81 System.setProperty(AlternativeDirectoryResourceLoader.PLUGIN_RESOURCE_DIRECTORIES,
82 base.getAbsolutePath() + "," + classes.getAbsolutePath());
83 assertThat(loader.getResourceDirectories().size(),equalTo(2));
84 }
85
86
87 @Test
88 public void testGetResourceWithWhitespace() throws Exception {
89 System.setProperty(AlternativeDirectoryResourceLoader.PLUGIN_RESOURCE_DIRECTORIES,
90 "\n" +
91 " " + base.getAbsolutePath() + ",\n" +
92 " " + classes.getAbsolutePath() + "\n" +
93 " ");
94 final AlternativeResourceLoader loader = new AlternativeDirectoryResourceLoader();
95 assertThat(loader.getResource("classes"), equalTo(classes.toURI().toURL()));
96 assertThat(loader.getResource("com"), equalTo(com.toURI().toURL()));
97 assertThat(loader.getResource("asdfasdfasf"), nullValue());
98 }
99
100 @Test
101 public void testGetResourceNoProperty() throws Exception {
102 final AlternativeResourceLoader loader = new AlternativeDirectoryResourceLoader();
103 assertThat(loader.getResource("classes"), nullValue());
104 assertThat(loader.getResource("asdfasdfasf"), nullValue());
105 }
106
107 @Test
108 public void testGetResourceAsStream() throws Exception {
109 System.setProperty(AlternativeDirectoryResourceLoader.PLUGIN_RESOURCE_DIRECTORIES, base.getAbsolutePath());
110 final AlternativeResourceLoader loader = new AlternativeDirectoryResourceLoader();
111 InputStream kidInputStream = null;
112 InputStream junkInputStream = null;
113 try {
114 kidInputStream = loader.getResourceAsStream("kid.txt");
115 junkInputStream = loader.getResourceAsStream("asdfasdfasf");
116 assertThat(kidInputStream, notNullValue());
117 assertThat(junkInputStream, nullValue());
118 } finally {
119 IOUtils.closeQuietly(kidInputStream);
120 IOUtils.closeQuietly(junkInputStream);
121 }
122 }
123
124 @Test
125 public void constructionLogsFoundAsDebugAndNotFoundAsWarning() {
126 final File classes = new File(base, "classes");
127 final File nonexistent = new File(base, "non-existent");
128 System.setProperty(AlternativeDirectoryResourceLoader.PLUGIN_RESOURCE_DIRECTORIES, nonexistent + "," + classes);
129 final AlternativeDirectoryResourceLoader loader = new AlternativeDirectoryResourceLoader();
130 assertThat(loader.getResourceDirectories(), contains(classes));
131 assertThat(capturedLogging, didLogDebug(classes.getPath(), "Found"));
132 assertThat(capturedLogging, didLogWarn(nonexistent.getPath(), nonexistent.getAbsolutePath(), "does not exist"));
133 }
134
135 @Test
136 public void emptyNamePluginResourceDirectoriesDoNotLogWarnings() {
137 final File classes = new File(base, "classes");
138 System.setProperty(AlternativeDirectoryResourceLoader.PLUGIN_RESOURCE_DIRECTORIES, "," + classes);
139 final AlternativeDirectoryResourceLoader loader = new AlternativeDirectoryResourceLoader();
140 assertThat(loader.getResourceDirectories(), contains(classes));
141
142 assertThat(capturedLogging, not(didLogWarn()));
143 }
144 }