/*
* 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);
}
}
}