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

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

see #15229 - see #15182 - fix unit test

  • Property svn:eol-style set to native
File size: 9.8 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.data.osm;
3
4import static org.junit.Assert.assertEquals;
5import static org.junit.Assert.assertFalse;
6import static org.junit.Assert.assertNotNull;
7import static org.junit.Assert.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.After;
16import org.junit.Before;
17import org.junit.Rule;
18import org.junit.Test;
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 */
28public class ChangesetCacheTest {
29
30 /**
31 * Setup test.
32 */
33 @Rule
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 @After
43 @Before
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 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 public void testConstructor() {
76 assertNotNull(ChangesetCache.getInstance());
77 }
78
79 @Test
80 public void testAddAndRemoveListeners() {
81 // should work
82 cache.addChangesetCacheListener(null);
83
84 // should work
85 ChangesetCacheListener listener = new ChangesetCacheListener() {
86 @Override
87 public void changesetCacheUpdated(ChangesetCacheEvent event) {}
88 };
89 cache.addChangesetCacheListener(listener);
90 // adding a second time - should work too
91 cache.addChangesetCacheListener(listener);
92 assertEquals(1, cache.listeners.size()); // ... but only added once
93
94 cache.removeChangesetCacheListener(null);
95
96 cache.removeChangesetCacheListener(listener);
97 assertTrue(cache.listeners.isEmpty());
98 }
99
100 @Test
101 public void testUpdateGetRemoveCycle() {
102 cache.update(new Changeset(1));
103 assertEquals(1, cache.size());
104 assertNotNull(cache.get(1));
105 assertEquals(1, cache.get(1).getId());
106 cache.remove(1);
107 assertEquals(0, cache.size());
108 }
109
110 @Test
111 public void testUpdateTwice() {
112 Changeset cs = new Changeset(1);
113 cs.setIncomplete(false);
114 cs.put("key1", "value1");
115 cs.setOpen(true);
116 cache.update(cs);
117
118 Changeset cs2 = new Changeset(cs);
119 assertNotNull(cs2);
120 cs2.put("key2", "value2");
121 cs2.setOpen(false);
122 cache.update(cs2);
123
124 assertEquals(1, cache.size());
125 assertNotNull(cache.get(1));
126
127 cs = cache.get(1);
128 assertEquals("value1", cs.get("key1"));
129 assertEquals("value2", cs.get("key2"));
130 assertFalse(cs.isOpen());
131 }
132
133 @Test
134 public void testContains() {
135 Changeset cs = new Changeset(1);
136 cache.update(cs);
137
138 assertTrue(cache.contains(1));
139 assertTrue(cache.contains(cs));
140 assertTrue(cache.contains(new Changeset(cs)));
141
142 assertFalse(cache.contains(2));
143 assertFalse(cache.contains(new Changeset(2)));
144 assertFalse(cache.contains(null));
145 }
146
147 @Test
148 public void testFireingEventsAddAChangeset() {
149 TestListener listener = new TestListener() {
150 @Override
151 public void test() {
152 await();
153 assertNotNull(event);
154 assertEquals(1, event.getAddedChangesets().size());
155 assertTrue(event.getRemovedChangesets().isEmpty());
156 assertTrue(event.getUpdatedChangesets().isEmpty());
157 assertEquals(cache, event.getSource());
158 }
159 };
160 cache.addChangesetCacheListener(listener);
161 cache.update(new Changeset(1));
162 listener.test();
163 cache.removeChangesetCacheListener(listener);
164 }
165
166 @Test
167 public void testFireingEventsUpdateChangeset() {
168 // Waiter listener to ensure the second listener does not receive the first event
169 TestListener waiter = new TestListener() {
170 @Override
171 void test() {
172 await();
173 }
174 };
175 cache.addChangesetCacheListener(waiter);
176 Changeset cs = new Changeset(1);
177 cache.update(cs);
178 waiter.test();
179 cache.removeChangesetCacheListener(waiter);
180
181 TestListener listener = new TestListener() {
182 @Override
183 void test() {
184 await();
185 assertNotNull(event);
186 assertTrue(event.getAddedChangesets().isEmpty());
187 assertTrue(event.getRemovedChangesets().isEmpty());
188 assertEquals(1, event.getUpdatedChangesets().size());
189 assertEquals(cache, event.getSource());
190 }
191 };
192 cache.addChangesetCacheListener(listener);
193 cache.update(cs);
194 listener.test();
195 cache.removeChangesetCacheListener(listener);
196 }
197
198 @Test
199 public void testFireingEventsRemoveChangeset() {
200 // Waiter listener to ensure the second listener does not receive the first event
201 TestListener waiter = new TestListener() {
202 @Override
203 void test() {
204 await();
205 }
206 };
207 cache.addChangesetCacheListener(waiter);
208 cache.update(new Changeset(1));
209 waiter.test();
210 cache.removeChangesetCacheListener(waiter);
211
212 TestListener listener = new TestListener() {
213 @Override
214 void test() {
215 await();
216 assertNotNull(event);
217 assertTrue(event.getAddedChangesets().isEmpty());
218 assertEquals(1, event.getRemovedChangesets().size());
219 assertTrue(event.getUpdatedChangesets().isEmpty());
220 assertEquals(cache, event.getSource());
221 }
222 };
223 cache.addChangesetCacheListener(listener);
224 cache.remove(1);
225 listener.test();
226 cache.removeChangesetCacheListener(listener);
227 }
228
229 /**
230 * Unit test of methods {@link ChangesetCache#getOpenChangesets} / {@link ChangesetCache#getChangesets}.
231 */
232 @Test
233 public void testGetOpenChangesets() {
234 // empty cache => empty list
235 assertTrue(
236 "Empty cache should produce an empty list.",
237 cache.getOpenChangesets().isEmpty()
238 );
239 assertTrue(
240 "Empty cache should produce an empty list.",
241 cache.getChangesets().isEmpty()
242 );
243
244 // cache with only closed changesets => empty list
245 Changeset closedCs = new Changeset(1);
246 closedCs.setOpen(false);
247 cache.update(closedCs);
248 assertTrue(
249 "Cache with only closed changesets should produce an empty list.",
250 cache.getOpenChangesets().isEmpty()
251 );
252 assertEquals(1, cache.getChangesets().size());
253
254 // cache with open and closed changesets => list with only the open ones
255 Changeset openCs = new Changeset(2);
256 openCs.setOpen(true);
257 cache.update(openCs);
258 assertEquals(
259 Collections.singletonList(openCs),
260 cache.getOpenChangesets()
261 );
262 assertEquals(2, cache.getChangesets().size());
263 }
264
265 /**
266 * Unit test of method {@link ChangesetCache#getOpenChangesetsForCurrentUser}.
267 */
268 @Test
269 public void testGetOpenChangesetsForCurrentUser() {
270 // empty cache => empty list
271 assertTrue(
272 "Empty cache should produce an empty list.",
273 cache.getOpenChangesetsForCurrentUser().isEmpty()
274 );
275
276 Changeset openCs1 = new Changeset(1);
277 openCs1.setOpen(true);
278 openCs1.setUser(User.getAnonymous());
279 cache.update(openCs1);
280
281 Changeset openCs2 = new Changeset(2);
282 openCs2.setOpen(true);
283 openCs2.setUser(User.createLocalUser("foo"));
284 cache.update(openCs2);
285
286 Changeset closedCs = new Changeset(3);
287 closedCs.setOpen(false);
288 cache.update(closedCs);
289
290 assertEquals(3, cache.getChangesets().size());
291
292 UserIdentityManager.getInstance().setAnonymous();
293 assertEquals(2, cache.getOpenChangesetsForCurrentUser().size());
294
295 UserIdentityManager.getInstance().setPartiallyIdentified("foo");
296 assertEquals(1, cache.getOpenChangesetsForCurrentUser().size());
297 }
298
299 /**
300 * Unit test of methods {@link ChangesetCache#remove}.
301 */
302 @Test
303 public void testRemove() {
304 Changeset cs1 = new Changeset(1);
305 cache.update(cs1);
306 assertEquals(1, cache.getChangesets().size());
307
308 cache.remove((Changeset) null);
309 cache.remove(cs1);
310 assertTrue(cache.getChangesets().isEmpty());
311
312 Changeset cs2 = new Changeset(2);
313 cache.update((Collection<Changeset>) null);
314 cache.update(Arrays.asList(cs1, cs2));
315 assertEquals(2, cache.getChangesets().size());
316
317 cache.remove((Collection<Changeset>) null);
318 cache.remove(Arrays.asList(cs1, cs2));
319 assertTrue(cache.getChangesets().isEmpty());
320 }
321}
Note: See TracBrowser for help on using the repository browser.