aboutsummaryrefslogtreecommitdiffstats
path: root/vid-automation/src/main/java/vid/automation/test/infra/SkipTestsTestngTransformer.java
diff options
context:
space:
mode:
Diffstat (limited to 'vid-automation/src/main/java/vid/automation/test/infra/SkipTestsTestngTransformer.java')
-rw-r--r--vid-automation/src/main/java/vid/automation/test/infra/SkipTestsTestngTransformer.java103
1 files changed, 103 insertions, 0 deletions
diff --git a/vid-automation/src/main/java/vid/automation/test/infra/SkipTestsTestngTransformer.java b/vid-automation/src/main/java/vid/automation/test/infra/SkipTestsTestngTransformer.java
new file mode 100644
index 000000000..ed9aaaf69
--- /dev/null
+++ b/vid-automation/src/main/java/vid/automation/test/infra/SkipTestsTestngTransformer.java
@@ -0,0 +1,103 @@
+package vid.automation.test.infra;
+
+import java.time.LocalDate;
+import org.testng.IAnnotationTransformer;
+import org.testng.annotations.ITestAnnotation;
+import org.togglz.core.context.StaticFeatureManagerProvider;
+
+import java.lang.reflect.AnnotatedElement;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+
+/*
+This transformer skip test we want to ignore during running VID tests.
+Pay attention that this listener shall be configured in the testng.xml (or command line)
+It can't be used as Listener annotation of base class
+
+FeatureTogglingTest:
+There are 2 ways to annotate that tests required featureFlags to be active :
+In method level - with @FeatureTogglingTest on the test method and list of Required Feature flags on
+In Class level - with @FeatureTogglingTest on the test class and list of Required Feature flags on
+For each test annotation of method level, we check if the test shall whole class shall run regards the features flag test.
+
+SkipTestUntil:
+If test annotated with SkipTestUntil the transformer check if the due date has already pass
+
+*/
+public class SkipTestsTestngTransformer implements IAnnotationTransformer {
+
+ @Override
+ public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) {
+
+ if (testMethod!=null) {
+ try {
+
+ if (!annotation.getEnabled()) {
+ return;
+ }
+
+ if (isIgnoreFeatureToggledTest(testMethod)) {
+ disableTest(annotation, testMethod.getName());
+ return;
+ }
+
+ if (isIgnoreFeatureToggledTest(testMethod.getDeclaringClass())) {
+ disableTest(annotation, testMethod.getDeclaringClass().getName());
+ return;
+ }
+
+ if (isIgnoreSkipUntilTest(testMethod)) {
+ disableTest(annotation, testMethod.getName());
+ return;
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private boolean isIgnoreFeatureToggledTest(AnnotatedElement annotatedElement) {
+
+ return (annotatedElement.isAnnotationPresent(FeatureTogglingTest.class) &&
+ shallDisableTest(annotatedElement.getAnnotation(FeatureTogglingTest.class)));
+
+ }
+
+ private boolean shallDisableTest(FeatureTogglingTest featureTogglingTest) {
+ if (featureTogglingTest.value().length==0) {
+ return false;
+ }
+ if (new StaticFeatureManagerProvider().getFeatureManager()==null) {
+ FeaturesTogglingConfiguration.initializeFeatureManager();
+ }
+ for (Features feature : featureTogglingTest.value()) {
+ if (!(feature.isActive()==featureTogglingTest.flagActive())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private void disableTest(ITestAnnotation annotation, String name) {
+ System.out.println("Ignore "+ name+" due to annotation");
+ annotation.setEnabled(false);
+ }
+
+ private boolean isIgnoreSkipUntilTest(AnnotatedElement annotatedElement) {
+ if (!annotatedElement.isAnnotationPresent(SkipTestUntil.class)) {
+ return false;
+ }
+
+ String dateAsStr = annotatedElement.getAnnotation(SkipTestUntil.class).value();
+ try {
+ return LocalDate.now().isBefore(LocalDate.parse(dateAsStr));
+ }
+ catch (RuntimeException exception) {
+ System.out.println("Failure during processing of SkipTestUntil annotation value is " + dateAsStr);
+ exception.printStackTrace();
+ return false;
+ }
+ }
+}
+