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