[JVM_IR] Run KotlinSteppingTests with the JVM_IR backend.

Implement support for supressing failures by backend.
This commit is contained in:
Mads Ager
2020-08-06 14:25:29 +02:00
committed by max-kammerer
parent 01f7da66c6
commit 119302b016
27 changed files with 1407 additions and 8 deletions
@@ -216,6 +216,31 @@ fun main(args: Array<String>) {
model("stepping/custom", pattern = KT_WITHOUT_DOTS_IN_NAME, testMethod = "doCustomTest")
}
testClass<AbstractIrKotlinSteppingTest> {
model(
"stepping/stepIntoAndSmartStepInto",
pattern = KT_WITHOUT_DOTS_IN_NAME,
testMethod = "doStepIntoTest",
testClassName = "StepInto"
)
model(
"stepping/stepIntoAndSmartStepInto",
pattern = KT_WITHOUT_DOTS_IN_NAME,
testMethod = "doSmartStepIntoTest",
testClassName = "SmartStepInto"
)
model(
"stepping/stepInto",
pattern = KT_WITHOUT_DOTS_IN_NAME,
testMethod = "doStepIntoTest",
testClassName = "StepIntoOnly"
)
model("stepping/stepOut", pattern = KT_WITHOUT_DOTS_IN_NAME, testMethod = "doStepOutTest")
model("stepping/stepOver", pattern = KT_WITHOUT_DOTS_IN_NAME, testMethod = "doStepOverTest")
model("stepping/filters", pattern = KT_WITHOUT_DOTS_IN_NAME, testMethod = "doStepIntoTest")
model("stepping/custom", pattern = KT_WITHOUT_DOTS_IN_NAME, testMethod = "doCustomTest")
}
testClass<AbstractKotlinEvaluateExpressionTest> {
model("evaluation/singleBreakpoint", testMethod = "doSingleBreakpointTest")
model("evaluation/multipleBreakpoints", testMethod = "doMultipleBreakpointsTest")
@@ -0,0 +1,10 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.debugger.test
abstract class AbstractIrKotlinSteppingTest : AbstractKotlinSteppingTest() {
override fun useIrBackend() = true
}
@@ -16,6 +16,9 @@ import com.intellij.openapi.vfs.LocalFileSystem
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.openapi.vfs.newvfs.ArchiveFileSystem
import com.intellij.psi.PsiManager
import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig
import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory
import org.jetbrains.kotlin.backend.jvm.jvmPhases
import org.jetbrains.kotlin.caches.resolve.KotlinCacheService
import org.jetbrains.kotlin.cli.common.output.writeAllTo
import org.jetbrains.kotlin.cli.jvm.compiler.findMainClass
@@ -35,7 +38,11 @@ import org.jetbrains.kotlin.test.MockLibraryUtil
import org.jetbrains.kotlin.test.testFramework.KtUsefulTestCase
import java.io.File
class DebuggerTestCompilerFacility(files: List<TestFile>, private val jvmTarget: JvmTarget) {
class DebuggerTestCompilerFacility(
files: List<TestFile>,
private val jvmTarget: JvmTarget,
private val useIrBackend: Boolean
) {
private val kotlinStdlibPath = ForTestCompileRuntime.runtimeJarForTests().absolutePath
private val mainFiles: TestFilesByLanguage
@@ -86,11 +93,17 @@ class DebuggerTestCompilerFacility(files: List<TestFile>, private val jvmTarget:
if (kotlinStdlibInMavenArtifacts() == null)
mavenArtifacts.add(kotlinStdlibPath)
val options = mutableListOf("-jvm-target", jvmTarget.description)
if (useIrBackend) {
options.add("-Xuse-ir")
}
if (kotlin.isNotEmpty()) {
MockLibraryUtil.compileKotlin(
srcDir.absolutePath,
classesDir,
listOf("-jvm-target", jvmTarget.description),
options,
*(mavenArtifacts.toTypedArray())
)
}
@@ -162,10 +175,17 @@ class DebuggerTestCompilerFacility(files: List<TestFile>, private val jvmTarget:
val configuration = CompilerConfiguration()
configuration.put(JVMConfigurationKeys.JVM_TARGET, jvmTarget)
configuration.put(JVMConfigurationKeys.IR, useIrBackend)
val state = GenerationState.Builder(project, ClassBuilderFactories.BINARIES, moduleDescriptor, bindingContext, files, configuration)
.generateDeclaredClassFilter(GenerationState.GenerateClassFilter.GENERATE_ALL)
.codegenFactory(DefaultCodegenFactory)
.codegenFactory(
if (useIrBackend) {
JvmIrCodegenFactory(PhaseConfig(jvmPhases))
} else {
DefaultCodegenFactory
}
)
.build()
KotlinCodegenFacade.compileCorrectFiles(state)
@@ -96,6 +96,8 @@ abstract class KotlinDescriptorTestCase : DescriptorTestCase() {
super.tearDown()
}
open fun useIrBackend() = false
fun doTest(path: String) {
val wholeFile = File(path)
val wholeFileContents = FileUtil.loadFile(wholeFile, true)
@@ -108,7 +110,7 @@ abstract class KotlinDescriptorTestCase : DescriptorTestCase() {
val rawJvmTarget = preferences[DebuggerPreferenceKeys.JVM_TARGET]
val jvmTarget = JvmTarget.fromString(rawJvmTarget) ?: error("Invalid JVM target value: $rawJvmTarget")
val compilerFacility = DebuggerTestCompilerFacility(testFiles, jvmTarget)
val compilerFacility = DebuggerTestCompilerFacility(testFiles, jvmTarget, useIrBackend())
for (library in preferences[DebuggerPreferenceKeys.ATTACH_LIBRARY]) {
if (library.startsWith("maven("))
@@ -151,7 +153,7 @@ abstract class KotlinDescriptorTestCase : DescriptorTestCase() {
abstract fun doMultiFileTest(files: TestFiles, preferences: DebuggerPreferences)
override fun initOutputChecker(): OutputChecker {
return KotlinOutputChecker(getTestDirectoryPath(), testAppPath, appOutputPath)
return KotlinOutputChecker(getTestDirectoryPath(), testAppPath, appOutputPath, useIrBackend())
}
override fun setUpModule() {
@@ -14,6 +14,8 @@ import com.intellij.openapi.util.io.FileUtil
import com.intellij.openapi.util.io.FileUtilRt
import com.intellij.openapi.util.text.StringUtilRt
import com.intellij.openapi.vfs.CharsetToolkit
import org.jetbrains.kotlin.test.InTextDirectivesUtils
import org.jetbrains.kotlin.test.TargetBackend
import org.junit.Assert
import java.io.File
import kotlin.math.min
@@ -21,7 +23,8 @@ import kotlin.math.min
internal class KotlinOutputChecker(
private val testDir: String,
appPath: String,
outputPath: String
outputPath: String,
private val useIrBackend: Boolean
) : OutputChecker(appPath, outputPath) {
companion object {
@JvmStatic
@@ -75,7 +78,10 @@ internal class KotlinOutputChecker(
LOG.error("Test file created ${outFile.path}\n**************** Don't forget to put it into VCS! *******************")
} else {
val originalText = FileUtilRt.loadFile(outFile, CharsetToolkit.UTF8)
val expected = StringUtilRt.convertLineSeparators(originalText)
val isIgnored = InTextDirectivesUtils.isIgnoredTarget(if (useIrBackend) TargetBackend.JVM_IR else TargetBackend.JVM, outFile)
val expected = StringUtilRt.convertLineSeparators(originalText).split("\n").filter {
!it.trim().startsWith(InTextDirectivesUtils.IGNORE_BACKEND_DIRECTIVE_PREFIX)
}.joinToString("\n")
if (expected != actual) {
println("expected:")
println(originalText)
@@ -92,7 +98,13 @@ internal class KotlinOutputChecker(
println("Rest from actual text is: \"" + actual.substring(len) + "\"")
}
Assert.assertEquals(originalText, actual)
// Ignore test failure if marked as ignored.
if (isIgnored) return
Assert.assertEquals(expected, actual)
} else if (isIgnored) {
// Fail if tests are marked as failing, but actually pass.
throw AssertionError("Test passes and could be unmuted, remove IGNORE_BACKEND directive from ${outFile.path}")
}
}
}
@@ -1,3 +1,4 @@
// IGNORE_BACKEND: JVM_IR
LineBreakpoint created at coroutine.kt:17
Run Java
Connected to the target VM
@@ -1,3 +1,4 @@
// IGNORE_BACKEND: JVM_IR
LineBreakpoint created at initBlocks.kt:6
Run Java
Connected to the target VM
@@ -1,3 +1,4 @@
// IGNORE_BACKEND: JVM_IR
LineBreakpoint created at smartStepIntoConstructor.kt:7
LineBreakpoint created at smartStepIntoConstructor.kt:11
LineBreakpoint created at smartStepIntoConstructor.kt:15
@@ -1,3 +1,4 @@
// IGNORE_BACKEND: JVM_IR
LineBreakpoint created at smartStepIntoInterfaceImpl.kt:91
LineBreakpoint created at smartStepIntoInterfaceImpl.kt:96
LineBreakpoint created at smartStepIntoInterfaceImpl.kt:101
@@ -1,3 +1,4 @@
// IGNORE_BACKEND: JVM_IR
LineBreakpoint created at smartStepIntoWithDelegates.kt:24
LineBreakpoint created at smartStepIntoWithDelegates.kt:32
LineBreakpoint created at smartStepIntoWithDelegates.kt:40
@@ -1,3 +1,4 @@
// IGNORE_BACKEND: JVM_IR
LineBreakpoint created at stepIntoMultiFileFacade.kt:6
Run Java
Connected to the target VM
@@ -1,3 +1,4 @@
// IGNORE_BACKEND: JVM_IR
LineBreakpoint created at accessors.kt:10
Run Java
Connected to the target VM
@@ -1,3 +1,4 @@
// IGNORE_BACKEND: JVM_IR
LineBreakpoint created at functionReference.kt:11
Run Java
Connected to the target VM
@@ -1,3 +1,4 @@
// IGNORE_BACKEND: JVM_IR
LineBreakpoint created at stepIntoSuspendFunctionSimple.kt:20
Run Java
Connected to the target VM
@@ -1,3 +1,4 @@
// IGNORE_BACKEND: JVM_IR
LineBreakpoint created at syntheticMethods.kt:6
Run Java
Connected to the target VM
@@ -1,3 +1,4 @@
// IGNORE_BACKEND: JVM_IR
LineBreakpoint created at whenExpr.kt:5
Run Java
Connected to the target VM
@@ -1,3 +1,4 @@
// IGNORE_BACKEND: JVM_IR
KotlinFieldBreakpoint created at fwBackingField.kt:5
KotlinFieldBreakpoint created at fwBackingField.kt:8
KotlinFieldBreakpoint created at fwBackingField.kt:18
@@ -1,3 +1,4 @@
// IGNORE_BACKEND: JVM_IR
LineBreakpoint created at sequenceNested.kt:6
Run Java
Connected to the target VM
@@ -1,3 +1,4 @@
// IGNORE_BACKEND: JVM_IR
LineBreakpoint created at sequenceNested2.kt:8
Run Java
Connected to the target VM
@@ -1,3 +1,4 @@
// IGNORE_BACKEND: JVM_IR
LineBreakpoint created at sequenceSimple.kt:6
Run Java
Connected to the target VM
@@ -1,3 +1,4 @@
// IGNORE_BACKEND: JVM_IR
LineBreakpoint created at kt34905.kt:13
Run Java
Connected to the target VM
@@ -1,3 +1,4 @@
// IGNORE_BACKEND: JVM_IR
LineBreakpoint created at noParameterExtensionLambdaArgumentCallInInline3.kt:12
Run Java
Connected to the target VM
@@ -1,3 +1,4 @@
// IGNORE_BACKEND: JVM_IR
LineBreakpoint created at soInlineLibFun.kt:6
Run Java
Connected to the target VM
@@ -1,3 +1,4 @@
// IGNORE_BACKEND: JVM_IR
LineBreakpoint created at soSuspendableCallInEndOfFun.kt:29
Run Java
Connected to the target VM
@@ -1,3 +1,4 @@
// IGNORE_BACKEND: JVM_IR
LineBreakpoint created at stepOverInlinedLambdaStdlib.kt:5
Run Java
Connected to the target VM
@@ -1,3 +1,4 @@
// IGNORE_BACKEND: JVM_IR
LineBreakpoint created at stepOverWhenWithInline.kt:5
Run Java
Connected to the target VM