blob: 23cd31d3ab4fed021e0956ce4be4dc314532e168 [file] [log] [blame]
/*
* 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 {
}