View Javadoc
1   /*
2    * Licensed under the GPL License. You may not use this file except in compliance with the License.
3    * You may obtain a copy of the License at
4    *
5    *   https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
6    *
7    * THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
8    * WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
9    * PURPOSE.
10   */
11  package psiprobe.beans;
12  
13  import static org.junit.jupiter.api.Assertions.assertEquals;
14  import static org.junit.jupiter.api.Assertions.assertSame;
15  import static org.junit.jupiter.api.Assertions.assertTrue;
16  import static org.mockito.Mockito.mock;
17  import static org.mockito.Mockito.when;
18  
19  import com.codebox.bean.JavaBeanTester;
20  
21  import java.lang.reflect.Field;
22  import java.util.List;
23  import java.util.Map;
24  
25  import org.apache.catalina.Context;
26  import org.junit.jupiter.api.Test;
27  import org.springframework.test.util.ReflectionTestUtils;
28  
29  import psiprobe.TomcatContainer;
30  import psiprobe.model.ApplicationResource;
31  import psiprobe.model.DataSourceInfo;
32  
33  /**
34   * The Class ContainerWrapperBeanTest.
35   */
36  class ContainerWrapperBeanTest {
37  
38    public static class RecordingTomcatContainer implements TomcatContainer {
39  
40      private static Object lastWrapper;
41  
42      private static int setWrapperCalls;
43  
44      @Override
45      public void setWrapper(org.apache.catalina.Wrapper wrapper) {
46        lastWrapper = wrapper;
47        setWrapperCalls++;
48      }
49  
50      @Override
51      public boolean canBoundTo(String binding) {
52        return true;
53      }
54  
55      @Override
56      public org.apache.catalina.Context findContext(String name) {
57        return null;
58      }
59  
60      @Override
61      public String formatContextName(String name) {
62        return name;
63      }
64  
65      @Override
66      public String formatContextFilename(String contextName) {
67        return contextName;
68      }
69  
70      @Override
71      public java.util.List<org.apache.catalina.Context> findContexts() {
72        return List.of();
73      }
74  
75      @Override
76      public java.util.List<org.apache.catalina.connector.Connector> findConnectors() {
77        return List.of();
78      }
79  
80      @Override
81      public void stop(String name) {
82        // no-op
83      }
84  
85      @Override
86      public void start(String name) {
87        // no-op
88      }
89  
90      @Override
91      public void remove(String name) {
92        // no-op
93      }
94  
95      @Override
96      public void installWar(String name) {
97        // no-op
98      }
99  
100     @Override
101     public java.io.File getAppBase() {
102       return null;
103     }
104 
105     @Override
106     public java.io.File getConfigFile(org.apache.catalina.Context context) {
107       return null;
108     }
109 
110     @Override
111     public String getConfigBase() {
112       return null;
113     }
114 
115     @Override
116     public boolean installContext(String contextName) {
117       return false;
118     }
119 
120     @Override
121     public void listContextJsps(org.apache.catalina.Context context,
122         psiprobe.model.jsp.Summary summary, boolean compile) {
123       // no-op
124     }
125 
126     @Override
127     public void recompileJsps(org.apache.catalina.Context context,
128         psiprobe.model.jsp.Summary summary, java.util.List<String> names) {
129       // no-op
130     }
131 
132     @Override
133     public void discardWorkDir(org.apache.catalina.Context context) {
134       // no-op
135     }
136 
137     @Override
138     public String getHostName() {
139       return null;
140     }
141 
142     @Override
143     public String getName() {
144       return "Catalina";
145     }
146 
147     @Override
148     public String getServletFileNameForJsp(org.apache.catalina.Context context, String jspName) {
149       return null;
150     }
151 
152     @Override
153     public java.util.List<psiprobe.model.FilterMapping> getApplicationFilterMaps(
154         org.apache.catalina.Context context) {
155       return List.of();
156     }
157 
158     @Override
159     public boolean getAvailable(org.apache.catalina.Context context) {
160       return true;
161     }
162 
163     @Override
164     public void addContextResource(org.apache.catalina.Context context,
165         java.util.List<psiprobe.model.ApplicationResource> resourceList) {
166       // no-op
167     }
168 
169     @Override
170     public void addContextResourceLink(org.apache.catalina.Context context,
171         java.util.List<psiprobe.model.ApplicationResource> resourceList) {
172       // no-op
173     }
174 
175     @Override
176     public java.util.List<psiprobe.model.FilterInfo> getApplicationFilters(
177         org.apache.catalina.Context context) {
178       return List.of();
179     }
180 
181     @Override
182     public java.util.List<psiprobe.model.ApplicationParam> getApplicationInitParams(
183         org.apache.catalina.Context context) {
184       return List.of();
185     }
186 
187     @Override
188     public boolean resourceExists(String name, org.apache.catalina.Context context) {
189       return false;
190     }
191 
192     @Override
193     public java.io.InputStream getResourceStream(String name, org.apache.catalina.Context context) {
194       return null;
195     }
196 
197     @Override
198     public Long[] getResourceAttributes(String name, org.apache.catalina.Context context) {
199       return new Long[] {0L, 0L};
200     }
201 
202     @Override
203     public void bindToContext(org.apache.catalina.Context context) {
204       // no-op
205     }
206 
207     @Override
208     public void unbindFromContext(org.apache.catalina.Context context) {
209       // no-op
210     }
211   }
212 
213   /**
214    * Javabean tester.
215    */
216   @Test
217   void javabeanTester() {
218     JavaBeanTester.builder(ContainerWrapperBean.class).loadData().test();
219   }
220 
221   @Test
222   void getResourceResolverSelectsDefaultAndJbossResolvers() {
223     ResourceResolver defaultResolver = mock(ResourceResolver.class);
224     ResourceResolver jbossResolver = mock(ResourceResolver.class);
225 
226     ContainerWrapperBean defaultBean = new ContainerWrapperBean();
227     ReflectionTestUtils.setField(defaultBean, "resourceResolvers",
228         Map.of("default", defaultResolver, "jboss", jbossResolver));
229     assertSame(defaultResolver, defaultBean.getResourceResolver());
230     assertSame(defaultResolver, defaultBean.getResourceResolver());
231 
232     String previous = System.getProperty("jboss.server.name");
233     try {
234       System.setProperty("jboss.server.name", "node1");
235       ContainerWrapperBean jbossBean = new ContainerWrapperBean();
236       ReflectionTestUtils.setField(jbossBean, "resourceResolvers",
237           Map.of("default", defaultResolver, "jboss", jbossResolver));
238       assertSame(jbossResolver, jbossBean.getResourceResolver());
239     } finally {
240       if (previous == null) {
241         System.clearProperty("jboss.server.name");
242       } else {
243         System.setProperty("jboss.server.name", previous);
244       }
245     }
246   }
247 
248   @Test
249   void getDataSourcesAggregatesPrivateAndGlobalDataSources() throws Exception {
250     ContainerWrapperBean bean = new ContainerWrapperBean();
251     ResourceResolver resolver = mock(ResourceResolver.class);
252     Context context = mock(Context.class);
253     TomcatContainer tomcatContainer = mock(TomcatContainer.class);
254 
255     ReflectionTestUtils.setField(bean, "resourceResolvers", Map.of("default", resolver));
256     setTomcatContainer(bean, tomcatContainer);
257 
258     when(resolver.supportsPrivateResources()).thenReturn(true);
259     when(resolver.supportsGlobalResources()).thenReturn(true);
260     when(tomcatContainer.findContexts()).thenReturn(List.of(context));
261 
262     ApplicationResource privateResource = resourceWithDataSource("jdbc/private");
263     ApplicationResource privateNonDatasource = new ApplicationResource();
264     when(resolver.getApplicationResources(context, bean))
265         .thenReturn(List.of(privateResource, privateNonDatasource));
266 
267     ApplicationResource globalResource = resourceWithDataSource("jdbc/global");
268     when(resolver.getApplicationResources()).thenReturn(List.of(globalResource));
269 
270     List<ApplicationResource> dataSources = bean.getDataSources();
271 
272     assertEquals(2, dataSources.size());
273     assertTrue(
274         dataSources.stream().anyMatch(resource -> "jdbc/private".equals(resource.getName())));
275     assertTrue(dataSources.stream().anyMatch(resource -> "jdbc/global".equals(resource.getName())));
276   }
277 
278   @Test
279   void setWrapperInitializesAndUnregistersSelectedAdapter() {
280     ContainerWrapperBean bean = new ContainerWrapperBean();
281     RecordingTomcatContainer.lastWrapper = null;
282     RecordingTomcatContainer.setWrapperCalls = 0;
283 
284     ReflectionTestUtils.setField(bean, "adapterClasses",
285         List.of(RecordingTomcatContainer.class.getName()));
286     bean.setForceFirstAdapter(true);
287 
288     org.apache.catalina.Wrapper wrapper = mock(org.apache.catalina.Wrapper.class);
289     bean.setWrapper(wrapper);
290 
291     assertTrue(bean.getTomcatContainer() instanceof RecordingTomcatContainer);
292     assertSame(wrapper, RecordingTomcatContainer.lastWrapper);
293 
294     bean.setWrapper(null);
295 
296     assertEquals(2, RecordingTomcatContainer.setWrapperCalls);
297     assertSame(null, RecordingTomcatContainer.lastWrapper);
298   }
299 
300   private static ApplicationResource resourceWithDataSource(String name) {
301     ApplicationResource resource = new ApplicationResource();
302     resource.setName(name);
303     resource.setDataSourceInfo(new DataSourceInfo());
304     return resource;
305   }
306 
307   private static void setTomcatContainer(ContainerWrapperBean bean, TomcatContainer container)
308       throws NoSuchFieldException, IllegalAccessException {
309     Field field = ContainerWrapperBean.class.getDeclaredField("tomcatContainer");
310     field.setAccessible(true);
311     field.set(bean, container);
312   }
313 
314 }