diff options
author | 2020-08-24 12:19:04 +0100 | |
---|---|---|
committer | 2020-08-27 08:26:14 +0000 | |
commit | c3617cda17351ffd33ced81a3e03b87f59d4a41d (patch) | |
tree | 054ddf7a77f35acb2c8a66954838553c6230b8b7 | |
parent | 3d52363c5780f37d6f9bbd8e476f3c360d22b833 (diff) |
VarHandle tests for interfaces
Bug: 65872996
Test: run-test --host 712
Change-Id: I29190f9e86dd60ff9d8428c8fc08e3f84e99baf0
5 files changed, 291 insertions, 2 deletions
diff --git a/test/712-varhandle-invocations/expected.txt b/test/712-varhandle-invocations/expected.txt index af921901f8..1c437cf9bf 100644 --- a/test/712-varhandle-invocations/expected.txt +++ b/test/712-varhandle-invocations/expected.txt @@ -2881,6 +2881,161 @@ ArrayElementGetAndBitwiseAndAcquireWidget...OK ArrayElementGetAndBitwiseXorWidget...OK ArrayElementGetAndBitwiseXorReleaseWidget...OK ArrayElementGetAndBitwiseXorAcquireWidget...OK +FieldGetWidgetInterface...OK +FieldSetWidgetInterface...OK +FieldGetVolatileWidgetInterface...OK +FieldSetVolatileWidgetInterface...OK +FieldGetAcquireWidgetInterface...OK +FieldSetReleaseWidgetInterface...OK +FieldGetOpaqueWidgetInterface...OK +FieldSetOpaqueWidgetInterface...OK +FieldCompareAndSetWidgetInterface...OK +FieldCompareAndExchangeWidgetInterface...OK +FieldCompareAndExchangeAcquireWidgetInterface...OK +FieldCompareAndExchangeReleaseWidgetInterface...OK +FieldWeakCompareAndSetPlainWidgetInterface...OK +FieldWeakCompareAndSetWidgetInterface...OK +FieldWeakCompareAndSetAcquireWidgetInterface...OK +FieldWeakCompareAndSetReleaseWidgetInterface...OK +FieldGetAndSetWidgetInterface...OK +FieldGetAndSetAcquireWidgetInterface...OK +FieldGetAndSetReleaseWidgetInterface...OK +FieldGetAndAddWidgetInterface...OK +FieldGetAndAddAcquireWidgetInterface...OK +FieldGetAndAddReleaseWidgetInterface...OK +FieldGetAndBitwiseOrWidgetInterface...OK +FieldGetAndBitwiseOrReleaseWidgetInterface...OK +FieldGetAndBitwiseOrAcquireWidgetInterface...OK +FieldGetAndBitwiseAndWidgetInterface...OK +FieldGetAndBitwiseAndReleaseWidgetInterface...OK +FieldGetAndBitwiseAndAcquireWidgetInterface...OK +FieldGetAndBitwiseXorWidgetInterface...OK +FieldGetAndBitwiseXorReleaseWidgetInterface...OK +FieldGetAndBitwiseXorAcquireWidgetInterface...OK +FinalFieldGetWidgetInterface...OK +FinalFieldSetWidgetInterface...OK +FinalFieldGetVolatileWidgetInterface...OK +FinalFieldSetVolatileWidgetInterface...OK +FinalFieldGetAcquireWidgetInterface...OK +FinalFieldSetReleaseWidgetInterface...OK +FinalFieldGetOpaqueWidgetInterface...OK +FinalFieldSetOpaqueWidgetInterface...OK +FinalFieldCompareAndSetWidgetInterface...OK +FinalFieldCompareAndExchangeWidgetInterface...OK +FinalFieldCompareAndExchangeAcquireWidgetInterface...OK +FinalFieldCompareAndExchangeReleaseWidgetInterface...OK +FinalFieldWeakCompareAndSetPlainWidgetInterface...OK +FinalFieldWeakCompareAndSetWidgetInterface...OK +FinalFieldWeakCompareAndSetAcquireWidgetInterface...OK +FinalFieldWeakCompareAndSetReleaseWidgetInterface...OK +FinalFieldGetAndSetWidgetInterface...OK +FinalFieldGetAndSetAcquireWidgetInterface...OK +FinalFieldGetAndSetReleaseWidgetInterface...OK +FinalFieldGetAndAddWidgetInterface...OK +FinalFieldGetAndAddAcquireWidgetInterface...OK +FinalFieldGetAndAddReleaseWidgetInterface...OK +FinalFieldGetAndBitwiseOrWidgetInterface...OK +FinalFieldGetAndBitwiseOrReleaseWidgetInterface...OK +FinalFieldGetAndBitwiseOrAcquireWidgetInterface...OK +FinalFieldGetAndBitwiseAndWidgetInterface...OK +FinalFieldGetAndBitwiseAndReleaseWidgetInterface...OK +FinalFieldGetAndBitwiseAndAcquireWidgetInterface...OK +FinalFieldGetAndBitwiseXorWidgetInterface...OK +FinalFieldGetAndBitwiseXorReleaseWidgetInterface...OK +FinalFieldGetAndBitwiseXorAcquireWidgetInterface...OK +StaticFieldGetWidgetInterface...OK +StaticFieldSetWidgetInterface...OK +StaticFieldGetVolatileWidgetInterface...OK +StaticFieldSetVolatileWidgetInterface...OK +StaticFieldGetAcquireWidgetInterface...OK +StaticFieldSetReleaseWidgetInterface...OK +StaticFieldGetOpaqueWidgetInterface...OK +StaticFieldSetOpaqueWidgetInterface...OK +StaticFieldCompareAndSetWidgetInterface...OK +StaticFieldCompareAndExchangeWidgetInterface...OK +StaticFieldCompareAndExchangeAcquireWidgetInterface...OK +StaticFieldCompareAndExchangeReleaseWidgetInterface...OK +StaticFieldWeakCompareAndSetPlainWidgetInterface...OK +StaticFieldWeakCompareAndSetWidgetInterface...OK +StaticFieldWeakCompareAndSetAcquireWidgetInterface...OK +StaticFieldWeakCompareAndSetReleaseWidgetInterface...OK +StaticFieldGetAndSetWidgetInterface...OK +StaticFieldGetAndSetAcquireWidgetInterface...OK +StaticFieldGetAndSetReleaseWidgetInterface...OK +StaticFieldGetAndAddWidgetInterface...OK +StaticFieldGetAndAddAcquireWidgetInterface...OK +StaticFieldGetAndAddReleaseWidgetInterface...OK +StaticFieldGetAndBitwiseOrWidgetInterface...OK +StaticFieldGetAndBitwiseOrReleaseWidgetInterface...OK +StaticFieldGetAndBitwiseOrAcquireWidgetInterface...OK +StaticFieldGetAndBitwiseAndWidgetInterface...OK +StaticFieldGetAndBitwiseAndReleaseWidgetInterface...OK +StaticFieldGetAndBitwiseAndAcquireWidgetInterface...OK +StaticFieldGetAndBitwiseXorWidgetInterface...OK +StaticFieldGetAndBitwiseXorReleaseWidgetInterface...OK +StaticFieldGetAndBitwiseXorAcquireWidgetInterface...OK +StaticFinalFieldGetWidgetInterface...OK +StaticFinalFieldSetWidgetInterface...OK +StaticFinalFieldGetVolatileWidgetInterface...OK +StaticFinalFieldSetVolatileWidgetInterface...OK +StaticFinalFieldGetAcquireWidgetInterface...OK +StaticFinalFieldSetReleaseWidgetInterface...OK +StaticFinalFieldGetOpaqueWidgetInterface...OK +StaticFinalFieldSetOpaqueWidgetInterface...OK +StaticFinalFieldCompareAndSetWidgetInterface...OK +StaticFinalFieldCompareAndExchangeWidgetInterface...OK +StaticFinalFieldCompareAndExchangeAcquireWidgetInterface...OK +StaticFinalFieldCompareAndExchangeReleaseWidgetInterface...OK +StaticFinalFieldWeakCompareAndSetPlainWidgetInterface...OK +StaticFinalFieldWeakCompareAndSetWidgetInterface...OK +StaticFinalFieldWeakCompareAndSetAcquireWidgetInterface...OK +StaticFinalFieldWeakCompareAndSetReleaseWidgetInterface...OK +StaticFinalFieldGetAndSetWidgetInterface...OK +StaticFinalFieldGetAndSetAcquireWidgetInterface...OK +StaticFinalFieldGetAndSetReleaseWidgetInterface...OK +StaticFinalFieldGetAndAddWidgetInterface...OK +StaticFinalFieldGetAndAddAcquireWidgetInterface...OK +StaticFinalFieldGetAndAddReleaseWidgetInterface...OK +StaticFinalFieldGetAndBitwiseOrWidgetInterface...OK +StaticFinalFieldGetAndBitwiseOrReleaseWidgetInterface...OK +StaticFinalFieldGetAndBitwiseOrAcquireWidgetInterface...OK +StaticFinalFieldGetAndBitwiseAndWidgetInterface...OK +StaticFinalFieldGetAndBitwiseAndReleaseWidgetInterface...OK +StaticFinalFieldGetAndBitwiseAndAcquireWidgetInterface...OK +StaticFinalFieldGetAndBitwiseXorWidgetInterface...OK +StaticFinalFieldGetAndBitwiseXorReleaseWidgetInterface...OK +StaticFinalFieldGetAndBitwiseXorAcquireWidgetInterface...OK +ArrayElementGetWidgetInterface...OK +ArrayElementSetWidgetInterface...OK +ArrayElementGetVolatileWidgetInterface...OK +ArrayElementSetVolatileWidgetInterface...OK +ArrayElementGetAcquireWidgetInterface...OK +ArrayElementSetReleaseWidgetInterface...OK +ArrayElementGetOpaqueWidgetInterface...OK +ArrayElementSetOpaqueWidgetInterface...OK +ArrayElementCompareAndSetWidgetInterface...OK +ArrayElementCompareAndExchangeWidgetInterface...OK +ArrayElementCompareAndExchangeAcquireWidgetInterface...OK +ArrayElementCompareAndExchangeReleaseWidgetInterface...OK +ArrayElementWeakCompareAndSetPlainWidgetInterface...OK +ArrayElementWeakCompareAndSetWidgetInterface...OK +ArrayElementWeakCompareAndSetAcquireWidgetInterface...OK +ArrayElementWeakCompareAndSetReleaseWidgetInterface...OK +ArrayElementGetAndSetWidgetInterface...OK +ArrayElementGetAndSetAcquireWidgetInterface...OK +ArrayElementGetAndSetReleaseWidgetInterface...OK +ArrayElementGetAndAddWidgetInterface...OK +ArrayElementGetAndAddAcquireWidgetInterface...OK +ArrayElementGetAndAddReleaseWidgetInterface...OK +ArrayElementGetAndBitwiseOrWidgetInterface...OK +ArrayElementGetAndBitwiseOrReleaseWidgetInterface...OK +ArrayElementGetAndBitwiseOrAcquireWidgetInterface...OK +ArrayElementGetAndBitwiseAndWidgetInterface...OK +ArrayElementGetAndBitwiseAndReleaseWidgetInterface...OK +ArrayElementGetAndBitwiseAndAcquireWidgetInterface...OK +ArrayElementGetAndBitwiseXorWidgetInterface...OK +ArrayElementGetAndBitwiseXorReleaseWidgetInterface...OK +ArrayElementGetAndBitwiseXorAcquireWidgetInterface...OK BoxingReturnGetBoolean...OK BoxingSetBoolean...OK BoxingReturnGetVolatileBoolean...OK @@ -3179,5 +3334,6 @@ WideningFloatReturnValueTest...OK WideningDoubleReturnValueTest...OK SubtypeTest...OK SupertypeTest...OK +InterfaceTest...OK ImplicitBoxingIntegerTest...OK -3182 successes, 0 skips, 0 failures. +3338 successes, 0 skips, 0 failures. diff --git a/test/712-varhandle-invocations/src/VarHandleTypeConversionTests.java b/test/712-varhandle-invocations/src/VarHandleTypeConversionTests.java index c0fbd492b2..6c0295229e 100644 --- a/test/712-varhandle-invocations/src/VarHandleTypeConversionTests.java +++ b/test/712-varhandle-invocations/src/VarHandleTypeConversionTests.java @@ -1246,6 +1246,105 @@ public class VarHandleTypeConversionTests { } } + public static class InterfaceTest extends VarHandleUnitTest { + public interface ParentInterface { + int getValue(); + } + + public interface ChildInterface extends ParentInterface { + void setValue(int newValue); + } + + public class A implements ParentInterface { + protected int value = 0; + public int getValue() { return value; } + } + + public class B extends A implements ChildInterface { + public void setValue(int newValue) { value = newValue; } + } + + private ParentInterface pi; + private A obj; + + private VarHandle vh_pi; + private VarHandle vh_obj; + { + try { + vh_pi = MethodHandles.lookup().findVarHandle(InterfaceTest.class, "pi", + InterfaceTest.ParentInterface.class); + vh_obj = MethodHandles.lookup().findVarHandle(InterfaceTest.class, "obj", + InterfaceTest.A.class); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static void main(String[] args) { + new InterfaceTest().run(); + } + + @Override + public void doTest() { + // Tests using VarHandle to field of type ParentInterface. + { + pi = (ParentInterface) new A(); + ParentInterface p = (ParentInterface) vh_pi.get(this); + Object o = (Object) vh_pi.get(this); + try { + ChildInterface c = (ChildInterface) vh_pi.get(this); + failUnreachable(); + } catch (ClassCastException expected) {} + } + { + pi = new B(); + ParentInterface p = (ParentInterface) vh_pi.get(this); + B b = (B) vh_pi.get(this); + Object o = (Object) vh_pi.get(this); + ChildInterface c = (ChildInterface) vh_pi.get(this); + } + { + pi = null; + ParentInterface p = (ParentInterface) vh_pi.get(this); + B b = (B) vh_pi.get(this); + Object o = (Object) vh_pi.get(this); + ChildInterface c = (ChildInterface) vh_pi.get(this); + } + + // Tests using VarHandle to field of type A. + { + obj = new A(); + ParentInterface p = (ParentInterface) vh_obj.get(this); + Object o = (Object) vh_obj.get(this); + A a = (A) vh_obj.get(this); + try { + B b = (B) vh_obj.get(this); + failUnreachable(); + } catch (ClassCastException e) {} + try { + ChildInterface c = (ChildInterface) vh_obj.get(this); + failUnreachable(); + } catch (ClassCastException e) {} + } + { + obj = new B(); + ParentInterface p = (ParentInterface) vh_obj.get(this); + Object o = (Object) vh_obj.get(this); + A a = (A) vh_obj.get(this); + B b = (B) vh_obj.get(this); + ChildInterface c = (ChildInterface) vh_obj.get(this); + } + { + obj = null; + ParentInterface p = (ParentInterface) vh_obj.get(this); + Object o = (Object) vh_obj.get(this); + A a = (A) vh_obj.get(this); + B b = (B) vh_obj.get(this); + ChildInterface c = (ChildInterface) vh_obj.get(this); + } + } + } + public static class ImplicitBoxingIntegerTest extends VarHandleUnitTest { private static Integer field; private static final VarHandle vh; @@ -1337,6 +1436,7 @@ public class VarHandleTypeConversionTests { SubtypeTest.main(args); SupertypeTest.main(args); + InterfaceTest.main(args); ImplicitBoxingIntegerTest.main(args); } diff --git a/test/712-varhandle-invocations/src/Widget.java b/test/712-varhandle-invocations/src/Widget.java index 0282ff8d64..332b4eac66 100644 --- a/test/712-varhandle-invocations/src/Widget.java +++ b/test/712-varhandle-invocations/src/Widget.java @@ -15,7 +15,7 @@ */ // Widget class for reference type accessor tests. -public class Widget { +public class Widget implements WidgetInterface { protected int requisitionNumber; public Widget(int requisitionNumber) { @@ -34,6 +34,8 @@ public class Widget { return requisitionNumber == wo.requisitionNumber; } + public int getRequisitionNumber() { return requisitionNumber; } + public static final Widget ONE = new Widget(1); public static final Widget TWO = new Widget(2); } diff --git a/test/712-varhandle-invocations/src/WidgetInterface.java b/test/712-varhandle-invocations/src/WidgetInterface.java new file mode 100644 index 0000000000..441abbef41 --- /dev/null +++ b/test/712-varhandle-invocations/src/WidgetInterface.java @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Widget interface for reference type accessor tests. +public interface WidgetInterface { + int getRequisitionNumber(); +} diff --git a/test/712-varhandle-invocations/util-src/generate_java.py b/test/712-varhandle-invocations/util-src/generate_java.py index f535b400f8..f9927db1b1 100644 --- a/test/712-varhandle-invocations/util-src/generate_java.py +++ b/test/712-varhandle-invocations/util-src/generate_java.py @@ -722,6 +722,16 @@ def emit_reference_accessor_tests(output_path): for accessor in VAR_HANDLE_ACCESSORS: emit_accessor_test(var_handle_kind, accessor, ref_type, output_path) +def emit_interface_accessor_tests(output_path): + ref_type = JavaType("WidgetInterface", [ "Widget.ONE", "Widget.TWO", "null" ]) + for var_handle_kind in ALL_VAR_HANDLE_KINDS: + if var_handle_kind.is_view(): + # Views as reference type arrays are not supported. They + # fail instantiation. This is tested in 710-varhandle-creation. + continue + for accessor in VAR_HANDLE_ACCESSORS: + emit_accessor_test(var_handle_kind, accessor, ref_type, output_path) + def emit_boxing_value_type_accessor_test(accessor, var_type, output_path): test_class = "Boxing" + capitalize_first(accessor.method_name) + capitalize_first(var_type.name) GENERATED_TEST_CLASSES.append(test_class) @@ -873,6 +883,7 @@ def main(argv): sys.exit(1) emit_value_type_accessor_tests(final_java_dir) emit_reference_accessor_tests(final_java_dir) + emit_interface_accessor_tests(final_java_dir) emit_boxing_value_type_accessor_tests(final_java_dir) emit_main(final_java_dir, argv[2:]) |