ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ConcurrentHashMapTest.java
Revision: 1.13
Committed: Sat May 28 14:09:27 2005 UTC (18 years, 11 months ago) by dl
Branch: MAIN
Changes since 1.12: +43 -0 lines
Log Message:
Add toArray tests for views

File Contents

# User Rev Content
1 dl 1.1 /*
2 dl 1.9 * 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 dl 1.1 */
8    
9     import junit.framework.*;
10     import java.util.*;
11     import java.util.concurrent.*;
12     import java.util.Enumeration;
13 dl 1.2 import java.io.*;
14 dl 1.1
15 dl 1.3 public class ConcurrentHashMapTest extends JSR166TestCase{
16 dl 1.1 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 dl 1.5 /**
24     * Create a map from Integers 1-5 to Strings "A"-"E".
25     */
26 dl 1.1 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 dl 1.5 * clear removes all pairs
41 dl 1.1 */
42 dl 1.5 public void testClear() {
43 dl 1.1 ConcurrentHashMap map = map5();
44     map.clear();
45     assertEquals(map.size(), 0);
46     }
47    
48     /**
49 dl 1.5 * 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 dl 1.1 */
64 dl 1.5 public void testContains() {
65 dl 1.1 ConcurrentHashMap map = map5();
66     assertTrue(map.contains("A"));
67     assertFalse(map.contains("Z"));
68     }
69    
70     /**
71 dl 1.5 * containsKey returns true for contained key
72 dl 1.1 */
73 dl 1.5 public void testContainsKey() {
74 dl 1.1 ConcurrentHashMap map = map5();
75     assertTrue(map.containsKey(one));
76 dl 1.5 assertFalse(map.containsKey(zero));
77 dl 1.1 }
78    
79     /**
80 dl 1.5 * containsValue returns true for held values
81 dl 1.1 */
82 dl 1.5 public void testContainsValue() {
83 dl 1.1 ConcurrentHashMap map = map5();
84 dl 1.11 assertTrue(map.containsValue("A"));
85     assertFalse(map.containsValue("Z"));
86 dl 1.1 }
87    
88     /**
89 dl 1.4 * enumeration returns an enumeration containing the correct
90     * elements
91 dl 1.1 */
92 dl 1.5 public void testEnumeration() {
93 dl 1.1 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 dl 1.4 }
102    
103     /**
104 dl 1.5 * get returns the correct element at the given key,
105     * or null if not present
106 dl 1.1 */
107 dl 1.5 public void testGet() {
108 dl 1.1 ConcurrentHashMap map = map5();
109     assertEquals("A", (String)map.get(one));
110     ConcurrentHashMap empty = new ConcurrentHashMap();
111 dl 1.5 assertNull(map.get("anything"));
112 dl 1.1 }
113    
114     /**
115 dl 1.5 * isEmpty is true of empty map and false for non-empty
116 dl 1.1 */
117 dl 1.5 public void testIsEmpty() {
118 dl 1.1 ConcurrentHashMap empty = new ConcurrentHashMap();
119     ConcurrentHashMap map = map5();
120     assertTrue(empty.isEmpty());
121     assertFalse(map.isEmpty());
122     }
123    
124     /**
125 dl 1.3 * keys returns an enumeration containing all the keys from the map
126 dl 1.1 */
127 dl 1.5 public void testKeys() {
128 dl 1.1 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 dl 1.3 * keySet returns a Set containing all the keys
140 dl 1.1 */
141 dl 1.5 public void testKeySet() {
142 dl 1.1 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 dl 1.5 /**
153 dl 1.13 * 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 dl 1.5 * values collection contains all values
197     */
198     public void testValues() {
199 dl 1.1 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 dl 1.5 /**
210     * entrySet contains all pairs
211     */
212     public void testEntrySet() {
213 dl 1.1 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 dl 1.3 * putAll adds all key-value pairs from the given map
230 dl 1.1 */
231 dl 1.5 public void testPutAll() {
232 dl 1.1 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 dl 1.3 * putIfAbsent works when the given key is not present
245 dl 1.1 */
246 dl 1.5 public void testPutIfAbsent() {
247 dl 1.1 ConcurrentHashMap map = map5();
248 dl 1.7 map.putIfAbsent(six, "Z");
249     assertTrue(map.containsKey(six));
250 dl 1.1 }
251    
252     /**
253 dl 1.3 * putIfAbsent does not add the pair if the key is already present
254 dl 1.1 */
255 dl 1.5 public void testPutIfAbsent2() {
256 dl 1.1 ConcurrentHashMap map = map5();
257     assertEquals("A", map.putIfAbsent(one, "Z"));
258     }
259    
260     /**
261 dl 1.7 * replace fails when the given key is not present
262     */
263     public void testReplace() {
264     ConcurrentHashMap map = map5();
265 dl 1.8 assertNull(map.replace(six, "Z"));
266 dl 1.7 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 dl 1.8 assertNotNull(map.replace(one, "Z"));
275 dl 1.7 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 dl 1.3 * remove removes the correct key-value pair from the map
302 dl 1.1 */
303 dl 1.5 public void testRemove() {
304 dl 1.1 ConcurrentHashMap map = map5();
305     map.remove(five);
306     assertEquals(4, map.size());
307     assertFalse(map.containsKey(five));
308     }
309    
310 dl 1.5 /**
311     * remove(key,value) removes only if pair present
312     */
313     public void testRemove2() {
314 dl 1.1 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 dl 1.3 * size returns the correct values
326 dl 1.1 */
327 dl 1.5 public void testSize() {
328 dl 1.1 ConcurrentHashMap map = map5();
329     ConcurrentHashMap empty = new ConcurrentHashMap();
330     assertEquals(0, empty.size());
331     assertEquals(5, map.size());
332     }
333    
334 dl 1.5 /**
335     * toString contains toString of elements
336     */
337     public void testToString() {
338 dl 1.1 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 dl 1.5 /**
348     * Cannot create with negative capacity
349     */
350     public void testConstructor1() {
351     try {
352 dl 1.1 new ConcurrentHashMap(-1,0,1);
353 dl 1.5 shouldThrow();
354     } catch(IllegalArgumentException e){}
355 dl 1.1 }
356    
357 dl 1.5 /**
358     * Cannot create with negative concurrency level
359     */
360     public void testConstructor2() {
361     try {
362 dl 1.1 new ConcurrentHashMap(1,0,-1);
363 dl 1.5 shouldThrow();
364     } catch(IllegalArgumentException e){}
365 dl 1.1 }
366    
367 dl 1.5 /**
368     * Cannot create with only negative capacity
369     */
370     public void testConstructor3() {
371     try {
372 dl 1.1 new ConcurrentHashMap(-1);
373 dl 1.5 shouldThrow();
374     } catch(IllegalArgumentException e){}
375 dl 1.1 }
376    
377 dl 1.5 /**
378     * get(null) throws NPE
379     */
380     public void testGet_NullPointerException() {
381     try {
382 dl 1.1 ConcurrentHashMap c = new ConcurrentHashMap(5);
383     c.get(null);
384 dl 1.5 shouldThrow();
385     } catch(NullPointerException e){}
386 dl 1.1 }
387    
388 dl 1.5 /**
389     * containsKey(null) throws NPE
390     */
391     public void testContainsKey_NullPointerException() {
392     try {
393 dl 1.1 ConcurrentHashMap c = new ConcurrentHashMap(5);
394     c.containsKey(null);
395 dl 1.5 shouldThrow();
396     } catch(NullPointerException e){}
397 dl 1.1 }
398    
399 dl 1.5 /**
400     * containsValue(null) throws NPE
401     */
402     public void testContainsValue_NullPointerException() {
403     try {
404 dl 1.1 ConcurrentHashMap c = new ConcurrentHashMap(5);
405     c.containsValue(null);
406 dl 1.5 shouldThrow();
407     } catch(NullPointerException e){}
408 dl 1.1 }
409    
410 dl 1.5 /**
411     * contains(null) throws NPE
412     */
413     public void testContains_NullPointerException() {
414     try {
415 dl 1.1 ConcurrentHashMap c = new ConcurrentHashMap(5);
416     c.contains(null);
417 dl 1.5 shouldThrow();
418     } catch(NullPointerException e){}
419 dl 1.1 }
420    
421 dl 1.5 /**
422     * put(null,x) throws NPE
423     */
424     public void testPut1_NullPointerException() {
425     try {
426 dl 1.1 ConcurrentHashMap c = new ConcurrentHashMap(5);
427     c.put(null, "whatever");
428 dl 1.5 shouldThrow();
429     } catch(NullPointerException e){}
430 dl 1.1 }
431    
432 dl 1.5 /**
433     * put(x, null) throws NPE
434     */
435     public void testPut2_NullPointerException() {
436     try {
437 dl 1.1 ConcurrentHashMap c = new ConcurrentHashMap(5);
438     c.put("whatever", null);
439 dl 1.5 shouldThrow();
440     } catch(NullPointerException e){}
441 dl 1.1 }
442    
443 dl 1.5 /**
444     * putIfAbsent(null, x) throws NPE
445     */
446     public void testPutIfAbsent1_NullPointerException() {
447     try {
448 dl 1.1 ConcurrentHashMap c = new ConcurrentHashMap(5);
449     c.putIfAbsent(null, "whatever");
450 dl 1.5 shouldThrow();
451     } catch(NullPointerException e){}
452 dl 1.1 }
453    
454 dl 1.5 /**
455 dl 1.7 * 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 dl 1.5 * putIfAbsent(x, null) throws NPE
478     */
479     public void testPutIfAbsent2_NullPointerException() {
480     try {
481 dl 1.1 ConcurrentHashMap c = new ConcurrentHashMap(5);
482     c.putIfAbsent("whatever", null);
483 dl 1.7 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 dl 1.5 shouldThrow();
518     } catch(NullPointerException e){}
519 dl 1.1 }
520    
521    
522 dl 1.5 /**
523     * remove(null) throws NPE
524     */
525     public void testRemove1_NullPointerException() {
526     try {
527 dl 1.1 ConcurrentHashMap c = new ConcurrentHashMap(5);
528     c.put("sadsdf", "asdads");
529     c.remove(null);
530 dl 1.5 shouldThrow();
531     } catch(NullPointerException e){}
532 dl 1.1 }
533    
534 dl 1.5 /**
535     * remove(null, x) throws NPE
536     */
537     public void testRemove2_NullPointerException() {
538     try {
539 dl 1.1 ConcurrentHashMap c = new ConcurrentHashMap(5);
540     c.put("sadsdf", "asdads");
541     c.remove(null, "whatever");
542 dl 1.5 shouldThrow();
543     } catch(NullPointerException e){}
544 dl 1.1 }
545 dl 1.2
546 dl 1.5 /**
547 dl 1.12 * 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 dl 1.5 * A deserialized map equals original
561     */
562 dl 1.2 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 dl 1.5 unexpectedException();
580 dl 1.2 }
581     }
582 dl 1.6
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 dl 1.1
607     }