package org.jboss.windup.reporting; import java.io.File; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.forge.arquillian.AddonDependency; import org.jboss.forge.arquillian.AddonDependencies; import org.jboss.forge.arquillian.archive.AddonArchive; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.windup.config.GraphRewrite; import org.jboss.windup.graph.GraphContext; import org.jboss.windup.graph.GraphContextFactory; import org.jboss.windup.graph.model.WindupVertexFrame; import org.jboss.windup.graph.model.resource.FileModel; import org.jboss.windup.reporting.model.ClassificationModel; import org.jboss.windup.reporting.model.InlineHintModel; import org.jboss.windup.reporting.model.TechnologyTagLevel; import org.jboss.windup.reporting.query.FindSourceReportFilesGremlinCriterion; import org.jboss.windup.reporting.service.TechnologyTagService; import org.jboss.windup.rules.apps.java.query.FindFilesNotClassifiedOrHintedGremlinCriterion; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import com.tinkerpop.blueprints.Vertex; import com.tinkerpop.gremlin.java.GremlinPipeline; @RunWith(Arquillian.class) public class InlineHintModelQueryTest { @Deployment @AddonDependencies({ @AddonDependency(name = "org.jboss.windup.config:windup-config"), @AddonDependency(name = "org.jboss.windup.graph:windup-graph"), @AddonDependency(name = "org.jboss.windup.reporting:windup-reporting"), @AddonDependency(name = "org.jboss.windup.rules.apps:windup-rules-java"), @AddonDependency(name = "org.jboss.forge.furnace.container:cdi") }) public static AddonArchive getDeployment() { AddonArchive archive = ShrinkWrap.create(AddonArchive.class) .addBeansXML() .addAsResource(new File("src/test/resources/reports")); return archive; } @Inject private GraphContextFactory factory; private GraphContext context; @Before public void beforeTest() throws Exception { context = factory.create(); } @After public void afterTest() throws Exception { context.close(); context.clear(); } @Test public void testFindingClassifiedFiles() throws Exception { FileModel f1 = context.getFramed().addVertex(null, FileModel.class); f1.setFilePath("/f1"); FileModel f2 = context.getFramed().addVertex(null, FileModel.class); f2.setFilePath("/f2"); FileModel f3 = context.getFramed().addVertex(null, FileModel.class); f3.setFilePath("/f3"); FileModel f4 = context.getFramed().addVertex(null, FileModel.class); f4.setFilePath("/f4"); FileModel f5 = context.getFramed().addVertex(null, FileModel.class); f5.setFilePath("/f5"); FileModel f6 = context.getFramed().addVertex(null, FileModel.class); f6.setFilePath("/f6"); FileModel f7 = context.getFramed().addVertex(null, FileModel.class); f7.setFilePath("/f7"); InlineHintModel b1 = context.getFramed().addVertex(null, InlineHintModel.class); InlineHintModel b1b = context.getFramed().addVertex(null, InlineHintModel.class); b1.setFile(f1); b1b.setFile(f1); InlineHintModel b2 = context.getFramed().addVertex(null, InlineHintModel.class); b2.setFile(f2); ClassificationModel c1 = context.getFramed().addVertex(null, ClassificationModel.class); ClassificationModel c1b = context.getFramed().addVertex(null, ClassificationModel.class); c1.addFileModel(f1); c1b.addFileModel(f1); ClassificationModel c2 = context.getFramed().addVertex(null, ClassificationModel.class); c2.addFileModel(f3); TechnologyTagService techTagService = new TechnologyTagService(context); techTagService.addTagToFileModel(f4, "TestTag", TechnologyTagLevel.IMPORTANT); List<Vertex> vertexList = new ArrayList<>(); for (Vertex v : context.getQuery().type(FileModel.class).vertices()) { vertexList.add(v); } GremlinPipeline<Vertex, Vertex> pipeline = new GremlinPipeline<>(context.getQuery().type(FileModel.class) .vertices()); GraphRewrite event = new GraphRewrite(context); // manually execute this criterion (this just adds things to the pipeline) new FindSourceReportFilesGremlinCriterion().query(event, pipeline); List<FileModel> fileModels = new ArrayList<>(); for (Vertex v : pipeline) { // Explicit cast here insures that the frame returned was actually a FileModel. If it is not, a // ClassCastException will // occur and the test will fail. // // If we called frame(v, FileModel.class) directly, frames would happily force it to be a FileModel // even if the underlying query were returning invalid results. FileModel fm = (FileModel) context.getFramed().frame(v, WindupVertexFrame.class); fileModels.add(fm); } boolean foundF1 = false; boolean foundF2 = false; boolean foundF3 = false; boolean foundF4 = false; Assert.assertEquals(4, fileModels.size()); for (FileModel fm : fileModels) { if (fm.getFilePath().equals(f1.getFilePath())) { foundF1 = true; } else if (fm.getFilePath().equals(f2.getFilePath())) { foundF2 = true; } else if (fm.getFilePath().equals(f3.getFilePath())) { foundF3 = true; } else if (fm.getFilePath().equals(f4.getFilePath())) { foundF4 = true; } } Assert.assertTrue(foundF1); Assert.assertTrue(foundF2); Assert.assertTrue(foundF3); Assert.assertTrue(foundF4); } @Test public void testFindingNonClassifiedFiles() throws Exception { FileModel f1 = context.getFramed().addVertex(null, FileModel.class); f1.setFilePath("/f1"); FileModel f2 = context.getFramed().addVertex(null, FileModel.class); f2.setFilePath("/f2"); FileModel f3 = context.getFramed().addVertex(null, FileModel.class); f3.setFilePath("/f3"); FileModel f4 = context.getFramed().addVertex(null, FileModel.class); f4.setFilePath("/f4"); FileModel f5 = context.getFramed().addVertex(null, FileModel.class); f5.setFilePath("/f5"); FileModel f6 = context.getFramed().addVertex(null, FileModel.class); f6.setFilePath("/f6"); FileModel f7 = context.getFramed().addVertex(null, FileModel.class); f7.setFilePath("/f7"); InlineHintModel b1 = context.getFramed().addVertex(null, InlineHintModel.class); InlineHintModel b1b = context.getFramed().addVertex(null, InlineHintModel.class); b1.setFile(f1); b1b.setFile(f1); InlineHintModel b2 = context.getFramed().addVertex(null, InlineHintModel.class); b2.setFile(f2); ClassificationModel c1 = context.getFramed().addVertex(null, ClassificationModel.class); ClassificationModel c1b = context.getFramed().addVertex(null, ClassificationModel.class); c1.addFileModel(f1); c1b.addFileModel(f1); ClassificationModel c2 = context.getFramed().addVertex(null, ClassificationModel.class); c2.addFileModel(f3); List<Vertex> vertexList = new ArrayList<>(); for (Vertex v : context.getQuery().type(FileModel.class).vertices()) { vertexList.add(v); } // manually execute this criterion (this just adds things to the pipeline) Iterable<Vertex> allFMVertices = context.getQuery().type(FileModel.class).vertices(); Iterable<Vertex> fileModelIterable = new FindFilesNotClassifiedOrHintedGremlinCriterion() .query(context, allFMVertices); List<FileModel> fileModels = new ArrayList<>(); for (Vertex v : fileModelIterable) { // Explicit cast here insures that the frame returned was actually a FileModel. If it is not, a // ClassCastException will // occur and the test will fail. // // If we called frame(v, FileModel.class) directly, frames would happily force it to be a FileModel // even if the underlying query were returning invalid results. FileModel fm = (FileModel) context.getFramed().frame(v, WindupVertexFrame.class); fileModels.add(fm); } boolean foundF4 = false; boolean foundF5 = false; boolean foundF6 = false; boolean foundF7 = false; Assert.assertEquals(4, fileModels.size()); for (FileModel fm : fileModels) { if (fm.getFilePath().equals(f4.getFilePath())) { foundF4 = true; } else if (fm.getFilePath().equals(f5.getFilePath())) { foundF5 = true; } else if (fm.getFilePath().equals(f6.getFilePath())) { foundF6 = true; } else if (fm.getFilePath().equals(f7.getFilePath())) { foundF7 = true; } } Assert.assertTrue(foundF4); Assert.assertTrue(foundF5); Assert.assertTrue(foundF6); Assert.assertTrue(foundF7); } }