package org.jboss.windup.exec.test; import java.nio.file.Paths; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.inject.Inject; import org.apache.commons.lang3.BooleanUtils; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.forge.arquillian.AddonDependencies; import org.jboss.forge.arquillian.AddonDependency; import org.jboss.forge.arquillian.archive.AddonArchive; import org.jboss.forge.furnace.proxy.Proxies; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.windup.config.AbstractRuleLifecycleListener; import org.jboss.windup.config.AbstractRuleProvider; import org.jboss.windup.config.GraphRewrite; import org.jboss.windup.config.RuleProvider; import org.jboss.windup.config.SkipReportsRenderingOption; import org.jboss.windup.config.loader.RuleLoaderContext; import org.jboss.windup.config.metadata.RuleMetadata; import org.jboss.windup.config.metadata.RuleMetadataType; import org.jboss.windup.config.operation.Log; import org.jboss.windup.config.phase.MigrationRulesPhase; import org.jboss.windup.config.phase.PostReportGenerationPhase; import org.jboss.windup.config.phase.PostReportRenderingPhase; import org.jboss.windup.config.phase.PreReportGenerationPhase; import org.jboss.windup.config.phase.ReportGenerationPhase; import org.jboss.windup.config.phase.ReportRenderingPhase; import org.jboss.windup.exec.WindupProcessor; import org.jboss.windup.exec.configuration.WindupConfiguration; import org.jboss.windup.graph.GraphContext; import org.jboss.windup.graph.GraphContextFactory; import org.jboss.windup.util.exception.WindupException; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.ocpsoft.logging.Logger; import org.ocpsoft.rewrite.config.Configuration; import org.ocpsoft.rewrite.config.ConfigurationBuilder; import org.ocpsoft.rewrite.config.Rule; import org.ocpsoft.rewrite.context.Context; import org.ocpsoft.rewrite.context.EvaluationContext; /** * Test for skipping reports rendering - RuleProvider execution filtering based on report related phases . * * How this tests works: * * The 6 RuleProviders have different phase. Execution is configured to disable processing rules in phases related to reports. Through the * RuleExecutionListener, execution of rules is observed, and the same listener, at the end of execution, checks whether the right rule with a phase * was executed. * * @author <a href="mailto:hotmana76@gmail.com">Marek Novotny</a> */ @RunWith(Arquillian.class) public class SkippingReportsRenderingTest { final List<Class<? extends RuleProvider>> RULES = Arrays.asList(TestRuleinPreReportGenerationPhase.class, TestRuleinPostReportRendenringPhase.class, TestRuleinMigrationRulesPhase.class, TestRuleinPostReportGenerationPhase.class, TestRuleinReportGenerationPhase.class, TestRuleinReportRenderingPhase.class); @Deployment @AddonDependencies({ @AddonDependency(name = "org.jboss.forge.furnace.container:cdi"), @AddonDependency(name = "org.jboss.windup.utils:windup-utils"), @AddonDependency(name = "org.jboss.windup.graph:windup-graph"), @AddonDependency(name = "org.jboss.windup.config:windup-config"), @AddonDependency(name = "org.jboss.windup.exec:windup-exec"), }) public static AddonArchive getDeployment() { final AddonArchive archive = ShrinkWrap.create(AddonArchive.class) .addBeansXML(); return archive; } @Inject private WindupProcessor processor; @Inject private GraphContextFactory contextFactory; public static class TestPhaseRuleExecutionListener extends AbstractRuleLifecycleListener { Map<String, Boolean> executedRules = new HashMap<>(); @Override public void beforeExecution(GraphRewrite event) { event.getRewriteContext().put("testData", new HashMap<>()); } @Override public boolean beforeRuleEvaluation(GraphRewrite event, Rule rule, EvaluationContext context) { RuleProvider provider = (RuleProvider) ((Context) rule).get(RuleMetadataType.RULE_PROVIDER); String realName = Proxies.unwrapProxyClassName(provider.getClass()); executedRules.put(realName, Boolean.FALSE); return false; } @Override public boolean ruleEvaluationProgress(GraphRewrite event, String name, int currentPosition, int total, int timeRemainingInSeconds) { return false; } @Override public void afterRuleConditionEvaluation(GraphRewrite event, EvaluationContext context, Rule rule, boolean result) { RuleProvider provider = (RuleProvider) ((Context) rule).get(RuleMetadataType.RULE_PROVIDER); String realName = Proxies.unwrapProxyClassName(provider.getClass()); executedRules.put(realName, Boolean.TRUE); } @Override public void afterExecution(GraphRewrite event) { verifyExecutionOfRule(TestRuleinMigrationRulesPhase.class, Boolean.TRUE); verifyExecutionOfRule(TestRuleinPreReportGenerationPhase.class, Boolean.FALSE); verifyExecutionOfRule(TestRuleinReportGenerationPhase.class, Boolean.FALSE); verifyExecutionOfRule(TestRuleinPostReportGenerationPhase.class, Boolean.FALSE); verifyExecutionOfRule(TestRuleinReportRenderingPhase.class, Boolean.FALSE); verifyExecutionOfRule(TestRuleinPostReportRendenringPhase.class, Boolean.FALSE); } private void verifyExecutionOfRule(Class<? extends RuleProvider> cls, Boolean shouldHaveRun) { final Boolean didItRun = BooleanUtils.isTrue(executedRules.get(cls.getName())); Assert.assertEquals(cls.getSimpleName(), shouldHaveRun, didItRun); } } @Test public void testRules() { executeTest(RULES); } private void executeTest(List<Class<? extends RuleProvider>> rules) { try (GraphContext context = contextFactory.create()) { runRules(context, rules); } catch (Exception ex) { throw new WindupException(ex.getMessage(), ex); } } /** * Configure the WindupConfiguration according to the params and run the RuleProviders. */ private void runRules(GraphContext context, List<Class<? extends RuleProvider>> rules) { WindupConfiguration wc = new WindupConfiguration(); wc.setGraphContext(context); wc.addInputPath(Paths.get(".")); wc.setOutputDirectory(Paths.get("target/WindupReport")); wc.setOptionValue(SkipReportsRenderingOption.NAME, true); processor.execute(wc); } @RuleMetadata(phase = PreReportGenerationPhase.class) public static class TestRuleinPreReportGenerationPhase extends NoopRuleProvider { } @RuleMetadata(phase = ReportGenerationPhase.class) public static class TestRuleinReportGenerationPhase extends NoopRuleProvider { } @RuleMetadata(phase = PostReportGenerationPhase.class) public static class TestRuleinPostReportGenerationPhase extends NoopRuleProvider { } @RuleMetadata(phase = ReportRenderingPhase.class) public static class TestRuleinReportRenderingPhase extends NoopRuleProvider { } @RuleMetadata(phase = PostReportRenderingPhase.class) public static class TestRuleinPostReportRendenringPhase extends NoopRuleProvider { } @RuleMetadata(phase = MigrationRulesPhase.class) public static class TestRuleinMigrationRulesPhase extends NoopRuleProvider { } public abstract static class NoopRuleProvider extends AbstractRuleProvider { @Override public Configuration getConfiguration(RuleLoaderContext ruleLoaderContext) { return ConfigurationBuilder.begin().addRule() .perform(Log.message(Logger.Level.TRACE, "Performing Rule: " + this.getClass().getSimpleName())); } } }