1
2
3
4
5
6
7
8
9
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
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
83 }
84
85 @Override
86 public void start(String name) {
87
88 }
89
90 @Override
91 public void remove(String name) {
92
93 }
94
95 @Override
96 public void installWar(String name) {
97
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
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
130 }
131
132 @Override
133 public void discardWorkDir(org.apache.catalina.Context context) {
134
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
167 }
168
169 @Override
170 public void addContextResourceLink(org.apache.catalina.Context context,
171 java.util.List<psiprobe.model.ApplicationResource> resourceList) {
172
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
205 }
206
207 @Override
208 public void unbindFromContext(org.apache.catalina.Context context) {
209
210 }
211 }
212
213
214
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 }