Skip to content

Commit

Permalink
Add failure test util where needed
Browse files Browse the repository at this point in the history
  • Loading branch information
JooHyukKim committed Jan 19, 2025
1 parent 4ff30d6 commit 4f44fd6
Show file tree
Hide file tree
Showing 18 changed files with 588 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.fasterxml.jackson.module.afterburner.util.failure;

import java.lang.annotation.*;

import org.junit.jupiter.api.extension.ExtendWith;

/**
* <p>
* Annotation used to indicate that a JUnit-5 based tests method is expected to fail.
*
* <p>
* When a test method is annotated with {@code @JacksonTestFailureExpected}, the
* {@link JacksonTestFailureExpectedInterceptor} will intercept the test execution.
* If the test passes, which is an unexpected behavior, the interceptor will throw an exception to fail the test,
* indicating that the test was expected to fail but didn't.
* </p>
*
* <h3>Usage Example:</h3>
*
* <pre><code>
*
* &#64;Test
* &#64;JacksonTestFailureExpected
* public void testFeatureNotYetImplemented() {
* // Test code that is expected to fail
* }
* }
* </code></pre>
*
* <p>
*
* @since 2.19
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@ExtendWith(JacksonTestFailureExpectedInterceptor.class)
public @interface JacksonTestFailureExpected { }
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.fasterxml.jackson.module.afterburner.util.failure;

import java.lang.reflect.Method;

import org.junit.jupiter.api.extension.*;

/**
* Custom {@link InvocationInterceptor} that intercepts test method invocation.
* To pass the test ***only if*** test fails with an exception, and fail the test otherwise.
*
* @since 2.19
*/
public class JacksonTestFailureExpectedInterceptor
implements InvocationInterceptor
{
@Override
public void interceptTestMethod(Invocation<Void> invocation,
ReflectiveInvocationContext<Method> invocationContext, ExtensionContext extensionContext)
throws Throwable
{
try {
invocation.proceed();
} catch (Throwable t) {
// do-nothing, we do expect an exception
return;
}
handleUnexpectePassingTest(invocationContext);
}

private void handleUnexpectePassingTest(ReflectiveInvocationContext<Method> invocationContext) {
// Collect information we need
Object targetClass = invocationContext.getTargetClass();
Object testMethod = invocationContext.getExecutable().getName();
//List<Object> arguments = invocationContext.getArguments();

// Create message
String message = String.format("Test method %s.%s() passed, but should have failed", targetClass, testMethod);

// throw exception
throw new JacksonTestShouldFailException(message);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.fasterxml.jackson.module.afterburner.util.failure;

/**
* Exception used to alert that a test is passing, but should be failing.
*
* WARNING : This only for test code, and should never be thrown from production code.
*
* @since 2.19
*/
public class JacksonTestShouldFailException
extends RuntimeException
{
private static final long serialVersionUID = 1L;

public JacksonTestShouldFailException(String msg) {
super(msg);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.fasterxml.jackson.module.androidrecord.testutil.failure;

import java.lang.annotation.*;

import org.junit.jupiter.api.extension.ExtendWith;

/**
* <p>
* Annotation used to indicate that a JUnit-5 based tests method is expected to fail.
*
* <p>
* When a test method is annotated with {@code @JacksonTestFailureExpected}, the
* {@link JacksonTestFailureExpectedInterceptor} will intercept the test execution.
* If the test passes, which is an unexpected behavior, the interceptor will throw an exception to fail the test,
* indicating that the test was expected to fail but didn't.
* </p>
*
* <h3>Usage Example:</h3>
*
* <pre><code>
*
* &#64;Test
* &#64;JacksonTestFailureExpected
* public void testFeatureNotYetImplemented() {
* // Test code that is expected to fail
* }
* }
* </code></pre>
*
* <p>
*
* @since 2.19
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@ExtendWith(JacksonTestFailureExpectedInterceptor.class)
public @interface JacksonTestFailureExpected { }
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.fasterxml.jackson.module.androidrecord.testutil.failure;

import java.lang.reflect.Method;

import org.junit.jupiter.api.extension.*;

/**
* Custom {@link InvocationInterceptor} that intercepts test method invocation.
* To pass the test ***only if*** test fails with an exception, and fail the test otherwise.
*
* @since 2.19
*/
public class JacksonTestFailureExpectedInterceptor
implements InvocationInterceptor
{
@Override
public void interceptTestMethod(Invocation<Void> invocation,
ReflectiveInvocationContext<Method> invocationContext, ExtensionContext extensionContext)
throws Throwable
{
try {
invocation.proceed();
} catch (Throwable t) {
// do-nothing, we do expect an exception
return;
}
handleUnexpectePassingTest(invocationContext);
}

private void handleUnexpectePassingTest(ReflectiveInvocationContext<Method> invocationContext) {
// Collect information we need
Object targetClass = invocationContext.getTargetClass();
Object testMethod = invocationContext.getExecutable().getName();
//List<Object> arguments = invocationContext.getArguments();

// Create message
String message = String.format("Test method %s.%s() passed, but should have failed", targetClass, testMethod);

// throw exception
throw new JacksonTestShouldFailException(message);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.fasterxml.jackson.module.androidrecord.testutil.failure;

/**
* Exception used to alert that a test is passing, but should be failing.
*
* WARNING : This only for test code, and should never be thrown from production code.
*
* @since 2.19
*/
public class JacksonTestShouldFailException
extends RuntimeException
{
private static final long serialVersionUID = 1L;

public JacksonTestShouldFailException(String msg) {
super(msg);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.fasterxml.jackson.module.blackbird.testutil.failure;

import java.lang.annotation.*;

import org.junit.jupiter.api.extension.ExtendWith;

/**
* <p>
* Annotation used to indicate that a JUnit-5 based tests method is expected to fail.
*
* <p>
* When a test method is annotated with {@code @JacksonTestFailureExpected}, the
* {@link JacksonTestFailureExpectedInterceptor} will intercept the test execution.
* If the test passes, which is an unexpected behavior, the interceptor will throw an exception to fail the test,
* indicating that the test was expected to fail but didn't.
* </p>
*
* <h3>Usage Example:</h3>
*
* <pre><code>
*
* &#64;Test
* &#64;JacksonTestFailureExpected
* public void testFeatureNotYetImplemented() {
* // Test code that is expected to fail
* }
* }
* </code></pre>
*
* <p>
*
* @since 2.19
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@ExtendWith(JacksonTestFailureExpectedInterceptor.class)
public @interface JacksonTestFailureExpected { }
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.fasterxml.jackson.module.blackbird.testutil.failure;

import java.lang.reflect.Method;

import org.junit.jupiter.api.extension.*;

/**
* Custom {@link InvocationInterceptor} that intercepts test method invocation.
* To pass the test ***only if*** test fails with an exception, and fail the test otherwise.
*
* @since 2.19
*/
public class JacksonTestFailureExpectedInterceptor
implements InvocationInterceptor
{
@Override
public void interceptTestMethod(Invocation<Void> invocation,
ReflectiveInvocationContext<Method> invocationContext, ExtensionContext extensionContext)
throws Throwable
{
try {
invocation.proceed();
} catch (Throwable t) {
// do-nothing, we do expect an exception
return;
}
handleUnexpectePassingTest(invocationContext);
}

private void handleUnexpectePassingTest(ReflectiveInvocationContext<Method> invocationContext) {
// Collect information we need
Object targetClass = invocationContext.getTargetClass();
Object testMethod = invocationContext.getExecutable().getName();
//List<Object> arguments = invocationContext.getArguments();

// Create message
String message = String.format("Test method %s.%s() passed, but should have failed", targetClass, testMethod);

// throw exception
throw new JacksonTestShouldFailException(message);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.fasterxml.jackson.module.blackbird.testutil.failure;

/**
* Exception used to alert that a test is passing, but should be failing.
*
* WARNING : This only for test code, and should never be thrown from production code.
*
* @since 2.19
*/
public class JacksonTestShouldFailException
extends RuntimeException
{
private static final long serialVersionUID = 1L;

public JacksonTestShouldFailException(String msg) {
super(msg);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.fasterxml.jackson.module.jakarta.xmlbind.testutil.failure;

import java.lang.annotation.*;

import org.junit.jupiter.api.extension.ExtendWith;

/**
* <p>
* Annotation used to indicate that a JUnit-5 based tests method is expected to fail.
*
* <p>
* When a test method is annotated with {@code @JacksonTestFailureExpected}, the
* {@link JacksonTestFailureExpectedInterceptor} will intercept the test execution.
* If the test passes, which is an unexpected behavior, the interceptor will throw an exception to fail the test,
* indicating that the test was expected to fail but didn't.
* </p>
*
* <h3>Usage Example:</h3>
*
* <pre><code>
*
* &#64;Test
* &#64;JacksonTestFailureExpected
* public void testFeatureNotYetImplemented() {
* // Test code that is expected to fail
* }
* }
* </code></pre>
*
* <p>
*
* @since 2.19
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@ExtendWith(JacksonTestFailureExpectedInterceptor.class)
public @interface JacksonTestFailureExpected { }
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.fasterxml.jackson.module.jakarta.xmlbind.testutil.failure;

import java.lang.reflect.Method;

import org.junit.jupiter.api.extension.*;

/**
* Custom {@link InvocationInterceptor} that intercepts test method invocation.
* To pass the test ***only if*** test fails with an exception, and fail the test otherwise.
*
* @since 2.19
*/
public class JacksonTestFailureExpectedInterceptor
implements InvocationInterceptor
{
@Override
public void interceptTestMethod(Invocation<Void> invocation,
ReflectiveInvocationContext<Method> invocationContext, ExtensionContext extensionContext)
throws Throwable
{
try {
invocation.proceed();
} catch (Throwable t) {
// do-nothing, we do expect an exception
return;
}
handleUnexpectePassingTest(invocationContext);
}

private void handleUnexpectePassingTest(ReflectiveInvocationContext<Method> invocationContext) {
// Collect information we need
Object targetClass = invocationContext.getTargetClass();
Object testMethod = invocationContext.getExecutable().getName();
//List<Object> arguments = invocationContext.getArguments();

// Create message
String message = String.format("Test method %s.%s() passed, but should have failed", targetClass, testMethod);

// throw exception
throw new JacksonTestShouldFailException(message);
}

}
Loading

0 comments on commit 4f44fd6

Please sign in to comment.