/*
|
* Copyright (C) 2010 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 {
|
static {
|
staticMethodCalledByClinit();
|
}
|
|
private static void staticMethodCalledByClinit() {
|
// Test that DeliverException works when we need to unwind to a handler -- this method --
|
// that is currently a resolution stub because it's running on behalf of <clinit>.
|
try {
|
throwDuringClinit();
|
System.out.println("didn't throw!");
|
} catch (NullPointerException ex) {
|
System.out.println("caught exception thrown during clinit");
|
}
|
}
|
|
private static void throwDuringClinit() {
|
throw new NullPointerException();
|
}
|
|
public static void main(String[] args) {
|
checkExceptions();
|
checkTiming();
|
checkStaticMethodInvokeAfterFailedClinit();
|
}
|
|
public static void sleep(int msec) {
|
try {
|
Thread.sleep(msec);
|
} catch (InterruptedException ie) {
|
System.out.println("sleep interrupted");
|
}
|
}
|
|
static void checkExceptions() {
|
try {
|
System.out.println(PartialInit.FIELD0);
|
System.out.println("Construction of PartialInit succeeded unexpectedly");
|
} catch (ExceptionInInitializerError eiie) {
|
System.out.println("Got expected EIIE for FIELD0");
|
}
|
|
try {
|
System.out.println(PartialInit.FIELD0);
|
System.out.println("Load of FIELD0 succeeded unexpectedly");
|
} catch (NoClassDefFoundError ncdfe) {
|
System.out.println("Got expected NCDFE for FIELD0");
|
}
|
try {
|
System.out.println(PartialInit.FIELD1);
|
System.out.println("Load of FIELD1 succeeded unexpectedly");
|
} catch (NoClassDefFoundError ncdfe) {
|
System.out.println("Got expected NCDFE for FIELD1");
|
}
|
|
try {
|
System.out.println(Exploder.FIELD);
|
System.out.println("Load of FIELD succeeded unexpectedly");
|
} catch (AssertionError expected) {
|
System.out.println("Got expected '" + expected.getMessage() + "' from Exploder");
|
}
|
}
|
|
static void checkTiming() {
|
FieldThread fieldThread = new FieldThread();
|
MethodThread methodThread = new MethodThread();
|
|
fieldThread.start();
|
methodThread.start();
|
|
/* start class init */
|
IntHolder zero = SlowInit.FIELD0;
|
|
/* wait for children to complete */
|
try {
|
fieldThread.join();
|
methodThread.join();
|
} catch (InterruptedException ie) {
|
System.out.println(ie);
|
}
|
|
/* print all values */
|
System.out.println("Fields (main thread): " +
|
SlowInit.FIELD0.getValue() + SlowInit.FIELD1.getValue() +
|
SlowInit.FIELD2.getValue() + SlowInit.FIELD3.getValue());
|
}
|
|
static class FieldThread extends Thread {
|
public void run() {
|
/* allow SlowInit's <clinit> to start */
|
Main.sleep(5000);
|
|
/* collect fields; should delay until class init completes */
|
int field0, field1, field2, field3;
|
field0 = SlowInit.FIELD0.getValue();
|
field1 = SlowInit.FIELD1.getValue();
|
field2 = SlowInit.FIELD2.getValue();
|
field3 = SlowInit.FIELD3.getValue();
|
|
/* let MethodThread print first */
|
Main.sleep(5000);
|
System.out.println("Fields (child thread): " +
|
field0 + field1 + field2 + field3);
|
}
|
}
|
|
static class MethodThread extends Thread {
|
public void run() {
|
/* allow SlowInit's <clinit> to start */
|
Main.sleep(5000);
|
|
/* use a method that shouldn't be accessible yet */
|
SlowInit.printMsg("MethodThread message");
|
}
|
}
|
|
static void checkStaticMethodInvokeAfterFailedClinit() {
|
System.out.println("checkStaticMethodInvokeAfterFailedClinit START");
|
|
// Call static method to cause implicit clinit.
|
try {
|
ClassWithThrowingClinit.staticMethod();
|
System.out.println("checkStaticMethodInvokeAfterFailedClinit FAILED"
|
+ " due to missing ExceptionInInitializerError");
|
} catch (ExceptionInInitializerError expected) {
|
}
|
|
// Call again to make sure we still get the expected error.
|
try {
|
ClassWithThrowingClinit.staticMethod();
|
System.out.println("checkStaticMethodInvokeAfterFailedClinit FAILED"
|
+ " due to missing NoClassDefFoundError");
|
} catch (NoClassDefFoundError expected) {
|
}
|
System.out.println("checkStaticMethodInvokeAfterFailedClinit PASSED");
|
}
|
|
static class ClassWithThrowingClinit {
|
static {
|
throwDuringClinit();
|
}
|
static void staticMethod() {
|
}
|
}
|
}
|