[K/JS TEST] Fix the problem with running JS tests on Windows if the test has a long name

This commit is contained in:
Artem Kobzar
2023-04-14 10:46:52 +00:00
committed by Space Team
parent 949186b629
commit 73f8c984a1
7 changed files with 37 additions and 31 deletions
@@ -16,7 +16,6 @@ import org.jetbrains.kotlin.ir.backend.js.*
import org.jetbrains.kotlin.ir.backend.js.codegen.JsGenerationGranularity import org.jetbrains.kotlin.ir.backend.js.codegen.JsGenerationGranularity
import org.jetbrains.kotlin.ir.backend.js.ic.JsExecutableProducer import org.jetbrains.kotlin.ir.backend.js.ic.JsExecutableProducer
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsManglerDesc import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsManglerDesc
import org.jetbrains.kotlin.ir.backend.js.SourceMapsInfo
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.* import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.*
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImplForJsIC import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImplForJsIC
@@ -36,9 +35,11 @@ import org.jetbrains.kotlin.test.directives.JsEnvironmentConfigurationDirectives
import org.jetbrains.kotlin.test.directives.model.RegisteredDirectives import org.jetbrains.kotlin.test.directives.model.RegisteredDirectives
import org.jetbrains.kotlin.test.frontend.classic.moduleDescriptorProvider import org.jetbrains.kotlin.test.frontend.classic.moduleDescriptorProvider
import org.jetbrains.kotlin.test.model.* import org.jetbrains.kotlin.test.model.*
import org.jetbrains.kotlin.test.services.* import org.jetbrains.kotlin.test.services.TestServices
import org.jetbrains.kotlin.test.services.compilerConfigurationProvider
import org.jetbrains.kotlin.test.services.configuration.JsEnvironmentConfigurator import org.jetbrains.kotlin.test.services.configuration.JsEnvironmentConfigurator
import org.jetbrains.kotlin.test.services.configuration.JsEnvironmentConfigurator.Companion.getJsArtifactSimpleName import org.jetbrains.kotlin.test.services.configuration.JsEnvironmentConfigurator.Companion.getJsArtifactSimpleName
import org.jetbrains.kotlin.test.services.jsLibraryProvider
import org.jetbrains.kotlin.utils.addToStdlib.ifTrue import org.jetbrains.kotlin.utils.addToStdlib.ifTrue
import org.jetbrains.kotlin.utils.addToStdlib.runIf import org.jetbrains.kotlin.utils.addToStdlib.runIf
import org.jetbrains.kotlin.utils.fileUtils.withReplacedExtensionOrNull import org.jetbrains.kotlin.utils.fileUtils.withReplacedExtensionOrNull
@@ -163,16 +164,17 @@ class JsIrBackendFacade(
module.directives[JsEnvironmentConfigurationDirectives.MODULE_KIND].contains(ModuleKind.ES) module.directives[JsEnvironmentConfigurationDirectives.MODULE_KIND].contains(ModuleKind.ES)
val outputFile = val outputFile =
File(JsEnvironmentConfigurator.getJsModuleArtifactPath(testServices, module.name, TranslationMode.FULL_DEV) + module.kind.extension) File(
JsEnvironmentConfigurator.getJsModuleArtifactPath(testServices, module.name, TranslationMode.FULL_DEV)
.finalizePath(module.kind)
)
val transformer = IrModuleToJsTransformer( val transformer = IrModuleToJsTransformer(
loweredIr.context, loweredIr.context,
mainArguments, mainArguments,
moduleToName = runIf(isEsModules) { moduleToName = runIf(isEsModules) {
loweredIr.allModules.associateWith { loweredIr.allModules.associateWith {
"./${getJsArtifactSimpleName(testServices, it.safeName)}_v5.mjs".run { "./${getJsArtifactSimpleName(testServices, it.safeName)}_v5.mjs".minifyIfNeed()
if (isWindows) minify() else this
}
} }
} ?: emptyMap() } ?: emptyMap()
) )
@@ -231,14 +233,14 @@ class JsIrBackendFacade(
if (dontSkipRegularMode) { if (dontSkipRegularMode) {
for ((mode, output) in compilerResult.outputs.entries) { for ((mode, output) in compilerResult.outputs.entries) {
val outputFile = if (firstTimeCompilation) { val outputFile = if (firstTimeCompilation) {
File(JsEnvironmentConfigurator.getJsModuleArtifactPath(testServices, module.name, mode) + moduleKind.extension) File(JsEnvironmentConfigurator.getJsModuleArtifactPath(testServices, module.name, mode).finalizePath(moduleKind))
} else { } else {
File( File(
JsEnvironmentConfigurator.getRecompiledJsModuleArtifactPath( JsEnvironmentConfigurator.getRecompiledJsModuleArtifactPath(
testServices, testServices,
module.name, module.name,
mode mode
) + moduleKind.extension ).finalizePath(moduleKind)
) )
} }
output.writeTo(outputFile, moduleId, moduleKind) output.writeTo(outputFile, moduleId, moduleKind)
@@ -307,8 +309,6 @@ val TestModule.kind: ModuleKind
get() = directives.moduleKind get() = directives.moduleKind
fun String.augmentWithModuleName(moduleName: String): String { fun String.augmentWithModuleName(moduleName: String): String {
val shouldMinimize = isWindows && moduleName.isPath()
val normalizedName = moduleName.run { if (shouldMinimize) minify() else this }
val suffix = when { val suffix = when {
endsWith(ESM_EXTENSION) -> ESM_EXTENSION endsWith(ESM_EXTENSION) -> ESM_EXTENSION
endsWith(REGULAR_EXTENSION) -> REGULAR_EXTENSION endsWith(REGULAR_EXTENSION) -> REGULAR_EXTENSION
@@ -316,26 +316,31 @@ fun String.augmentWithModuleName(moduleName: String): String {
} }
return if (suffix == ESM_EXTENSION) { return if (suffix == ESM_EXTENSION) {
replaceAfterLast(File.separator, normalizedName.replace("./", "")).removeSuffix(suffix) + suffix replaceAfterLast(File.separator, moduleName.minifyIfNeed().replace("./", "")).removeSuffix(suffix) + suffix
} else { } else {
return removeSuffix("_v5$suffix") + "-${normalizedName}_v5$suffix" return removeSuffix("_v5$suffix") + "-${moduleName}_v5$suffix"
} }
} }
fun String.finalizePath(moduleKind: ModuleKind): String {
return plus(moduleKind.extension).minifyIfNeed()
}
// D8 ignores Windows settings related to extending of maximum path symbols count // D8 ignores Windows settings related to extending of maximum path symbols count
// The hack should be deleted when D8 fixes the bug. // The hack should be deleted when D8 fixes the bug.
// The issue is here: https://bugs.chromium.org/p/v8/issues/detail?id=13318 // The issue is here: https://bugs.chromium.org/p/v8/issues/detail?id=13318
fun String.minify(): String { fun String.minifyIfNeed(): String {
if (length <= 80) return this if (!isWindows) return this
val delimiter = if (contains('\\')) '\\' else '/'
val directoryPath = substringBeforeLast('/') val directoryPath = substringBeforeLast(delimiter)
val fileFullName = substringAfterLast('/') val fileFullName = substringAfterLast(delimiter)
val fileName = fileFullName.substringBeforeLast('.') val fileName = fileFullName.substringBeforeLast('.')
if (fileName.length <= 80) return this
val fileExtension = fileFullName.substringAfterLast('.') val fileExtension = fileFullName.substringAfterLast('.')
return "$directoryPath/${fileName.cityHash64().toULong().toString(16)}.$fileExtension" return "$directoryPath$delimiter${fileName.cityHash64().toULong().toString(16)}.$fileExtension"
} }
private fun String.isPath(): Boolean = contains("/")
fun File.augmentWithModuleName(moduleName: String): File = File(absolutePath.augmentWithModuleName(moduleName)) fun File.augmentWithModuleName(moduleName: String): File = File(absolutePath.augmentWithModuleName(moduleName))
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.js.JavaScript
import org.jetbrains.kotlin.js.config.JSConfigurationKeys import org.jetbrains.kotlin.js.config.JSConfigurationKeys
import org.jetbrains.kotlin.js.test.JsAdditionalSourceProvider import org.jetbrains.kotlin.js.test.JsAdditionalSourceProvider
import org.jetbrains.kotlin.js.test.converters.augmentWithModuleName import org.jetbrains.kotlin.js.test.converters.augmentWithModuleName
import org.jetbrains.kotlin.js.test.converters.finalizePath
import org.jetbrains.kotlin.js.test.converters.kind import org.jetbrains.kotlin.js.test.converters.kind
import org.jetbrains.kotlin.js.test.handlers.JsBoxRunner.Companion.TEST_FUNCTION import org.jetbrains.kotlin.js.test.handlers.JsBoxRunner.Companion.TEST_FUNCTION
import org.jetbrains.kotlin.js.testOld.* import org.jetbrains.kotlin.js.testOld.*
@@ -135,7 +136,7 @@ fun testWithModuleSystem(testServices: TestServices): Boolean {
} }
fun getModeOutputFilePath(testServices: TestServices, module: TestModule, mode: TranslationMode): String { fun getModeOutputFilePath(testServices: TestServices, module: TestModule, mode: TranslationMode): String {
return JsEnvironmentConfigurator.getJsModuleArtifactPath(testServices, module.name, mode) + module.kind.extension return JsEnvironmentConfigurator.getJsModuleArtifactPath(testServices, module.name, mode).finalizePath(module.kind)
} }
fun getAllFilesForRunner( fun getAllFilesForRunner(
@@ -2,7 +2,7 @@
// EXPECTED_REACHABLE_NODES: 1252 // EXPECTED_REACHABLE_NODES: 1252
// ES_MODULES // ES_MODULES
// MODULE: overriden_chain_non_export_intermediate // MODULE: intermediate
// FILE: lib.kt // FILE: lib.kt
@JsExport @JsExport
abstract class A { abstract class A {
@@ -27,7 +27,7 @@ class C : B() {
// FILE: entry.mjs // FILE: entry.mjs
// ENTRY_ES_MODULE // ENTRY_ES_MODULE
import { C } from "./overriddenChainNonExportIntermediate-overriden_chain_non_export_intermediate_v5.mjs"; import { C } from "./overriddenChainNonExportIntermediate-intermediate_v5.mjs";
export function box() { export function box() {
const c = new C() const c = new C()
@@ -2,7 +2,7 @@
// DONT_TARGET_EXACT_BACKEND: JS // DONT_TARGET_EXACT_BACKEND: JS
// ES_MODULES // ES_MODULES
// MODULE: overriden_chain_non_export_intermediate // MODULE: intermediate
// FILE: not_exported.kt // FILE: not_exported.kt
abstract class B : A() { abstract class B : A() {
abstract fun baz(): String abstract fun baz(): String
@@ -29,7 +29,7 @@ class C : B() {
// FILE: main.mjs // FILE: main.mjs
// ENTRY_ES_MODULE // ENTRY_ES_MODULE
import { C } from "./overriddenChainNonExportIntermediateInExportedFile-overriden_chain_non_export_intermediate_v5.mjs" import { C } from "./overriddenChainNonExportIntermediateInExportedFile-intermediate_v5.mjs"
export function box() { export function box() {
var c = new C(); var c = new C();
@@ -3,7 +3,7 @@
// RUN_PLAIN_BOX_FUNCTION // RUN_PLAIN_BOX_FUNCTION
// INFER_MAIN_MODULE // INFER_MAIN_MODULE
// MODULE: overriden_chain_non_export_intermediate // MODULE: intermediate
// FILE: lib.kt // FILE: lib.kt
@JsExport @JsExport
abstract class A { abstract class A {
@@ -29,7 +29,7 @@ class C : B() {
// FILE: test.js // FILE: test.js
function box() { function box() {
return test(new this["overriden_chain_non_export_intermediate"].C()); return test(new this["intermediate"].C());
} }
function test(c) { function test(c) {
@@ -3,7 +3,7 @@
// RUN_PLAIN_BOX_FUNCTION // RUN_PLAIN_BOX_FUNCTION
// INFER_MAIN_MODULE // INFER_MAIN_MODULE
// MODULE: overriden_chain_non_export_intermediate // MODULE: intermediate
// FILE: not_exported.kt // FILE: not_exported.kt
abstract class B : A() { abstract class B : A() {
abstract fun baz(): String abstract fun baz(): String
@@ -31,7 +31,7 @@ class C : B() {
// FILE: test.js // FILE: test.js
function box() { function box() {
return test(new this["overriden_chain_non_export_intermediate"].C()); return test(new this["intermediate"].C());
} }
function test(c) { function test(c) {
@@ -3,7 +3,7 @@
// RUN_PLAIN_BOX_FUNCTION // RUN_PLAIN_BOX_FUNCTION
// INFER_MAIN_MODULE // INFER_MAIN_MODULE
// MODULE: overriden_external_method_with_same_name_method // MODULE: lib
// FILE: lib.kt // FILE: lib.kt
external abstract class Foo { external abstract class Foo {
abstract fun o(): String abstract fun o(): String
@@ -31,7 +31,7 @@ Foo.prototype.k = function() {
} }
function box() { function box() {
return test(new this["overriden_external_method_with_same_name_method"].Baz()); return test(new this["lib"].Baz());
} }
function test(foo) { function test(foo) {