1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.configuration2.builder;
18
19 import static org.junit.jupiter.api.Assertions.assertEquals;
20 import static org.junit.jupiter.api.Assertions.assertFalse;
21 import static org.junit.jupiter.api.Assertions.assertNotSame;
22 import static org.junit.jupiter.api.Assertions.assertSame;
23 import static org.junit.jupiter.api.Assertions.assertTrue;
24 import static org.mockito.Mockito.mock;
25 import static org.mockito.Mockito.times;
26 import static org.mockito.Mockito.verify;
27 import static org.mockito.Mockito.verifyNoMoreInteractions;
28 import static org.mockito.Mockito.when;
29
30 import java.util.HashMap;
31 import java.util.Map;
32
33 import org.apache.commons.configuration2.PropertiesConfiguration;
34 import org.apache.commons.configuration2.ex.ConfigurationException;
35 import org.apache.commons.configuration2.io.FileHandler;
36 import org.apache.commons.configuration2.reloading.FileHandlerReloadingDetector;
37 import org.apache.commons.configuration2.reloading.ReloadingDetector;
38 import org.junit.jupiter.api.Test;
39
40
41
42
43 public class TestReloadingFileBasedConfigurationBuilder {
44
45
46
47
48 private static final class ReloadingFileBasedConfigurationBuilderTestImpl extends ReloadingFileBasedConfigurationBuilder<PropertiesConfiguration> {
49
50
51 private final ReloadingDetector mockDetector;
52
53
54 private FileHandler handlerForDetector;
55
56
57
58
59
60
61
62 public ReloadingFileBasedConfigurationBuilderTestImpl(final ReloadingDetector detector) {
63 super(PropertiesConfiguration.class);
64 mockDetector = detector;
65 }
66
67
68
69
70 @Override
71 protected ReloadingDetector createReloadingDetector(final FileHandler handler, final FileBasedBuilderParametersImpl fbparams) {
72 handlerForDetector = handler;
73 return mockDetector;
74 }
75
76
77
78
79
80
81 public FileHandler getHandlerForDetector() {
82 return handlerForDetector;
83 }
84 }
85
86
87
88
89 @Test
90 void testCreateReloadingDetectorDefaultFactory() throws ConfigurationException {
91 final ReloadingFileBasedConfigurationBuilder<PropertiesConfiguration> builder = new ReloadingFileBasedConfigurationBuilder<>(
92 PropertiesConfiguration.class);
93 final FileHandler handler = new FileHandler();
94 final FileBasedBuilderParametersImpl params = new FileBasedBuilderParametersImpl();
95 final long refreshDelay = 60000L;
96 params.setReloadingRefreshDelay(refreshDelay);
97 final FileHandlerReloadingDetector detector = (FileHandlerReloadingDetector) builder.createReloadingDetector(handler, params);
98 assertSame(handler, detector.getFileHandler());
99 assertEquals(refreshDelay, detector.getRefreshDelay());
100 }
101
102
103
104
105 @Test
106 void testCreateReloadingDetectoryCustomFactory() throws ConfigurationException {
107 final ReloadingDetector detector = mock(ReloadingDetector.class);
108 final ReloadingDetectorFactory factory = mock(ReloadingDetectorFactory.class);
109 final FileHandler handler = new FileHandler();
110 final FileBasedBuilderParametersImpl params = new FileBasedBuilderParametersImpl();
111
112 when(factory.createReloadingDetector(handler, params)).thenReturn(detector);
113
114 params.setReloadingDetectorFactory(factory);
115 final ReloadingFileBasedConfigurationBuilder<PropertiesConfiguration> builder = new ReloadingFileBasedConfigurationBuilder<>(
116 PropertiesConfiguration.class);
117 assertSame(detector, builder.createReloadingDetector(handler, params));
118
119 verify(factory).createReloadingDetector(handler, params);
120 verifyNoMoreInteractions(factory);
121 }
122
123
124
125
126
127 @Test
128 void testGetConfigurationNoLocation() throws ConfigurationException {
129 final Map<String, Object> params = new HashMap<>();
130 params.put("throwExceptionOnMissing", Boolean.TRUE);
131 final ReloadingFileBasedConfigurationBuilder<PropertiesConfiguration> builder = new ReloadingFileBasedConfigurationBuilder<>(
132 PropertiesConfiguration.class, params);
133 final PropertiesConfiguration conf = builder.getConfiguration();
134 assertTrue(conf.isThrowExceptionOnMissing());
135 assertTrue(conf.isEmpty());
136 }
137
138
139
140
141 @Test
142 void testInitAllowFailOnInitFlag() {
143 final ReloadingFileBasedConfigurationBuilder<PropertiesConfiguration> builder = new ReloadingFileBasedConfigurationBuilder<>(
144 PropertiesConfiguration.class, null, true);
145 assertTrue(builder.isAllowFailOnInit());
146 }
147
148
149
150
151 @Test
152 void testReloadingControllerEvents() throws ConfigurationException {
153 final ReloadingDetector detector = mock(ReloadingDetector.class);
154
155 when(detector.isReloadingRequired()).thenReturn(Boolean.TRUE);
156
157 final ReloadingFileBasedConfigurationBuilderTestImpl builder = new ReloadingFileBasedConfigurationBuilderTestImpl(detector);
158 final BuilderEventListenerImpl listener = new BuilderEventListenerImpl();
159 builder.addEventListener(ConfigurationBuilderEvent.RESET, listener);
160 builder.getConfiguration();
161 builder.getReloadingController().checkForReloading(null);
162 listener.nextEvent(ConfigurationBuilderEvent.RESET);
163 listener.assertNoMoreEvents();
164
165 verify(detector).isReloadingRequired();
166 verifyNoMoreInteractions(detector);
167 }
168
169
170
171
172 @Test
173 void testReloadingDetectorIsReloadingRequired() throws ConfigurationException {
174 final ReloadingDetector detector = mock(ReloadingDetector.class);
175
176 when(detector.isReloadingRequired()).thenReturn(Boolean.TRUE, Boolean.FALSE);
177
178 final ReloadingFileBasedConfigurationBuilderTestImpl builder = new ReloadingFileBasedConfigurationBuilderTestImpl(detector);
179 builder.getConfiguration();
180 final ReloadingDetector ctrlDetector = builder.getReloadingController().getDetector();
181 assertTrue(ctrlDetector.isReloadingRequired());
182 assertFalse(ctrlDetector.isReloadingRequired());
183 assertSame(builder.getFileHandler(), builder.getHandlerForDetector());
184
185 verify(detector, times(2)).isReloadingRequired();
186 verifyNoMoreInteractions(detector);
187 }
188
189
190
191
192 @Test
193 void testReloadingDetectorNoFileHandler() {
194 final ReloadingFileBasedConfigurationBuilder<PropertiesConfiguration> builder = new ReloadingFileBasedConfigurationBuilder<>(
195 PropertiesConfiguration.class);
196 final ReloadingDetector ctrlDetector = builder.getReloadingController().getDetector();
197 ctrlDetector.reloadingPerformed();
198 assertFalse(ctrlDetector.isReloadingRequired());
199 }
200
201
202
203
204 @Test
205 void testReloadingDetectorReloadingPerformed() throws ConfigurationException {
206 final ReloadingDetector detector = mock(ReloadingDetector.class);
207 final ReloadingFileBasedConfigurationBuilderTestImpl builder = new ReloadingFileBasedConfigurationBuilderTestImpl(detector);
208 builder.getConfiguration();
209 final ReloadingDetector ctrlDetector = builder.getReloadingController().getDetector();
210 ctrlDetector.reloadingPerformed();
211
212 verify(detector).reloadingPerformed();
213 verifyNoMoreInteractions(detector);
214 }
215
216
217
218
219 @Test
220 void testResetReloadingStateInGetConfiguration() throws ConfigurationException {
221 final ReloadingDetector detector = mock(ReloadingDetector.class);
222
223 when(detector.isReloadingRequired()).thenReturn(Boolean.TRUE);
224
225 final ReloadingFileBasedConfigurationBuilderTestImpl builder = new ReloadingFileBasedConfigurationBuilderTestImpl(detector);
226 final PropertiesConfiguration config1 = builder.getConfiguration();
227 builder.getReloadingController().checkForReloading(null);
228 final PropertiesConfiguration config2 = builder.getConfiguration();
229 assertNotSame(config1, config2);
230 assertFalse(builder.getReloadingController().isInReloadingState());
231
232 verify(detector).isReloadingRequired();
233 verify(detector).reloadingPerformed();
234 verifyNoMoreInteractions(detector);
235 }
236 }