ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ConcurrentHashMapTest.java
Revision: 1.22
Committed: Sat Oct 9 19:30:34 2010 UTC (13 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.21: +22 -22 lines
Log Message:
whitespace

File Contents

# Content
1 /*
2 * Written by Doug Lea with assistance from members of JCP JSR-166
3 * Expert Group and released to the public domain, as explained at
4 * http://creativecommons.org/licenses/publicdomain
5 * Other contributors include Andrew Wright, Jeffrey Hayes,
6 * Pat Fisher, Mike Judd.
7 */
8
9 import junit.framework.*;
10 import java.util.*;
11 import java.util.concurrent.*;
12 import java.util.Enumeration;
13 import java.io.*;
14
15 public class ConcurrentHashMapTest extends JSR166TestCase {
16 public static void main(String[] args) {
17 junit.textui.TestRunner.run(suite());
18 }
19 public static Test suite() {
20 return new TestSuite(ConcurrentHashMapTest.class);
21 }
22
23 /**
24 * Create a map from Integers 1-5 to Strings "A"-"E".
25 */
26 private static ConcurrentHashMap map5() {
27 ConcurrentHashMap map = new ConcurrentHashMap(5);
28 assertTrue(map.isEmpty());
29 map.put(one, "A");
30 map.put(two, "B");
31 map.put(three, "C");
32 map.put(four, "D");
33 map.put(five, "E");
34 assertFalse(map.isEmpty());
35 assertEquals(5, map.size());
36 return map;
37 }
38
39 /**
40 * clear removes all pairs
41 */
42 public void testClear() {
43 ConcurrentHashMap map = map5();
44 map.clear();
45 assertEquals(map.size(), 0);
46 }
47
48 /**
49 * Maps with same contents are equal
50 */
51 public void testEquals() {
52 ConcurrentHashMap map1 = map5();
53 ConcurrentHashMap map2 = map5();
54 assertEquals(map1, map2);
55 assertEquals(map2, map1);
56 map1.clear();
57 assertFalse(map1.equals(map2));
58 assertFalse(map2.equals(map1));
59 }
60
61 /**
62 * contains returns true for contained value
63 */
64 public void testContains() {
65 ConcurrentHashMap map = map5();
66 assertTrue(map.contains("A"));
67 assertFalse(map.contains("Z"));
68 }
69
70 /**
71 * containsKey returns true for contained key
72 */
73 public void testContainsKey() {
74 ConcurrentHashMap map = map5();
75 assertTrue(map.containsKey(one));
76 assertFalse(map.containsKey(zero));
77 }
78
79 /**
80 * containsValue returns true for held values
81 */
82 public void testContainsValue() {
83 ConcurrentHashMap map = map5();
84 assertTrue(map.containsValue("A"));
85 assertFalse(map.containsValue("Z"));
86 }
87
88 /**
89 * enumeration returns an enumeration containing the correct
90 * elements
91 */
92 public void testEnumeration() {
93 ConcurrentHashMap map = map5();
94 Enumeration e = map.elements();
95 int count = 0;
96 while (e.hasMoreElements()) {
97 count++;
98 e.nextElement();
99 }
100 assertEquals(5, count);
101 }
102
103 /**
104 * get returns the correct element at the given key,
105 * or null if not present
106 */
107 public void testGet() {
108 ConcurrentHashMap map = map5();
109 assertEquals("A", (String)map.get(one));
110 ConcurrentHashMap empty = new ConcurrentHashMap();
111 assertNull(map.get("anything"));
112 }
113
114 /**
115 * isEmpty is true of empty map and false for non-empty
116 */
117 public void testIsEmpty() {
118 ConcurrentHashMap empty = new ConcurrentHashMap();
119 ConcurrentHashMap map = map5();
120 assertTrue(empty.isEmpty());
121 assertFalse(map.isEmpty());
122 }
123
124 /**
125 * keys returns an enumeration containing all the keys from the map
126 */
127 public void testKeys() {
128 ConcurrentHashMap map = map5();
129 Enumeration e = map.keys();
130 int count = 0;
131 while (e.hasMoreElements()) {
132 count++;
133 e.nextElement();
134 }
135 assertEquals(5, count);
136 }
137
138 /**
139 * keySet returns a Set containing all the keys
140 */
141 public void testKeySet() {
142 ConcurrentHashMap map = map5();
143 Set s = map.keySet();
144 assertEquals(5, s.size());
145 assertTrue(s.contains(one));
146 assertTrue(s.contains(two));
147 assertTrue(s.contains(three));
148 assertTrue(s.contains(four));
149 assertTrue(s.contains(five));
150 }
151
152 /**
153 * keySet.toArray returns contains all keys
154 */
155 public void testKeySetToArray() {
156 ConcurrentHashMap map = map5();
157 Set s = map.keySet();
158 Object[] ar = s.toArray();
159 assertTrue(s.containsAll(Arrays.asList(ar)));
160 assertEquals(5, ar.length);
161 ar[0] = m10;
162 assertFalse(s.containsAll(Arrays.asList(ar)));
163 }
164
165 /**
166 * Values.toArray contains all values
167 */
168 public void testValuesToArray() {
169 ConcurrentHashMap map = map5();
170 Collection v = map.values();
171 Object[] ar = v.toArray();
172 ArrayList s = new ArrayList(Arrays.asList(ar));
173 assertEquals(5, ar.length);
174 assertTrue(s.contains("A"));
175 assertTrue(s.contains("B"));
176 assertTrue(s.contains("C"));
177 assertTrue(s.contains("D"));
178 assertTrue(s.contains("E"));
179 }
180
181 /**
182 * entrySet.toArray contains all entries
183 */
184 public void testEntrySetToArray() {
185 ConcurrentHashMap map = map5();
186 Set s = map.entrySet();
187 Object[] ar = s.toArray();
188 assertEquals(5, ar.length);
189 for (int i = 0; i < 5; ++i) {
190 assertTrue(map.containsKey(((Map.Entry)(ar[i])).getKey()));
191 assertTrue(map.containsValue(((Map.Entry)(ar[i])).getValue()));
192 }
193 }
194
195 /**
196 * values collection contains all values
197 */
198 public void testValues() {
199 ConcurrentHashMap map = map5();
200 Collection s = map.values();
201 assertEquals(5, s.size());
202 assertTrue(s.contains("A"));
203 assertTrue(s.contains("B"));
204 assertTrue(s.contains("C"));
205 assertTrue(s.contains("D"));
206 assertTrue(s.contains("E"));
207 }
208
209 /**
210 * entrySet contains all pairs
211 */
212 public void testEntrySet() {
213 ConcurrentHashMap map = map5();
214 Set s = map.entrySet();
215 assertEquals(5, s.size());
216 Iterator it = s.iterator();
217 while (it.hasNext()) {
218 Map.Entry e = (Map.Entry) it.next();
219 assertTrue(
220 (e.getKey().equals(one) && e.getValue().equals("A")) ||
221 (e.getKey().equals(two) && e.getValue().equals("B")) ||
222 (e.getKey().equals(three) && e.getValue().equals("C")) ||
223 (e.getKey().equals(four) && e.getValue().equals("D")) ||
224 (e.getKey().equals(five) && e.getValue().equals("E")));
225 }
226 }
227
228 /**
229 * putAll adds all key-value pairs from the given map
230 */
231 public void testPutAll() {
232 ConcurrentHashMap empty = new ConcurrentHashMap();
233 ConcurrentHashMap map = map5();
234 empty.putAll(map);
235 assertEquals(5, empty.size());
236 assertTrue(empty.containsKey(one));
237 assertTrue(empty.containsKey(two));
238 assertTrue(empty.containsKey(three));
239 assertTrue(empty.containsKey(four));
240 assertTrue(empty.containsKey(five));
241 }
242
243 /**
244 * putIfAbsent works when the given key is not present
245 */
246 public void testPutIfAbsent() {
247 ConcurrentHashMap map = map5();
248 map.putIfAbsent(six, "Z");
249 assertTrue(map.containsKey(six));
250 }
251
252 /**
253 * putIfAbsent does not add the pair if the key is already present
254 */
255 public void testPutIfAbsent2() {
256 ConcurrentHashMap map = map5();
257 assertEquals("A", map.putIfAbsent(one, "Z"));
258 }
259
260 /**
261 * replace fails when the given key is not present
262 */
263 public void testReplace() {
264 ConcurrentHashMap map = map5();
265 assertNull(map.replace(six, "Z"));
266 assertFalse(map.containsKey(six));
267 }
268
269 /**
270 * replace succeeds if the key is already present
271 */
272 public void testReplace2() {
273 ConcurrentHashMap map = map5();
274 assertNotNull(map.replace(one, "Z"));
275 assertEquals("Z", map.get(one));
276 }
277
278
279 /**
280 * replace value fails when the given key not mapped to expected value
281 */
282 public void testReplaceValue() {
283 ConcurrentHashMap map = map5();
284 assertEquals("A", map.get(one));
285 assertFalse(map.replace(one, "Z", "Z"));
286 assertEquals("A", map.get(one));
287 }
288
289 /**
290 * replace value succeeds when the given key mapped to expected value
291 */
292 public void testReplaceValue2() {
293 ConcurrentHashMap map = map5();
294 assertEquals("A", map.get(one));
295 assertTrue(map.replace(one, "A", "Z"));
296 assertEquals("Z", map.get(one));
297 }
298
299
300 /**
301 * remove removes the correct key-value pair from the map
302 */
303 public void testRemove() {
304 ConcurrentHashMap map = map5();
305 map.remove(five);
306 assertEquals(4, map.size());
307 assertFalse(map.containsKey(five));
308 }
309
310 /**
311 * remove(key,value) removes only if pair present
312 */
313 public void testRemove2() {
314 ConcurrentHashMap map = map5();
315 map.remove(five, "E");
316 assertEquals(4, map.size());
317 assertFalse(map.containsKey(five));
318 map.remove(four, "A");
319 assertEquals(4, map.size());
320 assertTrue(map.containsKey(four));
321 }
322
323 /**
324 * size returns the correct values
325 */
326 public void testSize() {
327 ConcurrentHashMap map = map5();
328 ConcurrentHashMap empty = new ConcurrentHashMap();
329 assertEquals(0, empty.size());
330 assertEquals(5, map.size());
331 }
332
333 /**
334 * toString contains toString of elements
335 */
336 public void testToString() {
337 ConcurrentHashMap map = map5();
338 String s = map.toString();
339 for (int i = 1; i <= 5; ++i) {
340 assertTrue(s.indexOf(String.valueOf(i)) >= 0);
341 }
342 }
343
344 // Exception tests
345
346 /**
347 * Cannot create with negative capacity
348 */
349 public void testConstructor1() {
350 try {
351 new ConcurrentHashMap(-1,0,1);
352 shouldThrow();
353 } catch (IllegalArgumentException success) {}
354 }
355
356 /**
357 * Cannot create with negative concurrency level
358 */
359 public void testConstructor2() {
360 try {
361 new ConcurrentHashMap(1,0,-1);
362 shouldThrow();
363 } catch (IllegalArgumentException success) {}
364 }
365
366 /**
367 * Cannot create with only negative capacity
368 */
369 public void testConstructor3() {
370 try {
371 new ConcurrentHashMap(-1);
372 shouldThrow();
373 } catch (IllegalArgumentException success) {}
374 }
375
376 /**
377 * get(null) throws NPE
378 */
379 public void testGet_NullPointerException() {
380 try {
381 ConcurrentHashMap c = new ConcurrentHashMap(5);
382 c.get(null);
383 shouldThrow();
384 } catch (NullPointerException success) {}
385 }
386
387 /**
388 * containsKey(null) throws NPE
389 */
390 public void testContainsKey_NullPointerException() {
391 try {
392 ConcurrentHashMap c = new ConcurrentHashMap(5);
393 c.containsKey(null);
394 shouldThrow();
395 } catch (NullPointerException success) {}
396 }
397
398 /**
399 * containsValue(null) throws NPE
400 */
401 public void testContainsValue_NullPointerException() {
402 try {
403 ConcurrentHashMap c = new ConcurrentHashMap(5);
404 c.containsValue(null);
405 shouldThrow();
406 } catch (NullPointerException success) {}
407 }
408
409 /**
410 * contains(null) throws NPE
411 */
412 public void testContains_NullPointerException() {
413 try {
414 ConcurrentHashMap c = new ConcurrentHashMap(5);
415 c.contains(null);
416 shouldThrow();
417 } catch (NullPointerException success) {}
418 }
419
420 /**
421 * put(null,x) throws NPE
422 */
423 public void testPut1_NullPointerException() {
424 try {
425 ConcurrentHashMap c = new ConcurrentHashMap(5);
426 c.put(null, "whatever");
427 shouldThrow();
428 } catch (NullPointerException success) {}
429 }
430
431 /**
432 * put(x, null) throws NPE
433 */
434 public void testPut2_NullPointerException() {
435 try {
436 ConcurrentHashMap c = new ConcurrentHashMap(5);
437 c.put("whatever", null);
438 shouldThrow();
439 } catch (NullPointerException success) {}
440 }
441
442 /**
443 * putIfAbsent(null, x) throws NPE
444 */
445 public void testPutIfAbsent1_NullPointerException() {
446 try {
447 ConcurrentHashMap c = new ConcurrentHashMap(5);
448 c.putIfAbsent(null, "whatever");
449 shouldThrow();
450 } catch (NullPointerException success) {}
451 }
452
453 /**
454 * replace(null, x) throws NPE
455 */
456 public void testReplace_NullPointerException() {
457 try {
458 ConcurrentHashMap c = new ConcurrentHashMap(5);
459 c.replace(null, "whatever");
460 shouldThrow();
461 } catch (NullPointerException success) {}
462 }
463
464 /**
465 * replace(null, x, y) throws NPE
466 */
467 public void testReplaceValue_NullPointerException() {
468 try {
469 ConcurrentHashMap c = new ConcurrentHashMap(5);
470 c.replace(null, one, "whatever");
471 shouldThrow();
472 } catch (NullPointerException success) {}
473 }
474
475 /**
476 * putIfAbsent(x, null) throws NPE
477 */
478 public void testPutIfAbsent2_NullPointerException() {
479 try {
480 ConcurrentHashMap c = new ConcurrentHashMap(5);
481 c.putIfAbsent("whatever", null);
482 shouldThrow();
483 } catch (NullPointerException success) {}
484 }
485
486
487 /**
488 * replace(x, null) throws NPE
489 */
490 public void testReplace2_NullPointerException() {
491 try {
492 ConcurrentHashMap c = new ConcurrentHashMap(5);
493 c.replace("whatever", null);
494 shouldThrow();
495 } catch (NullPointerException success) {}
496 }
497
498 /**
499 * replace(x, null, y) throws NPE
500 */
501 public void testReplaceValue2_NullPointerException() {
502 try {
503 ConcurrentHashMap c = new ConcurrentHashMap(5);
504 c.replace("whatever", null, "A");
505 shouldThrow();
506 } catch (NullPointerException success) {}
507 }
508
509 /**
510 * replace(x, y, null) throws NPE
511 */
512 public void testReplaceValue3_NullPointerException() {
513 try {
514 ConcurrentHashMap c = new ConcurrentHashMap(5);
515 c.replace("whatever", one, null);
516 shouldThrow();
517 } catch (NullPointerException success) {}
518 }
519
520
521 /**
522 * remove(null) throws NPE
523 */
524 public void testRemove1_NullPointerException() {
525 try {
526 ConcurrentHashMap c = new ConcurrentHashMap(5);
527 c.put("sadsdf", "asdads");
528 c.remove(null);
529 shouldThrow();
530 } catch (NullPointerException success) {}
531 }
532
533 /**
534 * remove(null, x) throws NPE
535 */
536 public void testRemove2_NullPointerException() {
537 try {
538 ConcurrentHashMap c = new ConcurrentHashMap(5);
539 c.put("sadsdf", "asdads");
540 c.remove(null, "whatever");
541 shouldThrow();
542 } catch (NullPointerException success) {}
543 }
544
545 /**
546 * remove(x, null) returns false
547 */
548 public void testRemove3() {
549 ConcurrentHashMap c = new ConcurrentHashMap(5);
550 c.put("sadsdf", "asdads");
551 assertFalse(c.remove("sadsdf", null));
552 }
553
554 /**
555 * A deserialized map equals original
556 */
557 public void testSerialization() throws Exception {
558 ConcurrentHashMap q = map5();
559
560 ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
561 ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
562 out.writeObject(q);
563 out.close();
564
565 ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
566 ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
567 ConcurrentHashMap r = (ConcurrentHashMap)in.readObject();
568 assertEquals(q.size(), r.size());
569 assertTrue(q.equals(r));
570 assertTrue(r.equals(q));
571 }
572
573
574 /**
575 * SetValue of an EntrySet entry sets value in the map.
576 */
577 public void testSetValueWriteThrough() {
578 // Adapted from a bug report by Eric Zoerner
579 ConcurrentHashMap map = new ConcurrentHashMap(2, 5.0f, 1);
580 assertTrue(map.isEmpty());
581 for (int i = 0; i < 20; i++)
582 map.put(new Integer(i), new Integer(i));
583 assertFalse(map.isEmpty());
584 Map.Entry entry1 = (Map.Entry)map.entrySet().iterator().next();
585
586 // assert that entry1 is not 16
587 assertTrue("entry is 16, test not valid",
588 !entry1.getKey().equals(new Integer(16)));
589
590 // remove 16 (a different key) from map
591 // which just happens to cause entry1 to be cloned in map
592 map.remove(new Integer(16));
593 entry1.setValue("XYZ");
594 assertTrue(map.containsValue("XYZ")); // fails
595 }
596
597 }