/* * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jetbrains.idea.maven.project; import com.intellij.openapi.application.Result; import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.testFramework.PlatformTestUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.idea.maven.MavenTestCase; import org.jetbrains.idea.maven.model.*; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; public class MavenProjectReaderTest extends MavenTestCase { public void testBasics() throws Exception { createProjectPom("test" + "project" + "1"); MavenId p = readProject(myProjectPom).getMavenId(); assertEquals("test", p.getGroupId()); assertEquals("project", p.getArtifactId()); assertEquals("1", p.getVersion()); } public void testInvalidXml() throws Exception { createProjectPom("test" + "project" + "1"); assertProblems(readProject(myProjectPom, new NullProjectLocator())); createProjectPom("" + "" + "<" + "testproject" + "1"); MavenProjectReaderResult result = readProject(myProjectPom, new NullProjectLocator()); assertProblems(result, "'pom.xml' has syntax errors"); MavenId p = result.mavenModel.getMavenId(); assertEquals("test", p.getGroupId()); assertEquals("project", p.getArtifactId()); assertEquals("1", p.getVersion()); } public void testInvalidXmlCharData() throws Exception { createProjectPom("test" + "project" + "1"); assertProblems(readProject(myProjectPom, new NullProjectLocator())); createProjectPom("a" + new String(new byte[]{0x0}) + "a"); MavenProjectReaderResult result = readProject(myProjectPom, new NullProjectLocator()); assertProblems(result, "'pom.xml' has syntax errors"); MavenModel p = result.mavenModel; assertEquals("a0x0a", p.getName()); } public void testInvalidParentXml() throws Exception { createProjectPom("test" + "parent" + "1" + "" + " test" + " parent" + " 1" + ""); assertProblems(readProject(module, new NullProjectLocator()), "Parent 'test:parent:1' has problems"); } public void testProjectWithAbsentParentXmlIsValid() throws Exception { createProjectPom("" + " test" + " parent" + " 1" + ""); assertProblems(readProject(myProjectPom, new NullProjectLocator())); } public void testProjectWithSelfParentIsInvalid() throws Exception { createProjectPom("" + " test" + " project" + " 1" + "" + "project" + "pom"); assertProblems(readProject(myProjectPom, new NullProjectLocator()), "Self-inheritance found"); } public void testInvalidProfilesXml() throws Exception { createProjectPom("test" + "project" + "1"); createProfilesXml("test" + "project" + "1"); updateSettingsXml("test" + "project" + "1" + "foo"); MavenProjectReaderResult readResult = readProject(myProjectPom, new NullProjectLocator()); assertProblems(readResult, "'pom.xml' has syntax errors"); MavenModel p = readResult.mavenModel; assertEquals("test", p.getMavenId().getGroupId()); assertEquals("project", p.getMavenId().getArtifactId()); assertEquals("Unknown", p.getMavenId().getVersion()); assertEquals("foo", p.getName()); } public void testInvalidXmlWithWrongClosingTag() throws Exception { if (ignore()) return; createProjectPom("test" + "project" + "1" + "foo"); MavenProjectReaderResult readResult = readProject(myProjectPom, new NullProjectLocator()); assertProblems(readResult, "'pom.xml' has syntax errors"); MavenModel p = readResult.mavenModel; assertEquals("test", p.getMavenId().getGroupId()); assertEquals("project", p.getMavenId().getArtifactId()); assertEquals("1", p.getMavenId().getVersion()); assertEquals("foo", p.getName()); } public void testEmpty() throws Exception { createProjectPom(""); MavenModel p = readProject(myProjectPom); assertEquals("Unknown", p.getMavenId().getGroupId()); assertEquals("Unknown", p.getMavenId().getArtifactId()); assertEquals("Unknown", p.getMavenId().getVersion()); } public void testSpaces() throws Exception { createProjectPom("foo bar"); MavenModel p = readProject(myProjectPom); assertEquals("foo bar", p.getName()); } public void testNewLines() throws Exception { createProjectPom("\n" + " group\n" + "\n" + "\n" + " artifact\n" + "\n" + "\n" + " 1\n" + "\n"); MavenModel p = readProject(myProjectPom); assertEquals(new MavenId("group", "artifact", "1"), p.getMavenId()); } public void testCommentsWithNewLinesInTags() throws Exception { createProjectPom("test\n" + "" + "\n" + "project" + "1\n" + "" + "\n" + "\n" + ""); MavenModel p = readProject(myProjectPom); MavenId id = p.getMavenId(); assertEquals("test", id.getGroupId()); assertEquals("project", id.getArtifactId()); assertEquals("1", id.getVersion()); assertNull(p.getName()); } public void testTextInContainerTag() throws Exception { createProjectPom("foo name bar"); MavenModel p = readProject(myProjectPom); assertEquals("name", p.getName()); } public void testDefaults() throws Exception { VirtualFile file = new WriteAction() { @Override protected void run(Result result) throws Throwable { VirtualFile res = myProjectRoot.createChildData(this, "pom.xml"); result.setResult(res); } }.execute().getResultObject(); VfsUtil.saveText(file, "" + " test" + " project" + " 1" + ""); MavenModel p = readProject(file); assertEquals("jar", p.getPackaging()); assertNull(p.getName()); assertNull(p.getParent()); assertEquals("project-1", p.getBuild().getFinalName()); assertEquals(null, p.getBuild().getDefaultGoal()); assertSize(1, p.getBuild().getSources()); PlatformTestUtil.assertPathsEqual(pathFromBasedir("src/main/java"), p.getBuild().getSources().get(0)); assertSize(1, p.getBuild().getTestSources()); PlatformTestUtil.assertPathsEqual(pathFromBasedir("src/test/java"), p.getBuild().getTestSources().get(0)); assertEquals(1, p.getBuild().getResources().size()); assertResource(p.getBuild().getResources().get(0), pathFromBasedir("src/main/resources"), false, null, Collections.emptyList(), Collections.emptyList()); assertEquals(1, p.getBuild().getTestResources().size()); assertResource(p.getBuild().getTestResources().get(0), pathFromBasedir("src/test/resources"), false, null, Collections.emptyList(), Collections.emptyList()); PlatformTestUtil.assertPathsEqual(pathFromBasedir("target"), p.getBuild().getDirectory()); PlatformTestUtil.assertPathsEqual(pathFromBasedir("target/classes"), p.getBuild().getOutputDirectory()); PlatformTestUtil.assertPathsEqual(pathFromBasedir("target/test-classes"), p.getBuild().getTestOutputDirectory()); } public void testDefaultsForParent() throws Exception { createProjectPom("test" + "project" + "1" + "" + " dummy" + ""); MavenModel p = readProject(myProjectPom); assertParent(p, "Unknown", "Unknown", "Unknown"); } public void testTakingCoordinatesFromParent() throws Exception { createProjectPom("" + " test" + " project" + " 1" + ""); MavenId id = readProject(myProjectPom).getMavenId(); assertEquals("test", id.getGroupId()); assertEquals("Unknown", id.getArtifactId()); assertEquals("1", id.getVersion()); } public void testCustomSettings() throws Exception { VirtualFile file = new WriteAction() { @Override protected void run(Result result) throws Throwable { VirtualFile res = myProjectRoot.createChildData(this, "pom.xml"); result.setResult(res); } }.execute().getResultObject(); VfsUtil.saveText(file, "" + " 1.2.3" + " test" + " project" + " 1" + " foo" + " pom" + " " + " testParent" + " projectParent" + " 2" + " ../parent/pom.xml" + " " + " " + " xxx" + " someGoal" + " mySrc" + " myTestSrc" + " myScriptSrc" + " " + " " + " myRes" + " true" + " dir" + " **.properties" + " **.xml" + " " + " " + " " + " " + " myTestRes" + " **.properties" + " " + " " + " myOutput" + " myClasses" + " myTestClasses" + " " + ""); MavenModel p = readProject(file); assertEquals("pom", p.getPackaging()); assertEquals("foo", p.getName()); assertParent(p, "testParent", "projectParent", "2"); assertEquals("xxx", p.getBuild().getFinalName()); assertEquals("someGoal", p.getBuild().getDefaultGoal()); assertSize(1, p.getBuild().getSources()); PlatformTestUtil.assertPathsEqual(pathFromBasedir("mySrc"), p.getBuild().getSources().get(0)); assertSize(1, p.getBuild().getTestSources()); PlatformTestUtil.assertPathsEqual(pathFromBasedir("myTestSrc"), p.getBuild().getTestSources().get(0)); assertEquals(1, p.getBuild().getResources().size()); assertResource(p.getBuild().getResources().get(0), pathFromBasedir("myRes"), true, "dir", Collections.singletonList("**.properties"), Collections.singletonList("**.xml")); assertEquals(1, p.getBuild().getTestResources().size()); assertResource(p.getBuild().getTestResources().get(0), pathFromBasedir("myTestRes"), false, null, Collections.singletonList("**.properties"), Collections.emptyList()); PlatformTestUtil.assertPathsEqual(pathFromBasedir("myOutput"), p.getBuild().getDirectory()); PlatformTestUtil.assertPathsEqual(pathFromBasedir("myClasses"), p.getBuild().getOutputDirectory()); PlatformTestUtil.assertPathsEqual(pathFromBasedir("myTestClasses"), p.getBuild().getTestOutputDirectory()); } public void testOutputPathsAreBasedOnTargetPath() throws Exception { createProjectPom("test" + "project" + "1" + "" + " my-target" + ""); MavenModel p = readProject(myProjectPom); PlatformTestUtil.assertPathsEqual(pathFromBasedir("my-target"), p.getBuild().getDirectory()); PlatformTestUtil.assertPathsEqual(pathFromBasedir("my-target/classes"), p.getBuild().getOutputDirectory()); PlatformTestUtil.assertPathsEqual(pathFromBasedir("my-target/test-classes"), p.getBuild().getTestOutputDirectory()); } public void testDoesNotIncludeResourcesWithoutDirectory() throws Exception { createProjectPom("" + " " + " " + " " + " " + " " + " " + " " + " true" + " " + " " + ""); MavenModel p = readProject(myProjectPom); assertEquals(0, p.getBuild().getResources().size()); assertEquals(0, p.getBuild().getTestResources().size()); } public void testPathsWithProperties() throws Exception { createProjectPom("" + " subDir" + " " + "" + "" + " ${foo}/mySrc" + " ${foo}/myTestSrc" + " ${foo}/myScriptSrc" + " " + " " + " ${foo}/myRes" + " " + " " + " aaa/${emptyProperty}/${unexistingProperty}" + " " + " " + " " + " " + " ${foo}/myTestRes" + " " + " " + " ${foo}/myOutput" + " ${foo}/myClasses" + " ${foo}/myTestClasses" + ""); MavenModel p = readProject(myProjectPom); assertSize(1, p.getBuild().getSources()); PlatformTestUtil.assertPathsEqual(pathFromBasedir("subDir/mySrc"), p.getBuild().getSources().get(0)); assertSize(1, p.getBuild().getTestSources()); PlatformTestUtil.assertPathsEqual(pathFromBasedir("subDir/myTestSrc"), p.getBuild().getTestSources().get(0)); assertEquals(2, p.getBuild().getResources().size()); assertResource(p.getBuild().getResources().get(0), pathFromBasedir("subDir/myRes"), false, null, Collections.emptyList(), Collections.emptyList()); assertResource(p.getBuild().getResources().get(1), pathFromBasedir("aaa/${unexistingProperty}"), false, null, Collections.emptyList(), Collections.emptyList()); assertEquals(1, p.getBuild().getTestResources().size()); assertResource(p.getBuild().getTestResources().get(0), pathFromBasedir("subDir/myTestRes"), false, null, Collections.emptyList(), Collections.emptyList()); PlatformTestUtil.assertPathsEqual(pathFromBasedir("subDir/myOutput"), p.getBuild().getDirectory()); PlatformTestUtil.assertPathsEqual(pathFromBasedir("subDir/myClasses"), p.getBuild().getOutputDirectory()); PlatformTestUtil.assertPathsEqual(pathFromBasedir("subDir/myTestClasses"), p.getBuild().getTestOutputDirectory()); } public void testExpandingProperties() throws Exception { createProjectPom("" + " value1" + " value2" + "" + "${prop1}" + "${prop2}"); MavenModel p = readProject(myProjectPom); assertEquals("value1", p.getName()); assertEquals("value2", p.getPackaging()); } public void testExpandingPropertiesRecursively() throws Exception { createProjectPom("" + " value1" + " ${prop1}2" + "" + "${prop1}" + "${prop2}"); MavenModel p = readProject(myProjectPom); assertEquals("value1", p.getName()); assertEquals("value12", p.getPackaging()); } public void testHandlingRecursiveProperties() throws Exception { createProjectPom("" + " ${prop2}" + " ${prop1}" + "" + "${prop1}" + "${prop2}"); MavenModel p = readProject(myProjectPom); assertEquals("${prop1}", p.getName()); assertEquals("${prop2}", p.getPackaging()); } public void testHandlingRecursionProprielyAndDoNotForgetCoClearRecursionGuard() throws Exception { File repositoryPath = new File(myDir, "repository"); setRepositoryPath(repositoryPath.getPath()); File parentFile = new File(repositoryPath, "test/parent/1/parent-1.pom"); parentFile.getParentFile().mkdirs(); FileUtil.writeToFile(parentFile, createPomXml("test" + "parent" + "1").getBytes()); createProjectPom("test" + "not-a-project" + "1" + "" + " test" + " parent" + " 1" + ""); VirtualFile child = createModulePom("child", "test" + "child" + "1" + "" + " test" + " parent" + " 1" + ""); MavenProjectReaderResult readResult = readProject(child, new NullProjectLocator()); assertProblems(readResult); } public void testDoNotGoIntoRecursionWhenTryingToResolveParentInDefaultPath() throws Exception { VirtualFile child = createModulePom("child", "test" + "child" + "1" + "" + " test" + " parent" + " 1" + ""); createProjectPom("test" + "subChild" + "1" + "" + " test" + " child" + " 1" + " child/pom.xml" + ""); MavenProjectReaderResult readResult = readProject(child, new NullProjectLocator()); assertProblems(readResult); } public void testExpandingSystemAndEnvProperties() throws Exception { createProjectPom("${java.home}" + "${env." + getEnvVar() + "}"); MavenModel p = readProject(myProjectPom); assertEquals(System.getProperty("java.home"), p.getName()); assertEquals(System.getenv(getEnvVar()), p.getPackaging()); } public void testExpandingPropertiesFromProfiles() throws Exception { createProjectPom("${prop1}" + "${prop2}" + "" + " " + " one" + " " + " true" + " " + " " + " value1" + " " + " " + " " + " two" + " " + " value2" + " " + " " + ""); MavenModel p = readProject(myProjectPom); assertEquals("value1", p.getName()); assertEquals("${prop2}", p.getPackaging()); } public void testExpandingPropertiesFromManuallyActivatedProfiles() throws Exception { createProjectPom("${prop1}" + "${prop2}" + "" + " " + " one" + " " + " true" + " " + " " + " value1" + " " + " " + " " + " two" + " " + " value2" + " " + " " + ""); MavenModel p = readProject(myProjectPom, "two"); assertEquals("${prop1}", p.getName()); assertEquals("value2", p.getPackaging()); } public void testExpandingPropertiesFromParent() throws Exception { createProjectPom("test" + "parent" + "1" + "" + " value" + ""); VirtualFile module = createModulePom("module", "" + " test" + " parent" + " 1" + "" + "${prop}"); MavenModel p = readProject(module); assertEquals("value", p.getName()); } public void testDoNotExpandPropertiesFromParentWithWrongCoordinates() throws Exception { createProjectPom("test" + "parent" + "1" + "" + " value" + ""); VirtualFile module = createModulePom("module", "" + " test" + " invalid" + " 1" + "" + "${prop}"); MavenModel p = readProject(module); assertEquals("${prop}", p.getName()); } public void testExpandingPropertiesFromParentNotInVfs() throws Exception { FileUtil.writeToFile(new File(myProjectRoot.getPath(), "pom.xml"), createPomXml("test" + "parent" + "1" + "" + " value" + "").getBytes()); VirtualFile module = createModulePom("module", "" + " test" + " parent" + " 1" + "" + "${prop}"); MavenModel p = readProject(module); assertEquals("value", p.getName()); } public void testExpandingPropertiesFromIndirectParent() throws Exception { createProjectPom("test" + "parent" + "1" + "" + " value" + ""); createModulePom("module", "test" + "module" + "1" + "" + " test" + " parent" + " 1" + ""); VirtualFile subModule = createModulePom("module/subModule", "" + " test" + " module" + " 1" + "" + "${prop}"); MavenModel p = readProject(subModule); assertEquals("value", p.getName()); } public void testExpandingPropertiesFromParentInSpecifiedLocation() throws Exception { createModulePom("parent", "test" + "parent" + "1" + "" + " value" + ""); VirtualFile module = createModulePom("module", "" + " test" + " parent" + " 1" + " ../parent/pom.xml" + "" + "${prop}"); MavenModel p = readProject(module); assertEquals("value", p.getName()); } public void testExpandingPropertiesFromParentInSpecifiedLocationWithoutFile() throws Exception { createModulePom("parent", "test" + "parent" + "1" + "" + " value" + ""); VirtualFile module = createModulePom("module", "" + " test" + " parent" + " 1" + " ../parent" + "" + "${prop}"); MavenModel p = readProject(module); assertEquals("value", p.getName()); } public void testExpandingPropertiesFromParentInRepository() throws Exception { File repositoryPath = new File(myDir, "repository"); setRepositoryPath(repositoryPath.getPath()); File parentFile = new File(repositoryPath, "org/test/parent/1/parent-1.pom"); parentFile.getParentFile().mkdirs(); FileUtil.writeToFile(parentFile, createPomXml("org.test" + "parent" + "1" + "" + " value" + "").getBytes()); createProjectPom("" + " org.test" + " parent" + " 1" + "" + "${prop}"); MavenModel p = readProject(myProjectPom); assertEquals("value", p.getName()); } public void testExpandingPropertiesFromParentInInvalidLocation() throws Exception { final VirtualFile parent = createModulePom("parent", "test" + "parent" + "1" + "" + " value" + ""); VirtualFile module = createModulePom("module", "" + " test" + " parent" + " 1" + "" + "${prop}"); MavenModel p = readProject(module, new MavenProjectReaderProjectLocator() { @Override public VirtualFile findProjectFile(MavenId coordinates) { return new MavenId("test", "parent", "1").equals(coordinates) ? parent : null; } }).mavenModel; assertEquals("value", p.getName()); } public void testPropertiesFromParentInParentSection() throws Exception { createProjectPom("${groupProp}" + "parent" + "${versionProp}" + "" + " test" + " 1" + ""); VirtualFile module = createModulePom("module", "" + " ${groupProp}" + " parent" + " ${versionProp}" + "" + "module"); MavenId id = readProject(module).getMavenId(); assertEquals("test:module:1", id.getGroupId() + ":" + id.getArtifactId() + ":" + id.getVersion()); } public void testInheritingSettingsFromParentAndAlignCorrectly() throws Exception { createProjectPom("test" + "parent" + "1" + "" + " custom" + ""); VirtualFile module = createModulePom("module", "" + " test" + " parent" + " 1" + ""); MavenModel p = readProject(module); PlatformTestUtil.assertPathsEqual(pathFromBasedir(module.getParent(), "custom"), p.getBuild().getDirectory()); } public void testExpandingPropertiesAfterInheritingSettingsFromParent() throws Exception { createProjectPom("test" + "parent" + "1" + "" + " subDir" + "" + "" + " ${basedir}/${prop}/custom" + ""); VirtualFile module = createModulePom("module", "" + " test" + " parent" + " 1" + ""); MavenModel p = readProject(module); PlatformTestUtil.assertPathsEqual(pathFromBasedir(module.getParent(), "subDir/custom"), p.getBuild().getDirectory()); } public void testExpandingPropertiesAfterInheritingSettingsFromParentProfiles() throws Exception { createProjectPom("test" + "parent" + "1" + "" + " " + " one" + " " + " subDir" + " " + " " + " ${basedir}/${prop}/custom" + " " + " " + ""); VirtualFile module = createModulePom("module", "" + " test" + " parent" + " 1" + ""); MavenModel p = readProject(module, "one"); PlatformTestUtil.assertPathsEqual(pathFromBasedir(module.getParent(), "subDir/custom"), p.getBuild().getDirectory()); } public void testPropertiesFromProfilesXmlOldStyle() throws Exception { createProjectPom("${prop}"); createProfilesXmlOldStyle("" + " one" + " " + " foo" + " " + ""); MavenModel mavenProject = readProject(myProjectPom); assertEquals("${prop}", mavenProject.getName()); mavenProject = readProject(myProjectPom, "one"); assertEquals("foo", mavenProject.getName()); } public void testPropertiesFromProfilesXmlNewStyle() throws Exception { createProjectPom("${prop}"); createProfilesXml("" + " one" + " " + " foo" + " " + ""); MavenModel mavenProject = readProject(myProjectPom); assertEquals("${prop}", mavenProject.getName()); mavenProject = readProject(myProjectPom, "one"); assertEquals("foo", mavenProject.getName()); } public void testPropertiesFromSettingsXml() throws Exception { createProjectPom("${prop}"); updateSettingsXml("" + " " + " one" + " " + " foo" + " " + " " + ""); MavenModel mavenProject = readProject(myProjectPom); assertEquals("${prop}", mavenProject.getName()); mavenProject = readProject(myProjectPom, "one"); assertEquals("foo", mavenProject.getName()); } public void testDoNoInheritParentFinalNameIfUnspecified() throws Exception { createProjectPom("test" + "parent" + "1"); VirtualFile module = createModulePom("module", "test" + "module" + "2" + "" + " test" + " parent" + " 1" + ""); MavenModel p = readProject(module, "one"); assertEquals("module-2", p.getBuild().getFinalName()); } public void testDoInheritingParentFinalNameIfSpecified() throws Exception { createProjectPom("test" + "parent" + "1" + "" + " xxx" + ""); VirtualFile module = createModulePom("module", "test" + "module" + "2" + "" + " test" + " parent" + " 1" + ""); MavenModel p = readProject(module, "one"); assertEquals("xxx", p.getBuild().getFinalName()); } public void testInheritingParentProfiles() throws Exception { createProjectPom("test" + "parent" + "1" + "" + " " + " profileFromParent" + " " + ""); VirtualFile module = createModulePom("module", "test" + "module" + "1" + "" + " test" + " parent" + " 1" + "" + "" + " " + " profileFromChild" + " " + ""); MavenModel p = readProject(module); assertOrderedElementsAreEqual(ContainerUtil.map(p.getProfiles(), new Function() { @Override public Object fun(MavenProfile profile) { return profile.getId(); } }), "profileFromChild", "profileFromParent"); } public void testCorrectlyCollectProfilesFromDifferentSources() throws Exception { createProjectPom("test" + "parent" + "1" + "" + " " + " profile" + " parent" + " " + ""); final VirtualFile parentProfiles = createProfilesXml("" + " profile" + " parentProfiles" + ""); VirtualFile module = createModulePom("module", "test" + "module" + "1" + "" + " test" + " parent" + " 1" + "" + "" + " " + " profile" + " pom" + " " + ""); updateSettingsXml("" + " " + " profile" + " settings" + " " + ""); final VirtualFile profiles = createProfilesXml("module", "" + " profile" + " profiles" + ""); MavenModel p = readProject(module); assertEquals(1, p.getProfiles().size()); assertEquals("pom", p.getProfiles().get(0).getModules().get(0)); assertEquals("pom", p.getProfiles().get(0).getSource()); createModulePom("module", "test" + "module" + "1" + "" + " test" + " parent" + " 1" + ""); p = readProject(module); assertEquals(1, p.getProfiles().size()); assertEquals("profiles", p.getProfiles().get(0).getModules().get(0)); assertEquals("profiles.xml", p.getProfiles().get(0).getSource()); new WriteCommandAction.Simple(myProject) { @Override protected void run() throws Throwable { profiles.delete(this); } }.execute().throwException(); p = readProject(module); assertEquals(1, p.getProfiles().size()); assertEmpty("parent", p.getProfiles().get(0).getModules()); assertEquals("pom", p.getProfiles().get(0).getSource()); createProjectPom("test" + "parent" + "1"); p = readProject(module); assertEquals(1, p.getProfiles().size()); assertEmpty("parentProfiles", p.getProfiles().get(0).getModules()); assertEquals("profiles.xml", p.getProfiles().get(0).getSource()); new WriteCommandAction.Simple(myProject) { @Override protected void run() throws Throwable { parentProfiles.delete(null); } }.execute().throwException(); p = readProject(module); assertEquals(1, p.getProfiles().size()); assertEmpty("settings", p.getProfiles().get(0).getModules()); assertEquals("settings.xml", p.getProfiles().get(0).getSource()); } public void testModulesAreNotInheritedFromParentsProfiles() throws Exception { VirtualFile p = createProjectPom("test" + "project" + "1" + "pom" + "" + " " + " one" + " " + " m" + " " + " " + ""); VirtualFile m = createModulePom("m", "test" + "m" + "1" + "" + " test" + " project" + " 1" + ""); assertSize(1, readProject(p, "one").getModules()); assertSize(0, readProject(m, "one").getModules()); } public void testActivatingProfilesByDefault() throws Exception { createProjectPom("" + " " + " one" + " " + " true" + " " + " " + " " + " two" + " " + " false" + " " + " " + ""); assertActiveProfiles("one"); } public void testActivatingProfilesAfterResolvingInheritance() throws Exception { createModulePom("parent", "test" + "parent" + "1"); createProjectPom("" + " test" + " parent" + " 1" + " parent/pom.xml" + "" + "" + " " + " one" + " " + " true" + " " + " " + ""); assertActiveProfiles("one"); } public void testActivatingProfilesByOS() throws Exception { String os = SystemInfo.isWindows ? "windows" : SystemInfo.isMac ? "mac" : "unix"; createProjectPom("" + " " + " one" + " " + " " + os + "" + " " + " " + " " + " two" + " " + " xxx" + " " + " " + ""); assertActiveProfiles("one"); } public void testActivatingProfilesByJdk() throws Exception { createProjectPom("" + " " + " one" + " " + " [1.5,)" + " " + " " + " " + " two" + " " + " (,1.5)" + " " + " " + ""); assertActiveProfiles("one"); } public void testActivatingProfilesByStrictJdkVersion() throws Exception { createProjectPom("" + " " + " one" + " " + " 1.4" + " " + " " + ""); assertActiveProfiles(); } public void testActivatingProfilesByProperty() throws Exception { createProjectPom("" + " " + " one" + " " + " " + " os.name" + " " + System.getProperty("os.name") + "" + " " + " " + " " + " " + " two" + " " + " " + " os.name" + " xxx" + " " + " " + " " + ""); assertActiveProfiles("one"); } public void testActivatingProfilesByEnvProperty() throws Exception { String value = System.getenv(getEnvVar()); createProjectPom("" + " " + " one" + " " + " " + " env." + getEnvVar() + "" + " " + value + "" + " " + " " + " " + " " + " two" + " " + " " + " ffffff" + " ffffff" + " " + " " + " " + ""); assertActiveProfiles("one"); } public void testActivatingProfilesByFile() throws Exception { createProjectSubFile("dir/file.txt"); createProjectPom("" + " " + " one" + " " + " " + " ${basedir}/dir/file.txt" + " " + " " + " " + " " + " two" + " " + " " + " ${basedir}/dir/file.txt" + " " + " " + " " + ""); assertActiveProfiles("one"); } public void testActivateDefaultProfileEventIfThereAreExplicitOnesButAbsent() throws Exception { createProjectPom("" + " " + " default" + " " + " true" + " " + " " + " " + " explicit" + " " + ""); assertActiveProfiles(Arrays.asList("foofoofoo"), "default"); } public void testDoNotActivateDefaultProfileIfThereAreActivatedImplicit() throws Exception { createProjectPom("" + " " + " default" + " " + " true" + " " + " " + " " + " implicit" + " " + " [1.5,)" + " " + " " + ""); assertActiveProfiles("implicit"); } public void testActivatingImplicitProfilesEventWhenThereAreExplicitOnes() throws Exception { createProjectPom("" + " " + " explicit" + " " + " " + " implicit" + " " + " [1.5,)" + " " + " " + ""); assertActiveProfiles(Arrays.asList("explicit"), "explicit", "implicit"); } public void testAlwaysActivatingActiveProfilesInSettingsXml() throws Exception { updateSettingsXml("" + " settings" + ""); createProjectPom("" + " " + " explicit" + " " + " " + " settings" + " " + ""); assertActiveProfiles("settings"); assertActiveProfiles(Arrays.asList("explicit"), "explicit", "settings"); } public void testAlwaysActivatingActiveProfilesInProfilesXml() throws Exception { createFullProfilesXml("" + "" + " " + " profiles" + " " + ""); createProjectPom("" + " " + " explicit" + " " + " " + " profiles" + " " + ""); assertActiveProfiles("profiles"); assertActiveProfiles(Arrays.asList("explicit"), "explicit", "profiles"); } public void testActivatingBothActiveProfilesInSettingsXmlAndImplicitProfiles() throws Exception { updateSettingsXml("" + " settings" + ""); createProjectPom("" + " " + " implicit" + " " + " [1.5,)" + " " + " " + " " + " settings" + " " + ""); assertActiveProfiles("settings", "implicit"); } public void testDoNotActivateDefaultProfilesWhenThereAreAlwaysOnProfilesInPomXml() throws Exception { updateSettingsXml("" + " settings" + ""); createProjectPom("" + " " + " default" + " " + " true" + " " + " " + " " + " settings" + " " + ""); assertActiveProfiles("settings"); } public void testActivateDefaultProfilesWhenThereAreActiveProfilesInSettingsXml() throws Exception { updateSettingsXml("" + " " + " settings" + " " + "" + "" + " settings" + ""); createProjectPom("" + " " + " default" + " " + " true" + " " + " " + ""); assertActiveProfiles("default", "settings"); } public void testActivateDefaultProfilesWhenThereAreActiveProfilesInProfilesXml() throws Exception { createFullProfilesXml("" + "" + " " + " " + " profiles" + " " + " " + " " + " profiles" + " " + ""); createProjectPom("" + " " + " default" + " " + " true" + " " + " " + ""); assertActiveProfiles("default", "profiles"); } public void testActiveProfilesInSettingsXmlOrProfilesXmlThroughInheritance() throws Exception { updateSettingsXml("" + " settings" + ""); createFullProfilesXml("parent", "" + "" + " " + " parent" + " " + ""); createModulePom("parent", "test" + "parent" + "1"); createFullProfilesXml("" + "" + " " + " project" + " " + ""); createProjectPom("" + " test" + " parent" + " 1" + " parent/pom.xml" + "" + "" + " " + " project" + " " + " " + " parent" + " " + " " + " settings" + " " + ""); assertActiveProfiles("project", "settings"); } private MavenModel readProject(VirtualFile file, String... profiles) { MavenProjectReaderResult readResult = readProject(file, new NullProjectLocator(), profiles); assertProblems(readResult); return readResult.mavenModel; } private MavenProjectReaderResult readProject(VirtualFile file, MavenProjectReaderProjectLocator locator, String... profiles) { MavenProjectReaderResult result = new MavenProjectReader().readProject(getMavenGeneralSettings(), file, new MavenExplicitProfiles(Arrays.asList(profiles)), locator); return result; } private static void assertParent(MavenModel p, String groupId, String artifactId, String version) { MavenId parent = p.getParent().getMavenId(); assertEquals(groupId, parent.getGroupId()); assertEquals(artifactId, parent.getArtifactId()); assertEquals(version, parent.getVersion()); } private static void assertResource(MavenResource resource, String dir, boolean filtered, String targetPath, List includes, List excludes) { PlatformTestUtil.assertPathsEqual(dir, resource.getDirectory()); assertEquals(filtered, resource.isFiltered()); PlatformTestUtil.assertPathsEqual(targetPath, resource.getTargetPath()); assertOrderedElementsAreEqual(resource.getIncludes(), includes); assertOrderedElementsAreEqual(resource.getExcludes(), excludes); } private static void assertProblems(MavenProjectReaderResult readerResult, String... expectedProblems) { List actualProblems = new ArrayList(); for (MavenProjectProblem each : readerResult.readingProblems) { actualProblems.add(each.getDescription()); } assertOrderedElementsAreEqual(actualProblems, expectedProblems); } private void assertActiveProfiles(String... expected) { assertActiveProfiles(Collections.emptyList(), expected); } private void assertActiveProfiles(List explicitProfiles, String... expected) { MavenProjectReaderResult result = readProject(myProjectPom, new NullProjectLocator(), ArrayUtil.toStringArray(explicitProfiles)); assertUnorderedElementsAreEqual(result.activatedProfiles.getEnabledProfiles(), expected); } private static class NullProjectLocator implements MavenProjectReaderProjectLocator { @Override public VirtualFile findProjectFile(MavenId coordinates) { return null; } } }