blob: 0eb978588b5fecd51c4deeb8ecc3b545fd482161 [file] [log] [blame]
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001/*
2 * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/*
25 * @test
26 * @run testng/othervm -Diters=20000 VarHandleTestMethodHandleAccessString
27 */
28
29import org.testng.annotations.BeforeClass;
30import org.testng.annotations.DataProvider;
31import org.testng.annotations.Test;
32
33import java.lang.invoke.MethodHandles;
34import java.lang.invoke.VarHandle;
35import java.util.ArrayList;
36import java.util.Arrays;
37import java.util.List;
38
39import static org.testng.Assert.*;
40
41public class VarHandleTestMethodHandleAccessString extends VarHandleBaseTest {
42 static final String static_final_v = "foo";
43
44 static String static_v;
45
46 final String final_v = "foo";
47
48 String v;
49
50 VarHandle vhFinalField;
51
52 VarHandle vhField;
53
54 VarHandle vhStaticField;
55
56 VarHandle vhStaticFinalField;
57
58 VarHandle vhArray;
59
60 @BeforeClass
61 public void setup() throws Exception {
62 vhFinalField = MethodHandles.lookup().findVarHandle(
63 VarHandleTestMethodHandleAccessString.class, "final_v", String.class);
64
65 vhField = MethodHandles.lookup().findVarHandle(
66 VarHandleTestMethodHandleAccessString.class, "v", String.class);
67
68 vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle(
69 VarHandleTestMethodHandleAccessString.class, "static_final_v", String.class);
70
71 vhStaticField = MethodHandles.lookup().findStaticVarHandle(
72 VarHandleTestMethodHandleAccessString.class, "static_v", String.class);
73
74 vhArray = MethodHandles.arrayElementVarHandle(String[].class);
75 }
76
77
78 @DataProvider
79 public Object[][] accessTestCaseProvider() throws Exception {
80 List<AccessTestCase<?>> cases = new ArrayList<>();
81
82 for (VarHandleToMethodHandle f : VarHandleToMethodHandle.values()) {
83 cases.add(new MethodHandleAccessTestCase("Instance field",
84 vhField, f, hs -> testInstanceField(this, hs)));
85 cases.add(new MethodHandleAccessTestCase("Instance field unsupported",
86 vhField, f, hs -> testInstanceFieldUnsupported(this, hs),
87 false));
88
89 cases.add(new MethodHandleAccessTestCase("Static field",
90 vhStaticField, f, VarHandleTestMethodHandleAccessString::testStaticField));
91 cases.add(new MethodHandleAccessTestCase("Static field unsupported",
92 vhStaticField, f, VarHandleTestMethodHandleAccessString::testStaticFieldUnsupported,
93 false));
94
95 cases.add(new MethodHandleAccessTestCase("Array",
96 vhArray, f, VarHandleTestMethodHandleAccessString::testArray));
97 cases.add(new MethodHandleAccessTestCase("Array unsupported",
98 vhArray, f, VarHandleTestMethodHandleAccessString::testArrayUnsupported,
99 false));
100 cases.add(new MethodHandleAccessTestCase("Array index out of bounds",
101 vhArray, f, VarHandleTestMethodHandleAccessString::testArrayIndexOutOfBounds,
102 false));
103 }
104
105 // Work around issue with jtreg summary reporting which truncates
106 // the String result of Object.toString to 30 characters, hence
107 // the first dummy argument
108 return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new);
109 }
110
111 @Test(dataProvider = "accessTestCaseProvider")
112 public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable {
113 T t = atc.get();
114 int iters = atc.requiresLoop() ? ITERS : 1;
115 for (int c = 0; c < iters; c++) {
116 atc.testAccess(t);
117 }
118 }
119
120
121 static void testInstanceField(VarHandleTestMethodHandleAccessString recv, Handles hs) throws Throwable {
122 // Plain
123 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200124 hs.get(TestAccessMode.SET).invokeExact(recv, "foo");
125 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100126 assertEquals(x, "foo", "set String value");
127 }
128
129
130 // Volatile
131 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200132 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(recv, "bar");
133 String x = (String) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(recv);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100134 assertEquals(x, "bar", "setVolatile String value");
135 }
136
137 // Lazy
138 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200139 hs.get(TestAccessMode.SET_RELEASE).invokeExact(recv, "foo");
140 String x = (String) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(recv);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100141 assertEquals(x, "foo", "setRelease String value");
142 }
143
144 // Opaque
145 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200146 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(recv, "bar");
147 String x = (String) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(recv);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100148 assertEquals(x, "bar", "setOpaque String value");
149 }
150
Paul Sandoza7aff442016-04-13 15:05:48 +0200151 hs.get(TestAccessMode.SET).invokeExact(recv, "foo");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100152
153 // Compare
154 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200155 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, "foo", "bar");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100156 assertEquals(r, true, "success compareAndSet String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200157 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100158 assertEquals(x, "bar", "success compareAndSet String value");
159 }
160
161 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200162 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, "foo", "baz");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100163 assertEquals(r, false, "failing compareAndSet String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200164 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100165 assertEquals(x, "bar", "failing compareAndSet String value");
166 }
167
168 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200169 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, "bar", "foo");
170 assertEquals(r, "bar", "success compareAndExchange String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200171 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200172 assertEquals(x, "foo", "success compareAndExchange String value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100173 }
174
175 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200176 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, "bar", "baz");
177 assertEquals(r, "foo", "failing compareAndExchange String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200178 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200179 assertEquals(x, "foo", "failing compareAndExchange String value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100180 }
181
182 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200183 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, "foo", "bar");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100184 assertEquals(r, "foo", "success compareAndExchangeAcquire String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200185 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100186 assertEquals(x, "bar", "success compareAndExchangeAcquire String value");
187 }
188
189 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200190 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, "foo", "baz");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100191 assertEquals(r, "bar", "failing compareAndExchangeAcquire String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200192 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100193 assertEquals(x, "bar", "failing compareAndExchangeAcquire String value");
194 }
195
196 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200197 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, "bar", "foo");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100198 assertEquals(r, "bar", "success compareAndExchangeRelease String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200199 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100200 assertEquals(x, "foo", "success compareAndExchangeRelease String value");
201 }
202
203 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200204 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, "bar", "baz");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100205 assertEquals(r, "foo", "failing compareAndExchangeRelease String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200206 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100207 assertEquals(x, "foo", "failing compareAndExchangeRelease String value");
208 }
209
210 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300211 boolean success = false;
212 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700213 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(recv, "foo", "bar");
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300214 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700215 assertEquals(success, true, "weakCompareAndSetPlain String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200216 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700217 assertEquals(x, "bar", "weakCompareAndSetPlain String value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100218 }
219
220 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300221 boolean success = false;
222 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
223 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(recv, "bar", "foo");
224 }
225 assertEquals(success, true, "weakCompareAndSetAcquire String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200226 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100227 assertEquals(x, "foo", "weakCompareAndSetAcquire String");
228 }
229
230 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300231 boolean success = false;
232 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
233 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(recv, "foo", "bar");
234 }
235 assertEquals(success, true, "weakCompareAndSetRelease String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200236 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100237 assertEquals(x, "bar", "weakCompareAndSetRelease String");
238 }
239
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300240 {
241 boolean success = false;
242 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700243 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(recv, "bar", "foo");
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300244 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700245 assertEquals(success, true, "weakCompareAndSet String");
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300246 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700247 assertEquals(x, "foo", "weakCompareAndSet String");
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300248 }
249
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100250 // Compare set and get
251 {
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300252 String o = (String) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, "bar");
253 assertEquals(o, "foo", "getAndSet String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200254 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300255 assertEquals(x, "bar", "getAndSet String value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100256 }
257
Paul Sandoz82d48912016-09-01 10:16:57 -0700258
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100259 }
260
261 static void testInstanceFieldUnsupported(VarHandleTestMethodHandleAccessString recv, Handles hs) throws Throwable {
262
Paul Sandoza7aff442016-04-13 15:05:48 +0200263 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100264 checkUOE(am, () -> {
265 String r = (String) hs.get(am).invokeExact(recv, "foo");
266 });
267 }
Paul Sandoz82d48912016-09-01 10:16:57 -0700268
269 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) {
270 checkUOE(am, () -> {
271 String r = (String) hs.get(am).invokeExact(recv, "foo");
272 });
273 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100274 }
275
276
277 static void testStaticField(Handles hs) throws Throwable {
278 // Plain
279 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200280 hs.get(TestAccessMode.SET).invokeExact("foo");
281 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100282 assertEquals(x, "foo", "set String value");
283 }
284
285
286 // Volatile
287 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200288 hs.get(TestAccessMode.SET_VOLATILE).invokeExact("bar");
289 String x = (String) hs.get(TestAccessMode.GET_VOLATILE).invokeExact();
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100290 assertEquals(x, "bar", "setVolatile String value");
291 }
292
293 // Lazy
294 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200295 hs.get(TestAccessMode.SET_RELEASE).invokeExact("foo");
296 String x = (String) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact();
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100297 assertEquals(x, "foo", "setRelease String value");
298 }
299
300 // Opaque
301 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200302 hs.get(TestAccessMode.SET_OPAQUE).invokeExact("bar");
303 String x = (String) hs.get(TestAccessMode.GET_OPAQUE).invokeExact();
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100304 assertEquals(x, "bar", "setOpaque String value");
305 }
306
Paul Sandoza7aff442016-04-13 15:05:48 +0200307 hs.get(TestAccessMode.SET).invokeExact("foo");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100308
309 // Compare
310 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200311 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact("foo", "bar");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100312 assertEquals(r, true, "success compareAndSet String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200313 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100314 assertEquals(x, "bar", "success compareAndSet String value");
315 }
316
317 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200318 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact("foo", "baz");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100319 assertEquals(r, false, "failing compareAndSet String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200320 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100321 assertEquals(x, "bar", "failing compareAndSet String value");
322 }
323
324 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200325 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact("bar", "foo");
326 assertEquals(r, "bar", "success compareAndExchange String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200327 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200328 assertEquals(x, "foo", "success compareAndExchange String value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100329 }
330
331 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200332 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact("bar", "baz");
333 assertEquals(r, "foo", "failing compareAndExchange String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200334 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200335 assertEquals(x, "foo", "failing compareAndExchange String value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100336 }
337
338 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200339 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact("foo", "bar");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100340 assertEquals(r, "foo", "success compareAndExchangeAcquire String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200341 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100342 assertEquals(x, "bar", "success compareAndExchangeAcquire String value");
343 }
344
345 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200346 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact("foo", "baz");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100347 assertEquals(r, "bar", "failing compareAndExchangeAcquire String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200348 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100349 assertEquals(x, "bar", "failing compareAndExchangeAcquire String value");
350 }
351
352 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200353 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact("bar", "foo");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100354 assertEquals(r, "bar", "success compareAndExchangeRelease String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200355 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100356 assertEquals(x, "foo", "success compareAndExchangeRelease String value");
357 }
358
359 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200360 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact("bar", "baz");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100361 assertEquals(r, "foo", "failing compareAndExchangeRelease String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200362 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100363 assertEquals(x, "foo", "failing compareAndExchangeRelease String value");
364 }
365
366 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300367 boolean success = false;
368 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700369 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact("foo", "bar");
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300370 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700371 assertEquals(success, true, "weakCompareAndSetPlain String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200372 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700373 assertEquals(x, "bar", "weakCompareAndSetPlain String value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100374 }
375
376 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300377 boolean success = false;
378 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
379 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact("bar", "foo");
380 }
381 assertEquals(success, true, "weakCompareAndSetAcquire String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200382 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100383 assertEquals(x, "foo", "weakCompareAndSetAcquire String");
384 }
385
386 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300387 boolean success = false;
388 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
389 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact("foo", "bar");
390 }
391 assertEquals(success, true, "weakCompareAndSetRelease String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200392 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100393 assertEquals(x, "bar", "weakCompareAndSetRelease String");
394 }
395
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300396 {
397 boolean success = false;
398 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700399 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact("bar", "foo");
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300400 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700401 assertEquals(success, true, "weakCompareAndSet String");
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300402 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700403 assertEquals(x, "foo", "weakCompareAndSet String");
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300404 }
405
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100406 // Compare set and get
407 {
Paul Sandoz82d48912016-09-01 10:16:57 -0700408 hs.get(TestAccessMode.SET).invokeExact("foo");
409
410 String o = (String) hs.get(TestAccessMode.GET_AND_SET).invokeExact("bar");
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300411 assertEquals(o, "foo", "getAndSet String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200412 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300413 assertEquals(x, "bar", "getAndSet String value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100414 }
415
Paul Sandoz82d48912016-09-01 10:16:57 -0700416 // Compare set and get
417 {
418 hs.get(TestAccessMode.SET).invokeExact("foo");
419
420 String o = (String) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact("bar");
421 assertEquals(o, "foo", "getAndSetAcquire String");
422 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
423 assertEquals(x, "bar", "getAndSetAcquire String value");
424 }
425
426 // Compare set and get
427 {
428 hs.get(TestAccessMode.SET).invokeExact("foo");
429
430 String o = (String) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact("bar");
431 assertEquals(o, "foo", "getAndSetRelease String");
432 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
433 assertEquals(x, "bar", "getAndSetRelease String value");
434 }
435
436
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100437 }
438
439 static void testStaticFieldUnsupported(Handles hs) throws Throwable {
440
Paul Sandoza7aff442016-04-13 15:05:48 +0200441 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100442 checkUOE(am, () -> {
443 String r = (String) hs.get(am).invokeExact("foo");
444 });
445 }
Paul Sandoz82d48912016-09-01 10:16:57 -0700446
447 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) {
448 checkUOE(am, () -> {
449 String r = (String) hs.get(am).invokeExact("foo");
450 });
451 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100452 }
453
454
455 static void testArray(Handles hs) throws Throwable {
456 String[] array = new String[10];
457
458 for (int i = 0; i < array.length; i++) {
459 // Plain
460 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200461 hs.get(TestAccessMode.SET).invokeExact(array, i, "foo");
462 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100463 assertEquals(x, "foo", "get String value");
464 }
465
466
467 // Volatile
468 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200469 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(array, i, "bar");
470 String x = (String) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(array, i);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100471 assertEquals(x, "bar", "setVolatile String value");
472 }
473
474 // Lazy
475 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200476 hs.get(TestAccessMode.SET_RELEASE).invokeExact(array, i, "foo");
477 String x = (String) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(array, i);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100478 assertEquals(x, "foo", "setRelease String value");
479 }
480
481 // Opaque
482 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200483 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(array, i, "bar");
484 String x = (String) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(array, i);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100485 assertEquals(x, "bar", "setOpaque String value");
486 }
487
Paul Sandoza7aff442016-04-13 15:05:48 +0200488 hs.get(TestAccessMode.SET).invokeExact(array, i, "foo");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100489
490 // Compare
491 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200492 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, "foo", "bar");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100493 assertEquals(r, true, "success compareAndSet String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200494 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100495 assertEquals(x, "bar", "success compareAndSet String value");
496 }
497
498 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200499 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, "foo", "baz");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100500 assertEquals(r, false, "failing compareAndSet String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200501 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100502 assertEquals(x, "bar", "failing compareAndSet String value");
503 }
504
505 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200506 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, "bar", "foo");
507 assertEquals(r, "bar", "success compareAndExchange String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200508 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200509 assertEquals(x, "foo", "success compareAndExchange String value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100510 }
511
512 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200513 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, "bar", "baz");
514 assertEquals(r, "foo", "failing compareAndExchange String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200515 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200516 assertEquals(x, "foo", "failing compareAndExchange String value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100517 }
518
519 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200520 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, "foo", "bar");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100521 assertEquals(r, "foo", "success compareAndExchangeAcquire String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200522 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100523 assertEquals(x, "bar", "success compareAndExchangeAcquire String value");
524 }
525
526 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200527 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, "foo", "baz");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100528 assertEquals(r, "bar", "failing compareAndExchangeAcquire String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200529 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100530 assertEquals(x, "bar", "failing compareAndExchangeAcquire String value");
531 }
532
533 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200534 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, "bar", "foo");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100535 assertEquals(r, "bar", "success compareAndExchangeRelease String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200536 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100537 assertEquals(x, "foo", "success compareAndExchangeRelease String value");
538 }
539
540 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200541 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, "bar", "baz");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100542 assertEquals(r, "foo", "failing compareAndExchangeRelease String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200543 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100544 assertEquals(x, "foo", "failing compareAndExchangeRelease String value");
545 }
546
547 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300548 boolean success = false;
549 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700550 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(array, i, "foo", "bar");
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300551 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700552 assertEquals(success, true, "weakCompareAndSetPlain String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200553 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700554 assertEquals(x, "bar", "weakCompareAndSetPlain String value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100555 }
556
557 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300558 boolean success = false;
559 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
560 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, "bar", "foo");
561 }
562 assertEquals(success, true, "weakCompareAndSetAcquire String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200563 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100564 assertEquals(x, "foo", "weakCompareAndSetAcquire String");
565 }
566
567 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300568 boolean success = false;
569 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
570 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(array, i, "foo", "bar");
571 }
572 assertEquals(success, true, "weakCompareAndSetRelease String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200573 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100574 assertEquals(x, "bar", "weakCompareAndSetRelease String");
575 }
576
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300577 {
578 boolean success = false;
579 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700580 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(array, i, "bar", "foo");
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300581 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700582 assertEquals(success, true, "weakCompareAndSet String");
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300583 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700584 assertEquals(x, "foo", "weakCompareAndSet String");
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300585 }
586
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100587 // Compare set and get
588 {
Paul Sandoz82d48912016-09-01 10:16:57 -0700589 hs.get(TestAccessMode.SET).invokeExact(array, i, "foo");
590
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300591 String o = (String) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, "bar");
592 assertEquals(o, "foo", "getAndSet String");
Paul Sandoza7aff442016-04-13 15:05:48 +0200593 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300594 assertEquals(x, "bar", "getAndSet String value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100595 }
596
Paul Sandoz82d48912016-09-01 10:16:57 -0700597 {
598 hs.get(TestAccessMode.SET).invokeExact(array, i, "foo");
599
600 String o = (String) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact(array, i, "bar");
601 assertEquals(o, "foo", "getAndSetAcquire String");
602 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
603 assertEquals(x, "bar", "getAndSetAcquire String value");
604 }
605
606 {
607 hs.get(TestAccessMode.SET).invokeExact(array, i, "foo");
608
609 String o = (String) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact(array, i, "bar");
610 assertEquals(o, "foo", "getAndSetRelease String");
611 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
612 assertEquals(x, "bar", "getAndSetRelease String value");
613 }
614
615
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100616 }
617 }
618
619 static void testArrayUnsupported(Handles hs) throws Throwable {
620 String[] array = new String[10];
621
622 final int i = 0;
623
Paul Sandoza7aff442016-04-13 15:05:48 +0200624 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100625 checkUOE(am, () -> {
626 String o = (String) hs.get(am).invokeExact(array, i, "foo");
627 });
628 }
Paul Sandoz82d48912016-09-01 10:16:57 -0700629
630 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) {
631 checkUOE(am, () -> {
632 String o = (String) hs.get(am).invokeExact(array, i, "foo");
633 });
634 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100635 }
636
637 static void testArrayIndexOutOfBounds(Handles hs) throws Throwable {
638 String[] array = new String[10];
639
640 for (int i : new int[]{-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) {
641 final int ci = i;
642
Paul Sandoza7aff442016-04-13 15:05:48 +0200643 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100644 checkIOOBE(am, () -> {
645 String x = (String) hs.get(am).invokeExact(array, ci);
646 });
647 }
648
Paul Sandoza7aff442016-04-13 15:05:48 +0200649 for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100650 checkIOOBE(am, () -> {
651 hs.get(am).invokeExact(array, ci, "foo");
652 });
653 }
654
Paul Sandoza7aff442016-04-13 15:05:48 +0200655 for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100656 checkIOOBE(am, () -> {
657 boolean r = (boolean) hs.get(am).invokeExact(array, ci, "foo", "bar");
658 });
659 }
660
Paul Sandoza7aff442016-04-13 15:05:48 +0200661 for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100662 checkIOOBE(am, () -> {
663 String r = (String) hs.get(am).invokeExact(array, ci, "bar", "foo");
664 });
665 }
666
Paul Sandoza7aff442016-04-13 15:05:48 +0200667 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100668 checkIOOBE(am, () -> {
669 String o = (String) hs.get(am).invokeExact(array, ci, "foo");
670 });
671 }
672
Paul Sandoz82d48912016-09-01 10:16:57 -0700673
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100674 }
675 }
676}
677