1 /* 2 * Copyright (c) 2015, 2018, 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 // -- This file was mechanically generated: Do not edit! -- // 25 26 /* 27 * @test 28 * @run testng/othervm -Diters=20000 VarHandleTestMethodHandleAccessString 29 */ 30 31 import org.testng.annotations.BeforeClass; 32 import org.testng.annotations.DataProvider; 33 import org.testng.annotations.Test; 34 35 import java.lang.invoke.MethodHandles; 36 import java.lang.invoke.VarHandle; 37 import java.util.ArrayList; 38 import java.util.Arrays; 39 import java.util.List; 40 41 import static org.testng.Assert.*; 42 43 public class VarHandleTestMethodHandleAccessString extends VarHandleBaseTest { 44 static final String static_final_v = "foo"; 45 46 static String static_v; 47 48 final String final_v = "foo"; 49 50 String v; 51 52 VarHandle vhFinalField; 53 54 VarHandle vhField; 55 56 VarHandle vhStaticField; 57 58 VarHandle vhStaticFinalField; 59 60 VarHandle vhArray; 61 62 63 @BeforeClass 64 public void setup() throws Exception { 65 vhFinalField = MethodHandles.lookup().findVarHandle( 66 VarHandleTestMethodHandleAccessString.class, "final_v", String.class); 67 68 vhField = MethodHandles.lookup().findVarHandle( 69 VarHandleTestMethodHandleAccessString.class, "v", String.class); 70 71 vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle( 72 VarHandleTestMethodHandleAccessString.class, "static_final_v", String.class); 73 74 vhStaticField = MethodHandles.lookup().findStaticVarHandle( 75 VarHandleTestMethodHandleAccessString.class, "static_v", String.class); 76 77 vhArray = MethodHandles.arrayElementVarHandle(String[].class); 78 79 } 80 81 82 @DataProvider 83 public Object[][] accessTestCaseProvider() throws Exception { 84 List<AccessTestCase<?>> cases = new ArrayList<>(); 85 86 for (VarHandleToMethodHandle f : VarHandleToMethodHandle.values()) { 87 cases.add(new MethodHandleAccessTestCase("Instance field", 88 vhField, f, hs -> testInstanceField(this, hs))); 89 cases.add(new MethodHandleAccessTestCase("Instance field unsupported", 90 vhField, f, hs -> testInstanceFieldUnsupported(this, hs), 91 false)); 92 93 cases.add(new MethodHandleAccessTestCase("Static field", 94 vhStaticField, f, VarHandleTestMethodHandleAccessString::testStaticField)); 95 cases.add(new MethodHandleAccessTestCase("Static field unsupported", 96 vhStaticField, f, VarHandleTestMethodHandleAccessString::testStaticFieldUnsupported, 97 false)); 98 99 cases.add(new MethodHandleAccessTestCase("Array", 100 vhArray, f, VarHandleTestMethodHandleAccessString::testArray)); 101 cases.add(new MethodHandleAccessTestCase("Array unsupported", 102 vhArray, f, VarHandleTestMethodHandleAccessString::testArrayUnsupported, 103 false)); 104 cases.add(new MethodHandleAccessTestCase("Array index out of bounds", 105 vhArray, f, VarHandleTestMethodHandleAccessString::testArrayIndexOutOfBounds, 106 false)); 107 } 108 109 // Work around issue with jtreg summary reporting which truncates 110 // the String result of Object.toString to 30 characters, hence 111 // the first dummy argument 112 return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new); 113 } 114 115 @Test(dataProvider = "accessTestCaseProvider") 116 public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable { 117 T t = atc.get(); 118 int iters = atc.requiresLoop() ? ITERS : 1; 119 for (int c = 0; c < iters; c++) { 120 atc.testAccess(t); 121 } 122 } 123 124 125 static void testInstanceField(VarHandleTestMethodHandleAccessString recv, Handles hs) throws Throwable { 126 // Plain 127 { 128 hs.get(TestAccessMode.SET).invokeExact(recv, "foo"); 129 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv); 130 assertEquals(x, "foo", "set String value"); 131 } 132 133 134 // Volatile 135 { 136 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(recv, "bar"); 137 String x = (String) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(recv); 138 assertEquals(x, "bar", "setVolatile String value"); 139 } 140 141 // Lazy 142 { 143 hs.get(TestAccessMode.SET_RELEASE).invokeExact(recv, "foo"); 144 String x = (String) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(recv); 145 assertEquals(x, "foo", "setRelease String value"); 146 } 147 148 // Opaque 149 { 150 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(recv, "bar"); 151 String x = (String) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(recv); 152 assertEquals(x, "bar", "setOpaque String value"); 153 } 154 155 hs.get(TestAccessMode.SET).invokeExact(recv, "foo"); 156 157 // Compare 158 { 159 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, "foo", "bar"); 160 assertEquals(r, true, "success compareAndSet String"); 161 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv); 162 assertEquals(x, "bar", "success compareAndSet String value"); 163 } 164 165 { 166 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, "foo", "baz"); 167 assertEquals(r, false, "failing compareAndSet String"); 168 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv); 169 assertEquals(x, "bar", "failing compareAndSet String value"); 170 } 171 172 { 173 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, "bar", "foo"); 174 assertEquals(r, "bar", "success compareAndExchange String"); 175 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv); 176 assertEquals(x, "foo", "success compareAndExchange String value"); 177 } 178 179 { 180 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, "bar", "baz"); 181 assertEquals(r, "foo", "failing compareAndExchange String"); 182 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv); 183 assertEquals(x, "foo", "failing compareAndExchange String value"); 184 } 185 186 { 187 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, "foo", "bar"); 188 assertEquals(r, "foo", "success compareAndExchangeAcquire String"); 189 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv); 190 assertEquals(x, "bar", "success compareAndExchangeAcquire String value"); 191 } 192 193 { 194 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, "foo", "baz"); 195 assertEquals(r, "bar", "failing compareAndExchangeAcquire String"); 196 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv); 197 assertEquals(x, "bar", "failing compareAndExchangeAcquire String value"); 198 } 199 200 { 201 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, "bar", "foo"); 202 assertEquals(r, "bar", "success compareAndExchangeRelease String"); 203 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv); 204 assertEquals(x, "foo", "success compareAndExchangeRelease String value"); 205 } 206 207 { 208 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, "bar", "baz"); 209 assertEquals(r, "foo", "failing compareAndExchangeRelease String"); 210 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv); 211 assertEquals(x, "foo", "failing compareAndExchangeRelease String value"); 212 } 213 214 { 215 boolean success = false; 216 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 217 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(recv, "foo", "bar"); 218 } 219 assertEquals(success, true, "weakCompareAndSetPlain String"); 220 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv); 221 assertEquals(x, "bar", "weakCompareAndSetPlain String value"); 222 } 223 224 { 225 boolean success = false; 226 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 227 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(recv, "bar", "foo"); 228 } 229 assertEquals(success, true, "weakCompareAndSetAcquire String"); 230 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv); 231 assertEquals(x, "foo", "weakCompareAndSetAcquire String"); 232 } 233 234 { 235 boolean success = false; 236 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 237 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(recv, "foo", "bar"); 238 } 239 assertEquals(success, true, "weakCompareAndSetRelease String"); 240 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv); 241 assertEquals(x, "bar", "weakCompareAndSetRelease String"); 242 } 243 244 { 245 boolean success = false; 246 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 247 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(recv, "bar", "foo"); 248 } 249 assertEquals(success, true, "weakCompareAndSet String"); 250 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv); 251 assertEquals(x, "foo", "weakCompareAndSet String"); 252 } 253 254 // Compare set and get 255 { 256 String o = (String) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, "bar"); 257 assertEquals(o, "foo", "getAndSet String"); 258 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv); 259 assertEquals(x, "bar", "getAndSet String value"); 260 } 261 262 263 } 264 265 static void testInstanceFieldUnsupported(VarHandleTestMethodHandleAccessString recv, Handles hs) throws Throwable { 266 267 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) { 268 checkUOE(am, () -> { 269 String r = (String) hs.get(am).invokeExact(recv, "foo"); 270 }); 271 } 272 273 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) { 274 checkUOE(am, () -> { 275 String r = (String) hs.get(am).invokeExact(recv, "foo"); 276 }); 277 } 278 } 279 280 281 static void testStaticField(Handles hs) throws Throwable { 282 // Plain 283 { 284 hs.get(TestAccessMode.SET).invokeExact("foo"); 285 String x = (String) hs.get(TestAccessMode.GET).invokeExact(); 286 assertEquals(x, "foo", "set String value"); 287 } 288 289 290 // Volatile 291 { 292 hs.get(TestAccessMode.SET_VOLATILE).invokeExact("bar"); 293 String x = (String) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(); 294 assertEquals(x, "bar", "setVolatile String value"); 295 } 296 297 // Lazy 298 { 299 hs.get(TestAccessMode.SET_RELEASE).invokeExact("foo"); 300 String x = (String) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(); 301 assertEquals(x, "foo", "setRelease String value"); 302 } 303 304 // Opaque 305 { 306 hs.get(TestAccessMode.SET_OPAQUE).invokeExact("bar"); 307 String x = (String) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(); 308 assertEquals(x, "bar", "setOpaque String value"); 309 } 310 311 hs.get(TestAccessMode.SET).invokeExact("foo"); 312 313 // Compare 314 { 315 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact("foo", "bar"); 316 assertEquals(r, true, "success compareAndSet String"); 317 String x = (String) hs.get(TestAccessMode.GET).invokeExact(); 318 assertEquals(x, "bar", "success compareAndSet String value"); 319 } 320 321 { 322 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact("foo", "baz"); 323 assertEquals(r, false, "failing compareAndSet String"); 324 String x = (String) hs.get(TestAccessMode.GET).invokeExact(); 325 assertEquals(x, "bar", "failing compareAndSet String value"); 326 } 327 328 { 329 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact("bar", "foo"); 330 assertEquals(r, "bar", "success compareAndExchange String"); 331 String x = (String) hs.get(TestAccessMode.GET).invokeExact(); 332 assertEquals(x, "foo", "success compareAndExchange String value"); 333 } 334 335 { 336 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact("bar", "baz"); 337 assertEquals(r, "foo", "failing compareAndExchange String"); 338 String x = (String) hs.get(TestAccessMode.GET).invokeExact(); 339 assertEquals(x, "foo", "failing compareAndExchange String value"); 340 } 341 342 { 343 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact("foo", "bar"); 344 assertEquals(r, "foo", "success compareAndExchangeAcquire String"); 345 String x = (String) hs.get(TestAccessMode.GET).invokeExact(); 346 assertEquals(x, "bar", "success compareAndExchangeAcquire String value"); 347 } 348 349 { 350 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact("foo", "baz"); 351 assertEquals(r, "bar", "failing compareAndExchangeAcquire String"); 352 String x = (String) hs.get(TestAccessMode.GET).invokeExact(); 353 assertEquals(x, "bar", "failing compareAndExchangeAcquire String value"); 354 } 355 356 { 357 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact("bar", "foo"); 358 assertEquals(r, "bar", "success compareAndExchangeRelease String"); 359 String x = (String) hs.get(TestAccessMode.GET).invokeExact(); 360 assertEquals(x, "foo", "success compareAndExchangeRelease String value"); 361 } 362 363 { 364 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact("bar", "baz"); 365 assertEquals(r, "foo", "failing compareAndExchangeRelease String"); 366 String x = (String) hs.get(TestAccessMode.GET).invokeExact(); 367 assertEquals(x, "foo", "failing compareAndExchangeRelease String value"); 368 } 369 370 { 371 boolean success = false; 372 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 373 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact("foo", "bar"); 374 } 375 assertEquals(success, true, "weakCompareAndSetPlain String"); 376 String x = (String) hs.get(TestAccessMode.GET).invokeExact(); 377 assertEquals(x, "bar", "weakCompareAndSetPlain String value"); 378 } 379 380 { 381 boolean success = false; 382 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 383 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact("bar", "foo"); 384 } 385 assertEquals(success, true, "weakCompareAndSetAcquire String"); 386 String x = (String) hs.get(TestAccessMode.GET).invokeExact(); 387 assertEquals(x, "foo", "weakCompareAndSetAcquire String"); 388 } 389 390 { 391 boolean success = false; 392 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 393 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact("foo", "bar"); 394 } 395 assertEquals(success, true, "weakCompareAndSetRelease String"); 396 String x = (String) hs.get(TestAccessMode.GET).invokeExact(); 397 assertEquals(x, "bar", "weakCompareAndSetRelease String"); 398 } 399 400 { 401 boolean success = false; 402 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 403 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact("bar", "foo"); 404 } 405 assertEquals(success, true, "weakCompareAndSet String"); 406 String x = (String) hs.get(TestAccessMode.GET).invokeExact(); 407 assertEquals(x, "foo", "weakCompareAndSet String"); 408 } 409 410 // Compare set and get 411 { 412 hs.get(TestAccessMode.SET).invokeExact("foo"); 413 414 String o = (String) hs.get(TestAccessMode.GET_AND_SET).invokeExact("bar"); 415 assertEquals(o, "foo", "getAndSet String"); 416 String x = (String) hs.get(TestAccessMode.GET).invokeExact(); 417 assertEquals(x, "bar", "getAndSet String value"); 418 } 419 420 // Compare set and get 421 { 422 hs.get(TestAccessMode.SET).invokeExact("foo"); 423 424 String o = (String) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact("bar"); 425 assertEquals(o, "foo", "getAndSetAcquire String"); 426 String x = (String) hs.get(TestAccessMode.GET).invokeExact(); 427 assertEquals(x, "bar", "getAndSetAcquire String value"); 428 } 429 430 // Compare set and get 431 { 432 hs.get(TestAccessMode.SET).invokeExact("foo"); 433 434 String o = (String) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact("bar"); 435 assertEquals(o, "foo", "getAndSetRelease String"); 436 String x = (String) hs.get(TestAccessMode.GET).invokeExact(); 437 assertEquals(x, "bar", "getAndSetRelease String value"); 438 } 439 440 441 } 442 443 static void testStaticFieldUnsupported(Handles hs) throws Throwable { 444 445 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) { 446 checkUOE(am, () -> { 447 String r = (String) hs.get(am).invokeExact("foo"); 448 }); 449 } 450 451 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) { 452 checkUOE(am, () -> { 453 String r = (String) hs.get(am).invokeExact("foo"); 454 }); 455 } 456 } 457 458 459 static void testArray(Handles hs) throws Throwable { 460 String[] array = new String[10]; 461 462 for (int i = 0; i < array.length; i++) { 463 // Plain 464 { 465 hs.get(TestAccessMode.SET).invokeExact(array, i, "foo"); 466 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i); 467 assertEquals(x, "foo", "get String value"); 468 } 469 470 471 // Volatile 472 { 473 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(array, i, "bar"); 474 String x = (String) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(array, i); 475 assertEquals(x, "bar", "setVolatile String value"); 476 } 477 478 // Lazy 479 { 480 hs.get(TestAccessMode.SET_RELEASE).invokeExact(array, i, "foo"); 481 String x = (String) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(array, i); 482 assertEquals(x, "foo", "setRelease String value"); 483 } 484 485 // Opaque 486 { 487 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(array, i, "bar"); 488 String x = (String) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(array, i); 489 assertEquals(x, "bar", "setOpaque String value"); 490 } 491 492 hs.get(TestAccessMode.SET).invokeExact(array, i, "foo"); 493 494 // Compare 495 { 496 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, "foo", "bar"); 497 assertEquals(r, true, "success compareAndSet String"); 498 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i); 499 assertEquals(x, "bar", "success compareAndSet String value"); 500 } 501 502 { 503 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, "foo", "baz"); 504 assertEquals(r, false, "failing compareAndSet String"); 505 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i); 506 assertEquals(x, "bar", "failing compareAndSet String value"); 507 } 508 509 { 510 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, "bar", "foo"); 511 assertEquals(r, "bar", "success compareAndExchange String"); 512 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i); 513 assertEquals(x, "foo", "success compareAndExchange String value"); 514 } 515 516 { 517 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, "bar", "baz"); 518 assertEquals(r, "foo", "failing compareAndExchange String"); 519 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i); 520 assertEquals(x, "foo", "failing compareAndExchange String value"); 521 } 522 523 { 524 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, "foo", "bar"); 525 assertEquals(r, "foo", "success compareAndExchangeAcquire String"); 526 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i); 527 assertEquals(x, "bar", "success compareAndExchangeAcquire String value"); 528 } 529 530 { 531 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, "foo", "baz"); 532 assertEquals(r, "bar", "failing compareAndExchangeAcquire String"); 533 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i); 534 assertEquals(x, "bar", "failing compareAndExchangeAcquire String value"); 535 } 536 537 { 538 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, "bar", "foo"); 539 assertEquals(r, "bar", "success compareAndExchangeRelease String"); 540 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i); 541 assertEquals(x, "foo", "success compareAndExchangeRelease String value"); 542 } 543 544 { 545 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, "bar", "baz"); 546 assertEquals(r, "foo", "failing compareAndExchangeRelease String"); 547 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i); 548 assertEquals(x, "foo", "failing compareAndExchangeRelease String value"); 549 } 550 551 { 552 boolean success = false; 553 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 554 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(array, i, "foo", "bar"); 555 } 556 assertEquals(success, true, "weakCompareAndSetPlain String"); 557 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i); 558 assertEquals(x, "bar", "weakCompareAndSetPlain String value"); 559 } 560 561 { 562 boolean success = false; 563 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 564 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, "bar", "foo"); 565 } 566 assertEquals(success, true, "weakCompareAndSetAcquire String"); 567 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i); 568 assertEquals(x, "foo", "weakCompareAndSetAcquire String"); 569 } 570 571 { 572 boolean success = false; 573 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 574 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(array, i, "foo", "bar"); 575 } 576 assertEquals(success, true, "weakCompareAndSetRelease String"); 577 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i); 578 assertEquals(x, "bar", "weakCompareAndSetRelease String"); 579 } 580 581 { 582 boolean success = false; 583 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 584 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(array, i, "bar", "foo"); 585 } 586 assertEquals(success, true, "weakCompareAndSet String"); 587 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i); 588 assertEquals(x, "foo", "weakCompareAndSet String"); 589 } 590 591 // Compare set and get 592 { 593 hs.get(TestAccessMode.SET).invokeExact(array, i, "foo"); 594 595 String o = (String) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, "bar"); 596 assertEquals(o, "foo", "getAndSet String"); 597 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i); 598 assertEquals(x, "bar", "getAndSet String value"); 599 } 600 601 { 602 hs.get(TestAccessMode.SET).invokeExact(array, i, "foo"); 603 604 String o = (String) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact(array, i, "bar"); 605 assertEquals(o, "foo", "getAndSetAcquire String"); 606 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i); 607 assertEquals(x, "bar", "getAndSetAcquire String value"); 608 } 609 610 { 611 hs.get(TestAccessMode.SET).invokeExact(array, i, "foo"); 612 613 String o = (String) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact(array, i, "bar"); 614 assertEquals(o, "foo", "getAndSetRelease String"); 615 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i); 616 assertEquals(x, "bar", "getAndSetRelease String value"); 617 } 618 619 620 } 621 } 622 623 static void testArrayUnsupported(Handles hs) throws Throwable { 624 String[] array = new String[10]; 625 626 final int i = 0; 627 628 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) { 629 checkUOE(am, () -> { 630 String o = (String) hs.get(am).invokeExact(array, i, "foo"); 631 }); 632 } 633 634 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) { 635 checkUOE(am, () -> { 636 String o = (String) hs.get(am).invokeExact(array, i, "foo"); 637 }); 638 } 639 } 640 641 static void testArrayIndexOutOfBounds(Handles hs) throws Throwable { 642 String[] array = new String[10]; 643 644 for (int i : new int[]{-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) { 645 final int ci = i; 646 647 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) { 648 checkIOOBE(am, () -> { 649 String x = (String) hs.get(am).invokeExact(array, ci); 650 }); 651 } 652 653 for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { 654 checkIOOBE(am, () -> { 655 hs.get(am).invokeExact(array, ci, "foo"); 656 }); 657 } 658 659 for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) { 660 checkIOOBE(am, () -> { 661 boolean r = (boolean) hs.get(am).invokeExact(array, ci, "foo", "bar"); 662 }); 663 } 664 665 for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) { 666 checkIOOBE(am, () -> { 667 String r = (String) hs.get(am).invokeExact(array, ci, "bar", "foo"); 668 }); 669 } 670 671 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) { 672 checkIOOBE(am, () -> { 673 String o = (String) hs.get(am).invokeExact(array, ci, "foo"); 674 }); 675 } 676 677 678 } 679 } 680 } 681