/* * Copyright (C) 2022 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. */ public class Main { // Testcase 1: the superclass has a package private version in the same package. static Interface s = new SubClass(); // Testcase 2: the class has a package private version. static Interface s2; // Testcase 3: the superclass has a package private version in a different package. static Interface s3 = new SubClassFromPkg(); // Testcase 4: there is no implementation in the hierarchy. static Interface s4 = new SubClassNoFoo(); // Testcase 5: there is a private method in the hierarchy. static Interface s5 = new SubClassPrivateFoo(); // Testcase 6: there is a static method in the hierarchy. static Interface s6 = new SubClassStaticFoo(); static { try { s2 = (Interface) Class.forName("SubClass2").newInstance(); } catch (Exception e) { throw new Error(e); } } public static void assertEquals(Object expected, Object actual) { if (expected != actual) { throw new Error("Expected " + expected + ", got " + actual); } } public static void assertTrue(boolean value) { if (!value) { throw new Error(""); } } public static void main(String[] args) throws Exception { assertEquals(SuperClass.class, ((SubClass) s).foo()); assertEquals(SuperClass.class, ((SuperClass) s).foo()); try { s.foo(); throw new Error("Expected IllegalAccessError"); } catch (IllegalAccessError ie) { // expected } assertEquals(null, ((SuperClass) s2).foo()); try { s2.foo(); throw new Error("Expected IllegalAccessError"); } catch (IllegalAccessError ie) { // expected } try { ((pkg.PkgSuperClass) s3).foo(); throw new Error("Expected IllegalAccessError"); } catch (IllegalAccessError ie) { // expected } try { ((SubClassFromPkg) s3).foo(); throw new Error("Expected IllegalAccessError"); } catch (IllegalAccessError ie) { // expected } try { s3.foo(); throw new Error("Expected IllegalAccessError"); } catch (IllegalAccessError ie) { // expected } try { ((SuperClassNoFoo) s4).foo(); throw new Error("Expected NoSuchMethodError"); } catch (NoSuchMethodError e) { // expected } try { ((SubClassNoFoo) s4).foo(); throw new Error("Expected AbstractMethodError"); } catch (AbstractMethodError e) { // expected } try { s4.foo(); throw new Error("Expected AbstractMethodError"); } catch (AbstractMethodError e) { // expected } try { ((SuperClassPrivateFoo) s5).foo(); throw new Error("Expected IllegalAccessError"); } catch (IllegalAccessError e) { // expected } try { ((SubClassPrivateFoo) s5).foo(); throw new Error("Expected IllegalAccessError"); } catch (IllegalAccessError e) { // expected } try { s5.foo(); throw new Error("Expected AbstractMethodError on RI, IllegalAccessError on ART"); } catch (AbstractMethodError | IllegalAccessError e) { // expected } try { ((SuperClassStaticFoo) s6).foo(); throw new Error("Expected IncompatibleClassChangeError"); } catch (IncompatibleClassChangeError e) { // expected } try { ((SubClassStaticFoo) s6).foo(); throw new Error("Expected IncompatibleClassChangeError"); } catch (IncompatibleClassChangeError e) { // expected } try { s6.foo(); throw new Error("Expected AbstractMethodError"); } catch (AbstractMethodError e) { // expected } } } interface Interface { public Class foo(); } class SubClass extends SuperClass implements Interface { } class SubClassFromPkg extends pkg.PkgSuperClass implements Interface { } class SubClassNoFoo extends SuperClassNoFoo implements Interface { } class SubClassPrivateFoo extends SuperClassPrivateFoo implements Interface { } class SubClassStaticFoo extends SuperClassStaticFoo implements Interface { }