diff --git a/slf4j-api/src/test/java/org/slf4j/rule/BlaTest.java b/slf4j-api/src/test/java/org/slf4j/rule/BlaTest.java new file mode 100755 index 000000000..259d063ac --- /dev/null +++ b/slf4j-api/src/test/java/org/slf4j/rule/BlaTest.java @@ -0,0 +1,38 @@ +package org.slf4j.rule; + +import static org.junit.Assert.fail; + +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; + +@Ignore // this test has intentional fails +public class BlaTest { + + @Rule + public RunInNewThreadRule runInThread = new RunInNewThreadRule(); + + @Test + public void aTest() { + System.out.println("running aTest in "+ Thread.currentThread().getName()); + } + + @RunInNewThread + @Test + public void bTest() { + System.out.println("running bTest in "+ Thread.currentThread().getName()); + } + + @RunInNewThread(timeout = 2000L) + @Test + public void cTest() { + System.out.println("running cTest in "+ Thread.currentThread().getName()); + } + @RunInNewThread() + @Test + public void dTest() { + System.out.println("running dTest in "+ Thread.currentThread().getName()); + fail(); + } +} + diff --git a/slf4j-api/src/test/java/org/slf4j/rule/RunInNewThread.java b/slf4j-api/src/test/java/org/slf4j/rule/RunInNewThread.java new file mode 100755 index 000000000..1bf5944fb --- /dev/null +++ b/slf4j-api/src/test/java/org/slf4j/rule/RunInNewThread.java @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2021 QOS.ch + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package org.slf4j.rule; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD}) +public @interface RunInNewThread { + static final long DEFAULT_TIMEOUT = 1000L; + public long timeout() default DEFAULT_TIMEOUT; +} diff --git a/slf4j-api/src/test/java/org/slf4j/rule/RunInNewThreadRule.java b/slf4j-api/src/test/java/org/slf4j/rule/RunInNewThreadRule.java new file mode 100755 index 000000000..ab35ecc89 --- /dev/null +++ b/slf4j-api/src/test/java/org/slf4j/rule/RunInNewThreadRule.java @@ -0,0 +1,54 @@ +/** + * Copyright (c) 2021 QOS.ch + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +package org.slf4j.rule; + +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; + +// This class has been inspired by the article "A JUnit Rule to Run a Test in Its Own Thread" +// published by Frank Appel, author of the book "Testing with JUnit" published by Packt publishing. +// +// See also +// https://www.codeaffine.com/2014/07/21/a-junit-rule-to-run-a-test-in-its-own-thread/ + +public class RunInNewThreadRule implements TestRule { + + @Override + public Statement apply(Statement base, Description description) { + RunInNewThread desiredAnnotaton = description.getAnnotation(RunInNewThread.class); + + if(desiredAnnotaton == null) { + System.out.println("test "+ description.getMethodName() +" not annotated"); + return base; + } else { + long timeout = desiredAnnotaton.timeout(); + System.out.println("running "+ description.getMethodName() +" in separate tjread"); + return new RunInNewThreadStatement(base, timeout); + } + } + +} diff --git a/slf4j-api/src/test/java/org/slf4j/rule/RunInNewThreadStatement.java b/slf4j-api/src/test/java/org/slf4j/rule/RunInNewThreadStatement.java new file mode 100755 index 000000000..e990be37e --- /dev/null +++ b/slf4j-api/src/test/java/org/slf4j/rule/RunInNewThreadStatement.java @@ -0,0 +1,68 @@ +/** + * Copyright (c) 2021 QOS.ch + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ +package org.slf4j.rule; + +import org.junit.runners.model.Statement; + +//This class has been inspired by the article "A JUnit Rule to Run a Test in Its Own Thread" +//published by Frank Appel, author of the book "Testing with JUnit" published by Packt publishing. +// +//See also +//https://www.codeaffine.com/2014/07/21/a-junit-rule-to-run-a-test-in-its-own-thread/ + +public class RunInNewThreadStatement extends Statement implements Runnable { + + final Statement base; + final long timeout; + Throwable throwable; + + RunInNewThreadStatement(Statement base, long timeout) { + this.base = base; + this.timeout = timeout; + } + + @Override + public void evaluate() throws Throwable { + Thread thread = new Thread(this); + thread.start(); + System.out.println("Timeout is "+timeout); + thread.join(timeout); + + if(throwable != null) { + throw throwable; + } + } + + @Override + public void run() { + try { + base.evaluate(); + } catch (Throwable e) { + this.throwable = e; + } + } + + +}