ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AtomicMarkableReferenceTest.java
Revision: 1.13
Committed: Tue Dec 1 09:56:28 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.12: +17 -18 lines
Log Message:
use stricter assertions, e.g. assertSame

File Contents

# User Rev Content
1 dl 1.1 /*
2 dl 1.5 * 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 jsr166 1.7 * 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.concurrent.atomic.*;
11    
12 jsr166 1.9 public class AtomicMarkableReferenceTest extends JSR166TestCase {
13 dl 1.1 public static void main (String[] args) {
14     junit.textui.TestRunner.run (suite());
15     }
16     public static Test suite() {
17     return new TestSuite(AtomicMarkableReferenceTest.class);
18     }
19 jsr166 1.7
20 dl 1.3 /**
21 dl 1.6 * constructor initializes to given reference and mark
22 dl 1.3 */
23 jsr166 1.9 public void testConstructor() {
24 dl 1.1 AtomicMarkableReference ai = new AtomicMarkableReference(one, false);
25 jsr166 1.13 assertSame(one,ai.getReference());
26 jsr166 1.12 assertFalse(ai.isMarked());
27 dl 1.1 AtomicMarkableReference a2 = new AtomicMarkableReference(null, true);
28 jsr166 1.12 assertNull(a2.getReference());
29     assertTrue(a2.isMarked());
30 dl 1.1 }
31    
32 dl 1.3 /**
33 dl 1.4 * get returns the last values of reference and mark set
34 dl 1.3 */
35 jsr166 1.9 public void testGetSet() {
36 dl 1.1 boolean[] mark = new boolean[1];
37     AtomicMarkableReference ai = new AtomicMarkableReference(one, false);
38 jsr166 1.13 assertSame(one,ai.getReference());
39 jsr166 1.12 assertFalse(ai.isMarked());
40 jsr166 1.13 assertSame(one, ai.get(mark));
41 dl 1.1 assertFalse(mark[0]);
42 jsr166 1.12 ai.set(two, false);
43 jsr166 1.13 assertSame(two,ai.getReference());
44 jsr166 1.12 assertFalse(ai.isMarked());
45 jsr166 1.13 assertSame(two, ai.get(mark));
46 dl 1.1 assertFalse(mark[0]);
47 jsr166 1.12 ai.set(one, true);
48 jsr166 1.13 assertSame(one,ai.getReference());
49 jsr166 1.12 assertTrue(ai.isMarked());
50 jsr166 1.13 assertSame(one, ai.get(mark));
51 dl 1.1 assertTrue(mark[0]);
52     }
53    
54 dl 1.3 /**
55 dl 1.4 * attemptMark succeeds in single thread
56 dl 1.3 */
57 jsr166 1.9 public void testAttemptMark() {
58 dl 1.1 boolean[] mark = new boolean[1];
59     AtomicMarkableReference ai = new AtomicMarkableReference(one, false);
60     assertFalse(ai.isMarked());
61     assertTrue(ai.attemptMark(one, true));
62 jsr166 1.12 assertTrue(ai.isMarked());
63 jsr166 1.13 assertSame(one, ai.get(mark));
64 dl 1.1 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 jsr166 1.9 public void testCompareAndSet() {
72 dl 1.1 boolean[] mark = new boolean[1];
73     AtomicMarkableReference ai = new AtomicMarkableReference(one, false);
74 jsr166 1.13 assertSame(one, ai.get(mark));
75 dl 1.1 assertFalse(ai.isMarked());
76 jsr166 1.12 assertFalse(mark[0]);
77 dl 1.1
78     assertTrue(ai.compareAndSet(one, two, false, false));
79 jsr166 1.13 assertSame(two, ai.get(mark));
80 jsr166 1.12 assertFalse(mark[0]);
81 dl 1.1
82     assertTrue(ai.compareAndSet(two, m3, false, true));
83 jsr166 1.13 assertSame(m3, ai.get(mark));
84 jsr166 1.12 assertTrue(mark[0]);
85 dl 1.1
86     assertFalse(ai.compareAndSet(two, m3, true, true));
87 jsr166 1.13 assertSame(m3, ai.get(mark));
88 jsr166 1.12 assertTrue(mark[0]);
89 dl 1.1 }
90    
91 dl 1.3 /**
92 dl 1.4 * compareAndSet in one thread enables another waiting for reference value
93     * to succeed
94     */
95 jsr166 1.10 public void testCompareAndSetInMultipleThreads() throws Exception {
96 dl 1.4 final AtomicMarkableReference ai = new AtomicMarkableReference(one, false);
97 jsr166 1.11 Thread t = new Thread(new CheckedRunnable() {
98     public void realRun() {
99     while (!ai.compareAndSet(two, three, false, false))
100     Thread.yield();
101     }});
102 jsr166 1.10
103     t.start();
104     assertTrue(ai.compareAndSet(one, two, false, false));
105     t.join(LONG_DELAY_MS);
106     assertFalse(t.isAlive());
107 jsr166 1.13 assertSame(ai.getReference(), three);
108 jsr166 1.10 assertFalse(ai.isMarked());
109 dl 1.4 }
110    
111     /**
112     * compareAndSet in one thread enables another waiting for mark value
113     * to succeed
114     */
115 jsr166 1.10 public void testCompareAndSetInMultipleThreads2() throws Exception {
116 dl 1.4 final AtomicMarkableReference ai = new AtomicMarkableReference(one, false);
117 jsr166 1.11 Thread t = new Thread(new CheckedRunnable() {
118     public void realRun() {
119     while (!ai.compareAndSet(one, one, true, false))
120     Thread.yield();
121     }});
122 jsr166 1.10
123     t.start();
124     assertTrue(ai.compareAndSet(one, one, false, true));
125     t.join(LONG_DELAY_MS);
126     assertFalse(t.isAlive());
127 jsr166 1.13 assertSame(ai.getReference(), one);
128 jsr166 1.10 assertFalse(ai.isMarked());
129 dl 1.4 }
130    
131     /**
132     * repeated weakCompareAndSet succeeds in changing values when equal
133 jsr166 1.7 * to expected
134 dl 1.3 */
135 jsr166 1.9 public void testWeakCompareAndSet() {
136 dl 1.1 boolean[] mark = new boolean[1];
137     AtomicMarkableReference ai = new AtomicMarkableReference(one, false);
138 jsr166 1.13 assertSame(one, ai.get(mark));
139 dl 1.1 assertFalse(ai.isMarked());
140 jsr166 1.12 assertFalse(mark[0]);
141 dl 1.1
142 jsr166 1.8 while (!ai.weakCompareAndSet(one, two, false, false));
143 jsr166 1.13 assertSame(two, ai.get(mark));
144 jsr166 1.12 assertFalse(mark[0]);
145 dl 1.1
146 jsr166 1.8 while (!ai.weakCompareAndSet(two, m3, false, true));
147 jsr166 1.13 assertSame(m3, ai.get(mark));
148 jsr166 1.12 assertTrue(mark[0]);
149 dl 1.1 }
150    
151     }