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 RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties(
26 AlternativeDirectoryResourceLoader.PLUGIN_RESOURCE_DIRECTORIES);
27
28 @Rule
29 public TemporaryFolder temporaryFolder = new TemporaryFolder(new File("target"));
30
31 @Rule
32 public CapturedLogging capturedLogging = new CapturedLogging(AlternativeDirectoryResourceLoader.class);
33
34 private File base;
35 private File classes;
36 private File com;
37
38 @Before
39 public void setUp() throws Exception {
40 base = temporaryFolder.getRoot();
41 com = temporaryFolder.newFolder("classes", "com");
42 classes = com.getParentFile();
43 temporaryFolder.newFile("kid.txt");
44 }
45
46 @Test
47 public void testGetResource() throws Exception {
48 System.setProperty(AlternativeDirectoryResourceLoader.PLUGIN_RESOURCE_DIRECTORIES, base.getAbsolutePath());
49 final AlternativeResourceLoader loader = new AlternativeDirectoryResourceLoader();
50 assertThat(loader.getResource("classes"), equalTo(classes.toURL()));
51 assertThat(loader.getResource("com"), nullValue());
52 assertThat(loader.getResource("asdfasdfasf"), nullValue());
53 }
54
55 @Test
56 public void testGetResourceWithTwoDefined() throws Exception {
57 System.setProperty(AlternativeDirectoryResourceLoader.PLUGIN_RESOURCE_DIRECTORIES,
58 base.getAbsolutePath() + "," + classes.getAbsolutePath());
59 final AlternativeResourceLoader loader = new AlternativeDirectoryResourceLoader();
60 assertThat(loader.getResource("classes"), equalTo(classes.toURL()));
61 assertThat(loader.getResource("com"), equalTo(com.toURL()));
62 assertThat(loader.getResource("asdfasdfasf"), nullValue());
63 }
64
65 @Test
66 public void testChangesInSystemPropertyAreDynamic() throws Exception {
67
68
69
70
71 final AlternativeDirectoryResourceLoader loader = new AlternativeDirectoryResourceLoader();
72 assertThat(loader.getResourceDirectories().size(),equalTo(0));
73
74
75 System.setProperty(AlternativeDirectoryResourceLoader.PLUGIN_RESOURCE_DIRECTORIES, base.getAbsolutePath());
76 assertThat(loader.getResourceDirectories().size(),equalTo(1));
77
78
79 System.setProperty(AlternativeDirectoryResourceLoader.PLUGIN_RESOURCE_DIRECTORIES,
80 base.getAbsolutePath() + "," + classes.getAbsolutePath());
81 assertThat(loader.getResourceDirectories().size(),equalTo(2));
82
83
84 System.setProperty(AlternativeDirectoryResourceLoader.PLUGIN_RESOURCE_DIRECTORIES,
85 base.getAbsolutePath() + "," + classes.getAbsolutePath());
86 assertThat(loader.getResourceDirectories().size(),equalTo(2));
87 }
88
89
90 @Test
91 public void testGetResourceWithWhitespace() throws Exception {
92 System.setProperty(AlternativeDirectoryResourceLoader.PLUGIN_RESOURCE_DIRECTORIES,
93 "\n" +
94 " " + base.getAbsolutePath() + ",\n" +
95 " " + classes.getAbsolutePath() + "\n" +
96 " ");
97 final AlternativeResourceLoader loader = new AlternativeDirectoryResourceLoader();
98 assertThat(loader.getResource("classes"), equalTo(classes.toURL()));
99 assertThat(loader.getResource("com"), equalTo(com.toURL()));
100 assertThat(loader.getResource("asdfasdfasf"), nullValue());
101 }
102
103 @Test
104 public void testGetResourceNoProperty() throws Exception {
105 final AlternativeResourceLoader loader = new AlternativeDirectoryResourceLoader();
106 assertThat(loader.getResource("classes"), nullValue());
107 assertThat(loader.getResource("asdfasdfasf"), nullValue());
108 }
109
110 @Test
111 public void testGetResourceAsStream() throws Exception {
112 System.setProperty(AlternativeDirectoryResourceLoader.PLUGIN_RESOURCE_DIRECTORIES, base.getAbsolutePath());
113 final AlternativeResourceLoader loader = new AlternativeDirectoryResourceLoader();
114 InputStream kidInputStream = null;
115 InputStream junkInputStream = null;
116 try {
117 kidInputStream = loader.getResourceAsStream("kid.txt");
118 junkInputStream = loader.getResourceAsStream("asdfasdfasf");
119 assertThat(kidInputStream, notNullValue());
120 assertThat(junkInputStream, nullValue());
121 } finally {
122 IOUtils.closeQuietly(kidInputStream);
123 IOUtils.closeQuietly(junkInputStream);
124 }
125 }
126
127 @Test
128 public void constructionLogsFoundAsDebugAndNotFoundAsWarning() {
129 final File classes = new File(base, "classes");
130 final File nonexistent = new File(base, "non-existent");
131 System.setProperty(AlternativeDirectoryResourceLoader.PLUGIN_RESOURCE_DIRECTORIES, nonexistent + "," + classes);
132 final AlternativeDirectoryResourceLoader loader = new AlternativeDirectoryResourceLoader();
133 assertThat(loader.getResourceDirectories(), contains(classes));
134 assertThat(capturedLogging, didLogDebug(classes.getPath(), "Found"));
135 assertThat(capturedLogging, didLogWarn(nonexistent.getPath(), nonexistent.getAbsolutePath(), "does not exist"));
136 }
137
138 @Test
139 public void emptyNamePluginResourceDirectoriesDoNotLogWarnings() {
140 final File classes = new File(base, "classes");
141 System.setProperty(AlternativeDirectoryResourceLoader.PLUGIN_RESOURCE_DIRECTORIES, "," + classes);
142 final AlternativeDirectoryResourceLoader loader = new AlternativeDirectoryResourceLoader();
143 assertThat(loader.getResourceDirectories(), contains(classes));
144
145 assertThat(capturedLogging, not(didLogWarn()));
146 }
147 }