package org.jboss.windup.reporting;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import javax.inject.Inject;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.RandomStringUtils;
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.util.Predicate;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.windup.config.RuleProvider;
import org.jboss.windup.config.phase.FinalizePhase;
import org.jboss.windup.exec.WindupProcessor;
import org.jboss.windup.exec.configuration.WindupConfiguration;
import org.jboss.windup.exec.rulefilters.RuleProviderPhasePredicate;
import org.jboss.windup.graph.GraphContext;
import org.jboss.windup.graph.GraphContextFactory;
import org.jboss.windup.graph.model.ProjectModel;
import org.jboss.windup.graph.model.resource.FileModel;
import org.jboss.windup.graph.service.LinkService;
import org.jboss.windup.graph.service.ProjectService;
import org.jboss.windup.reporting.model.ClassificationModel;
import org.jboss.windup.reporting.model.InlineHintModel;
import org.jboss.windup.reporting.service.ClassificationService;
import org.jboss.windup.reporting.service.InlineHintService;
import org.jboss.windup.rules.apps.java.config.ScanPackagesOption;
import org.jboss.windup.rules.apps.java.config.SourceModeOption;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(Arquillian.class)
public class CSVExportingTest
{
@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.exec:windup-exec"),
@AddonDependency(name = "org.jboss.windup.utils:windup-utils"),
@AddonDependency(name = "org.jboss.forge.furnace.container:cdi")
})
public static AddonArchive getDeployment()
{
return ShrinkWrap.create(AddonArchive.class).addBeansXML();
}
@Inject
private GraphContextFactory factory;
@Inject
private WindupProcessor processor;
/**
* CSV export should be generated only if specified by input in the configuration
*/
@Test
public void testCSVExportGeneration() throws IOException
{
csvTest(true);
csvTest(false);
}
private void csvTest(boolean exportCSV) throws IOException
{
final Path outputPath = Paths.get(FileUtils.getTempDirectory().toString(),
"windup_" + RandomStringUtils.randomAlphanumeric(6));
outputPath.toFile().mkdirs();
try (GraphContext context = factory.create())
{
fillData(context);
String inputPath = "src/test/resources";
Predicate<RuleProvider> predicate = new RuleProviderPhasePredicate(FinalizePhase.class);
WindupConfiguration configuration = new WindupConfiguration()
.setGraphContext(context)
.setRuleProviderFilter(predicate)
.addInputPath(Paths.get(inputPath))
.setOutputDirectory(outputPath)
.setOptionValue(ScanPackagesOption.NAME, Collections.singletonList(""))
.setOptionValue(SourceModeOption.NAME, true);
if (exportCSV)
{
configuration.setExportingCSV(true);
}
processor.execute(configuration);
Assert.assertEquals(exportCSV, new File(outputPath + "/app1.csv").exists());
Assert.assertEquals(exportCSV, new File(outputPath + "/app2.csv").exists());
if (exportCSV)
{
Path resource = Paths.get("src/test/resources/test-exports/app1.csv");
Path resource2 = Paths.get("src/test/resources/test-exports/app2.csv");
try
{
Assert.assertTrue(checkFileAreSame(resource.toString(), outputPath + "/app1.csv"));
Assert.assertTrue(checkFileAreSame(resource2.toString(), outputPath + "/app2.csv"));
}
catch (IOException ex)
{
Assert.fail("Exception was thrown while checking if the exported CSV file looks like expected. Exception: " + ex);
}
}
}
}
private ProjectModel fillData(GraphContext context)
{
ProjectModel projectModel = new ProjectService(context).create();
projectModel.setName("app1");
ProjectModel projectModel2 = new ProjectService(context).create();
projectModel2.setName("app2");
InlineHintService inlineHintService = new InlineHintService(context);
ClassificationService classificationService = new ClassificationService(context);
LinkService linkService = new LinkService(context);
FileModel f1 = context.getFramed().addVertex(null, FileModel.class);
f1.setFilePath("/f1");
projectModel.addFileModel(f1);
FileModel f2 = context.getFramed().addVertex(null, FileModel.class);
f2.setFilePath("/f2");
projectModel2.addFileModel(f2);
InlineHintModel b1 = inlineHintService.create();
ClassificationModel c1 = classificationService.create();
InlineHintModel b1b = inlineHintService.create();
b1.setRuleID("rule1");
b1.setSourceSnippit("source1");
b1.setLineNumber(0);
b1.setTitle("hint1-text");
b1.setEffort(50);
b1.addLink(linkService.getOrCreate("description", "link"));
b1b.setRuleID("rule1");
b1b.setLineNumber(0);
b1b.setTitle("hint1b-text");
b1b.setEffort(100);
c1.setRuleID("classification1");
c1.addLink(linkService.getOrCreate("description", "link"));
c1.setDescription("description-classification");
c1.setClassification("classification1-text");
c1.setEffort(30);
ClassificationModel c2 = classificationService.create();
InlineHintModel b2 = inlineHintService.create();
b2.setEffort(3);
b2.setRuleID("rule2");
b2.setTitle("hint2;\"\"\"\"-te\"xt");
b2.setLineNumber(0);
c2.setRuleID("classification2");
c2.setClassification("classification2-text");
c2.setEffort(300);
b1.setFile(f1);
b1b.setFile(f1);
c1.addFileModel(f1);
b2.setFile(f2);
c1.addFileModel(f2);
c2.addFileModel(f2);
return projectModel;
}
private boolean checkFileAreSame(String filePath1, String filePath2) throws IOException
{
Set<String> linesFile1 = loadFile(filePath1);
Set<String> linesFile2 = loadFile(filePath2);
if (linesFile1.size() != linesFile2.size())
return false;
for (String line1 : linesFile1)
{
if (!linesFile2.contains(line1))
return false;
}
return true;
}
private Set<String> loadFile(String filePath) throws IOException
{
HashSet<String> result = new HashSet<>();
try (BufferedReader br = new BufferedReader(new FileReader(filePath)))
{
String line;
while ((line = br.readLine()) != null)
{
result.add(line);
}
}
return result;
}
}