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