source: josm/trunk/test/unit/org/openstreetmap/josm/data/osm/ChangesetCacheTest.java@ 17333

Last change on this file since 17333 was 17333, checked in by Don-vip, 3 years ago

see #20129 - Fix typos and misspellings in the code (patch by gaben)

  • Property svn:eol-style set to native
File size: 9.7 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.data.osm;
3
4import static org.junit.jupiter.api.Assertions.assertEquals;
5import static org.junit.jupiter.api.Assertions.assertFalse;
6import static org.junit.jupiter.api.Assertions.assertNotNull;
7import static org.junit.jupiter.api.Assertions.assertTrue;
8
9import java.util.Arrays;
10import java.util.Collection;
11import java.util.Collections;
12import java.util.concurrent.CountDownLatch;
13import java.util.concurrent.TimeUnit;
14
15import org.junit.jupiter.api.AfterEach;
16import org.junit.jupiter.api.BeforeEach;
17import org.junit.jupiter.api.Test;
18import org.junit.jupiter.api.extension.RegisterExtension;
19import org.openstreetmap.josm.data.UserIdentityManager;
20import org.openstreetmap.josm.testutils.JOSMTestRules;
21import org.openstreetmap.josm.tools.Logging;
22
23import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
24
25/**
26 * Unit test of {@link ChangesetCache}
27 */
28class ChangesetCacheTest {
29
30 /**
31 * Setup test.
32 */
33 @RegisterExtension
34 @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
35 public JOSMTestRules test = new JOSMTestRules();
36
37 private static final ChangesetCache cache = ChangesetCache.getInstance();
38
39 /**
40 * Clears cache before/after each unit test.
41 */
42 @AfterEach
43 @BeforeEach
44 public void clearCache() {
45 cache.listeners.clear();
46 cache.clear();
47 }
48
49 abstract class TestListener implements ChangesetCacheListener {
50
51 protected final CountDownLatch latch = new CountDownLatch(1);
52 protected ChangesetCacheEvent event;
53
54 @Override
55 public void changesetCacheUpdated(ChangesetCacheEvent event) {
56 this.event = event;
57 latch.countDown();
58 }
59
60 protected final void await() {
61 try {
62 Logging.trace(Boolean.toString(latch.await(2, TimeUnit.SECONDS)));
63 } catch (InterruptedException e) {
64 Logging.error(e);
65 }
66 }
67
68 abstract void test();
69 }
70
71 /**
72 * Unit test of {@link ChangesetCache#ChangesetCache}
73 */
74 @Test
75 void testConstructor() {
76 assertNotNull(ChangesetCache.getInstance());
77 }
78
79 @Test
80 void testAddAndRemoveListeners() {
81 // should work
82 cache.addChangesetCacheListener(null);
83
84 ChangesetCacheListener listener = event -> {
85 // should work
86 };
87 cache.addChangesetCacheListener(listener);
88 // adding a second time - should work too
89 cache.addChangesetCacheListener(listener);
90 assertEquals(1, cache.listeners.size()); // ... but only added once
91
92 cache.removeChangesetCacheListener(null);
93
94 cache.removeChangesetCacheListener(listener);
95 assertTrue(cache.listeners.isEmpty());
96 }
97
98 @Test
99 void testUpdateGetRemoveCycle() {
100 cache.update(new Changeset(1));
101 assertEquals(1, cache.size());
102 assertNotNull(cache.get(1));
103 assertEquals(1, cache.get(1).getId());
104 cache.remove(1);
105 assertEquals(0, cache.size());
106 }
107
108 @Test
109 void testUpdateTwice() {
110 Changeset cs = new Changeset(1);
111 cs.setIncomplete(false);
112 cs.put("key1", "value1");
113 cs.setOpen(true);
114 cache.update(cs);
115
116 Changeset cs2 = new Changeset(cs);
117 assertNotNull(cs2);
118 cs2.put("key2", "value2");
119 cs2.setOpen(false);
120 cache.update(cs2);
121
122 assertEquals(1, cache.size());
123 assertNotNull(cache.get(1));
124
125 cs = cache.get(1);
126 assertEquals("value1", cs.get("key1"));
127 assertEquals("value2", cs.get("key2"));
128 assertFalse(cs.isOpen());
129 }
130
131 @Test
132 void testContains() {
133 Changeset cs = new Changeset(1);
134 cache.update(cs);
135
136 assertTrue(cache.contains(1));
137 assertTrue(cache.contains(cs));
138 assertTrue(cache.contains(new Changeset(cs)));
139
140 assertFalse(cache.contains(2));
141 assertFalse(cache.contains(new Changeset(2)));
142 assertFalse(cache.contains(null));
143 }
144
145 @Test
146 void testFiringEventsAddAChangeset() {
147 TestListener listener = new TestListener() {
148 @Override
149 void test() {
150 await();
151 assertNotNull(event);
152 assertEquals(1, event.getAddedChangesets().size());
153 assertTrue(event.getRemovedChangesets().isEmpty());
154 assertTrue(event.getUpdatedChangesets().isEmpty());
155 assertEquals(cache, event.getSource());
156 }
157 };
158 cache.addChangesetCacheListener(listener);
159 cache.update(new Changeset(1));
160 listener.test();
161 cache.removeChangesetCacheListener(listener);
162 }
163
164 @Test
165 void testFiringEventsUpdateChangeset() {
166 // Waiter listener to ensure the second listener does not receive the first event
167 TestListener waiter = new TestListener() {
168 @Override
169 void test() {
170 await();
171 }
172 };
173 cache.addChangesetCacheListener(waiter);
174 Changeset cs = new Changeset(1);
175 cache.update(cs);
176 waiter.test();
177 cache.removeChangesetCacheListener(waiter);
178
179 TestListener listener = new TestListener() {
180 @Override
181 void test() {
182 await();
183 assertNotNull(event);
184 assertTrue(event.getAddedChangesets().isEmpty());
185 assertTrue(event.getRemovedChangesets().isEmpty());
186 assertEquals(1, event.getUpdatedChangesets().size());
187 assertEquals(cache, event.getSource());
188 }
189 };
190 cache.addChangesetCacheListener(listener);
191 cache.update(cs);
192 listener.test();
193 cache.removeChangesetCacheListener(listener);
194 }
195
196 @Test
197 void testFiringEventsRemoveChangeset() {
198 // Waiter listener to ensure the second listener does not receive the first event
199 TestListener waiter = new TestListener() {
200 @Override
201 void test() {
202 await();
203 }
204 };
205 cache.addChangesetCacheListener(waiter);
206 cache.update(new Changeset(1));
207 waiter.test();
208 cache.removeChangesetCacheListener(waiter);
209
210 TestListener listener = new TestListener() {
211 @Override
212 void test() {
213 await();
214 assertNotNull(event);
215 assertTrue(event.getAddedChangesets().isEmpty());
216 assertEquals(1, event.getRemovedChangesets().size());
217 assertTrue(event.getUpdatedChangesets().isEmpty());
218 assertEquals(cache, event.getSource());
219 }
220 };
221 cache.addChangesetCacheListener(listener);
222 cache.remove(1);
223 listener.test();
224 cache.removeChangesetCacheListener(listener);
225 }
226
227 /**
228 * Unit test of methods {@link ChangesetCache#getOpenChangesets} / {@link ChangesetCache#getChangesets}.
229 */
230 @Test
231 void testGetOpenChangesets() {
232 // empty cache => empty list
233 assertTrue(cache.getOpenChangesets().isEmpty(), "Empty cache should produce an empty list.");
234 assertTrue(cache.getChangesets().isEmpty(), "Empty cache should produce an empty list.");
235
236 // cache with only closed changesets => empty list
237 Changeset closedCs = new Changeset(1);
238 closedCs.setOpen(false);
239 cache.update(closedCs);
240 assertTrue(cache.getOpenChangesets().isEmpty(),
241 "Cache with only closed changesets should produce an empty list.");
242 assertEquals(1, cache.getChangesets().size());
243
244 // cache with open and closed changesets => list with only the open ones
245 Changeset openCs = new Changeset(2);
246 openCs.setOpen(true);
247 cache.update(openCs);
248 assertEquals(
249 Collections.singletonList(openCs),
250 cache.getOpenChangesets()
251 );
252 assertEquals(2, cache.getChangesets().size());
253 }
254
255 /**
256 * Unit test of method {@link ChangesetCache#getOpenChangesetsForCurrentUser}.
257 */
258 @Test
259 void testGetOpenChangesetsForCurrentUser() {
260 // empty cache => empty list
261 assertTrue(cache.getOpenChangesetsForCurrentUser().isEmpty(),
262 "Empty cache should produce an empty list.");
263
264 Changeset openCs1 = new Changeset(1);
265 openCs1.setOpen(true);
266 openCs1.setUser(User.getAnonymous());
267 cache.update(openCs1);
268
269 Changeset openCs2 = new Changeset(2);
270 openCs2.setOpen(true);
271 openCs2.setUser(User.createLocalUser("foo"));
272 cache.update(openCs2);
273
274 Changeset closedCs = new Changeset(3);
275 closedCs.setOpen(false);
276 cache.update(closedCs);
277
278 assertEquals(3, cache.getChangesets().size());
279
280 UserIdentityManager.getInstance().setAnonymous();
281 assertEquals(2, cache.getOpenChangesetsForCurrentUser().size());
282
283 UserIdentityManager.getInstance().setPartiallyIdentified("foo");
284 assertEquals(1, cache.getOpenChangesetsForCurrentUser().size());
285 }
286
287 /**
288 * Unit test of methods {@link ChangesetCache#remove}.
289 */
290 @Test
291 void testRemove() {
292 Changeset cs1 = new Changeset(1);
293 cache.update(cs1);
294 assertEquals(1, cache.getChangesets().size());
295
296 cache.remove((Changeset) null);
297 cache.remove(cs1);
298 assertTrue(cache.getChangesets().isEmpty());
299
300 Changeset cs2 = new Changeset(2);
301 cache.update((Collection<Changeset>) null);
302 cache.update(Arrays.asList(cs1, cs2));
303 assertEquals(2, cache.getChangesets().size());
304
305 cache.remove((Collection<Changeset>) null);
306 cache.remove(Arrays.asList(cs1, cs2));
307 assertTrue(cache.getChangesets().isEmpty());
308 }
309}
Note: See TracBrowser for help on using the repository browser.