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