19fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light/*
29fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light * Copyright (C) 2017 The Android Open Source Project
39fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light *
49fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light * Licensed under the Apache License, Version 2.0 (the "License");
59fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light * you may not use this file except in compliance with the License.
69fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light * You may obtain a copy of the License at
79fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light *
89fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light *      http://www.apache.org/licenses/LICENSE-2.0
99fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light *
109fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light * Unless required by applicable law or agreed to in writing, software
119fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light * distributed under the License is distributed on an "AS IS" BASIS,
129fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light * See the License for the specific language governing permissions and
149fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light * limitations under the License.
159fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light */
169fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light
179fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Lightpackage art;
189fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light
199fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Lightimport java.util.Arrays;
209fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Lightimport java.util.Objects;
219fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Lightimport java.lang.reflect.Executable;
229fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Lightimport java.lang.reflect.Method;
239fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light
249fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Lightpublic class Test1928 {
25ee5ff3cb3d66f3a57a98413c724c63266d5043a2Alex Light  public static boolean PRINT_FULL_EXCEPTION = false;
269fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  public static ExceptionHandler HANDLER = null;
279fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light
289fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  public static interface ExceptionHandler {
299fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    public void exceptionOccurred(
309fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light        Executable m, long loc, Throwable exception, Executable catch_m, long catch_l);
319fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  }
329fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light
339fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  private static void PrintStack() {
349fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    System.out.println("\tCurrent Stack:");
359fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    for (StackTrace.StackFrameData e : StackTrace.GetStackTrace(Thread.currentThread())) {
369fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      if (Objects.equals(e.method.getDeclaringClass().getPackage(), Test1928.class.getPackage())) {
379fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light        System.out.println("\t\t" + e.method + " @ line = " +
389fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light            Breakpoint.locationToLine(e.method, e.current_location));
399fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      }
409fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    }
419fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  }
429fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light
439fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  public static void ExceptionEvent(Thread thr,
449fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light                                    Executable throw_method,
459fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light                                    long throw_location,
469fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light                                    Throwable exception,
479fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light                                    Executable catch_method,
489fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light                                    long catch_location) {
499fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    System.out.println(thr.getName() + ": " + throw_method + " @ line = " +
509fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light        Breakpoint.locationToLine(throw_method, throw_location) + " throws " +
519fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light        exception.getClass() + ": " + exception.getMessage());
529fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    String catch_message;
539fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    if (catch_method == null) {
549fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      catch_message = "<UNKNOWN>";
559fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    } else {
569fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      catch_message = catch_method.toString() + " @ line = " +
579fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light          Breakpoint.locationToLine(catch_method, catch_location);
589fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    }
599fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    PrintStack();
609fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    System.out.println("\tWill be caught by: " + catch_message);
619fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    if (PRINT_FULL_EXCEPTION) {
629fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      System.out.print("exception is: ");
639fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      exception.printStackTrace(System.out);
649fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    }
659fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    if (HANDLER != null) {
669fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      HANDLER.exceptionOccurred(
679fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light          throw_method, throw_location, exception, catch_method, catch_location);
689fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    }
699fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  }
709fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light
719fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  public static class BaseTestException extends Error {
729fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    public BaseTestException(String e) { super(e); }
739fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    public BaseTestException(String e, Throwable t) { super(e, t); }
749fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  }
759fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  public static class TestException extends BaseTestException {
769fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    public TestException(String e) { super(e); }
779fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    public TestException(String e, Throwable t) { super(e, t); }
789fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  }
799fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light
809fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  public static class TestExceptionNoRethrow extends TestException {
819fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    public TestExceptionNoRethrow(String e) { super(e); }
829fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    public TestExceptionNoRethrow(String e, Throwable t) { super(e, t); }
839fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  }
849fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light
859fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  public static class DoNothingHandler implements ExceptionHandler {
869fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    public void exceptionOccurred(
879fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light        Executable m, long loc, Throwable exception, Executable catch_m, long catch_l) {
889fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      System.out.println("\tDoing nothing!");
899fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      return;
909fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    }
919fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  }
929fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light
939fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  public static class ThrowCatchBase implements ExceptionHandler {
949fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    public void exceptionOccurred(
959fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light        Executable m, long loc, Throwable exception, Executable catch_m, long catch_l) {
969fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      System.out.println("\tThrowing BaseTestException and catching it!");
979fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      try {
989fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light        throw new BaseTestException("ThrowBaseHandler during throw from " + m + " @ line = " +
999fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light            Breakpoint.locationToLine(m, loc), exception);
1009fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      } catch (BaseTestException t) {
1019fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light        System.out.println("Caught " + t.getClass().getName() + ": \"" + t.getMessage() + "\"");
1029fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light        if (PRINT_FULL_EXCEPTION) {
1039fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light          t.printStackTrace(System.out);
1049fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light        }
1059fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      }
1069fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    }
1079fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  }
1089fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light
1099fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  public static void doThrow() {
1109fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    throw new TestException("doThrow");
1119fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  }
1129fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light
1139fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  public static class DoThrowClass implements Runnable {
1149fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    public void run() { doThrow(); }
1159fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  }
1169fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light
1179fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  public static void throwCatchBaseTestException() {
1189fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    try {
1199fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      throw new TestException("throwCatchBaseTestException");
1209fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    } catch (BaseTestException t) {
1219fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      System.out.println("Caught " + t.getClass().getName() + ": \"" + t.getMessage() + "\"");
1229fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      if (PRINT_FULL_EXCEPTION) {
1239fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light        t.printStackTrace(System.out);
1249fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      }
1259fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    }
1269fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  }
1279fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light
1289fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  public static class DoThrowCatchBaseTestException implements Runnable {
1299fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    public void run() { throwCatchBaseTestException(); }
1309fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  }
1319fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light
1329fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  public static void throwCatchTestException() {
1339fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    try {
1349fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      throw new TestException("throwCatchTestException");
1359fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    } catch (TestException t) {
1369fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      System.out.println("Caught " + t.getClass().getName() + ": \"" + t.getMessage() + "\"");
1379fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      if (PRINT_FULL_EXCEPTION) {
1389fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light        t.printStackTrace(System.out);
1399fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      }
1409fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    }
1419fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  }
1429fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light
1439fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  public static class DoThrowCatchTestException implements Runnable {
1449fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    public void run() { throwCatchTestException(); }
1459fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  }
1469fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light
1479fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  public static void throwCatchTestExceptionNoRethrow() {
1489fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    try {
1499fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      throw new TestException("throwCatchTestExceptionNoRethrow");
1509fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    } catch (TestExceptionNoRethrow t) {
1519fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      System.out.println("Caught " + t.getClass().getName() + ": \"" + t.getMessage() + "\"");
1529fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      if (PRINT_FULL_EXCEPTION) {
1539fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light        t.printStackTrace(System.out);
1549fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      }
1559fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    }
1569fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  }
1579fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light
1589fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  public static class DoThrowCatchTestExceptionNoRethrow implements Runnable {
1599fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    public void run() { throwCatchTestExceptionNoRethrow(); }
1609fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  }
1619fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light
1629fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  public static void run() throws Exception {
1639fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    // Set up
1649fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    Exceptions.setupExceptionTracing(
1659fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light        Test1928.class,
1669fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light        TestException.class,
1679fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light        Test1928.class.getDeclaredMethod(
1689fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light            "ExceptionEvent",
1699fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light            Thread.class,
1709fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light            Executable.class,
1719fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light            Long.TYPE,
1729fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light            Throwable.class,
1739fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light            Executable.class,
1749fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light            Long.TYPE),
1759fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light        null);
1769fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    Exceptions.enableExceptionEvent(Thread.currentThread());
1779fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light
1789fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    ExceptionHandler[] handlers = new ExceptionHandler[] {
1799fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      new DoNothingHandler(),
1809fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      new ThrowCatchBase(),
1819fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    };
1829fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light
1839fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    Runnable[] tests = new Runnable[] {
1849fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      new DoThrowClass(),
1859fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      new DoThrowCatchBaseTestException(),
1869fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      new DoThrowCatchTestException(),
1879fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      new DoThrowCatchTestExceptionNoRethrow(),
1889fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    };
1899fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light
1909fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    for (ExceptionHandler handler : handlers) {
1919fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      for (Runnable test : tests) {
1929fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light        try {
1939fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light          HANDLER = handler;
1949fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light          System.out.printf("Test \"%s\": Running with handler \"%s\"\n",
1959fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light              test.getClass().getName(), handler.getClass().getName());
1969fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light          test.run();
1979fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light          System.out.printf("Test \"%s\": No error caught with handler \"%s\"\n",
1989fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light              test.getClass().getName(), handler.getClass().getName());
1999fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light        } catch (Throwable e) {
2009fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light          System.out.printf("Test \"%s\": Caught error %s:\"%s\" with handler \"%s\"\n",
2019fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light              test.getClass().getName(),
2029fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light              e.getClass().getName(),
2039fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light              e.getMessage(),
2049fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light              handler.getClass().getName());
2059fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light          if (PRINT_FULL_EXCEPTION) {
2069fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light            e.printStackTrace(System.out);
2079fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light          }
2089fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light        }
2099fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light        System.out.printf("Test \"%s\": Finished running with handler \"%s\"\n",
2109fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light            test.getClass().getName(), handler.getClass().getName());
2119fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light        HANDLER = null;
2129fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light      }
2139fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    }
2149fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light    Exceptions.disableExceptionEvent(Thread.currentThread());
2159fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light  }
2169fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light}
217