Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 public class Main {
     18     static {
     19         staticMethodCalledByClinit();
     20     }
     21 
     22     private static void staticMethodCalledByClinit() {
     23         // Test that DeliverException works when we need to unwind to a handler -- this method --
     24         // that is currently a resolution stub because it's running on behalf of <clinit>.
     25         try {
     26             throwDuringClinit();
     27             System.err.println("didn't throw!");
     28         } catch (NullPointerException ex) {
     29             System.out.println("caught exception thrown during clinit");
     30         }
     31     }
     32 
     33     private static void throwDuringClinit() {
     34         throw new NullPointerException();
     35     }
     36 
     37     public static void main(String[] args) {
     38         checkExceptions();
     39         checkTiming();
     40     }
     41 
     42     public static void sleep(int msec) {
     43         try {
     44             Thread.sleep(msec);
     45         } catch (InterruptedException ie) {
     46             System.err.println("sleep interrupted");
     47         }
     48     }
     49 
     50     static void checkExceptions() {
     51         try {
     52             System.out.println(PartialInit.FIELD0);
     53             System.err.println("Construction of PartialInit succeeded unexpectedly");
     54         } catch (ExceptionInInitializerError eiie) {
     55             System.out.println("Got expected EIIE for FIELD0");
     56         }
     57 
     58         try {
     59             System.out.println(PartialInit.FIELD0);
     60             System.err.println("Load of FIELD0 succeeded unexpectedly");
     61         } catch (NoClassDefFoundError ncdfe) {
     62             System.out.println("Got expected NCDFE for FIELD0");
     63         }
     64         try {
     65             System.out.println(PartialInit.FIELD1);
     66             System.err.println("Load of FIELD1 succeeded unexpectedly");
     67         } catch (NoClassDefFoundError ncdfe) {
     68             System.out.println("Got expected NCDFE for FIELD1");
     69         }
     70 
     71         try {
     72             System.out.println(Exploder.FIELD);
     73             System.err.println("Load of FIELD succeeded unexpectedly");
     74         } catch (AssertionError expected) {
     75             System.out.println("Got expected '" + expected.getMessage() + "' from Exploder");
     76         }
     77     }
     78 
     79     static void checkTiming() {
     80         FieldThread fieldThread = new FieldThread();
     81         MethodThread methodThread = new MethodThread();
     82 
     83         fieldThread.start();
     84         methodThread.start();
     85 
     86         /* start class init */
     87         IntHolder zero = SlowInit.FIELD0;
     88 
     89         /* wait for children to complete */
     90         try {
     91             fieldThread.join();
     92             methodThread.join();
     93         } catch (InterruptedException ie) {
     94             System.err.println(ie);
     95         }
     96 
     97         /* print all values */
     98         System.out.println("Fields (main thread): " +
     99             SlowInit.FIELD0.getValue() + SlowInit.FIELD1.getValue() +
    100             SlowInit.FIELD2.getValue() + SlowInit.FIELD3.getValue());
    101     }
    102 
    103     static class FieldThread extends Thread {
    104         public void run() {
    105             /* allow SlowInit's <clinit> to start */
    106             Main.sleep(5000);
    107 
    108             /* collect fields; should delay until class init completes */
    109             int field0, field1, field2, field3;
    110             field0 = SlowInit.FIELD0.getValue();
    111             field1 = SlowInit.FIELD1.getValue();
    112             field2 = SlowInit.FIELD2.getValue();
    113             field3 = SlowInit.FIELD3.getValue();
    114 
    115             /* let MethodThread print first */
    116             Main.sleep(5000);
    117             System.out.println("Fields (child thread): " +
    118                 field0 + field1 + field2 + field3);
    119         }
    120     }
    121 
    122     static class MethodThread extends Thread {
    123         public void run() {
    124             /* allow SlowInit's <clinit> to start */
    125             Main.sleep(5000);
    126 
    127             /* use a method that shouldn't be accessible yet */
    128             SlowInit.printMsg("MethodThread message");
    129         }
    130     }
    131 }
    132