1 /*
<lambda>null2  * Copyright 2024 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package androidx.build.testConfiguration
18 
19 import androidx.build.multiplatformExtension
20 import com.android.build.api.variant.TestVariant
21 import com.android.build.api.variant.Variant
22 import org.gradle.api.Project
23 import org.gradle.api.file.FileCollection
24 import org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension
25 import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
26 
27 internal fun Project.getTestSourceSetsForAndroid(variant: Variant?): List<FileCollection> {
28     val testSourceFileCollections = mutableListOf<FileCollection>()
29     when (variant) {
30         is TestVariant -> {
31             // com.android.test modules keep test code in main sourceset
32             variant.sources.java?.all?.let { sourceSet ->
33                 testSourceFileCollections.add(files(sourceSet))
34             }
35             // Add kotlin-android main source set
36             extensions
37                 .findByType(KotlinAndroidProjectExtension::class.java)
38                 ?.sourceSets
39                 ?.find { it.name == "main" }
40                 ?.let { testSourceFileCollections.add(it.kotlin.sourceDirectories) }
41             // Note, don't have to add kotlin-multiplatform as it is not compatible with
42             // com.android.test modules
43         }
44         is com.android.build.api.variant.HasAndroidTest -> {
45             variant.androidTest?.sources?.java?.all?.let {
46                 testSourceFileCollections.add(files(it))
47             }
48         }
49     }
50 
51     // Add kotlin-android androidTest source set
52     extensions
53         .findByType(KotlinAndroidProjectExtension::class.java)
54         ?.sourceSets
55         ?.find { it.name == "androidTest" }
56         ?.let { testSourceFileCollections.add(it.kotlin.sourceDirectories) }
57 
58     // Add kotlin-multiplatform androidInstrumentedTest target source sets
59     multiplatformExtension
60         ?.targets
61         ?.filterIsInstance<KotlinAndroidTarget>()
62         ?.mapNotNull { it.compilations.find { it.name == "releaseAndroidTest" } }
63         ?.flatMap { it.allKotlinSourceSets }
64         ?.mapTo(testSourceFileCollections) { it.kotlin.sourceDirectories }
65     return testSourceFileCollections
66 }
67