Skip to content

Commit 8148d3d

Browse files
TapchicomaSpace Team
authored andcommitted
[Gradle] Track 'webTest' sources usage
^KT-79482 In Progress
1 parent 3b80c98 commit 8148d3d

File tree

4 files changed

+100
-15
lines changed

4 files changed

+100
-15
lines changed

libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/FusMetrics.kt

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,17 @@ internal object KotlinSourceSetMetrics : FusMetrics {
403403
internal fun collectMetrics(project: Project) {
404404
project.launchInStage(KotlinPluginLifecycle.Stage.AfterFinaliseDsl) {
405405
project.reportGeneratedSourcesUsage()
406-
project.reportWebMainSourceSetUsage()
406+
project.reportSourceSetSourcesUsage(
407+
mapOf(
408+
"webMain" to BooleanMetrics.KOTLIN_WEB_MAIN_SOURCES_USED,
409+
"webTest" to BooleanMetrics.KOTLIN_WEB_TEST_SOURCES_USED,
410+
)
411+
)
412+
project.reportSourceSetDependenciesUsage(
413+
mapOf(
414+
"webMain" to BooleanMetrics.KOTLIN_WEB_MAIN_DEPENDENCIES_PRESENT,
415+
)
416+
)
407417
}
408418
}
409419

@@ -417,25 +427,39 @@ internal object KotlinSourceSetMetrics : FusMetrics {
417427
}
418428
}
419429

420-
private suspend fun Project.reportWebMainSourceSetUsage() {
421-
project.kotlinExtension.awaitSourceSets().configureEach {
422-
if (it.name == "webMain") {
423-
if (!it.allKotlinSources.isEmpty) {
424-
project.addConfigurationMetrics {
425-
it.put(BooleanMetrics.KOTLIN_WEB_MAIN_SOURCES_USED, true)
430+
private suspend fun Project.reportSourceSetSourcesUsage(
431+
sourceSetNameToMetricMap: Map<String, BooleanMetrics>
432+
) {
433+
project.kotlinExtension.awaitSourceSets().configureEach { sourceSet ->
434+
if (sourceSetNameToMetricMap.keys.any { it == sourceSet.name }) {
435+
if (!sourceSet.allKotlinSources.isEmpty) {
436+
project.addConfigurationMetrics { metricsContainer ->
437+
sourceSetNameToMetricMap[sourceSet.name]?.let { metric ->
438+
metricsContainer.put(metric, true)
439+
}
426440
}
427441
}
442+
}
443+
}
444+
}
428445

446+
private suspend fun Project.reportSourceSetDependenciesUsage(
447+
sourceSetNameToMetricMap: Map<String, BooleanMetrics>
448+
) {
449+
project.kotlinExtension.awaitSourceSets().configureEach { sourceSet ->
450+
if (sourceSetNameToMetricMap.keys.any { it == sourceSet.name }) {
429451
listOf(
430-
it.apiConfigurationName,
431-
it.implementationConfigurationName,
432-
it.compileOnlyConfigurationName,
433-
it.runtimeOnlyConfigurationName,
452+
sourceSet.apiConfigurationName,
453+
sourceSet.implementationConfigurationName,
454+
sourceSet.compileOnlyConfigurationName,
455+
sourceSet.runtimeOnlyConfigurationName,
434456
).map { project.configurations.getByName(it) }
435457
.forEach { configuration ->
436458
if (configuration.dependencies.isNotEmpty()) {
437-
project.addConfigurationMetrics {
438-
it.put(BooleanMetrics.KOTLIN_WEB_MAIN_DEPENDENCIES_PRESENT, true)
459+
sourceSetNameToMetricMap[sourceSet.name]?.let { metric ->
460+
project.addConfigurationMetrics { metricsContainer ->
461+
metricsContainer.put(metric, true)
462+
}
439463
}
440464
}
441465
}

libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/fus/FUSWebMainSourceSetTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.gradle.util.buildProjectWithMPP
1111
import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics
1212
import kotlin.test.Test
1313
import kotlin.test.assertNotNull
14+
import kotlin.test.assertTrue
1415

1516
@OptIn(ExperimentalWasmDsl::class)
1617
class FUSWebMainSourceSetTest {
@@ -26,7 +27,7 @@ class FUSWebMainSourceSetTest {
2627

2728
project.evaluate()
2829

29-
assertNotNull(
30+
assertTrue(
3031
project.collectedFusConfigurationTimeMetrics.booleanMetrics.keys.none {
3132
it.name == BooleanMetrics.KOTLIN_WEB_MAIN_SOURCES_USED.name
3233
},
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/*
2+
* Copyright 2010-2025 JetBrains s.r.o. and Kotlin Programming Language contributors.
3+
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
4+
*/
5+
6+
package org.jetbrains.kotlin.gradle.unitTests.fus
7+
8+
import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl
9+
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
10+
import org.jetbrains.kotlin.gradle.util.buildProjectWithMPP
11+
import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics
12+
import kotlin.test.Test
13+
import kotlin.test.assertNotNull
14+
import kotlin.test.assertTrue
15+
16+
@OptIn(ExperimentalWasmDsl::class)
17+
class FUSWebTestSourceSetTest {
18+
@Test
19+
fun emptyWebTestSourcesAreNotReported() {
20+
val project = buildProjectWithMPP(preApplyCode = enableFusOnCI) {
21+
with(multiplatformExtension) {
22+
js { nodejs() }
23+
wasmJs()
24+
}
25+
}
26+
27+
project.evaluate()
28+
29+
assertTrue(
30+
project.collectedFusConfigurationTimeMetrics.booleanMetrics.keys.none {
31+
it.name == BooleanMetrics.KOTLIN_WEB_TEST_SOURCES_USED.name
32+
},
33+
"FUS event is present for webTest sources"
34+
)
35+
}
36+
37+
@Test
38+
fun explicitlyAddedWebTestSourcesAreReported() {
39+
val project = buildProjectWithMPP(preApplyCode = enableFusOnCI) {
40+
with(multiplatformExtension) {
41+
js { browser() }
42+
wasmJs { browser() }
43+
}
44+
}
45+
46+
val sharedFile = project.layout.projectDirectory.file("src/webTest/kotlin/shared.kt").asFile
47+
sharedFile.parentFile.mkdirs()
48+
sharedFile.writeText("fun shared() = 1")
49+
50+
project.evaluate()
51+
52+
assertNotNull(
53+
project.collectedFusConfigurationTimeMetrics.booleanMetrics.entries.singleOrNull {
54+
it.key == BooleanMetrics.KOTLIN_WEB_TEST_SOURCES_USED && it.value
55+
}
56+
)
57+
}
58+
59+
}

libraries/tools/kotlin-gradle-statistics/src/main/kotlin/org/jetbrains/kotlin/statistics/metrics/BooleanMetrics.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ enum class BooleanMetrics(val type: BooleanOverridePolicy, val anonymization: Bo
5050

5151
KOTLIN_GENERATED_SOURCES_USED(OR, SAFE),
5252
KOTLIN_WEB_MAIN_SOURCES_USED(OR, SAFE),
53+
KOTLIN_WEB_TEST_SOURCES_USED(OR, SAFE),
5354
KOTLIN_WEB_MAIN_DEPENDENCIES_PRESENT(OR, SAFE),
5455

5556
// Disabled explicitly by the user
@@ -130,6 +131,6 @@ enum class BooleanMetrics(val type: BooleanOverridePolicy, val anonymization: Bo
130131
;
131132

132133
companion object {
133-
const val VERSION = 22
134+
const val VERSION = 23
134135
}
135136
}

0 commit comments

Comments
 (0)