blob: 248fd1bf6382674f0543e1b4160d50ba2ab28bf9 [file] [log] [blame]
package org.testng;
/**
* The root exception for special skip handling. In case a @Test or @Configuration
* throws this exception the method will be considered a skip or a failure according to the
* return of {@link #isSkip()}.
* Users may provide extensions to this mechanism by extending this class.
*
* @author <a href='mailto:the[dot]mindstorm[at]gmail[dot]com'>Alex Popescu</a>
* @since 5.6
*/
public class SkipException extends RuntimeException {
private static final long serialVersionUID = 4052142657885527260L;
private StackTraceElement[] m_stackTrace;
private volatile boolean m_stackReduced;
public SkipException(String skipMessage) {
super(skipMessage);
}
protected SkipException(String skipMessage, Throwable cause) {
super(skipMessage, cause);
}
/**
* Flag if the current exception marks a skipped method (<tt>true</tt>)
* or a failure (<tt>false</tt>). By default Subclasses should override this method
* in order to provide smarter behavior.
*
* @return <tt>true</tt> if the method should be considered a skip,
* <tt>false</tt> if the method should be considered failed. If not
* overwritten it returns <tt>true</tt>
*/
public boolean isSkip() {
return true;
}
/**
* Subclasses may use this method to reduce the printed stack trace.
* This method keeps only the last frame.
* <b>Important</b>: after calling this method the preserved internally
* and can be restored called {@link #restoreStackTrace}.
*/
protected void reduceStackTrace() {
if(!m_stackReduced) {
synchronized(this) {
StackTraceElement[] newStack= new StackTraceElement[1];
StackTraceElement[] originalStack= getStackTrace();
if(originalStack.length > 0) {
m_stackTrace= originalStack;
newStack[0]= getStackTrace()[0];
setStackTrace(newStack);
}
m_stackReduced= true;
}
}
}
/**
* Restores the original exception stack trace after a
* previous call to {@link #reduceStackTrace()}.
*
*/
protected void restoreStackTrace() {
if(m_stackReduced && null != m_stackTrace) {
synchronized(this) {
setStackTrace(m_stackTrace);
m_stackReduced= false;
}
}
}
}