[build][test] enable external compiler tests

This commit is contained in:
Vasily Levchenko
2020-11-26 05:57:58 +01:00
parent d6c147908e
commit 6234bcb453
3 changed files with 50 additions and 105 deletions
+23 -84
View File
@@ -52,24 +52,6 @@ configurations {
dependencies {
compile 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7'
cli_bc project(path: ':kotlin-native:backend.native', configuration: 'cli_bc')
def updateTestData = true
if (project.hasProperty("kotlinProjectPath")) {
def kotlinProj = project.property("kotlinProjectPath").toString()
def testDataZip = Paths.get(kotlinProj, "dist", "kotlin-test-data.zip").toFile()
if (testDataZip.exists()) {
update_tests files(testDataZip)
updateTestData = false
} else {
println("WARN: using tests provided by gradle.properties. Please execute :kotlin:zipTestData")
}
def stdlibTestsZip = Paths.get(kotlinProj, "dist", "kotlin-stdlib-tests.zip").toFile()
if (stdlibTestsZip.exists()) {
update_stdlib_tests files(stdlibTestsZip)
updateTestData = false
} else {
println("WARNING: using stdlib tests provided by gradle.properties. Please execute :kotlin:zipTestData")
}
}
}
ext.testOutputRoot = rootProject.file("test.output").absolutePath
ext.externalTestsDir = project.file("build/external")
@@ -182,43 +164,6 @@ def installTestLib = tasks.register("installTestLibrary", KlibInstall) {
}
}
// Gets tests from the same Kotlin compiler build
def update_external_tests() {
// Copy only used tests into the test directory.
if (externalTestsDir.exists()) {
delete(externalTestsDir)
}
externalTestsDir.mkdirs()
def compilerTestsFiles = configurations.update_tests.asFileTree
copy {
compilerTestsFiles.each {
from(zipTree(it))
into(externalTestsDir)
include 'compiler/codegen/box/**'
include 'compiler/codegen/boxInline/**'
include 'compiler/compileKotlinAgainstKotlin/**'
include 'compiler/binaryCompatibility/klibEvolution/**'
exclude 'stdlib/**'
}
}
if (externalStdlibTestsDir.exists()) {
delete(externalStdlibTestsDir)
}
externalStdlibTestsDir.mkdirs()
def stdlibTestsFiles = configurations.update_stdlib_tests.asFileTree
copy {
stdlibTestsFiles.each {
into(externalStdlibTestsDir)
include 'common/**'
include 'test/**'
exclude 'test/js/**'
include 'kotlin-test/**'
}
}
}
void konanc(String[] args) {
def konancScript = isWindows() ? "konanc.bat" : "konanc"
def konanc = "$dist/bin/$konancScript"
@@ -229,7 +174,7 @@ void konanc(String[] args) {
clean {
doLast {
delete(rootProject.file(testOutputRoot))
delete(project(":kotlin-native").file(testOutputRoot))
}
}
@@ -303,33 +248,13 @@ boolean isExcluded(String dir) {
return result
}
def createTestTasks(File testRoot, Class<Task> taskType) {
testRoot.eachDirRecurse {
// Skip build directory and directories without *.kt files.
if (it.name == "build" || it.listFiles().count { it.name.endsWith(".kt") && it.isFile() } == 0) {
return
}
def taskDirectory = project.relativePath(it).substring("build/".length())
if (!isExcluded(taskDirectory)) {
def taskName = taskDirectory.replaceAll("[-/\\\\]", '_')
project.tasks.register(taskName, taskType) {
it.groupDirectory = taskDirectory
it.finalizedBy resultsTask
}
} else {
println("$taskDirectory is excluded")
}
}
}
void dependsOnPlatformLibs(Task t) {
if (!useCustomDist) {
def testTarget = project.target
if (testTarget != project.platformManager.Companion.host) {
t.dependsOn(":${testTarget}PlatformLibs")
} else {
t.dependsOn(':distPlatformLibs')
t.dependsOn(':kotlin-native:distPlatformLibs')
}
}
}
@@ -418,14 +343,28 @@ Task dynamicTest(String name, Closure<KonanDynamicTest> configureClosure) {
}
}
task run_external () {
// Set this property to disable auto update tests
if (!project.hasProperty("test.disable_update")) {
update_external_tests()
}
def ignoredTests = [
"compiler_testData_codegen_box_callableReference" : ["genericConstructorReference.kt"]
]
// Create tasks for external tests.
createTestTasks(externalTestsDir, RunExternalTestGroup)
task run_external () {
outputs.upToDateWhen{ false }
rootProject.files(
'compiler/testData/codegen/box',
'compiler/codegen/boxInline',
'compiler/compileKotlinAgainstKotlin'
).asFileTree.visit { file ->
if (!file.isDirectory() || !file.file.list().any{ it.endsWith(".kt")})
return
def taskPath = rootProject.relativePath(file.file)
def taskName = taskPath.split(System.properties["file.separator"]).join('_')
project.tasks.register(taskName, RunExternalTestGroup) {
it.groupDirectory = taskPath
it.finalizedBy resultsTask
it.ignoredTests = ignoredTests[taskName]
}
}
// Set up dependencies.
dependsOn(tasksOf(RunExternalTestGroup))
@@ -27,9 +27,10 @@ import java.util.function.Function
import java.util.function.UnaryOperator
import java.util.regex.Pattern
import java.util.stream.Collectors
import java.io.File
class RunExternalTestGroup extends JavaExec implements CompilerRunner {
def platformManager = project.rootProject.platformManager
def platformManager = project.project(":kotlin-native").platformManager
def target = platformManager.targetManager(project.testTarget).target
def dist = UtilsKt.getKotlinNativeDist(project)
@@ -206,12 +207,14 @@ class RunExternalTestGroup extends JavaExec implements CompilerRunner {
@Input
def groupDirectory = "."
def ignoredTests = []
String filter = project.findProperty("filter")
def testGroupReporter = new KonanTestGroupReportEnvironment(project)
void parseLanguageFlags(String src) {
def text = project.buildDir.toPath().resolve(src).text
def text = project.rootProject.file(src).text
def languageSettings = findLinesWithPrefixesRemoved(text, "// !LANGUAGE: ")
if (languageSettings.size() != 0) {
languageSettings.forEach { line ->
@@ -269,14 +272,13 @@ class RunExternalTestGroup extends JavaExec implements CompilerRunner {
def boxPattern = ~/(?m)fun\s+box\s*\(\s*\)/
def classPattern = ~/.*(class|object|enum|interface)\s+(${identifier}*).*/
def sourceName = "_" + normalize(project.buildDir.toPath().resolve(src).toFile().name)
def sourceName = "_" + normalize(project.rootProject.file(src).name)
def packages = new LinkedHashSet<String>()
def imports = []
def classes = []
def vars = new HashSet<String>() // variables that has the same name as a package
TestModule mainModule = null
def testFiles = TestDirectivesKt.buildCompileList(project.file("build/$src").toPath(), "$outputDirectory/$src")
def testFiles = TestDirectivesKt.buildCompileList(project.rootProject.file(src).toPath(), "$outputDirectory/${project.rootProject.file(src).name}")
for (TestFile testFile: testFiles) {
def text = testFile.text
def filePath = testFile.path
@@ -299,7 +301,7 @@ class RunExternalTestGroup extends JavaExec implements CompilerRunner {
}
// Find mutable objects that should be marked as ThreadLocal
if (filePath != "$outputDirectory/$src/helpers.kt") {
if (filePath != "$outputDirectory/${project.rootProject.file(src).name}/helpers.kt") {
text = markMutableObjects(text)
}
testFile.text = text
@@ -369,13 +371,13 @@ class RunExternalTestGroup extends JavaExec implements CompilerRunner {
testFile.text = res
}
def launcherText = createLauncherFileText(src, imports)
testFiles.add(new TestFile("_launcher.kt", "$outputDirectory/$src/_launcher.kt".toString(),
testFiles.add(new TestFile("_launcher.kt", "$outputDirectory/${project.rootProject.file(src).name}/_launcher.kt".toString(),
launcherText, mainModule != null ? mainModule : TestModule.default))
return testFiles
}
String normalize(String name) {
name.replace('.kt', '')
return name.replace('.kt', '')
.replace('-','_')
.replace('.', '_')
}
@@ -415,18 +417,22 @@ fun runTest() {
}
static def excludeList = [
"external/compiler/codegen/boxInline/multiplatform/defaultArguments/receiversAndParametersInLambda.kt", // KT-36880
"external/compiler/compileKotlinAgainstKotlin/specialBridgesInDependencies.kt", // KT-42723
"external/compiler/codegen/box/collections/kt41123.kt", // KT-42723
"external/compiler/codegen/box/multiplatform/multiModule/expectActualTypealiasLink.kt", // KT-40137
"external/compiler/codegen/box/multiplatform/multiModule/expectActualMemberLink.kt", // KT-33091
"external/compiler/codegen/box/multiplatform/multiModule/expectActualLink.kt", // KT-41901
"external/compiler/codegen/box/coroutines/multiModule/", // KT-40121
"external/compiler/codegen/box/defaultArguments/recursiveDefaultArguments.kt" // KT-42684
"compiler/testData/codegen/boxInline/multiplatform/defaultArguments/receiversAndParametersInLambda.kt", // KT-36880
"compiler/testData/compileKotlinAgainstKotlin/specialBridgesInDependencies.kt", // KT-42723
"compiler/testData/codegen/box/collections/kt41123.kt", // KT-42723
"compiler/testData/codegen/box/multiplatform/multiModule/expectActualTypealiasLink.kt", // KT-40137
"compiler/testData/codegen/box/multiplatform/multiModule/expectActualMemberLink.kt", // KT-33091
"compiler/testData/codegen/box/multiplatform/multiModule/expectActualLink.kt", // KT-41901
"compiler/testData/codegen/box/coroutines/multiModule/", // KT-40121
"compiler/testData/codegen/box/defaultArguments/recursiveDefaultArguments.kt" // KT-42684
]
boolean isEnabledForNativeBackend(String fileName) {
def text = project.buildDir.toPath().resolve(fileName).text
def testFile = project.rootProject.file(fileName)
def text = testFile.text
if (testFile.name in ignoredTests)
return false
if (excludeList.any { fileName.replace(File.separator, "/").contains(it) }) return false
@@ -476,7 +482,7 @@ fun runTest() {
void executeTest() {
createOutputDirectory()
// Form the test list.
List<File> ktFiles = project.buildDir.toPath().resolve(groupDirectory).toFile()
def ktFiles = project.rootProject.projectDir.toPath().resolve(groupDirectory).toFile()
.listFiles({
it.isFile() && it.name.endsWith(".kt")
} as FileFilter)
@@ -492,10 +498,9 @@ fun runTest() {
flags = (flags ?: []) + "-tr"
List<TestFile> compileList = []
ktFiles.each {
def src = project.buildDir.relativePath(it)
def src = project.rootProject.relativePath(it)
if (isEnabledForNativeBackend(src)) {
// Create separate output directory for each test in the group.
project.file("$outputDirectory/${it.name}").mkdirs()
parseLanguageFlags(src)
compileList.addAll(createTestFiles(src))
}
@@ -543,7 +548,7 @@ fun runTest() {
// Run the tests.
arguments = (arguments ?: []) + "--ktest_logger=SILENT"
ktFiles.each { file ->
def src = project.buildDir.relativePath(file)
def src = project.rootProject.relativePath(file)
def savedArgs = arguments
arguments += "--ktest_filter=_${normalize(file.name)}.*"
use(KonanTestSuiteReportKt) {
@@ -11,6 +11,7 @@ import java.nio.file.Path
import java.nio.file.Paths
import java.util.regex.Matcher
import java.util.regex.Pattern
import java.io.File
private const val MODULE_DELIMITER = ",\\s*"
// These patterns are copies from