From ebb7b40808fb54b2e9a2cbfa90f549b92095d3ce Mon Sep 17 00:00:00 2001 From: nik Date: Tue, 21 Aug 2012 15:13:06 +0400 Subject: [PATCH] IDEA-89930: I have to invoke Make multiple times and get "package doesn't exist" after updating code --- .../recompileDependent/.idea/compiler.xml | 21 ----- .../recompileDependent/.idea/encodings.xml | 5 - .../recompileDependent/.idea/misc.xml | 70 -------------- .../recompileDependent/.idea/modules.xml | 9 -- .../recompileDependent/RecompileDependent.iml | 12 --- .../markDirty/recompileDependentTests.log | 20 ++++ .../recompileDependentTests/Server.java.new | 3 + .../recompileDependentTests/lib/a.jar | Bin 0 -> 783 bytes .../recompileDependentTests/src/Client.java | 20 ++++ .../recompileDependentTests/src/Server.java | 18 ++++ .../testSrc/TestClient.java | 20 ++++ .../jps/incremental/fs/BuildFSState.java | 17 ++-- .../jetbrains/ether/IncrementalTestCase.java | 89 +++++++++++------- .../org/jetbrains/ether/MarkDirtyTest.java | 24 +++++ .../jetbrains/jps/builders/BuildResult.java | 47 +++++++++ .../jps/builders/JpsBuildTestCase.java | 68 +++++++------ .../jps/builders/ModuleClasspathTest.groovy | 4 +- .../rebuild/JpsRebuildTestCase.groovy | 4 +- .../artifacts/ArtifactBuilderTestCase.java | 28 ++---- 19 files changed, 262 insertions(+), 217 deletions(-) delete mode 100644 java/java-tests/testData/compileServer/incremental/markDirty/recompileDependent/.idea/compiler.xml delete mode 100644 java/java-tests/testData/compileServer/incremental/markDirty/recompileDependent/.idea/encodings.xml delete mode 100644 java/java-tests/testData/compileServer/incremental/markDirty/recompileDependent/.idea/misc.xml delete mode 100644 java/java-tests/testData/compileServer/incremental/markDirty/recompileDependent/.idea/modules.xml delete mode 100644 java/java-tests/testData/compileServer/incremental/markDirty/recompileDependent/RecompileDependent.iml create mode 100644 java/java-tests/testData/compileServer/incremental/markDirty/recompileDependentTests.log create mode 100644 java/java-tests/testData/compileServer/incremental/markDirty/recompileDependentTests/Server.java.new create mode 100644 java/java-tests/testData/compileServer/incremental/markDirty/recompileDependentTests/lib/a.jar create mode 100644 java/java-tests/testData/compileServer/incremental/markDirty/recompileDependentTests/src/Client.java create mode 100644 java/java-tests/testData/compileServer/incremental/markDirty/recompileDependentTests/src/Server.java create mode 100644 java/java-tests/testData/compileServer/incremental/markDirty/recompileDependentTests/testSrc/TestClient.java create mode 100644 jps/jps-builders/testSrc/org/jetbrains/jps/builders/BuildResult.java diff --git a/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependent/.idea/compiler.xml b/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependent/.idea/compiler.xml deleted file mode 100644 index a1b41c52c724..000000000000 --- a/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependent/.idea/compiler.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - diff --git a/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependent/.idea/encodings.xml b/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependent/.idea/encodings.xml deleted file mode 100644 index e206d70d8595..000000000000 --- a/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependent/.idea/encodings.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependent/.idea/misc.xml b/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependent/.idea/misc.xml deleted file mode 100644 index f22d96b8c6a5..000000000000 --- a/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependent/.idea/misc.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IDEA jdk - - - - - - - - - - - - - - diff --git a/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependent/.idea/modules.xml b/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependent/.idea/modules.xml deleted file mode 100644 index 9991495b74f1..000000000000 --- a/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependent/.idea/modules.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependent/RecompileDependent.iml b/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependent/RecompileDependent.iml deleted file mode 100644 index d5c074327501..000000000000 --- a/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependent/RecompileDependent.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependentTests.log b/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependentTests.log new file mode 100644 index 000000000000..f546b0a9b1e3 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependentTests.log @@ -0,0 +1,20 @@ +Cleaning output files: +out/production/RecompileDependentTests/Server.class +End of files +Compiling files: +src/Server.java +End of files +Cleaning output files: +out/production/RecompileDependentTests/Client.class +out/production/RecompileDependentTests/Server.class +End of files +Compiling files: +src/Client.java +src/Server.java +End of files +Cleaning output files: +out/test/RecompileDependentTests/TestClient.class +End of files +Compiling files: +testSrc/TestClient.java +End of files diff --git a/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependentTests/Server.java.new b/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependentTests/Server.java.new new file mode 100644 index 000000000000..21eddc6a5dbf --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependentTests/Server.java.new @@ -0,0 +1,3 @@ +public class Server{ + public static final int CONSTANT = 200; +} \ No newline at end of file diff --git a/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependentTests/lib/a.jar b/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependentTests/lib/a.jar new file mode 100644 index 0000000000000000000000000000000000000000..577690d4fb0db6ca08f34072598434abe4c7130c GIT binary patch literal 783 zcmWIWW@h1H0D;F5&zz~2_6(3MFNL5y9Nm5Z_W?r#AZnZ)f zYO@OPsb>MIPtMN;n<&D-0fgvo6ojhqt#r;wEH2hd29dG-=e-U)2prr0@|nMHaCCC~ zfoScF1@l}!27M6u8t}4Kc=`@iUxk}o`=-ug;kRqxS3P%Z!BN|q!)I#t_uo9f{yRTI zu@94l#P`An%AX27KIoOMJS*zxldj#gd4-%v;*=Lbck|3wu6myu^+CmJm5-QqWcKZH z=i@f7+6;U)WeMN6(dW8pA}%vk+j)jh`pGD}lRGA)%IW*AJw0do!A-ZW&D?d(OySLf z;B20Uhmx!6%KRkWxCkAqcPxJymCEKW@JIM}l>+ysUw4kibgr)c!&a4hy*6yUEZ3Wj zZT4&|5(Q6{4c+0A;$vuK)l5 literal 0 HcmV?d00001 diff --git a/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependentTests/src/Client.java b/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependentTests/src/Client.java new file mode 100644 index 000000000000..dd2f6d88f140 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependentTests/src/Client.java @@ -0,0 +1,20 @@ +/* + * 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. + */ +class Client { + public static void main(String[] args) { + System.out.println(Server.CONSTANT); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependentTests/src/Server.java b/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependentTests/src/Server.java new file mode 100644 index 000000000000..7faab26bcff0 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependentTests/src/Server.java @@ -0,0 +1,18 @@ +/* + * 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. + */ +public class Server{ + public static final int CONSTANT = 100; +} \ No newline at end of file diff --git a/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependentTests/testSrc/TestClient.java b/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependentTests/testSrc/TestClient.java new file mode 100644 index 000000000000..1e1d53ce65bd --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/markDirty/recompileDependentTests/testSrc/TestClient.java @@ -0,0 +1,20 @@ +/* + * 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. + */ +class TestClient { + public static void main(String[] args) { + System.out.println(Server.CONSTANT + new com.MyClass().get()); + } +} \ No newline at end of file diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/fs/BuildFSState.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/fs/BuildFSState.java index 42ea86c2875f..28a81d3bff4c 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/fs/BuildFSState.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/fs/BuildFSState.java @@ -70,20 +70,28 @@ public class BuildFSState extends FSState { public boolean markDirty(@Nullable CompileContext context, File file, final RootDescriptor rd, @Nullable Timestamps tsStorage) throws IOException { final FilesDelta roundDelta = getRoundDelta(CURRENT_ROUND_DELTA_KEY, context); if (roundDelta != null) { - if (getContextModules(context).contains(rd.module)) { + if (isInCurrentContextModules(context, rd)) { roundDelta.markRecompile(rd.root, file); } } return super.markDirty(context, file, rd, tsStorage); } + private static boolean isInCurrentContextModules(CompileContext context, RootDescriptor rd) { + if (context == null) { + return false; + } + Set modules = CONTEXT_MODULES_KEY.get(context, Collections.emptySet()); + return modules.contains(rd.module) && rd.isTestRoot == context.isCompilingTests(); + } + @Override public boolean markDirtyIfNotDeleted(@Nullable CompileContext context, File file, final RootDescriptor rd, @Nullable Timestamps tsStorage) throws IOException { final boolean marked = super.markDirtyIfNotDeleted(context, file, rd, tsStorage); if (marked) { final FilesDelta roundDelta = getRoundDelta(CURRENT_ROUND_DELTA_KEY, context); if (roundDelta != null) { - if (getContextModules(context).contains(rd.module)) { + if (isInCurrentContextModules(context, rd)) { roundDelta.markRecompile(rd.root, file); } } @@ -207,11 +215,6 @@ public class BuildFSState extends FSState { return marked; } - @NotNull - private static Set getContextModules(@Nullable CompileContext context) { - return context != null? CONTEXT_MODULES_KEY.get(context, Collections.emptySet()) : Collections.emptySet(); - } - private static void setContextModules(@Nullable CompileContext context, @Nullable Set modules) { if (context != null) { CONTEXT_MODULES_KEY.set(context, modules); diff --git a/jps/jps-builders/testSrc/org/jetbrains/ether/IncrementalTestCase.java b/jps/jps-builders/testSrc/org/jetbrains/ether/IncrementalTestCase.java index 73d4fe9a1f77..5f9c6be56d6b 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/ether/IncrementalTestCase.java +++ b/jps/jps-builders/testSrc/org/jetbrains/ether/IncrementalTestCase.java @@ -16,18 +16,25 @@ package org.jetbrains.ether; import com.intellij.openapi.application.ex.PathManagerEx; -import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; +import org.jetbrains.jps.JpsPathUtil; +import org.jetbrains.jps.builders.BuildResult; import org.jetbrains.jps.builders.JpsBuildTestCase; import org.jetbrains.jps.cmdline.ProjectDescriptor; import org.jetbrains.jps.incremental.*; import org.jetbrains.jps.incremental.artifacts.ArtifactBuilderLoggerImpl; import org.jetbrains.jps.incremental.java.JavaBuilderLogger; -import org.jetbrains.jps.incremental.messages.BuildMessage; +import org.jetbrains.jps.model.JpsDummyElement; import org.jetbrains.jps.model.artifact.JpsArtifact; +import org.jetbrains.jps.model.java.JpsJavaExtensionService; +import org.jetbrains.jps.model.library.sdk.JpsSdk; +import org.jetbrains.jps.model.module.JpsModule; -import java.io.*; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileFilter; +import java.io.PrintStream; import java.util.Collections; /** @@ -38,6 +45,7 @@ public abstract class IncrementalTestCase extends JpsBuildTestCase { private final String groupName; private File baseDir; private File workDir; + private JpsSdk myJdk; @SuppressWarnings("JUnitTestCaseWithNonTrivialConstructors") protected IncrementalTestCase(final String name) throws Exception { @@ -55,6 +63,16 @@ public abstract class IncrementalTestCase extends JpsBuildTestCase { FileUtil.copyDir(baseDir, workDir); Utils.setSystemRoot(workDir); + String outputPath = getAbsolutePath("out"); + JpsJavaExtensionService.getInstance().getOrCreateProjectExtension(myJpsProject).setOutputUrl(JpsPathUtil.pathToUrl(outputPath)); + } + + protected String getUrl(String pathRelativeToProjectRoot) { + return JpsPathUtil.pathToUrl(getAbsolutePath(pathRelativeToProjectRoot)); + } + + protected String getAbsolutePath(final String pathRelativeToProjectRoot) { + return FileUtil.toSystemIndependentName(workDir.getAbsolutePath()) + "/" + pathRelativeToProjectRoot; } @Override @@ -96,45 +114,39 @@ public abstract class IncrementalTestCase extends JpsBuildTestCase { } public void doTest() throws Exception { - final String projectPath = workDir.getAbsolutePath(); + if (new File(workDir, ".idea").exists()) { + getOrCreateJdk(); + loadProject(workDir.getAbsolutePath()); + } + else { + addModule(); + } - initJdk("IDEA jdk"); + doTestBuild(); + } - loadProject(projectPath); + protected JpsModule addModule() { + String moduleName = StringUtil.capitalize(getProjectName()); + String srcPath = getAbsolutePath("src"); + return addModule(moduleName, new String[]{srcPath}, null, getOrCreateJdk()); + } - final TestJavaBuilderLogger javaBuilderLogger = new TestJavaBuilderLogger(FileUtil.toSystemIndependentName(workDir.getAbsolutePath()) + "/"); - final ProjectDescriptor projectDescriptor = createProjectDescriptor(new BuildLoggingManager(new ArtifactBuilderLoggerImpl(), javaBuilderLogger)); + protected BuildResult doTestBuild() throws Exception { + final TestJavaBuilderLogger + javaBuilderLogger = new TestJavaBuilderLogger(FileUtil.toSystemIndependentName(workDir.getAbsolutePath()) + "/"); + final ProjectDescriptor + projectDescriptor = createProjectDescriptor(new BuildLoggingManager(new ArtifactBuilderLoggerImpl(), javaBuilderLogger)); try { - final IncProjectBuilder builder = createBuilder(projectDescriptor); - doBuild(builder, new AllProjectScope(myProject, myJpsProject, Collections.emptySet(), true), false, false, true); + doBuild(projectDescriptor, new AllProjectScope(myProject, myJpsProject, Collections.emptySet(), true), false, + true, false).assertSuccessful(); modify(); - if (SystemInfo.isUnix) { - Thread.sleep(1000L); - } - - final IncProjectBuilder makeBuilder = createBuilder(projectDescriptor); - - class MH implements MessageHandler { - boolean myErrors = false; - - @Override - public void processMessage(final BuildMessage msg) { - if (msg.getKind() == BuildMessage.Kind.ERROR) - myErrors = true; - } - } - - final MH handler = new MH(); - - makeBuilder.addMessageHandler(handler); - - makeBuilder.build(new AllProjectScope(myProject, myJpsProject, Collections.emptySet(), false), true, false, false); + BuildResult result = doBuild(projectDescriptor, new AllProjectScope(myProject, myJpsProject, Collections.emptySet(), false), true, false, false); final ByteArrayOutputStream makeDump = new ByteArrayOutputStream(); - if (!handler.myErrors) { + if (result.isSuccessful()) { projectDescriptor.dataManager.getMappings().toStream(new PrintStream(makeDump)); } @@ -145,8 +157,9 @@ public abstract class IncrementalTestCase extends JpsBuildTestCase { assertEquals(expected, actual); - if (!handler.myErrors) { - createBuilder(projectDescriptor).build(new AllProjectScope(myProject, myJpsProject, Collections.emptySet(), true), false, true, false); + if (result.isSuccessful()) { + doBuild(projectDescriptor, new AllProjectScope(myProject, myJpsProject, Collections.emptySet(), true), false, + true, false).assertSuccessful(); final ByteArrayOutputStream rebuildDump = new ByteArrayOutputStream(); @@ -156,12 +169,20 @@ public abstract class IncrementalTestCase extends JpsBuildTestCase { assertEquals(rebuildDump.toString(), makeDump.toString()); } + return result; } finally { projectDescriptor.release(); } } + private JpsSdk getOrCreateJdk() { + if (myJdk == null) { + myJdk = addJdk("IDEA jdk"); + } + return myJdk; + } + private static class TestJavaBuilderLogger implements JavaBuilderLogger { private final String myRoot; private final StringBuilder myLog; diff --git a/jps/jps-builders/testSrc/org/jetbrains/ether/MarkDirtyTest.java b/jps/jps-builders/testSrc/org/jetbrains/ether/MarkDirtyTest.java index 249334d1bfdb..7b2833009167 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/ether/MarkDirtyTest.java +++ b/jps/jps-builders/testSrc/org/jetbrains/ether/MarkDirtyTest.java @@ -1,5 +1,15 @@ package org.jetbrains.ether; +import org.jetbrains.jps.model.JpsModuleRootModificationUtil; +import org.jetbrains.jps.model.java.JavaSourceRootType; +import org.jetbrains.jps.model.java.JpsJavaDependencyScope; +import org.jetbrains.jps.model.java.JpsJavaLibraryType; +import org.jetbrains.jps.model.library.JpsLibrary; +import org.jetbrains.jps.model.library.JpsOrderRootType; +import org.jetbrains.jps.model.module.JpsModule; + +import java.io.File; + /** * Created by IntelliJ IDEA. * User: db @@ -15,4 +25,18 @@ public class MarkDirtyTest extends IncrementalTestCase { public void testRecompileDependent() throws Exception { doTest(); } + + public void testRecompileDependentTests() throws Exception { + JpsModule module = addModule(); + module.addSourceRoot(getUrl("testSrc"), JavaSourceRootType.TEST_SOURCE); + JpsLibrary library = addLibrary(); + JpsModuleRootModificationUtil.addDependency(module, library, JpsJavaDependencyScope.TEST, false); + doTestBuild().assertSuccessful(); + } + + private JpsLibrary addLibrary() { + JpsLibrary library = myJpsProject.addLibrary("l", JpsJavaLibraryType.INSTANCE); + library.addRoot(new File(getAbsolutePath("lib/a.jar")), JpsOrderRootType.COMPILED); + return library; + } } diff --git a/jps/jps-builders/testSrc/org/jetbrains/jps/builders/BuildResult.java b/jps/jps-builders/testSrc/org/jetbrains/jps/builders/BuildResult.java new file mode 100644 index 000000000000..1557a1a162a4 --- /dev/null +++ b/jps/jps-builders/testSrc/org/jetbrains/jps/builders/BuildResult.java @@ -0,0 +1,47 @@ +package org.jetbrains.jps.builders; + +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.util.Function; +import junit.framework.Assert; +import org.jetbrains.jps.incremental.MessageHandler; +import org.jetbrains.jps.incremental.messages.BuildMessage; + +import java.util.ArrayList; +import java.util.List; + +/** +* @author nik +*/ +public class BuildResult implements MessageHandler { + private final List myErrorMessages; + private final List myInfoMessages; + + public BuildResult() { + myErrorMessages = new ArrayList(); + myInfoMessages = new ArrayList(); + } + + @Override + public void processMessage(BuildMessage msg) { + if (msg.getKind() == BuildMessage.Kind.ERROR) { + myErrorMessages.add(msg); + } + else { + myInfoMessages.add(msg); + } + } + + public void assertFailed() { + Assert.assertFalse("Build not failed as expected", isSuccessful()); + } + + public boolean isSuccessful() { + return myErrorMessages.isEmpty(); + } + + public void assertSuccessful() { + final Function toStringFunction = StringUtil.createToStringFunction(BuildMessage.class); + Assert.assertTrue("Build failed. \nErrors:\n" + StringUtil.join(myErrorMessages, toStringFunction, "\n") + + "\nInfo messages:\n" + StringUtil.join(myInfoMessages, toStringFunction, "\n"), isSuccessful()); + } +} diff --git a/jps/jps-builders/testSrc/org/jetbrains/jps/builders/JpsBuildTestCase.java b/jps/jps-builders/testSrc/org/jetbrains/jps/builders/JpsBuildTestCase.java index 113304cf9b38..111c27868029 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/jps/builders/JpsBuildTestCase.java +++ b/jps/jps-builders/testSrc/org/jetbrains/jps/builders/JpsBuildTestCase.java @@ -3,7 +3,6 @@ package org.jetbrains.jps.builders; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.testFramework.UsefulTestCase; -import com.intellij.util.Function; import junit.framework.Assert; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.JpsPathUtil; @@ -14,24 +13,22 @@ import org.jetbrains.jps.cmdline.ProjectDescriptor; import org.jetbrains.jps.idea.IdeaProjectLoader; import org.jetbrains.jps.incremental.*; import org.jetbrains.jps.incremental.fs.BuildFSState; -import org.jetbrains.jps.incremental.messages.BuildMessage; import org.jetbrains.jps.incremental.storage.BuildDataManager; import org.jetbrains.jps.incremental.storage.ProjectTimestamps; import org.jetbrains.jps.model.JpsDummyElement; import org.jetbrains.jps.model.JpsElementFactory; import org.jetbrains.jps.model.JpsModel; import org.jetbrains.jps.model.JpsProject; -import org.jetbrains.jps.model.java.JpsJavaSdkType; +import org.jetbrains.jps.model.java.*; import org.jetbrains.jps.model.library.JpsOrderRootType; import org.jetbrains.jps.model.library.JpsTypedLibrary; import org.jetbrains.jps.model.library.sdk.JpsSdk; +import org.jetbrains.jps.model.module.JpsModule; import org.jetbrains.jps.model.serialization.JpsProjectLoader; import java.io.File; import java.io.IOException; -import java.util.ArrayList; import java.util.Collections; -import java.util.List; import java.util.Map; /** @@ -52,16 +49,16 @@ public abstract class JpsBuildTestCase extends UsefulTestCase { Utils.setSystemRoot(FileUtil.createTempDirectory("compile-server", null)); } - protected JpsSdk initJdk(final String name) { + protected JpsSdk addJdk(final String name) { try { - return initJdk(name, FileUtil.toSystemIndependentName(ClasspathBootstrap.getResourcePath(Object.class).getCanonicalPath())); + return addJdk(name, FileUtil.toSystemIndependentName(ClasspathBootstrap.getResourcePath(Object.class).getCanonicalPath())); } catch (IOException e) { throw new RuntimeException(e); } } - protected JpsSdk initJdk(final String name, final String path) { + protected JpsSdk addJdk(final String name, final String path) { String homePath = System.getProperty("java.home"); String versionString = System.getProperty("java.version"); JpsTypedLibrary> jdk = myModel.getGlobal().addSdk(name, homePath, versionString, JpsJavaSdkType.INSTANCE); @@ -112,39 +109,40 @@ public abstract class JpsBuildTestCase extends UsefulTestCase { return null; } - - protected static IncProjectBuilder createBuilder(ProjectDescriptor projectDescriptor) { - return new IncProjectBuilder(projectDescriptor, BuilderRegistry.getInstance(), Collections.emptyMap(), CanceledStatus.NULL, null); + protected JpsModule addModule(String moduleName, + String[] srcPaths, + @Nullable final String outputPath, + final JpsSdk jdk) { + final JpsModule module = myJpsProject.addModule(moduleName, JpsJavaModuleType.INSTANCE); + module.getSdkReferencesTable().setSdkReference(JpsJavaSdkType.INSTANCE, jdk.createReference()); + module.getDependenciesList().addSdkDependency(JpsJavaSdkType.INSTANCE); + if (srcPaths.length > 0) { + for (String srcPath : srcPaths) { + module.getContentRootsList().addUrl(JpsPathUtil.pathToUrl(srcPath)); + module.addSourceRoot(JpsPathUtil.pathToUrl(srcPath), JavaSourceRootType.SOURCE); + } + JpsJavaModuleExtension extension = JpsJavaExtensionService.getInstance().getOrCreateModuleExtension(module); + if (outputPath != null) { + extension.setOutputUrl(JpsPathUtil.pathToUrl(outputPath)); + } + else { + extension.setInheritOutput(true); + } + } + return module; } - protected static void doBuild(IncProjectBuilder builder, CompileScope scope, boolean shouldFail, final boolean isMake, - final boolean isRebuild) { - final List errorMessages = new ArrayList(); - final List infoMessages = new ArrayList(); - builder.addMessageHandler(new MessageHandler() { - @Override - public void processMessage(BuildMessage msg) { - if (msg.getKind() == BuildMessage.Kind.ERROR) { - errorMessages.add(msg); - } - else { - infoMessages.add(msg); - } - } - }); + protected BuildResult doBuild(final ProjectDescriptor descriptor, CompileScope scope, + final boolean make, final boolean rebuild, final boolean forceCleanCaches) { + IncProjectBuilder builder = new IncProjectBuilder(descriptor, BuilderRegistry.getInstance(), Collections.emptyMap(), CanceledStatus.NULL, null); + BuildResult result = new BuildResult(); + builder.addMessageHandler(result); try { - builder.build(scope, isMake, isRebuild, false); + builder.build(scope, make, rebuild, forceCleanCaches); } catch (RebuildRequestedException e) { Assert.fail(e.getMessage()); } - if (shouldFail) { - Assert.assertFalse("Build not failed as expected", errorMessages.isEmpty()); - } - else { - final Function toStringFunction = StringUtil.createToStringFunction(BuildMessage.class); - Assert.assertTrue("Build failed. \nErrors:\n" + StringUtil.join(errorMessages, toStringFunction, "\n") + - "\nInfo messages:\n" + StringUtil.join(infoMessages, toStringFunction, "\n"), errorMessages.isEmpty()); - } + return result; } } diff --git a/jps/jps-builders/testSrc/org/jetbrains/jps/builders/ModuleClasspathTest.groovy b/jps/jps-builders/testSrc/org/jetbrains/jps/builders/ModuleClasspathTest.groovy index bce3d4bcbe9c..2418098e6c90 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/jps/builders/ModuleClasspathTest.groovy +++ b/jps/jps-builders/testSrc/org/jetbrains/jps/builders/ModuleClasspathTest.groovy @@ -12,8 +12,8 @@ public class ModuleClasspathTest extends JpsRebuildTestCase { protected void setUp() { super.setUp() myModel.getGlobal().getLibraryCollection().findLibrary("1.6").delete() - initJdk("1.6", "/jdk.jar") - initJdk("1.5", "/jdk15.jar") + addJdk("1.6", "/jdk.jar") + addJdk("1.5", "/jdk15.jar") loadProject("moduleClasspath/moduleClasspath.ipr") } diff --git a/jps/jps-builders/testSrc/org/jetbrains/jps/builders/rebuild/JpsRebuildTestCase.groovy b/jps/jps-builders/testSrc/org/jetbrains/jps/builders/rebuild/JpsRebuildTestCase.groovy index 7311a59115c1..7b3a1807c0fc 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/jps/builders/rebuild/JpsRebuildTestCase.groovy +++ b/jps/jps-builders/testSrc/org/jetbrains/jps/builders/rebuild/JpsRebuildTestCase.groovy @@ -21,7 +21,7 @@ abstract class JpsRebuildTestCase extends JpsBuildTestCase { @Override protected void setUp() { super.setUp() - initJdk("1.6") + addJdk("1.6") } def doTest(String projectPath, Closure initProject, Closure expectedOutput) { @@ -52,7 +52,7 @@ abstract class JpsRebuildTestCase extends JpsBuildTestCase { def descriptor = createProjectDescriptor(new BuildLoggingManager(new ArtifactBuilderLoggerImpl(), new JavaBuilderLoggerImpl())) try { def scope = new AllProjectScope(myProject, myJpsProject, new HashSet(JpsArtifactService.getInstance().getArtifacts(myJpsProject)), true) - doBuild(createBuilder(descriptor), scope, false, false, true) + doBuild(descriptor, scope, false, true, false).assertSuccessful() } finally { descriptor.release(); diff --git a/jps/jps-builders/testSrc/org/jetbrains/jps/incremental/artifacts/ArtifactBuilderTestCase.java b/jps/jps-builders/testSrc/org/jetbrains/jps/incremental/artifacts/ArtifactBuilderTestCase.java index a39f4575e479..f6df9a21c523 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/jps/incremental/artifacts/ArtifactBuilderTestCase.java +++ b/jps/jps-builders/testSrc/org/jetbrains/jps/incremental/artifacts/ArtifactBuilderTestCase.java @@ -21,19 +21,19 @@ import com.intellij.util.io.TestFileSystemBuilder; import com.intellij.util.text.UniqueNameGenerator; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.JpsPathUtil; +import org.jetbrains.jps.builders.BuildResult; import org.jetbrains.jps.builders.JpsBuildTestCase; import org.jetbrains.jps.cmdline.ProjectDescriptor; import org.jetbrains.jps.incremental.AllProjectScope; import org.jetbrains.jps.incremental.BuildLoggingManager; import org.jetbrains.jps.incremental.CompileScope; -import org.jetbrains.jps.incremental.IncProjectBuilder; import org.jetbrains.jps.incremental.java.JavaBuilderLoggerImpl; import org.jetbrains.jps.model.JpsDummyElement; import org.jetbrains.jps.model.JpsElementFactory; import org.jetbrains.jps.model.artifact.DirectoryArtifactType; import org.jetbrains.jps.model.artifact.JpsArtifact; import org.jetbrains.jps.model.artifact.JpsArtifactService; -import org.jetbrains.jps.model.java.*; +import org.jetbrains.jps.model.java.JpsJavaLibraryType; import org.jetbrains.jps.model.library.JpsLibrary; import org.jetbrains.jps.model.library.JpsOrderRootType; import org.jetbrains.jps.model.library.sdk.JpsSdk; @@ -127,20 +127,9 @@ public abstract class ArtifactBuilderTestCase extends JpsBuildTestCase { protected JpsModule addModule(String moduleName, String... srcPaths) { if (myJdk == null) { - myJdk = initJdk("1.6"); + myJdk = addJdk("1.6"); } - final JpsModule module = myJpsProject.addModule(moduleName, JpsJavaModuleType.INSTANCE); - module.getSdkReferencesTable().setSdkReference(JpsJavaSdkType.INSTANCE, myJdk.createReference()); - module.getDependenciesList().addSdkDependency(JpsJavaSdkType.INSTANCE); - if (srcPaths.length > 0) { - for (String srcPath : srcPaths) { - module.getContentRootsList().addUrl(JpsPathUtil.pathToUrl(srcPath)); - module.addSourceRoot(JpsPathUtil.pathToUrl(srcPath), JavaSourceRootType.SOURCE); - } - final String outputUrl = JpsPathUtil.pathToUrl(getAbsolutePath("out/production/" + moduleName)); - JpsJavaExtensionService.getInstance().getOrCreateModuleExtension(module).setOutputUrl(outputUrl); - } - return module; + return addModule(moduleName, srcPaths, getAbsolutePath("out/production/" + moduleName), myJdk); } protected JpsLibrary addProjectLibrary(String name, String jarPath) { @@ -155,19 +144,18 @@ public abstract class ArtifactBuilderTestCase extends JpsBuildTestCase { } protected void buildArtifacts(JpsArtifact... artifact) { - doBuild(false, false, artifact); + doBuild(false, artifact).assertSuccessful(); } - private void doBuild(boolean force, final boolean shouldFail, JpsArtifact... artifacts) { + private BuildResult doBuild(boolean force, JpsArtifact... artifacts) { if (myDescriptor == null) { myDescriptor = createProjectDescriptor(new BuildLoggingManager(myArtifactBuilderLogger, new JavaBuilderLoggerImpl())); myDescriptor.incUsageCounter(); } myArtifactBuilderLogger.clear(); - IncProjectBuilder builder = createBuilder(myDescriptor); final CompileScope scope = new AllProjectScope(myDescriptor.project, myDescriptor.jpsProject, new HashSet(Arrays.asList(artifacts)), force); - doBuild(builder, scope, shouldFail, !force, false); + return doBuild(myDescriptor, scope, !force, false, false); } protected static String getJUnitJarPath() { @@ -181,7 +169,7 @@ public abstract class ArtifactBuilderTestCase extends JpsBuildTestCase { } protected void assertBuildFailed(JpsArtifact a) { - doBuild(false, true, a); + doBuild(false, a).assertFailed(); } protected static void change(String filePath) {