From ea520306135d7626e8ca5d189cd1cfcce26a51ba Mon Sep 17 00:00:00 2001 From: XiangRongLin <41164160+XiangRongLin@users.noreply.github.com> Date: Sat, 16 Jan 2021 17:11:29 +0100 Subject: [PATCH] Add MockOnlyRule to allow skipping specific tests based on downloader --- .../java/org/schabi/newpipe/MockOnly.java | 18 +++++++ .../java/org/schabi/newpipe/MockOnlyRule.java | 48 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 extractor/src/test/java/org/schabi/newpipe/MockOnly.java create mode 100644 extractor/src/test/java/org/schabi/newpipe/MockOnlyRule.java 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 00000000..2435fe2a --- /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 00000000..78da16aa --- /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(); + } + }; + } +}