View Javadoc
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          // PLUG-1188 - didn't do dynamic setting of alternate resource directories
69          //
70          // with no property its zero sized
71          final AlternativeDirectoryResourceLoader loader = new AlternativeDirectoryResourceLoader();
72          assertThat(loader.getResourceDirectories().size(),equalTo(0));
73  
74          // just one directory to start with
75          System.setProperty(AlternativeDirectoryResourceLoader.PLUGIN_RESOURCE_DIRECTORIES, base.getAbsolutePath());
76          assertThat(loader.getResourceDirectories().size(),equalTo(1));
77  
78          // add another one and see how it detects that
79          System.setProperty(AlternativeDirectoryResourceLoader.PLUGIN_RESOURCE_DIRECTORIES,
80                  base.getAbsolutePath() + "," + classes.getAbsolutePath());
81          assertThat(loader.getResourceDirectories().size(),equalTo(2));
82  
83          // and if we set the same value it stays stable
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         // We should get no warnings at all
145         assertThat(capturedLogging, not(didLogWarn()));
146     }
147 }