ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AtomicMarkableReferenceTest.java
Revision: 1.4
Committed: Thu Sep 25 11:02:41 2003 UTC (20 years, 7 months ago) by dl
Branch: MAIN
CVS Tags: JSR166_NOV3_FREEZE, JSR166_DEC9_PRE_ES_SUBMIT, JSR166_DEC9_POST_ES_SUBMIT
Changes since 1.3: +53 -10 lines
Log Message:
improve tck javadocs; rename and add a few tests

File Contents

# User Rev Content
1 dl 1.1 /*
2     * Written by members of JCP JSR-166 Expert Group and released to the
3     * public domain. Use, modify, and redistribute this code in any way
4     * without acknowledgement. Other contributors include Andrew Wright,
5     * Jeffrey Hayes, Pat Fischer, Mike Judd.
6     */
7    
8     import junit.framework.*;
9     import java.util.concurrent.atomic.*;
10    
11 dl 1.2 public class AtomicMarkableReferenceTest extends JSR166TestCase{
12 dl 1.1 public static void main (String[] args) {
13     junit.textui.TestRunner.run (suite());
14     }
15     public static Test suite() {
16     return new TestSuite(AtomicMarkableReferenceTest.class);
17     }
18    
19 dl 1.3 /**
20 dl 1.4 * constructeor initializes to given reference and mark
21 dl 1.3 */
22 dl 1.1 public void testConstructor(){
23     AtomicMarkableReference ai = new AtomicMarkableReference(one, false);
24     assertEquals(one,ai.getReference());
25     assertFalse(ai.isMarked());
26     AtomicMarkableReference a2 = new AtomicMarkableReference(null, true);
27     assertNull(a2.getReference());
28     assertTrue(a2.isMarked());
29    
30     }
31    
32 dl 1.3 /**
33 dl 1.4 * get returns the last values of reference and mark set
34 dl 1.3 */
35 dl 1.1 public void testGetSet(){
36     boolean[] mark = new boolean[1];
37     AtomicMarkableReference ai = new AtomicMarkableReference(one, false);
38     assertEquals(one,ai.getReference());
39     assertFalse(ai.isMarked());
40     assertEquals(one, ai.get(mark));
41     assertFalse(mark[0]);
42     ai.set(two, false);
43     assertEquals(two,ai.getReference());
44     assertFalse(ai.isMarked());
45     assertEquals(two, ai.get(mark));
46     assertFalse(mark[0]);
47     ai.set(one, true);
48     assertEquals(one,ai.getReference());
49     assertTrue(ai.isMarked());
50     assertEquals(one, ai.get(mark));
51     assertTrue(mark[0]);
52     }
53    
54 dl 1.3 /**
55 dl 1.4 * attemptMark succeeds in single thread
56 dl 1.3 */
57 dl 1.1 public void testAttemptMark(){
58     boolean[] mark = new boolean[1];
59     AtomicMarkableReference ai = new AtomicMarkableReference(one, false);
60     assertFalse(ai.isMarked());
61     assertTrue(ai.attemptMark(one, true));
62     assertTrue(ai.isMarked());
63     assertEquals(one, ai.get(mark));
64     assertTrue(mark[0]);
65     }
66    
67 dl 1.3 /**
68 dl 1.4 * compareAndSet succeeds in changing values if equal to expected reference
69     * and mark else fails
70 dl 1.3 */
71 dl 1.1 public void testCompareAndSet(){
72     boolean[] mark = new boolean[1];
73     AtomicMarkableReference ai = new AtomicMarkableReference(one, false);
74     assertEquals(one, ai.get(mark));
75     assertFalse(ai.isMarked());
76     assertFalse(mark[0]);
77    
78     assertTrue(ai.compareAndSet(one, two, false, false));
79     assertEquals(two, ai.get(mark));
80     assertFalse(mark[0]);
81    
82     assertTrue(ai.compareAndSet(two, m3, false, true));
83     assertEquals(m3, ai.get(mark));
84     assertTrue(mark[0]);
85    
86     assertFalse(ai.compareAndSet(two, m3, true, true));
87     assertEquals(m3, ai.get(mark));
88     assertTrue(mark[0]);
89     }
90    
91 dl 1.3 /**
92 dl 1.4 * compareAndSet in one thread enables another waiting for reference value
93     * to succeed
94     */
95     public void testCompareAndSetInMultipleThreads() {
96     final AtomicMarkableReference ai = new AtomicMarkableReference(one, false);
97     Thread t = new Thread(new Runnable() {
98     public void run() {
99     while(!ai.compareAndSet(two, three, false, false)) Thread.yield();
100     }});
101     try {
102     t.start();
103     assertTrue(ai.compareAndSet(one, two, false, false));
104     t.join(LONG_DELAY_MS);
105     assertFalse(t.isAlive());
106     assertEquals(ai.getReference(), three);
107     assertFalse(ai.isMarked());
108     }
109     catch(Exception e) {
110     unexpectedException();
111     }
112     }
113    
114     /**
115     * compareAndSet in one thread enables another waiting for mark value
116     * to succeed
117     */
118     public void testCompareAndSetInMultipleThreads2() {
119     final AtomicMarkableReference ai = new AtomicMarkableReference(one, false);
120     Thread t = new Thread(new Runnable() {
121     public void run() {
122     while(!ai.compareAndSet(one, one, true, false)) Thread.yield();
123     }});
124     try {
125     t.start();
126     assertTrue(ai.compareAndSet(one, one, false, true));
127     t.join(LONG_DELAY_MS);
128     assertFalse(t.isAlive());
129     assertEquals(ai.getReference(), one);
130     assertFalse(ai.isMarked());
131     }
132     catch(Exception e) {
133     unexpectedException();
134     }
135     }
136    
137     /**
138     * repeated weakCompareAndSet succeeds in changing values when equal
139     * to expected
140 dl 1.3 */
141 dl 1.1 public void testWeakCompareAndSet(){
142     boolean[] mark = new boolean[1];
143     AtomicMarkableReference ai = new AtomicMarkableReference(one, false);
144     assertEquals(one, ai.get(mark));
145     assertFalse(ai.isMarked());
146     assertFalse(mark[0]);
147    
148     while(!ai.weakCompareAndSet(one, two, false, false));
149     assertEquals(two, ai.get(mark));
150     assertFalse(mark[0]);
151    
152     while(!ai.weakCompareAndSet(two, m3, false, true));
153     assertEquals(m3, ai.get(mark));
154     assertTrue(mark[0]);
155     }
156    
157     }