ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ConcurrentHashMapTest.java
Revision: 1.17
Committed: Sat Nov 21 02:07:26 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.16: +79 -79 lines
Log Message:
untabify

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 /**
325 * size returns the correct values
326 */
327 public void testSize() {
328 ConcurrentHashMap map = map5();
329 ConcurrentHashMap empty = new ConcurrentHashMap();
330 assertEquals(0, empty.size());
331 assertEquals(5, map.size());
332 }
333
334 /**
335 * toString contains toString of elements
336 */
337 public void testToString() {
338 ConcurrentHashMap map = map5();
339 String s = map.toString();
340 for (int i = 1; i <= 5; ++i) {
341 assertTrue(s.indexOf(String.valueOf(i)) >= 0);
342 }
343 }
344
345 // Exception tests
346
347 /**
348 * Cannot create with negative capacity
349 */
350 public void testConstructor1() {
351 try {
352 new ConcurrentHashMap(-1,0,1);
353 shouldThrow();
354 } catch (IllegalArgumentException e) {}
355 }
356
357 /**
358 * Cannot create with negative concurrency level
359 */
360 public void testConstructor2() {
361 try {
362 new ConcurrentHashMap(1,0,-1);
363 shouldThrow();
364 } catch (IllegalArgumentException e) {}
365 }
366
367 /**
368 * Cannot create with only negative capacity
369 */
370 public void testConstructor3() {
371 try {
372 new ConcurrentHashMap(-1);
373 shouldThrow();
374 } catch (IllegalArgumentException e) {}
375 }
376
377 /**
378 * get(null) throws NPE
379 */
380 public void testGet_NullPointerException() {
381 try {
382 ConcurrentHashMap c = new ConcurrentHashMap(5);
383 c.get(null);
384 shouldThrow();
385 } catch (NullPointerException e) {}
386 }
387
388 /**
389 * containsKey(null) throws NPE
390 */
391 public void testContainsKey_NullPointerException() {
392 try {
393 ConcurrentHashMap c = new ConcurrentHashMap(5);
394 c.containsKey(null);
395 shouldThrow();
396 } catch (NullPointerException e) {}
397 }
398
399 /**
400 * containsValue(null) throws NPE
401 */
402 public void testContainsValue_NullPointerException() {
403 try {
404 ConcurrentHashMap c = new ConcurrentHashMap(5);
405 c.containsValue(null);
406 shouldThrow();
407 } catch (NullPointerException e) {}
408 }
409
410 /**
411 * contains(null) throws NPE
412 */
413 public void testContains_NullPointerException() {
414 try {
415 ConcurrentHashMap c = new ConcurrentHashMap(5);
416 c.contains(null);
417 shouldThrow();
418 } catch (NullPointerException e) {}
419 }
420
421 /**
422 * put(null,x) throws NPE
423 */
424 public void testPut1_NullPointerException() {
425 try {
426 ConcurrentHashMap c = new ConcurrentHashMap(5);
427 c.put(null, "whatever");
428 shouldThrow();
429 } catch (NullPointerException e) {}
430 }
431
432 /**
433 * put(x, null) throws NPE
434 */
435 public void testPut2_NullPointerException() {
436 try {
437 ConcurrentHashMap c = new ConcurrentHashMap(5);
438 c.put("whatever", null);
439 shouldThrow();
440 } catch (NullPointerException e) {}
441 }
442
443 /**
444 * putIfAbsent(null, x) throws NPE
445 */
446 public void testPutIfAbsent1_NullPointerException() {
447 try {
448 ConcurrentHashMap c = new ConcurrentHashMap(5);
449 c.putIfAbsent(null, "whatever");
450 shouldThrow();
451 } catch (NullPointerException e) {}
452 }
453
454 /**
455 * replace(null, x) throws NPE
456 */
457 public void testReplace_NullPointerException() {
458 try {
459 ConcurrentHashMap c = new ConcurrentHashMap(5);
460 c.replace(null, "whatever");
461 shouldThrow();
462 } catch (NullPointerException e) {}
463 }
464
465 /**
466 * replace(null, x, y) throws NPE
467 */
468 public void testReplaceValue_NullPointerException() {
469 try {
470 ConcurrentHashMap c = new ConcurrentHashMap(5);
471 c.replace(null, one, "whatever");
472 shouldThrow();
473 } catch (NullPointerException e) {}
474 }
475
476 /**
477 * putIfAbsent(x, null) throws NPE
478 */
479 public void testPutIfAbsent2_NullPointerException() {
480 try {
481 ConcurrentHashMap c = new ConcurrentHashMap(5);
482 c.putIfAbsent("whatever", null);
483 shouldThrow();
484 } catch (NullPointerException e) {}
485 }
486
487
488 /**
489 * replace(x, null) throws NPE
490 */
491 public void testReplace2_NullPointerException() {
492 try {
493 ConcurrentHashMap c = new ConcurrentHashMap(5);
494 c.replace("whatever", null);
495 shouldThrow();
496 } catch (NullPointerException e) {}
497 }
498
499 /**
500 * replace(x, null, y) throws NPE
501 */
502 public void testReplaceValue2_NullPointerException() {
503 try {
504 ConcurrentHashMap c = new ConcurrentHashMap(5);
505 c.replace("whatever", null, "A");
506 shouldThrow();
507 } catch (NullPointerException e) {}
508 }
509
510 /**
511 * replace(x, y, null) throws NPE
512 */
513 public void testReplaceValue3_NullPointerException() {
514 try {
515 ConcurrentHashMap c = new ConcurrentHashMap(5);
516 c.replace("whatever", one, null);
517 shouldThrow();
518 } catch (NullPointerException e) {}
519 }
520
521
522 /**
523 * remove(null) throws NPE
524 */
525 public void testRemove1_NullPointerException() {
526 try {
527 ConcurrentHashMap c = new ConcurrentHashMap(5);
528 c.put("sadsdf", "asdads");
529 c.remove(null);
530 shouldThrow();
531 } catch (NullPointerException e) {}
532 }
533
534 /**
535 * remove(null, x) throws NPE
536 */
537 public void testRemove2_NullPointerException() {
538 try {
539 ConcurrentHashMap c = new ConcurrentHashMap(5);
540 c.put("sadsdf", "asdads");
541 c.remove(null, "whatever");
542 shouldThrow();
543 } catch (NullPointerException e) {}
544 }
545
546 /**
547 * remove(x, null) returns false
548 */
549 public void testRemove3() {
550 try {
551 ConcurrentHashMap c = new ConcurrentHashMap(5);
552 c.put("sadsdf", "asdads");
553 assertFalse(c.remove("sadsdf", null));
554 } catch (NullPointerException e) {
555 fail();
556 }
557 }
558
559 /**
560 * A deserialized map equals original
561 */
562 public void testSerialization() {
563 ConcurrentHashMap q = map5();
564
565 try {
566 ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
567 ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
568 out.writeObject(q);
569 out.close();
570
571 ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
572 ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
573 ConcurrentHashMap r = (ConcurrentHashMap)in.readObject();
574 assertEquals(q.size(), r.size());
575 assertTrue(q.equals(r));
576 assertTrue(r.equals(q));
577 } catch (Exception e) {
578 e.printStackTrace();
579 unexpectedException();
580 }
581 }
582
583
584 /**
585 * SetValue of an EntrySet entry sets value in the map.
586 */
587 public void testSetValueWriteThrough() {
588 // Adapted from a bug report by Eric Zoerner
589 ConcurrentHashMap map = new ConcurrentHashMap(2, 5.0f, 1);
590 assertTrue(map.isEmpty());
591 for (int i = 0; i < 20; i++)
592 map.put(new Integer(i), new Integer(i));
593 assertFalse(map.isEmpty());
594 Map.Entry entry1 = (Map.Entry)map.entrySet().iterator().next();
595
596 // assert that entry1 is not 16
597 assertTrue("entry is 16, test not valid",
598 !entry1.getKey().equals(new Integer(16)));
599
600 // remove 16 (a different key) from map
601 // which just happens to cause entry1 to be cloned in map
602 map.remove(new Integer(16));
603 entry1.setValue("XYZ");
604 assertTrue(map.containsValue("XYZ")); // fails
605 }
606
607 }