163 lines
5.7 KiB
Java
163 lines
5.7 KiB
Java
|
/*
|
||
|
* Copyright (C) 2009 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.
|
||
|
*/
|
||
|
|
||
|
import other.Mutant;
|
||
|
import other.InaccessibleClass;
|
||
|
import other.InaccessibleMethod;
|
||
|
|
||
|
/**
|
||
|
* Test some problematic situations that the verifier detects.
|
||
|
*/
|
||
|
public class Main {
|
||
|
public static final boolean VERBOSE = false;
|
||
|
|
||
|
public static void main(String[] args) {
|
||
|
testClassNewInstance();
|
||
|
testMissingStuff();
|
||
|
testBadAccess();
|
||
|
testBadInterfaceMethod();
|
||
|
}
|
||
|
/**
|
||
|
* Try to create and invoke a non-existent interface method.
|
||
|
*/
|
||
|
static void testBadInterfaceMethod() {
|
||
|
BadInterface badiface = new BadIfaceImpl();
|
||
|
try {
|
||
|
badiface.internalClone();
|
||
|
} catch (IncompatibleClassChangeError icce) {
|
||
|
// TODO b/64274113 This should really be an NSME
|
||
|
System.out.println("Got expected IncompatibleClassChangeError (interface)");
|
||
|
if (VERBOSE) System.out.println("--- " + icce);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Try to create a new instance of an abstract class.
|
||
|
*/
|
||
|
static void testClassNewInstance() {
|
||
|
try {
|
||
|
MaybeAbstract ma = new MaybeAbstract();
|
||
|
System.out.println("ERROR: MaybeAbstract succeeded unexpectedly");
|
||
|
} catch (InstantiationError ie) {
|
||
|
System.out.println("Got expected InstantationError");
|
||
|
if (VERBOSE) System.out.println("--- " + ie);
|
||
|
} catch (Exception ex) {
|
||
|
System.out.println("Got unexpected MaybeAbstract failure");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Test stuff that disappears.
|
||
|
*/
|
||
|
static void testMissingStuff() {
|
||
|
Mutant mutant = new Mutant();
|
||
|
|
||
|
try {
|
||
|
int x = mutant.disappearingField;
|
||
|
} catch (NoSuchFieldError nsfe) {
|
||
|
System.out.println("Got expected NoSuchFieldError");
|
||
|
if (VERBOSE) System.out.println("--- " + nsfe);
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
int y = Mutant.disappearingStaticField;
|
||
|
} catch (NoSuchFieldError nsfe) {
|
||
|
System.out.println("Got expected NoSuchFieldError");
|
||
|
if (VERBOSE) System.out.println("--- " + nsfe);
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
mutant.disappearingMethod();
|
||
|
} catch (NoSuchMethodError nsme) {
|
||
|
System.out.println("Got expected NoSuchMethodError");
|
||
|
if (VERBOSE) System.out.println("--- " + nsme);
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
Mutant.disappearingStaticMethod();
|
||
|
} catch (NoSuchMethodError nsme) {
|
||
|
System.out.println("Got expected NoSuchMethodError");
|
||
|
if (VERBOSE) System.out.println("--- " + nsme);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Test stuff that becomes inaccessible.
|
||
|
*/
|
||
|
static void testBadAccess() {
|
||
|
Mutant mutant = new Mutant();
|
||
|
|
||
|
try {
|
||
|
int x = mutant.inaccessibleField;
|
||
|
System.out.println("ERROR: bad access succeeded (ifield)");
|
||
|
} catch (IllegalAccessError iae) {
|
||
|
System.out.println("Got expected IllegalAccessError (ifield)");
|
||
|
if (VERBOSE) System.out.println("--- " + iae);
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
int y = Mutant.inaccessibleStaticField;
|
||
|
System.out.println("ERROR: bad access succeeded (sfield)");
|
||
|
} catch (IllegalAccessError iae) {
|
||
|
System.out.println("Got expected IllegalAccessError (sfield)");
|
||
|
if (VERBOSE) System.out.println("--- " + iae);
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
mutant.inaccessibleMethod();
|
||
|
System.out.println("ERROR: bad access succeeded (method)");
|
||
|
} catch (IllegalAccessError iae) {
|
||
|
System.out.println("Got expected IllegalAccessError (method)");
|
||
|
if (VERBOSE) System.out.println("--- " + iae);
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
Mutant.inaccessibleStaticMethod();
|
||
|
System.out.println("ERROR: bad access succeeded (smethod)");
|
||
|
} catch (IllegalAccessError iae) {
|
||
|
System.out.println("Got expected IllegalAccessError (smethod)");
|
||
|
if (VERBOSE) System.out.println("--- " + iae);
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
/* accessible static method in an inaccessible class */
|
||
|
InaccessibleClass.test();
|
||
|
System.out.println("ERROR: bad meth-class access succeeded (meth-class)");
|
||
|
} catch (IllegalAccessError iae) {
|
||
|
System.out.println("Got expected IllegalAccessError (meth-class)");
|
||
|
if (VERBOSE) System.out.println("--- " + iae);
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
/* accessible static field in an inaccessible class */
|
||
|
int blah = InaccessibleClass.blah;
|
||
|
System.out.println("ERROR: bad field-class access succeeded (field-class)");
|
||
|
} catch (IllegalAccessError iae) {
|
||
|
System.out.println("Got expected IllegalAccessError (field-class)");
|
||
|
if (VERBOSE) System.out.println("--- " + iae);
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
/* inaccessible static method in an accessible class */
|
||
|
InaccessibleMethod.test();
|
||
|
System.out.println("ERROR: bad access succeeded (meth-meth)");
|
||
|
} catch (IllegalAccessError iae) {
|
||
|
System.out.println("Got expected IllegalAccessError (meth-meth)");
|
||
|
if (VERBOSE) System.out.println("--- " + iae);
|
||
|
}
|
||
|
}
|
||
|
}
|