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

# Content
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 public class AtomicMarkableReferenceTest extends JSR166TestCase{
12 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 /**
20 * constructeor initializes to given reference and mark
21 */
22 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 /**
33 * get returns the last values of reference and mark set
34 */
35 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 /**
55 * attemptMark succeeds in single thread
56 */
57 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 /**
68 * compareAndSet succeeds in changing values if equal to expected reference
69 * and mark else fails
70 */
71 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 /**
92 * 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 */
141 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 }