blob: 5e61bbc6dffe456031abf01338b5ed429bd38d1d [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.drill.common.exceptions;
import org.apache.drill.exec.proto.UserBitShared.DrillPBError;
import org.apache.drill.exec.proto.UserBitShared.DrillPBError.ErrorType;
import org.apache.drill.test.BaseTest;
import org.junit.Assert;
import org.junit.Test;
/**
* Test various use cases when creating user exceptions
*/
public class TestUserException extends BaseTest {
private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory
.getLogger("--ignore.as.this.is.for.testing.exceptions--");
private Exception wrap(UserException uex, int numWraps) {
Exception ex = uex;
for (int i = 0; i < numWraps; i++) {
ex = new Exception("wrap #" + (i+1), ex);
}
return ex;
}
// make sure system exceptions are created properly
@Test
public void testBuildSystemException() {
String message = "This is an exception";
UserException uex = UserException.systemError(new Exception(new RuntimeException(message))).build(logger);
Assert.assertTrue(uex.getOriginalMessage().contains(message));
Assert.assertTrue(uex.getOriginalMessage().contains("RuntimeException"));
DrillPBError error = uex.getOrCreatePBError(true);
Assert.assertEquals(ErrorType.SYSTEM, error.getErrorType());
}
@Test
public void testBuildUserExceptionWithMessage() {
String message = "Test message";
UserException uex = UserException.dataWriteError().message(message).build(logger);
DrillPBError error = uex.getOrCreatePBError(false);
Assert.assertEquals(ErrorType.DATA_WRITE, error.getErrorType());
Assert.assertEquals(message, uex.getOriginalMessage());
}
@Test
public void testBuildUserExceptionWithCause() {
String message = "Test message";
UserException uex = UserException.dataWriteError(new RuntimeException(message)).build(logger);
DrillPBError error = uex.getOrCreatePBError(false);
// cause message should be used
Assert.assertEquals(ErrorType.DATA_WRITE, error.getErrorType());
Assert.assertEquals(message, uex.getOriginalMessage());
}
@Test
public void testBuildUserExceptionWithCauseAndMessage() {
String messageA = "Test message A";
String messageB = "Test message B";
UserException uex = UserException.dataWriteError(new RuntimeException(messageA)).message(messageB).build(logger);
DrillPBError error = uex.getOrCreatePBError(false);
// passed message should override the cause message
Assert.assertEquals(ErrorType.DATA_WRITE, error.getErrorType());
Assert.assertFalse(error.getMessage().contains(messageA)); // messageA should not be part of the context
Assert.assertEquals(messageB, uex.getOriginalMessage());
}
@Test
public void testBuildUserExceptionWithUserExceptionCauseAndMessage() {
String messageA = "Test message A";
String messageB = "Test message B";
UserException original = UserException.connectionError().message(messageA).build(logger);
UserException uex = UserException.dataWriteError(wrap(original, 5)).message(messageB).build(logger);
//builder should return the unwrapped original user exception and not build a new one
Assert.assertEquals(original, uex);
DrillPBError error = uex.getOrCreatePBError(false);
Assert.assertEquals(messageA, uex.getOriginalMessage());
Assert.assertFalse(error.getMessage().contains(messageB)); // messageB should not be part of the context
}
@Test
public void testBuildUserExceptionWithFormattedMessage() {
String format = "This is test #%d";
UserException uex = UserException.connectionError().message(format, 5).build(logger);
DrillPBError error = uex.getOrCreatePBError(false);
Assert.assertEquals(ErrorType.CONNECTION, error.getErrorType());
Assert.assertEquals(String.format(format, 5), uex.getOriginalMessage());
}
// make sure wrapped user exceptions are retrieved properly when calling ErrorHelper.wrap()
@Test
public void testWrapUserException() {
UserException uex = UserException.dataReadError().message("this is a data read exception").build(logger);
Exception wrapped = wrap(uex, 3);
Assert.assertEquals(uex, UserException.systemError(wrapped).build(logger));
}
}