package org.jboss.windup.tests.application; import org.apache.commons.lang.StringUtils; 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.shrinkwrap.api.ShrinkWrap; import org.jboss.windup.graph.GraphContext; import org.jboss.windup.graph.model.ProjectModel; import org.jboss.windup.graph.model.WindupConfigurationModel; import org.jboss.windup.graph.model.resource.FileModel; import org.jboss.windup.graph.service.ProjectService; import org.jboss.windup.graph.service.Service; import org.jboss.windup.graph.service.WindupConfigurationService; import org.jboss.windup.reporting.model.ApplicationReportModel; import org.jboss.windup.reporting.model.MigrationIssuesReportModel; import org.jboss.windup.reporting.model.ReportModel; import org.jboss.windup.reporting.rules.CreateApplicationListReportRuleProvider; import org.jboss.windup.reporting.service.ReportService; import org.jboss.windup.rules.apps.java.dependencyreport.CreateDependencyReportRuleProvider; import org.jboss.windup.rules.apps.java.model.JavaApplicationOverviewReportModel; import org.jboss.windup.rules.apps.java.reporting.rules.CreateReportIndexRuleProvider; import org.jboss.windup.testutil.html.CheckFailedException; import org.jboss.windup.testutil.html.TestApplicationListUtil; import org.jboss.windup.testutil.html.TestDependencyReportUtil; import org.jboss.windup.testutil.html.TestJavaApplicationOverviewUtil; import org.jboss.windup.testutil.html.TestMigrationIssuesReportUtil; import org.jboss.windup.testutil.html.TestReportIndexReportUtil; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import java.io.File; import java.nio.file.Path; import java.util.Arrays; import java.util.List; /** * @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a> */ @RunWith(Arquillian.class) public class WindupArchitectureDuplicateTest extends WindupArchitectureTest { private static final String MAIN_APP_FILENAME = "duplicate-ear-test-1.ear"; private static final String SECOND_APP_FILENAME = "duplicate-ear-test-2.ear"; private static final String THIRD_APP_FILENAME = "duplicate-ear-test-3.ear"; @Deployment @AddonDependencies({ @AddonDependency(name = "org.jboss.windup.graph:windup-graph"), @AddonDependency(name = "org.jboss.windup.reporting:windup-reporting"), @AddonDependency(name = "org.jboss.windup.exec:windup-exec"), @AddonDependency(name = "org.jboss.windup.rules.apps:windup-rules-java"), @AddonDependency(name = "org.jboss.windup.rules.apps:windup-rules-java-ee"), @AddonDependency(name = "org.jboss.windup.rules.apps:windup-rules-java-project"), @AddonDependency(name = "org.jboss.windup.rules.apps:windup-rules-tattletale"), @AddonDependency(name = "org.jboss.windup.tests:test-util"), @AddonDependency(name = "org.jboss.windup.config:windup-config-groovy"), @AddonDependency(name = "org.jboss.forge.furnace.container:cdi"), }) public static AddonArchive getDeployment() { return ShrinkWrap.create(AddonArchive.class) .addBeansXML() .addClass(WindupArchitectureTest.class) .addAsResource(new File("src/test/groovy/GroovyExampleRule.windup.groovy")) .addAsResource(new File("src/test/xml/DuplicateTestRules.windup.xml")); } @Test public void testRunWindupDuplicateEAR() throws Exception { final String path1 = "../test-files/duplicate/" + MAIN_APP_FILENAME; final String path2 = "../test-files/duplicate/" + SECOND_APP_FILENAME; final String path3 = "../test-files/duplicate/" + THIRD_APP_FILENAME; final Path outputPath = getDefaultPath(); try (GraphContext context = createGraphContext(outputPath)) { List<String> inputPaths = Arrays.asList(path1, path2, path3); super.runTest(context, inputPaths, false); validateApplicationList(context); validateReportIndex(context); validateMigrationIssues(context); validateJarDependencyReport(context); validateOverviewReport(context); } finally { //FileUtils.deleteDirectory(testTempPath.toFile()); } } private void validateOverviewReport(GraphContext context) { ReportService reportService = new ReportService(context); Iterable<ReportModel> reportModels = getApplicationDetailsReports(context); ReportModel report = null; for (ReportModel reportModel : reportModels) { if (!(reportModel instanceof JavaApplicationOverviewReportModel)) continue; JavaApplicationOverviewReportModel javaReport = (JavaApplicationOverviewReportModel)reportModel; if ("duplicate-ear-test-1.ear".equals(javaReport.getProjectModel().getRootFileModel().getFileName())) { report = javaReport; break; } } if (report == null) throw new CheckFailedException("Could not find expected overview report!"); Path appReportPath = reportService.getReportDirectory().resolve(report.getReportFilename()); TestJavaApplicationOverviewUtil util = new TestJavaApplicationOverviewUtil(); util.loadPage(appReportPath); util.checkApplicationMessage("log4j reference found"); } private void validateApplicationList(GraphContext graphContext) { Service<ReportModel> service = graphContext.service(ReportModel.class); ReportModel report = service.getUniqueByProperty(ReportModel.TEMPLATE_PATH, CreateApplicationListReportRuleProvider.TEMPLATE_PATH); Assert.assertNotNull(report); Path reportPath = getPathForReport(graphContext, report); Assert.assertNotNull(reportPath); TestApplicationListUtil util = new TestApplicationListUtil(); util.loadPage(reportPath); Assert.assertEquals(636, util.getTotalStoryPoints(MAIN_APP_FILENAME)); Assert.assertEquals(584, util.getSharedStoryPoints(MAIN_APP_FILENAME)); Assert.assertEquals(52, util.getUniqueStoryPoints(MAIN_APP_FILENAME)); Assert.assertEquals(636, util.getTotalStoryPoints(SECOND_APP_FILENAME)); Assert.assertEquals(584, util.getSharedStoryPoints(SECOND_APP_FILENAME)); Assert.assertEquals(52, util.getUniqueStoryPoints(SECOND_APP_FILENAME)); Assert.assertEquals(576, util.getTotalStoryPoints(THIRD_APP_FILENAME)); Assert.assertEquals(576, util.getSharedStoryPoints(THIRD_APP_FILENAME)); Assert.assertEquals(0, util.getUniqueStoryPoints(THIRD_APP_FILENAME)); Assert.assertEquals(584, util.getTotalStoryPoints(ProjectService.SHARED_LIBS_APP_NAME)); } private void validateReportIndex(GraphContext graphContext) { Path mainReportPath = getReportIndex(graphContext, MAIN_APP_FILENAME); Assert.assertNotNull(mainReportPath); Path secondAppPath = getReportIndex(graphContext, SECOND_APP_FILENAME); Assert.assertNotNull(secondAppPath); Path sharedLibsPath = getReportIndex(graphContext, ProjectService.SHARED_LIBS_FILENAME); Assert.assertNotNull(sharedLibsPath); TestReportIndexReportUtil reportIndex = new TestReportIndexReportUtil(); reportIndex.loadPage(mainReportPath); Assert.assertTrue(reportIndex.checkIncidentByCategoryRow("mandatory", 2, 0)); Assert.assertTrue(reportIndex.checkIncidentByCategoryRow("optional", 91, 636)); Assert.assertTrue(reportIndex.checkIncidentByCategoryRow("potential", 0, 0)); reportIndex.loadPage(secondAppPath); Assert.assertTrue(reportIndex.checkIncidentByCategoryRow("mandatory", 2, 0)); Assert.assertTrue(reportIndex.checkIncidentByCategoryRow("optional", 91, 636)); Assert.assertTrue(reportIndex.checkIncidentByCategoryRow("potential", 0, 0)); reportIndex.loadPage(sharedLibsPath); Assert.assertTrue(reportIndex.checkIncidentByCategoryRow("mandatory", 2, 0)); Assert.assertTrue(reportIndex.checkIncidentByCategoryRow("optional", 87, 584)); Assert.assertTrue(reportIndex.checkIncidentByCategoryRow("potential", 0, 0)); } private void validateJarDependencyReport(GraphContext graphContext) { Path dependencyReport = getDependencyReportPath(graphContext); Assert.assertNotNull(dependencyReport); TestDependencyReportUtil dependencyReportUtil = new TestDependencyReportUtil(); dependencyReportUtil.loadPage(dependencyReport); Assert.assertEquals(9, dependencyReportUtil.getNumberOfJarsOnPage()); Assert.assertEquals(6, dependencyReportUtil.getNumberOfArchivePathsOnPage("log4j-1.2.6.jar")); Assert.assertEquals(3, dependencyReportUtil.getNumberOfArchivePathsOnPage("jee-example-services.jar")); Assert.assertTrue(dependencyReportUtil.findDependencyElement("jee-example-services.jar", "JEE Example EJB Services", "org.windup.example:jee-example-services:1.0.0", "d910370c02710f4bb7f7856e18f50803f1c37e16", "1.0.0", "", Arrays.asList(FOUND_PATHS_JEE_EXAMPLE_SERVICES))); Assert.assertTrue(dependencyReportUtil.findDependencyElement("commons-lang-2.5.jar", "Commons Lang", "commons-lang:commons-lang:2.5", "b0236b252e86419eef20c31a44579d2aee2f0a69", "2.5", "The Apache Software Foundation", Arrays.asList(FOUND_PATHS_COMMONS_LANG))); } private void validateMigrationIssues(GraphContext graphContext) { WindupConfigurationModel configurationModel = WindupConfigurationService.getConfigurationModel(graphContext); ProjectModel mainProject = null; ProjectModel copyProject = null; for (FileModel inputFile : configurationModel.getInputPaths()) { if (inputFile.getFileName().equals(MAIN_APP_FILENAME)) mainProject = inputFile.getProjectModel(); else if (inputFile.getFileName().equals(SECOND_APP_FILENAME)) copyProject = inputFile.getProjectModel(); } Assert.assertNotNull(mainProject); Assert.assertNotNull(copyProject); MigrationIssuesReportModel mainIssuesReportModel = getMigrationIssuesReport(graphContext, mainProject); MigrationIssuesReportModel copyIssuesReportModel = getMigrationIssuesReport(graphContext, copyProject); TestMigrationIssuesReportUtil migrationIssuesReportUtil = new TestMigrationIssuesReportUtil(); migrationIssuesReportUtil.loadPage(getPathForReport(graphContext, mainIssuesReportModel)); Assert.assertTrue(migrationIssuesReportUtil.checkIssue("Maven POM", 6, 0, "Info", 0)); Assert.assertTrue(migrationIssuesReportUtil.checkIssue("Unparsable XML File", 2, 0, "Info", 0)); migrationIssuesReportUtil.loadPage(getPathForReport(graphContext, copyIssuesReportModel)); Assert.assertTrue(migrationIssuesReportUtil.checkIssue("Maven POM", 6, 0, "Info", 0)); Assert.assertTrue(migrationIssuesReportUtil.checkIssue("Unparsable XML File", 2, 0, "Info", 0)); } private Path getReportIndex(GraphContext graphContext, String applicationFilename) { Service<ApplicationReportModel> service = graphContext.service(ApplicationReportModel.class); Iterable<ApplicationReportModel> reports = service.findAllByProperty(ReportModel.TEMPLATE_PATH, CreateReportIndexRuleProvider.TEMPLATE); for (ApplicationReportModel report : reports) { if (StringUtils.equals(applicationFilename, report.getProjectModel().getRootFileModel().getFileName())) return getPathForReport(graphContext, report); } return null; } private static final String[] FOUND_PATHS_JEE_EXAMPLE_SERVICES = { "duplicate-ear-test-1.ear/jee-example-services.jar", "duplicate-ear-test-2.ear/jee-example-services.jar", "duplicate-ear-test-3.ear/jee-example-services.jar"}; private static final String[] FOUND_PATHS_COMMONS_LANG = { "duplicate-ear-test-1.ear/jee-example-web.war/WEB-INF/lib/commons-lang-2.5.jar", "duplicate-ear-test-2.ear/jee-example-web.war/WEB-INF/lib/commons-lang-2.5.jar", "duplicate-ear-test-3.ear/jee-example-web.war/WEB-INF/lib/commons-lang-2.5.jar", }; private Path getDependencyReportPath(GraphContext graphContext) { Service<ApplicationReportModel> service = graphContext.service(ApplicationReportModel.class); Iterable<ApplicationReportModel> reports = service.findAllByProperty(ReportModel.TEMPLATE_PATH, CreateDependencyReportRuleProvider.TEMPLATE); for (ApplicationReportModel report : reports) { // test checks only Global Jar Dependencies report if ("dependency_report_global.html".equals(report.getReportFilename())) return getPathForReport(graphContext, report); } return null; } private Path getPathForReport(GraphContext graphContext, ReportModel report) { return new ReportService(graphContext).getReportDirectory().resolve(report.getReportFilename()); } }