blob: 04b428b2cd2f91cf6932ac99c2d61756dd446d66 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You 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.
*/
package org.apache.geode.internal.lang;
import static org.apache.geode.internal.lang.ThrowableUtils.getRootCause;
import static org.apache.geode.internal.lang.ThrowableUtils.hasCauseMessage;
import static org.apache.geode.internal.lang.ThrowableUtils.hasCauseType;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.catchThrowable;
import org.junit.Test;
/**
* Unit tests for {@link ThrowableUtils}
*/
public class ThrowableUtilsTest {
@Test
public void getRootCauseOfNullShouldThrowNullPointerException() {
Throwable thrown = catchThrowable(() -> getRootCause(null));
assertThat(thrown).isExactlyInstanceOf(NullPointerException.class);
}
@Test
public void getRootCauseOfLeafExceptionShouldReturnSameInstance() {
Throwable exception = new Exception();
Throwable rootCause = getRootCause(exception);
assertThat(rootCause).isSameAs(exception);
}
@Test
public void getRootCauseOfExceptionShouldReturnCause() {
Throwable cause = new Exception();
Throwable rootCause = getRootCause(new Exception(cause));
assertThat(rootCause).isSameAs(cause);
}
@Test
public void getRootCauseOfExceptionTreeShouldReturnCause() {
Throwable cause = new Exception();
Throwable rootCause = getRootCause(new Exception(new Exception(cause)));
assertThat(rootCause).isSameAs(cause);
}
@Test
public void getRootCauseOfErrorTreeShouldReturnCause() {
Throwable cause = new Error();
Throwable rootCause = getRootCause(new Error(new Error(cause)));
assertThat(rootCause).isSameAs(cause);
}
@Test
public void hasCauseTypeOfNullClassShouldThrowNullPointerException() {
Throwable thrown = catchThrowable(() -> hasCauseType(new Exception(), null));
assertThat(thrown).isExactlyInstanceOf(NullPointerException.class);
}
@Test
public void hasCauseTypeOfNullThrowableShouldThrowNullPointerException() {
Throwable thrown = catchThrowable(() -> hasCauseType(null, Exception.class));
assertThat(thrown).isExactlyInstanceOf(NullPointerException.class);
}
@Test
public void hasCauseTypeOfNonMatchingShouldReturnFalse() {
assertThat(hasCauseType(new OneException(), OtherException.class)).isFalse();
}
@Test
public void hasCauseTypeOfSameClassShouldReturnTrue() {
assertThat(hasCauseType(new OneException(), OneException.class)).isTrue();
}
@Test
public void hasCauseTypeOfSuperClassShouldReturnFalse() {
assertThat(hasCauseType(new OneException(), SubException.class)).isFalse();
}
@Test
public void hasCauseTypeOfSubClassShouldReturnTrue() {
assertThat(hasCauseType(new SubException(), OneException.class)).isTrue();
}
@Test
public void hasCauseTypeOfWrappedClassShouldReturnTrue() {
assertThat(hasCauseType(new OneException(new TwoException()), TwoException.class)).isTrue();
}
@Test
public void hasCauseTypeOfWrappingClassShouldReturnTrue() {
assertThat(hasCauseType(new OneException(new TwoException()), OneException.class)).isTrue();
}
@Test
public void hasCauseTypeOfNestedClassShouldReturnTrue() {
assertThat(hasCauseType(new OneException(new TwoException(new OtherException())),
OtherException.class)).isTrue();
}
@Test
public void hasCauseMessageForNullShouldThrowNullPointerException() {
Throwable thrown = catchThrowable(() -> hasCauseMessage(null, "message"));
assertThat(thrown).isExactlyInstanceOf(NullPointerException.class);
}
@Test
public void hasCauseMessageOfNullShouldThrowNullPointerException() {
Throwable thrown = catchThrowable(() -> hasCauseMessage(new OneException(), null));
assertThat(thrown).isExactlyInstanceOf(NullPointerException.class);
}
@Test
public void hasCauseMessageForNullMessageShouldThrowNullPointerException() {
Throwable thrown = catchThrowable(() -> hasCauseMessage(new OneException((String) null), null));
assertThat(thrown).isExactlyInstanceOf(NullPointerException.class);
}
@Test
public void hasCauseMessageOfNonMatchingNullMessageShouldThrowNullPointerException() {
Throwable thrown = catchThrowable(() -> hasCauseMessage(new OneException("message"), null));
assertThat(thrown).isExactlyInstanceOf(NullPointerException.class);
}
@Test
public void hasCauseMessageOfEmptyMessageShouldReturnTrue() {
assertThat(hasCauseMessage(new OneException(""), "")).isTrue();
}
@Test
public void hasCauseMessageOfMatchingMessageShouldReturnTrue() {
assertThat(hasCauseMessage(new OneException("message"), "message")).isTrue();
}
@Test
public void hasCauseMessageOfNonMatchingMessageShouldReturnFalse() {
assertThat(hasCauseMessage(new OneException("non-matching"), "message")).isFalse();
}
@Test
public void hasCauseMessageOfContainedMessageShouldReturnTrue() {
assertThat(hasCauseMessage(new OneException("this is the message"), "message")).isTrue();
}
@Test
public void hasCauseMessageOfPartialMatchingMessageShouldReturnFalse() {
assertThat(hasCauseMessage(new OneException("message"), "this is the message")).isFalse();
}
@Test
public void setRootCauseShouldSetTheCause() {
OneException exception = new OneException(new TwoException());
ThrowableUtils.setRootCause(exception, new OtherException());
assertThat(exception).hasCauseInstanceOf(TwoException.class);
assertThat(exception).hasRootCauseInstanceOf(OtherException.class);
}
@Test
public void setRootCauseShouldAvoidSelfCausation() {
TwoException cause = new TwoException();
OneException exception = new OneException(cause);
ThrowableUtils.setRootCause(exception, cause);
assertThat(exception).hasRootCauseInstanceOf(TwoException.class);
}
private static class OneException extends Exception {
public OneException() {
// nothing
}
public OneException(String message) {
super(message);
}
public OneException(Throwable cause) {
super(cause);
}
public OneException(String message, Throwable cause) {
super(message, cause);
}
}
private static class SubException extends OneException {
public SubException() {
// nothing
}
public SubException(String message) {
super(message);
}
public SubException(Throwable cause) {
super(cause);
}
public SubException(String message, Throwable cause) {
super(message, cause);
}
}
private static class TwoException extends Exception {
public TwoException() {
// nothing
}
public TwoException(String message) {
super(message);
}
public TwoException(Throwable cause) {
super(cause);
}
public TwoException(String message, Throwable cause) {
super(message, cause);
}
}
private static class OtherException extends Exception {
public OtherException() {
// nothing
}
public OtherException(String message) {
super(message);
}
public OtherException(Throwable cause) {
super(cause);
}
public OtherException(String message, Throwable cause) {
super(message, cause);
}
}
}