11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License.
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.base;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Throwables.getStackTraceAsString;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.util.Arrays.asList;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.util.regex.Pattern.quote;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.Iterables;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.NullPointerTester;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.FileNotFoundException;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unit test for {@link Throwables}.
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@SuppressWarnings("serial") // this warning is silly for exceptions in tests
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class ThrowablesTest extends TestCase {
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPropagateIfPossible_NoneDeclared_NoneThrown() {
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Sample sample = new Sample() {
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public void noneDeclared() {
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          methodThatDoesntThrowAnything();
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (Throwable t) {
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Throwables.propagateIfPossible(t);
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          throw new SomeChainingException(t);
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Expect no exception to be thrown
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sample.noneDeclared();
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPropagateIfPossible_NoneDeclared_UncheckedThrown() {
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Sample sample = new Sample() {
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public void noneDeclared() {
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          methodThatThrowsUnchecked();
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (Throwable t) {
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Throwables.propagateIfPossible(t);
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          throw new SomeChainingException(t);
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Expect the unchecked exception to propagate as-is
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      sample.noneDeclared();
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (SomeUncheckedException expected) {
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPropagateIfPossible_NoneDeclared_UndeclaredThrown() {
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Sample sample = new Sample() {
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public void noneDeclared() {
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          methodThatThrowsUndeclaredChecked();
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (Throwable t) {
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Throwables.propagateIfPossible(t);
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          throw new SomeChainingException(t);
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Expect the undeclared exception to have been chained inside another
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      sample.noneDeclared();
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (SomeChainingException expected) {
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPropagateIfPossible_OneDeclared_NoneThrown()
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throws SomeCheckedException {
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Sample sample = new Sample() {
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public void oneDeclared() throws SomeCheckedException {
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          methodThatDoesntThrowAnything();
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (Throwable t) {
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          // yes, this block is never reached, but for purposes of illustration
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          // we're keeping it the same in each test
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Throwables.propagateIfPossible(t, SomeCheckedException.class);
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          throw new SomeChainingException(t);
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Expect no exception to be thrown
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sample.oneDeclared();
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPropagateIfPossible_OneDeclared_UncheckedThrown()
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throws SomeCheckedException {
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Sample sample = new Sample() {
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public void oneDeclared() throws SomeCheckedException {
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          methodThatThrowsUnchecked();
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (Throwable t) {
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Throwables.propagateIfPossible(t, SomeCheckedException.class);
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          throw new SomeChainingException(t);
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Expect the unchecked exception to propagate as-is
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      sample.oneDeclared();
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (SomeUncheckedException expected) {
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPropagateIfPossible_OneDeclared_CheckedThrown() {
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Sample sample = new Sample() {
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public void oneDeclared() throws SomeCheckedException {
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          methodThatThrowsChecked();
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (Throwable t) {
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Throwables.propagateIfPossible(t, SomeCheckedException.class);
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          throw new SomeChainingException(t);
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Expect the checked exception to propagate as-is
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      sample.oneDeclared();
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (SomeCheckedException expected) {
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPropagateIfPossible_OneDeclared_UndeclaredThrown()
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throws SomeCheckedException {
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Sample sample = new Sample() {
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public void oneDeclared() throws SomeCheckedException {
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          methodThatThrowsUndeclaredChecked();
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (Throwable t) {
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Throwables.propagateIfPossible(t, SomeCheckedException.class);
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          throw new SomeChainingException(t);
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Expect the undeclared exception to have been chained inside another
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      sample.oneDeclared();
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (SomeChainingException expected) {
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPropagateIfPossible_TwoDeclared_NoneThrown()
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throws SomeCheckedException, SomeOtherCheckedException {
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Sample sample = new Sample() {
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public void twoDeclared() throws SomeCheckedException,
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          SomeOtherCheckedException {
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          methodThatDoesntThrowAnything();
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (Throwable t) {
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Throwables.propagateIfPossible(t, SomeCheckedException.class,
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              SomeOtherCheckedException.class);
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          throw new SomeChainingException(t);
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Expect no exception to be thrown
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sample.twoDeclared();
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPropagateIfPossible_TwoDeclared_UncheckedThrown()
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throws SomeCheckedException, SomeOtherCheckedException {
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Sample sample = new Sample() {
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public void twoDeclared() throws SomeCheckedException,
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          SomeOtherCheckedException {
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          methodThatThrowsUnchecked();
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (Throwable t) {
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Throwables.propagateIfPossible(t, SomeCheckedException.class,
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              SomeOtherCheckedException.class);
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          throw new SomeChainingException(t);
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Expect the unchecked exception to propagate as-is
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      sample.twoDeclared();
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (SomeUncheckedException expected) {
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPropagateIfPossible_TwoDeclared_CheckedThrown()
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throws SomeOtherCheckedException {
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Sample sample = new Sample() {
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public void twoDeclared() throws SomeCheckedException,
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          SomeOtherCheckedException {
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          methodThatThrowsChecked();
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (Throwable t) {
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Throwables.propagateIfPossible(t, SomeCheckedException.class,
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              SomeOtherCheckedException.class);
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          throw new SomeChainingException(t);
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Expect the checked exception to propagate as-is
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      sample.twoDeclared();
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (SomeCheckedException expected) {
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPropagateIfPossible_TwoDeclared_OtherCheckedThrown()
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throws SomeCheckedException {
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Sample sample = new Sample() {
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public void twoDeclared() throws SomeCheckedException,
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          SomeOtherCheckedException {
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          methodThatThrowsOtherChecked();
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (Throwable t) {
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Throwables.propagateIfPossible(t, SomeCheckedException.class,
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              SomeOtherCheckedException.class);
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          throw new SomeChainingException(t);
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Expect the checked exception to propagate as-is
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      sample.twoDeclared();
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (SomeOtherCheckedException expected) {
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPropageIfPossible_null() throws SomeCheckedException {
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Throwables.propagateIfPossible(null);
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Throwables.propagateIfPossible(null, SomeCheckedException.class);
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Throwables.propagateIfPossible(null, SomeCheckedException.class,
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        SomeUncheckedException.class);
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPropagate_NoneDeclared_NoneThrown() {
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Sample sample = new Sample() {
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public void noneDeclared() {
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          methodThatDoesntThrowAnything();
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (Throwable t) {
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          throw Throwables.propagate(t);
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Expect no exception to be thrown
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sample.noneDeclared();
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPropagate_NoneDeclared_UncheckedThrown() {
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Sample sample = new Sample() {
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public void noneDeclared() {
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          methodThatThrowsUnchecked();
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (Throwable t) {
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          throw Throwables.propagate(t);
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Expect the unchecked exception to propagate as-is
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      sample.noneDeclared();
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (SomeUncheckedException expected) {
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPropagate_NoneDeclared_ErrorThrown() {
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Sample sample = new Sample() {
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public void noneDeclared() {
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          methodThatThrowsError();
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (Throwable t) {
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          throw Throwables.propagate(t);
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Expect the error to propagate as-is
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      sample.noneDeclared();
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (SomeError expected) {
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPropagate_NoneDeclared_CheckedThrown() {
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Sample sample = new Sample() {
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public void noneDeclared() {
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          methodThatThrowsChecked();
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (Throwable t) {
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          throw Throwables.propagate(t);
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Expect the undeclared exception to have been chained inside another
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      sample.noneDeclared();
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (RuntimeException expected) {
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(expected.getCause() instanceof SomeCheckedException);
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPropagateIfInstanceOf_NoneThrown()
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throws SomeCheckedException {
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Sample sample = new Sample() {
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public void oneDeclared() throws SomeCheckedException {
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          methodThatDoesntThrowAnything();
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (Throwable t) {
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Throwables.propagateIfInstanceOf(t, SomeCheckedException.class);
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          throw Throwables.propagate(t);
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Expect no exception to be thrown
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sample.oneDeclared();
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPropagateIfInstanceOf_DeclaredThrown() {
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Sample sample = new Sample() {
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public void oneDeclared() throws SomeCheckedException {
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          methodThatThrowsChecked();
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (Throwable t) {
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Throwables.propagateIfInstanceOf(t, SomeCheckedException.class);
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          throw Throwables.propagate(t);
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Expect declared exception to be thrown as-is
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      sample.oneDeclared();
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (SomeCheckedException e) {
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPropagateIfInstanceOf_UncheckedThrown()
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throws SomeCheckedException {
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Sample sample = new Sample() {
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public void oneDeclared() throws SomeCheckedException {
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          methodThatThrowsUnchecked();
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (Throwable t) {
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Throwables.propagateIfInstanceOf(t, SomeCheckedException.class);
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          throw Throwables.propagate(t);
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Expect unchecked exception to be thrown as-is
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      sample.oneDeclared();
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (SomeUncheckedException e) {
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPropagateIfInstanceOf_UndeclaredThrown()
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throws SomeCheckedException {
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Sample sample = new Sample() {
4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public void oneDeclared() throws SomeCheckedException {
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          methodThatThrowsOtherChecked();
4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (Throwable t) {
4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Throwables.propagateIfInstanceOf(t, SomeCheckedException.class);
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          throw Throwables.propagate(t);
4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Expect undeclared exception wrapped by RuntimeException to be thrown
4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      sample.oneDeclared();
4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (RuntimeException e) {
4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(e.getCause() instanceof SomeOtherCheckedException);
4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPropageIfInstanceOf_null() throws SomeCheckedException {
4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Throwables.propagateIfInstanceOf(null, SomeCheckedException.class);
4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetRootCause_NoCause() {
4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SomeCheckedException exception = new SomeCheckedException();
4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(exception, Throwables.getRootCause(exception));
4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetRootCause_SingleWrapped() {
4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SomeCheckedException cause = new SomeCheckedException();
4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SomeChainingException exception = new SomeChainingException(cause);
4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(cause, Throwables.getRootCause(exception));
4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetRootCause_DoubleWrapped() {
4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SomeCheckedException cause = new SomeCheckedException();
4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SomeChainingException exception =
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new SomeChainingException(new SomeChainingException(cause));
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(cause, Throwables.getRootCause(exception));
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class SomeThrowable extends Throwable {}
4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class SomeError extends Error {}
4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class SomeCheckedException extends Exception {}
4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class SomeOtherCheckedException extends Exception {}
4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class SomeUncheckedException extends RuntimeException {}
4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class SomeUndeclaredCheckedException extends Exception {}
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class SomeChainingException extends RuntimeException {
4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public SomeChainingException(Throwable cause) {
4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(cause);
4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static class Sample {
4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    void noneDeclared() {}
4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /*
4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * Subclasses of Sample will define methods with these signatures that throw
4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * these exceptions, so we must declare them in the throws clause here.
4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * Eclipse doesn't think being thrown from a subclass's non-public,
4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * non-protected method with the same signature counts as being "used."
4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     */
4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @SuppressWarnings("unused")
4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    void oneDeclared() throws SomeCheckedException {}
4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @SuppressWarnings("unused")
4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    void twoDeclared() throws SomeCheckedException, SomeOtherCheckedException {}
4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static void methodThatDoesntThrowAnything() {}
4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static void methodThatThrowsError() {
4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    throw new SomeError();
4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static void methodThatThrowsUnchecked() {
4761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    throw new SomeUncheckedException();
4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static void methodThatThrowsChecked() throws SomeCheckedException {
4791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    throw new SomeCheckedException();
4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static void methodThatThrowsOtherChecked() throws SomeOtherCheckedException {
4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    throw new SomeOtherCheckedException();
4831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static void methodThatThrowsUndeclaredChecked()
4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throws SomeUndeclaredCheckedException {
4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    throw new SomeUndeclaredCheckedException();
4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetStackTraceAsString() {
4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    class StackTraceException extends Exception {
4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      StackTraceException(String message) {
4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        super(message);
4931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    StackTraceException e = new StackTraceException("my message");
4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String firstLine = quote(e.getClass().getName() + ": " + e.getMessage());
4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String secondLine = "\\s*at " + ThrowablesTest.class.getName() + "\\..*";
5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String moreLines = "(?:.*\n?)*";
5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String expected = firstLine + "\n" + secondLine + "\n" + moreLines;
5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(getStackTraceAsString(e).matches(expected));
5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetCausalChain() {
5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    FileNotFoundException fnfe = new FileNotFoundException();
5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    IllegalArgumentException iae = new IllegalArgumentException(fnfe);
5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    RuntimeException re = new RuntimeException(iae);
5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    IllegalStateException ex = new IllegalStateException(re);
5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList(ex, re, iae, fnfe), Throwables.getCausalChain(ex));
5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(fnfe, Iterables.getOnlyElement(Throwables.getCausalChain(fnfe)));
5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Throwables.getCausalChain(null);
5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("Should have throw NPE");
5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {
5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Throwable> causes = Throwables.getCausalChain(ex);
5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      causes.add(new RuntimeException());
5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("List should be unmodifiable");
5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {
5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNullPointers() throws Exception {
5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    NullPointerTester tester = new NullPointerTester();
5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.setDefault(Throwable.class, new SomeCheckedException());
5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.setDefault(Class.class, SomeCheckedException.class);
5311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicStaticMethods(Throwables.class);
5321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
534