Clover Coverage Report - Backport Util Concurrent v3.0
Coverage timestamp: Fri May 9 2008 11:05:23 EST
28   106   14   3.5
8   62   0.5   4
8     1.75  
2    
 
  ThreadLocalTest       Line # 12 14 8 77.3% 0.77272725
  ThreadLocalTest.ITLThread       Line # 61 14 6 95.5% 0.95454544
 
  (1)
 
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 edu.emory.mathcs.backport.java.util.concurrent.Semaphore;
11   
 
12    public class ThreadLocalTest extends JSR166TestCase {
 
13  0 toggle public static void main(String[] args) {
14  0 junit.textui.TestRunner.run(suite());
15    }
16   
 
17  1 toggle public static Test suite() {
18  1 return new TestSuite(ThreadLocalTest.class);
19    }
20   
21    static ThreadLocal tl = new ThreadLocal() {
 
22  0 toggle public Object initialValue() {
23  0 return one;
24    }
25    };
26   
27    static InheritableThreadLocal itl =
28    new InheritableThreadLocal() {
 
29  1 toggle protected Object initialValue() {
30  1 return zero;
31    }
32   
 
33  9 toggle protected Object childValue(Object parentValue) {
34  9 return new Integer(((Integer)parentValue).intValue() + 1);
35    }
36    };
37   
38    // /**
39    // * remove causes next access to return initial value
40    // */
41    // public void testRemove() {
42    // assertEquals(tl.get(), one);
43    // tl.set(two);
44    // assertEquals(tl.get(), two);
45    // tl.remove();
46    // assertEquals(tl.get(), one);
47    // }
48    //
49    // /**
50    // * remove in InheritableThreadLocal causes next access to return
51    // * initial value
52    // */
53    // public void testRemoveITL() {
54    // assertEquals(itl.get(), zero);
55    // itl.set(two);
56    // assertEquals(itl.get(), two);
57    // itl.remove();
58    // assertEquals(itl.get(), zero);
59    // }
60   
 
61    private class ITLThread extends Thread {
62    final int[] x;
 
63  10 toggle ITLThread(int[] array) { x = array; }
 
64  10 toggle public void run() {
65  10 Thread child = null;
66  10 if (((Integer)itl.get()).intValue() < x.length - 1) {
67  9 child = new ITLThread(x);
68  9 child.start();
69    }
70  10 Thread.currentThread().yield();
71   
72  5 int threadId = ((Integer)itl.get()).intValue();
73  55 for (int j = 0; j < threadId; j++) {
74  45 x[threadId]++;
75  45 Thread.currentThread().yield();
76    }
77   
78  10 if (child != null) { // Wait for child (if any)
79  9 try {
80  9 child.join();
81    } catch(InterruptedException e) {
82  0 threadUnexpectedException();
83    }
84    }
85    }
86    }
87   
88    /**
89    * InheritableThreadLocal propagates generic values.
90    */
 
91  1 toggle public void testGenericITL() {
92  1 final int threadCount = 10;
93  1 final int x[] = new int[threadCount];
94  1 Thread progenitor = new ITLThread(x);
95  1 try {
96  1 progenitor.start();
97  1 progenitor.join();
98  11 for(int i = 0; i < threadCount; i++) {
99  10 assertEquals(i, x[i]);
100    }
101    } catch(InterruptedException e) {
102  0 unexpectedException();
103    }
104    }
105    }
106