add tests for KT-8158 make Kotlin compiler invoked from IDEA cancellable

This commit is contained in:
Michael Nedzelsky
2015-07-03 15:37:20 +03:00
parent ea0c14d7ad
commit 8cd978bfd8
7 changed files with 160 additions and 4 deletions
@@ -26,8 +26,16 @@ import com.intellij.testFramework.UsefulTestCase
import com.intellij.util.ArrayUtil
import com.intellij.util.containers.ContainerUtil
import com.intellij.util.io.ZipUtil
import org.jetbrains.jps.api.CanceledStatus
import org.jetbrains.jps.builders.BuildResult
import org.jetbrains.jps.builders.CompileScopeTestBuilder
import org.jetbrains.jps.builders.JpsBuildTestCase
import org.jetbrains.jps.builders.TestProjectBuilderLogger
import org.jetbrains.jps.builders.impl.BuildDataPathsImpl
import org.jetbrains.jps.builders.logging.BuildLoggingManager
import org.jetbrains.jps.incremental.BuilderRegistry
import org.jetbrains.jps.incremental.IncProjectBuilder
import org.jetbrains.jps.incremental.messages.BuildMessage
import org.jetbrains.jps.model.java.JpsJavaDependencyScope
import org.jetbrains.jps.model.java.JpsJavaExtensionService
import org.jetbrains.jps.model.module.JpsModule
@@ -41,10 +49,7 @@ import org.jetbrains.org.objectweb.asm.ClassReader
import org.jetbrains.org.objectweb.asm.ClassVisitor
import org.jetbrains.org.objectweb.asm.MethodVisitor
import org.jetbrains.org.objectweb.asm.Opcodes
import java.io.File
import java.io.FileNotFoundException
import java.io.FileOutputStream
import java.io.IOException
import java.io.*
import java.util.Arrays
import java.util.Collections
import java.util.HashSet
@@ -533,6 +538,99 @@ public class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() {
assertFalse(File(storageRoot, "targets/java-production/kotlinProject/kotlin").exists())
}
public fun testCancelLongKotlinCompilation() {
generateLongKotlinFile("Foo.kt", "foo", "Foo")
initProject()
val start = System.currentTimeMillis()
val canceledStatus = CanceledStatus() { System.currentTimeMillis() - start > 2000 }
val logger = TestProjectBuilderLogger()
val buildResult = BuildResult()
buildCustom(canceledStatus, logger, buildResult)
val interval = System.currentTimeMillis() - start
assertCanceled(buildResult)
buildResult.assertSuccessful()
assert(interval < 8000, "expected time for canceled compilation < 8000 ms, but $interval")
val module = myProject.getModules().get(0)
assertFilesNotExistInOutput(module, "foo/Foo.class")
val expectedLog = workDir.getAbsolutePath() + File.separator + "expected.log"
checkFullLog(logger, File(expectedLog))
}
public fun testCancelKotlinCompilation() {
initProject()
makeAll().assertSuccessful()
val module = myProject.getModules().get(0)
assertFilesExistInOutput(module, "foo/Bar.class")
val buildResult = BuildResult()
val canceledStatus = object: CanceledStatus {
var checkFromIndex = 0;
public override fun isCanceled(): Boolean {
val messages = buildResult.getMessages(BuildMessage.Kind.INFO)
for (i in checkFromIndex..messages.size()-1) {
if (messages.get(i).getMessageText().startsWith("Kotlin JPS plugin version")) return true;
}
checkFromIndex = messages.size();
return false;
}
}
touch("src/Bar.kt").apply()
buildCustom(canceledStatus, TestProjectBuilderLogger(), buildResult)
assertCanceled(buildResult)
assertFilesNotExistInOutput(module, "foo/Bar.class")
}
private fun buildCustom(canceledStatus: CanceledStatus, logger: TestProjectBuilderLogger,buildResult: BuildResult) {
val scopeBuilder = CompileScopeTestBuilder.make().all()
val descriptor = this.createProjectDescriptor(BuildLoggingManager(logger))
try {
val builder = IncProjectBuilder(descriptor, BuilderRegistry.getInstance(), this.myBuildParams, canceledStatus, null, true)
builder.addMessageHandler(buildResult)
builder.build(scopeBuilder.build(), false)
}
finally {
descriptor.release()
}
}
private fun checkFullLog(logger: TestProjectBuilderLogger, expectedLogFile: File) {
UsefulTestCase.assertSameLinesWithFile(expectedLogFile.getAbsolutePath(), logger.getFullLog(getOrCreateProjectDir(), myDataStorageRoot))
}
private fun assertCanceled(buildResult: BuildResult) {
val list = buildResult.getMessages(BuildMessage.Kind.INFO)
assertTrue("The build has been canceled".equals(list.last().getMessageText()))
}
private fun generateLongKotlinFile(filePath: String, packagename: String, className: String) {
val file = File(workDir.getAbsolutePath() + File.separator + "src" + File.separator + filePath)
FileUtilRt.createIfNotExists(file)
val writer = BufferedWriter(FileWriter(file))
try {
writer.write("package $packagename\n\n")
writer.write("public class $className {\n")
for (i in 0..10000) {
writer.write("fun f$i():Int = $i\n\n")
}
writer.write("}\n")
}
finally {
writer.close()
}
}
private fun findModule(name: String): JpsModule {
for (module in myProject.getModules()) {
if (module.getName() == name) {
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="jdk" jdkName="IDEA_JDK" jdkType="JavaSDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="KotlinRuntime" level="project" />
</component>
</module>
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<option name="DEFAULT_COMPILER" value="Javac" />
</component>
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/kotlinProject.iml" filepath="$PROJECT_DIR$/kotlinProject.iml" />
</modules>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" assert-keyword="true" jdk-15="true" project-jdk-name="IDEA_JDK" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
@@ -0,0 +1,3 @@
package foo
class Bar
@@ -0,0 +1,3 @@
Compiling files:
src/Foo.kt
End of files
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="jdk" jdkName="IDEA_JDK" jdkType="JavaSDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="KotlinRuntime" level="project" />
</component>
</module>
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<option name="DEFAULT_COMPILER" value="Javac" />
</component>
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/kotlinProject.iml" filepath="$PROJECT_DIR$/kotlinProject.iml" />
</modules>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" assert-keyword="true" jdk-15="true" project-jdk-name="IDEA_JDK" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>