diff --git a/extractor/src/test/java/org/schabi/newpipe/MockOnly.java b/extractor/src/test/java/org/schabi/newpipe/MockOnly.java new file mode 100644 index 000000000..2435fe2ab --- /dev/null +++ b/extractor/src/test/java/org/schabi/newpipe/MockOnly.java @@ -0,0 +1,18 @@ +package org.schabi.newpipe; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Marker annotation to skip test if it not run with mocks. + * + * {@link MockOnlyRule} + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD, ElementType.TYPE}) +@Inherited +public @interface MockOnly { +} \ No newline at end of file diff --git a/extractor/src/test/java/org/schabi/newpipe/MockOnlyRule.java b/extractor/src/test/java/org/schabi/newpipe/MockOnlyRule.java new file mode 100644 index 000000000..78da16aaf --- /dev/null +++ b/extractor/src/test/java/org/schabi/newpipe/MockOnlyRule.java @@ -0,0 +1,48 @@ +package org.schabi.newpipe; + +import org.junit.Assume; +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; +import org.schabi.newpipe.downloader.DownloaderType; + +import javax.annotation.Nonnull; + +/** + *

+ * Checks if the system variable "downloader" is set to "REAL" and skips the tests if it is. + * Otherwise execute the test. + *

+ * + *

+ * Use it by creating a public variable of this inside the test class and annotate it with + * {@link org.junit.Rule}. Then annotate the tests to be skipped with {@link MockOnly} + *

+ * + *

+ * Allows skipping unreliable or time sensitive tests in CI pipeline. + *

+ */ +public class MockOnlyRule implements TestRule { + + final String downloader = System.getProperty("downloader"); + + @Override + @Nonnull + public Statement apply(@Nonnull Statement base, @Nonnull Description description) { + return new Statement() { + @Override + public void evaluate() throws Throwable { + final boolean hasAnnotation = description.getAnnotation(MockOnly.class) == null; + final boolean isMockDownloader = downloader == null || + !downloader.equalsIgnoreCase(DownloaderType.REAL.toString()); + Assume.assumeTrue( + "The test is not reliable against a website and thus skipped", + hasAnnotation && isMockDownloader + ); + + base.evaluate(); + } + }; + } +}