1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2022 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker public class Main { 18*795d594fSAndroid Build Coastguard Worker 19*795d594fSAndroid Build Coastguard Worker // Testcase 1: the superclass has a package private version in the same package. 20*795d594fSAndroid Build Coastguard Worker static Interface s = new SubClass(); 21*795d594fSAndroid Build Coastguard Worker 22*795d594fSAndroid Build Coastguard Worker // Testcase 2: the class has a package private version. 23*795d594fSAndroid Build Coastguard Worker static Interface s2; 24*795d594fSAndroid Build Coastguard Worker 25*795d594fSAndroid Build Coastguard Worker // Testcase 3: the superclass has a package private version in a different package. 26*795d594fSAndroid Build Coastguard Worker static Interface s3 = new SubClassFromPkg(); 27*795d594fSAndroid Build Coastguard Worker 28*795d594fSAndroid Build Coastguard Worker // Testcase 4: there is no implementation in the hierarchy. 29*795d594fSAndroid Build Coastguard Worker static Interface s4 = new SubClassNoFoo(); 30*795d594fSAndroid Build Coastguard Worker 31*795d594fSAndroid Build Coastguard Worker // Testcase 5: there is a private method in the hierarchy. 32*795d594fSAndroid Build Coastguard Worker static Interface s5 = new SubClassPrivateFoo(); 33*795d594fSAndroid Build Coastguard Worker 34*795d594fSAndroid Build Coastguard Worker // Testcase 6: there is a static method in the hierarchy. 35*795d594fSAndroid Build Coastguard Worker static Interface s6 = new SubClassStaticFoo(); 36*795d594fSAndroid Build Coastguard Worker 37*795d594fSAndroid Build Coastguard Worker static { 38*795d594fSAndroid Build Coastguard Worker try { 39*795d594fSAndroid Build Coastguard Worker s2 = (Interface) Class.forName("SubClass2").newInstance(); 40*795d594fSAndroid Build Coastguard Worker } catch (Exception e) { 41*795d594fSAndroid Build Coastguard Worker throw new Error(e); 42*795d594fSAndroid Build Coastguard Worker } 43*795d594fSAndroid Build Coastguard Worker } 44*795d594fSAndroid Build Coastguard Worker assertEquals(Object expected, Object actual)45*795d594fSAndroid Build Coastguard Worker public static void assertEquals(Object expected, Object actual) { 46*795d594fSAndroid Build Coastguard Worker if (expected != actual) { 47*795d594fSAndroid Build Coastguard Worker throw new Error("Expected " + expected + ", got " + actual); 48*795d594fSAndroid Build Coastguard Worker } 49*795d594fSAndroid Build Coastguard Worker } 50*795d594fSAndroid Build Coastguard Worker assertTrue(boolean value)51*795d594fSAndroid Build Coastguard Worker public static void assertTrue(boolean value) { 52*795d594fSAndroid Build Coastguard Worker if (!value) { 53*795d594fSAndroid Build Coastguard Worker throw new Error(""); 54*795d594fSAndroid Build Coastguard Worker } 55*795d594fSAndroid Build Coastguard Worker } 56*795d594fSAndroid Build Coastguard Worker main(String[] args)57*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) throws Exception { 58*795d594fSAndroid Build Coastguard Worker assertEquals(SuperClass.class, ((SubClass) s).foo()); 59*795d594fSAndroid Build Coastguard Worker assertEquals(SuperClass.class, ((SuperClass) s).foo()); 60*795d594fSAndroid Build Coastguard Worker 61*795d594fSAndroid Build Coastguard Worker try { 62*795d594fSAndroid Build Coastguard Worker s.foo(); 63*795d594fSAndroid Build Coastguard Worker throw new Error("Expected IllegalAccessError"); 64*795d594fSAndroid Build Coastguard Worker } catch (IllegalAccessError ie) { 65*795d594fSAndroid Build Coastguard Worker // expected 66*795d594fSAndroid Build Coastguard Worker } 67*795d594fSAndroid Build Coastguard Worker 68*795d594fSAndroid Build Coastguard Worker assertEquals(null, ((SuperClass) s2).foo()); 69*795d594fSAndroid Build Coastguard Worker try { 70*795d594fSAndroid Build Coastguard Worker s2.foo(); 71*795d594fSAndroid Build Coastguard Worker throw new Error("Expected IllegalAccessError"); 72*795d594fSAndroid Build Coastguard Worker } catch (IllegalAccessError ie) { 73*795d594fSAndroid Build Coastguard Worker // expected 74*795d594fSAndroid Build Coastguard Worker } 75*795d594fSAndroid Build Coastguard Worker 76*795d594fSAndroid Build Coastguard Worker try { 77*795d594fSAndroid Build Coastguard Worker ((pkg.PkgSuperClass) s3).foo(); 78*795d594fSAndroid Build Coastguard Worker throw new Error("Expected IllegalAccessError"); 79*795d594fSAndroid Build Coastguard Worker } catch (IllegalAccessError ie) { 80*795d594fSAndroid Build Coastguard Worker // expected 81*795d594fSAndroid Build Coastguard Worker } 82*795d594fSAndroid Build Coastguard Worker 83*795d594fSAndroid Build Coastguard Worker try { 84*795d594fSAndroid Build Coastguard Worker ((SubClassFromPkg) s3).foo(); 85*795d594fSAndroid Build Coastguard Worker throw new Error("Expected IllegalAccessError"); 86*795d594fSAndroid Build Coastguard Worker } catch (IllegalAccessError ie) { 87*795d594fSAndroid Build Coastguard Worker // expected 88*795d594fSAndroid Build Coastguard Worker } 89*795d594fSAndroid Build Coastguard Worker 90*795d594fSAndroid Build Coastguard Worker try { 91*795d594fSAndroid Build Coastguard Worker s3.foo(); 92*795d594fSAndroid Build Coastguard Worker throw new Error("Expected IllegalAccessError"); 93*795d594fSAndroid Build Coastguard Worker } catch (IllegalAccessError ie) { 94*795d594fSAndroid Build Coastguard Worker // expected 95*795d594fSAndroid Build Coastguard Worker } 96*795d594fSAndroid Build Coastguard Worker 97*795d594fSAndroid Build Coastguard Worker try { 98*795d594fSAndroid Build Coastguard Worker ((SuperClassNoFoo) s4).foo(); 99*795d594fSAndroid Build Coastguard Worker throw new Error("Expected NoSuchMethodError"); 100*795d594fSAndroid Build Coastguard Worker } catch (NoSuchMethodError e) { 101*795d594fSAndroid Build Coastguard Worker // expected 102*795d594fSAndroid Build Coastguard Worker } 103*795d594fSAndroid Build Coastguard Worker 104*795d594fSAndroid Build Coastguard Worker try { 105*795d594fSAndroid Build Coastguard Worker ((SubClassNoFoo) s4).foo(); 106*795d594fSAndroid Build Coastguard Worker throw new Error("Expected AbstractMethodError"); 107*795d594fSAndroid Build Coastguard Worker } catch (AbstractMethodError e) { 108*795d594fSAndroid Build Coastguard Worker // expected 109*795d594fSAndroid Build Coastguard Worker } 110*795d594fSAndroid Build Coastguard Worker 111*795d594fSAndroid Build Coastguard Worker try { 112*795d594fSAndroid Build Coastguard Worker s4.foo(); 113*795d594fSAndroid Build Coastguard Worker throw new Error("Expected AbstractMethodError"); 114*795d594fSAndroid Build Coastguard Worker } catch (AbstractMethodError e) { 115*795d594fSAndroid Build Coastguard Worker // expected 116*795d594fSAndroid Build Coastguard Worker } 117*795d594fSAndroid Build Coastguard Worker 118*795d594fSAndroid Build Coastguard Worker try { 119*795d594fSAndroid Build Coastguard Worker ((SuperClassPrivateFoo) s5).foo(); 120*795d594fSAndroid Build Coastguard Worker throw new Error("Expected IllegalAccessError"); 121*795d594fSAndroid Build Coastguard Worker } catch (IllegalAccessError e) { 122*795d594fSAndroid Build Coastguard Worker // expected 123*795d594fSAndroid Build Coastguard Worker } 124*795d594fSAndroid Build Coastguard Worker 125*795d594fSAndroid Build Coastguard Worker try { 126*795d594fSAndroid Build Coastguard Worker ((SubClassPrivateFoo) s5).foo(); 127*795d594fSAndroid Build Coastguard Worker throw new Error("Expected IllegalAccessError"); 128*795d594fSAndroid Build Coastguard Worker } catch (IllegalAccessError e) { 129*795d594fSAndroid Build Coastguard Worker // expected 130*795d594fSAndroid Build Coastguard Worker } 131*795d594fSAndroid Build Coastguard Worker 132*795d594fSAndroid Build Coastguard Worker try { 133*795d594fSAndroid Build Coastguard Worker s5.foo(); 134*795d594fSAndroid Build Coastguard Worker throw new Error("Expected AbstractMethodError on RI, IllegalAccessError on ART"); 135*795d594fSAndroid Build Coastguard Worker } catch (AbstractMethodError | IllegalAccessError e) { 136*795d594fSAndroid Build Coastguard Worker // expected 137*795d594fSAndroid Build Coastguard Worker } 138*795d594fSAndroid Build Coastguard Worker 139*795d594fSAndroid Build Coastguard Worker try { 140*795d594fSAndroid Build Coastguard Worker ((SuperClassStaticFoo) s6).foo(); 141*795d594fSAndroid Build Coastguard Worker throw new Error("Expected IncompatibleClassChangeError"); 142*795d594fSAndroid Build Coastguard Worker } catch (IncompatibleClassChangeError e) { 143*795d594fSAndroid Build Coastguard Worker // expected 144*795d594fSAndroid Build Coastguard Worker } 145*795d594fSAndroid Build Coastguard Worker 146*795d594fSAndroid Build Coastguard Worker try { 147*795d594fSAndroid Build Coastguard Worker ((SubClassStaticFoo) s6).foo(); 148*795d594fSAndroid Build Coastguard Worker throw new Error("Expected IncompatibleClassChangeError"); 149*795d594fSAndroid Build Coastguard Worker } catch (IncompatibleClassChangeError e) { 150*795d594fSAndroid Build Coastguard Worker // expected 151*795d594fSAndroid Build Coastguard Worker } 152*795d594fSAndroid Build Coastguard Worker 153*795d594fSAndroid Build Coastguard Worker try { 154*795d594fSAndroid Build Coastguard Worker s6.foo(); 155*795d594fSAndroid Build Coastguard Worker throw new Error("Expected AbstractMethodError"); 156*795d594fSAndroid Build Coastguard Worker } catch (AbstractMethodError e) { 157*795d594fSAndroid Build Coastguard Worker // expected 158*795d594fSAndroid Build Coastguard Worker } 159*795d594fSAndroid Build Coastguard Worker } 160*795d594fSAndroid Build Coastguard Worker } 161*795d594fSAndroid Build Coastguard Worker 162*795d594fSAndroid Build Coastguard Worker interface Interface { foo()163*795d594fSAndroid Build Coastguard Worker public Class<?> foo(); 164*795d594fSAndroid Build Coastguard Worker } 165*795d594fSAndroid Build Coastguard Worker 166*795d594fSAndroid Build Coastguard Worker class SubClass extends SuperClass implements Interface { 167*795d594fSAndroid Build Coastguard Worker } 168*795d594fSAndroid Build Coastguard Worker 169*795d594fSAndroid Build Coastguard Worker class SubClassFromPkg extends pkg.PkgSuperClass implements Interface { 170*795d594fSAndroid Build Coastguard Worker } 171*795d594fSAndroid Build Coastguard Worker 172*795d594fSAndroid Build Coastguard Worker class SubClassNoFoo extends SuperClassNoFoo implements Interface { 173*795d594fSAndroid Build Coastguard Worker } 174*795d594fSAndroid Build Coastguard Worker 175*795d594fSAndroid Build Coastguard Worker class SubClassPrivateFoo extends SuperClassPrivateFoo implements Interface { 176*795d594fSAndroid Build Coastguard Worker } 177*795d594fSAndroid Build Coastguard Worker 178*795d594fSAndroid Build Coastguard Worker class SubClassStaticFoo extends SuperClassStaticFoo implements Interface { 179*795d594fSAndroid Build Coastguard Worker } 180