1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.configuration2.io;
18
19 import static org.junit.jupiter.api.Assertions.assertIterableEquals;
20 import static org.junit.jupiter.api.Assertions.assertNull;
21 import static org.junit.jupiter.api.Assertions.assertSame;
22 import static org.junit.jupiter.api.Assertions.assertThrows;
23 import static org.mockito.Mockito.mock;
24 import static org.mockito.Mockito.verify;
25 import static org.mockito.Mockito.verifyNoMoreInteractions;
26 import static org.mockito.Mockito.when;
27
28 import java.net.URL;
29 import java.util.ArrayList;
30 import java.util.Arrays;
31 import java.util.Collection;
32 import java.util.LinkedList;
33 import java.util.Objects;
34
35 import org.apache.commons.configuration2.ConfigurationAssert;
36 import org.junit.jupiter.api.BeforeAll;
37 import org.junit.jupiter.api.Test;
38
39
40
41
42 public class TestCombinedLocationStrategy {
43
44
45 private static FileLocator locator;
46
47
48 private static URL locateURL;
49
50 @BeforeAll
51 public static void setUpOnce() throws Exception {
52 locator = FileLocatorUtils.fileLocator().fileName("testFile.tst").create();
53 locateURL = ConfigurationAssert.getTestURL("test.xml");
54 }
55
56
57 private FileSystem fileSystem;
58
59
60 private FileLocationStrategy[] subStrategies;
61
62
63
64
65
66
67 private void checkSubStrategies(final CombinedLocationStrategy strategy) {
68 final Collection<FileLocationStrategy> subs = strategy.getSubStrategies();
69 assertIterableEquals(Arrays.asList(getSubStrategies()), subs);
70 }
71
72
73
74
75
76
77 private CombinedLocationStrategy createCombinedStrategy() {
78 return new CombinedLocationStrategy(Arrays.asList(getSubStrategies()));
79 }
80
81
82
83
84
85
86 private FileSystem getFileSystem() {
87 if (fileSystem == null) {
88 fileSystem = mock(FileSystem.class);
89 }
90 return fileSystem;
91 }
92
93
94
95
96
97
98 private FileLocationStrategy[] getSubStrategies() {
99 if (subStrategies == null) {
100 subStrategies = new FileLocationStrategy[2];
101 for (int i = 0; i < subStrategies.length; i++) {
102 subStrategies[i] = mock(FileLocationStrategy.class);
103 }
104 }
105 return subStrategies;
106 }
107
108
109
110
111 @Test
112 void testGetSubStrategiesModify() {
113 final CombinedLocationStrategy strategy = createCombinedStrategy();
114 final Collection<FileLocationStrategy> strategies = strategy.getSubStrategies();
115 assertThrows(UnsupportedOperationException.class, strategies::clear);
116 }
117
118
119
120
121 @Test
122 void testInitCollectionWithNullEntries() {
123 final Collection<FileLocationStrategy> col = new LinkedList<>(Arrays.asList(getSubStrategies()));
124 col.add(null);
125 assertThrows(IllegalArgumentException.class, () -> new CombinedLocationStrategy(col));
126 }
127
128
129
130
131 @Test
132 void testInitCollectionThrowsNPEOnContainsNull() {
133
134 final Collection<FileLocationStrategy> collectionThatThrowsNPE = new ArrayList<FileLocationStrategy>(Arrays.asList(getSubStrategies())) {
135 @Override
136 public boolean contains(final Object o) {
137 Objects.requireNonNull(o);
138 return super.contains(o);
139 }
140 };
141
142
143 final CombinedLocationStrategy strategy = new CombinedLocationStrategy(collectionThatThrowsNPE);
144 checkSubStrategies(strategy);
145 }
146
147
148
149
150 @Test
151 void testInitDefensiveCopy() {
152 final Collection<FileLocationStrategy> col = new LinkedList<>(Arrays.asList(getSubStrategies()));
153 final CombinedLocationStrategy strategy = new CombinedLocationStrategy(col);
154 col.add(mock(FileLocationStrategy.class));
155 checkSubStrategies(strategy);
156 }
157
158
159
160
161 @Test
162 void testInitNullCollection() {
163 assertThrows(IllegalArgumentException.class, () -> new CombinedLocationStrategy(null));
164 }
165
166
167
168
169 @Test
170 void testLocateFailed() {
171 when(getSubStrategies()[0].locate(getFileSystem(), locator)).thenReturn(null);
172 when(getSubStrategies()[1].locate(getFileSystem(), locator)).thenReturn(null);
173
174 final CombinedLocationStrategy strategy = createCombinedStrategy();
175 assertNull(strategy.locate(getFileSystem(), locator));
176
177 verify(getSubStrategies()[0]).locate(getFileSystem(), locator);
178 verify(getSubStrategies()[1]).locate(getFileSystem(), locator);
179 verifyNoMoreSubCategoryInteractions();
180 }
181
182
183
184
185 @Test
186 void testLocateSuccessFirstSubStrategy() {
187 when(getSubStrategies()[0].locate(getFileSystem(), locator)).thenReturn(locateURL);
188
189 final CombinedLocationStrategy strategy = createCombinedStrategy();
190 assertSame(locateURL, strategy.locate(getFileSystem(), locator));
191
192 verify(getSubStrategies()[0]).locate(getFileSystem(), locator);
193 verifyNoMoreSubCategoryInteractions();
194 }
195
196
197
198
199 @Test
200 void testLocateSuccessSecondSubStrategy() {
201 when(getSubStrategies()[0].locate(getFileSystem(), locator)).thenReturn(null);
202 when(getSubStrategies()[1].locate(getFileSystem(), locator)).thenReturn(locateURL);
203
204 final CombinedLocationStrategy strategy = createCombinedStrategy();
205 assertSame(locateURL, strategy.locate(getFileSystem(), locator));
206
207 verify(getSubStrategies()[0]).locate(getFileSystem(), locator);
208 verify(getSubStrategies()[1]).locate(getFileSystem(), locator);
209 verifyNoMoreSubCategoryInteractions();
210 }
211
212
213
214
215 private void verifyNoMoreSubCategoryInteractions() {
216 verifyNoMoreInteractions((Object[]) getSubStrategies());
217 }
218 }