// Copyright 2014 Pants project contributors (see CONTRIBUTORS.md).
// Licensed under the Apache License, Version 2.0 (see LICENSE).
package com.twitter.intellij.pants.integration;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.configurations.GeneralCommandLine;
import com.intellij.execution.process.CapturingAnsiEscapesAwareProcessHandler;
import com.intellij.execution.process.CapturingProcessHandler;
import com.intellij.execution.process.ProcessOutput;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.vfs.VirtualFile;
import com.twitter.intellij.pants.settings.PantsSettings;
import com.twitter.intellij.pants.testFramework.OSSPantsIntegrationTest;
import com.twitter.intellij.pants.util.PantsConstants;
import com.twitter.intellij.pants.util.PantsUtil;
import org.jetbrains.jps.incremental.ProjectBuildException;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
public class OSSPantsJavaExamplesIntegrationTest extends OSSPantsIntegrationTest {
public void testAnnotation() throws Throwable {
doImport("examples/src/java/org/pantsbuild/example/annotation/main");
assertFirstSourcePartyModules(
"examples_src_java_org_pantsbuild_example_annotation_example_example",
"examples_src_java_org_pantsbuild_example_annotation_main_main",
"examples_src_java_org_pantsbuild_example_annotation_processor_processor"
);
assertPantsCompileExecutesAndSucceeds(pantsCompileModule("examples_src_java_org_pantsbuild_example_annotation_main_main"));
}
public void testAntl3() throws Throwable {
doImport("examples/src/java/org/pantsbuild/example/antlr3");
assertFirstSourcePartyModules(
"examples_src_java_org_pantsbuild_example_antlr3_antlr3",
"examples_src_antlr_org_pantsbuild_example_exp_exp_antlr3"
);
assertGenModules(1);
assertPantsCompileExecutesAndSucceeds(pantsCompileModule("examples_src_java_org_pantsbuild_example_antlr3_antlr3"));
}
public void testAntl4() throws Throwable {
doImport("examples/src/java/org/pantsbuild/example/antlr4");
assertFirstSourcePartyModules(
"examples_src_java_org_pantsbuild_example_antlr4_antlr4",
"examples_src_antlr_org_pantsbuild_example_exp_exp_antlr4"
);
assertGenModules(1);
assertPantsCompileExecutesAndSucceeds(pantsCompileModule("examples_src_java_org_pantsbuild_example_antlr4_antlr4"));
}
public void testHello() throws Throwable {
doImport("examples/src/java/org/pantsbuild/example/hello");
assertProjectJdkAndLanguageLevel();
String[] initialModules = {
"examples_src_resources_org_pantsbuild_example_hello_hello",
"examples_src_java_org_pantsbuild_example_hello_main_main",
"examples_src_java_org_pantsbuild_example_hello_greet_greet",
"examples_src_java_org_pantsbuild_example_hello_simple_simple",
"examples_src_java_org_pantsbuild_example_hello_main_main-bin",
"examples_src_java_org_pantsbuild_example_hello_module",
"examples_src_java_org_pantsbuild_example_hello_main_readme",
"examples_src_java_org_pantsbuild_example_hello_main_common_sources"
};
assertFirstSourcePartyModules(
initialModules
);
assertPantsCompileExecutesAndSucceeds(pantsCompileModule("examples_src_java_org_pantsbuild_example_hello_main_main"));
}
public void testJaxb() throws Throwable {
String projectRelativePath = "examples/src/java/org/pantsbuild/example/jaxb/main";
doImport(projectRelativePath);
//Checking whether the modules loaded in the project are the same as pants dependencies
String[] moduleNames = getModulesNamesFromPantsDependencies(projectRelativePath);
assertTrue(moduleNames.length > 0);
assertFirstSourcePartyModules(moduleNames);
assertGenModules(1);
assertPantsCompileExecutesAndSucceeds(pantsCompileModule("examples_src_java_org_pantsbuild_example_jaxb_main_main"));
}
public void testProtobuf() throws Throwable {
doImport("examples/src/java/org/pantsbuild/example/protobuf/distance");
assertFirstSourcePartyModules(
"examples_src_java_org_pantsbuild_example_protobuf_distance_distance",
"examples_src_protobuf_org_pantsbuild_example_distance_distance"
);
assertGenModules(1);
assertPantsCompileExecutesAndSucceeds(pantsCompileModule("examples_src_java_org_pantsbuild_example_protobuf_distance_distance"));
}
public void testExcludes1() throws Throwable {
doImport("intellij-integration/src/java/org/pantsbuild/testproject/excludes1");
assertFirstSourcePartyModules(
"intellij-integration_src_java_org_pantsbuild_testproject_excludes1_excludes1"
);
assertPantsCompileExecutesAndSucceeds(
pantsCompileModule("intellij-integration_src_java_org_pantsbuild_testproject_excludes1_excludes1")
);
}
public void testExcludes2() throws Throwable {
doImport("intellij-integration/src/java/org/pantsbuild/testproject/excludes2");
assertFirstSourcePartyModules(
"intellij-integration_src_java_org_pantsbuild_testproject_excludes2_excludes2",
"intellij-integration_src_java_org_pantsbuild_testproject_excludes2_module"
);
assertPantsCompileExecutesAndSucceeds(
pantsCompileModule("intellij-integration_src_java_org_pantsbuild_testproject_excludes2_excludes2")
);
}
public void testResources1() throws Throwable {
// test if we handle resources with '.' in path and don't override resources
doImport("intellij-integration/src/java/org/pantsbuild/testproject/resources1");
assertFirstSourcePartyModules(
"intellij-integration_src_java_org_pantsbuild_testproject_resources1_resources1"
);
assertPantsCompileExecutesAndSucceeds(
pantsCompileModule("intellij-integration_src_java_org_pantsbuild_testproject_resources1_resources1")
);
}
public void testCompileWithProjectJdk() throws Throwable {
doImport("examples/src/java/org/pantsbuild/example/hello/greet");
assertFirstSourcePartyModules(
"examples_src_java_org_pantsbuild_example_hello_greet_greet"
);
PantsSettings settings = PantsSettings.getInstance(myProject);
settings.setUseIdeaProjectJdk(true);
Pair<Boolean, Optional<String>> result = pantsCompileProject();
assertPantsCompileExecutesAndSucceeds(result);
assertContainsSubstring(result.getSecond().get(), PantsConstants.PANTS_CLI_OPTION_JVM_DISTRIBUTIONS_PATHS);
settings.setUseIdeaProjectJdk(false);
Pair<Boolean, Optional<String>> resultB = pantsCompileProject();
assertPantsCompileExecutesAndSucceeds(result);
assertNotContainsSubstring(resultB.getSecond().get(), PantsConstants.PANTS_CLI_OPTION_JVM_DISTRIBUTIONS_PATHS);
}
private String[] getModulesNamesFromPantsDependencies(String targetName) throws ProjectBuildException {
Optional<VirtualFile> pantsExe = PantsUtil.findPantsExecutable(myProject);
assertTrue(pantsExe.isPresent());
final GeneralCommandLine commandLine = PantsUtil.defaultCommandLine(pantsExe.get().getPath());
commandLine.addParameters(PantsConstants.PANTS_CLI_OPTION_NO_COLORS);
commandLine.addParameters("dependencies");
commandLine.addParameters(targetName);
final Process process;
try {
process = commandLine.createProcess();
}
catch (ExecutionException e) {
throw new ProjectBuildException(e);
}
final CapturingProcessHandler processHandler = new CapturingAnsiEscapesAwareProcessHandler(process);
ProcessOutput output = processHandler.runProcess();
String lines[] = output.getStdout().split("\\r?\\n");
Set<String> modules = new HashSet<String>();
for (String l : lines) {
modules.add(PantsUtil.getCanonicalModuleName(l));
}
return modules.toArray(new String[modules.size()]);
}
}