[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.ic.JsExecutableProducer
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.declarations.IrModuleFragment
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.frontend.classic.moduleDescriptorProvider
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.Companion.getJsArtifactSimpleName
import org.jetbrains.kotlin.test.services.jsLibraryProvider
import org.jetbrains.kotlin.utils.addToStdlib.ifTrue
import org.jetbrains.kotlin.utils.addToStdlib.runIf
import org.jetbrains.kotlin.utils.fileUtils.withReplacedExtensionOrNull
@@ -163,16 +164,17 @@ class JsIrBackendFacade(
module.directives[JsEnvironmentConfigurationDirectives.MODULE_KIND].contains(ModuleKind.ES)
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(
loweredIr.context,
mainArguments,
moduleToName = runIf(isEsModules) {
loweredIr.allModules.associateWith {
"./${getJsArtifactSimpleName(testServices, it.safeName)}_v5.mjs".run {
if (isWindows) minify() else this
}
"./${getJsArtifactSimpleName(testServices, it.safeName)}_v5.mjs".minifyIfNeed()
}
} ?: emptyMap()
)
@@ -231,14 +233,14 @@ class JsIrBackendFacade(
if (dontSkipRegularMode) {
for ((mode, output) in compilerResult.outputs.entries) {
val outputFile = if (firstTimeCompilation) {
File(JsEnvironmentConfigurator.getJsModuleArtifactPath(testServices, module.name, mode) + moduleKind.extension)
File(JsEnvironmentConfigurator.getJsModuleArtifactPath(testServices, module.name, mode).finalizePath(moduleKind))
} else {
File(
JsEnvironmentConfigurator.getRecompiledJsModuleArtifactPath(
testServices,
module.name,
mode
) + moduleKind.extension
).finalizePath(moduleKind)
)
}
output.writeTo(outputFile, moduleId, moduleKind)
@@ -307,8 +309,6 @@ val TestModule.kind: ModuleKind
get() = directives.moduleKind
fun String.augmentWithModuleName(moduleName: String): String {
val shouldMinimize = isWindows && moduleName.isPath()
val normalizedName = moduleName.run { if (shouldMinimize) minify() else this }
val suffix = when {
endsWith(ESM_EXTENSION) -> ESM_EXTENSION
endsWith(REGULAR_EXTENSION) -> REGULAR_EXTENSION
@@ -316,26 +316,31 @@ fun String.augmentWithModuleName(moduleName: String): String {
}
return if (suffix == ESM_EXTENSION) {
replaceAfterLast(File.separator, normalizedName.replace("./", "")).removeSuffix(suffix) + suffix
replaceAfterLast(File.separator, moduleName.minifyIfNeed().replace("./", "")).removeSuffix(suffix) + suffix
} 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
// The hack should be deleted when D8 fixes the bug.
// The issue is here: https://bugs.chromium.org/p/v8/issues/detail?id=13318
fun String.minify(): String {
if (length <= 80) return this
val directoryPath = substringBeforeLast('/')
val fileFullName = substringAfterLast('/')
fun String.minifyIfNeed(): String {
if (!isWindows) return this
val delimiter = if (contains('\\')) '\\' else '/'
val directoryPath = substringBeforeLast(delimiter)
val fileFullName = substringAfterLast(delimiter)
val fileName = fileFullName.substringBeforeLast('.')
if (fileName.length <= 80) return this
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))
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.js.JavaScript
import org.jetbrains.kotlin.js.config.JSConfigurationKeys
import org.jetbrains.kotlin.js.test.JsAdditionalSourceProvider
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.handlers.JsBoxRunner.Companion.TEST_FUNCTION
import org.jetbrains.kotlin.js.testOld.*
@@ -135,7 +136,7 @@ fun testWithModuleSystem(testServices: TestServices): Boolean {
}
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(
@@ -2,7 +2,7 @@
// EXPECTED_REACHABLE_NODES: 1252
// ES_MODULES
// MODULE: overriden_chain_non_export_intermediate
// MODULE: intermediate
// FILE: lib.kt
@JsExport
abstract class A {
@@ -27,7 +27,7 @@ class C : B() {
// FILE: entry.mjs
// ENTRY_ES_MODULE
import { C } from "./overriddenChainNonExportIntermediate-overriden_chain_non_export_intermediate_v5.mjs";
import { C } from "./overriddenChainNonExportIntermediate-intermediate_v5.mjs";
export function box() {
const c = new C()
@@ -2,7 +2,7 @@
// DONT_TARGET_EXACT_BACKEND: JS
// ES_MODULES
// MODULE: overriden_chain_non_export_intermediate
// MODULE: intermediate
// FILE: not_exported.kt
abstract class B : A() {
abstract fun baz(): String
@@ -29,7 +29,7 @@ class C : B() {
// FILE: main.mjs
// ENTRY_ES_MODULE
import { C } from "./overriddenChainNonExportIntermediateInExportedFile-overriden_chain_non_export_intermediate_v5.mjs"
import { C } from "./overriddenChainNonExportIntermediateInExportedFile-intermediate_v5.mjs"
export function box() {
var c = new C();
@@ -3,7 +3,7 @@
// RUN_PLAIN_BOX_FUNCTION
// INFER_MAIN_MODULE
// MODULE: overriden_chain_non_export_intermediate
// MODULE: intermediate
// FILE: lib.kt
@JsExport
abstract class A {
@@ -29,7 +29,7 @@ class C : B() {
// FILE: test.js
function box() {
return test(new this["overriden_chain_non_export_intermediate"].C());
return test(new this["intermediate"].C());
}
function test(c) {
@@ -3,7 +3,7 @@
// RUN_PLAIN_BOX_FUNCTION
// INFER_MAIN_MODULE
// MODULE: overriden_chain_non_export_intermediate
// MODULE: intermediate
// FILE: not_exported.kt
abstract class B : A() {
abstract fun baz(): String
@@ -31,7 +31,7 @@ class C : B() {
// FILE: test.js
function box() {
return test(new this["overriden_chain_non_export_intermediate"].C());
return test(new this["intermediate"].C());
}
function test(c) {
@@ -3,7 +3,7 @@
// RUN_PLAIN_BOX_FUNCTION
// INFER_MAIN_MODULE
// MODULE: overriden_external_method_with_same_name_method
// MODULE: lib
// FILE: lib.kt
external abstract class Foo {
abstract fun o(): String
@@ -31,7 +31,7 @@ Foo.prototype.k = function() {
}
function box() {
return test(new this["overriden_external_method_with_same_name_method"].Baz());
return test(new this["lib"].Baz());
}
function test(foo) {