diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ExplicitApiIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ExplicitApiIT.kt index 215b8aaa740..6f81690c8c8 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ExplicitApiIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ExplicitApiIT.kt @@ -189,4 +189,85 @@ class ExplicitApiIT : KGPBaseTest() { } } } + + @DisplayName("Explicit api mode is enabled if added inside android extension") + @AndroidGradlePluginTests + @GradleAndroidTest + fun explicitApiInsideAndroidExtension( + gradleVersion: GradleVersion, + agpVersion: String, + jdkVersion: JdkVersions.ProvidedJdk + ) { + project( + "AndroidSimpleApp", + gradleVersion, + buildOptions = defaultBuildOptions.copy( + androidVersion = agpVersion, + logLevel = LogLevel.DEBUG, + ), + buildJdk = jdkVersion.location + ) { + buildGradle.modify { + it.replace( + "kotlin {", + """ + |kotlin { + | explicitApiWarning() + """.trimMargin() + ) + } + build(":compileDebugKotlin") { + assertTasksExecuted(":compileDebugKotlin") + assertCompilerArgument(":compileDebugKotlin", "-Xexplicit-api=warning") + } + build(":compileDebugUnitTestKotlin") { + assertTasksExecuted(":compileDebugUnitTestKotlin") + assertNoCompilerArgument(":compileDebugUnitTestKotlin", "-Xexplicit-api=warning") + } + } + } + + @DisplayName("Explicit api mode is enabled only for non-test variants in Android project in customized source directories") + @AndroidGradlePluginTests + @GradleAndroidTest + fun explicitApiCustomizedAndroidSourceSets( + gradleVersion: GradleVersion, + agpVersion: String, + jdkVersion: JdkVersions.ProvidedJdk + ) { + project( + "AndroidExtraSourceDirsApp", + gradleVersion, + buildOptions = defaultBuildOptions.copy( + androidVersion = agpVersion, + logLevel = LogLevel.DEBUG, + ), + buildJdk = jdkVersion.location + ) { + buildGradle.modify { + it.replace( + "compileOptions {", + """ + |kotlin { + | explicitApi = 'warning' + | } + | compileOptions { + """.trimMargin() + ) + } + build(":compileDebugKotlin") { + assertTasksExecuted(":compileDebugKotlin") + assertCompilerArgument(":compileDebugKotlin", "-Xexplicit-api=warning") + assertOutputContains("Visibility must be specified in explicit API mode") + } + build(":compileDebugUnitTestKotlin") { + assertTasksExecuted(":compileDebugUnitTestKotlin") + assertNoCompilerArgument(":compileDebugUnitTestKotlin", "-Xexplicit-api=warning") + } + build(":compileDebugAndroidTestKotlin") { + assertTasksExecuted(":compileDebugAndroidTestKotlin") + assertNoCompilerArgument(":compileDebugAndroidTestKotlin", "-Xexplicit-api=warning") + } + } + } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/build.gradle new file mode 100644 index 00000000000..c94ebeb6c3c --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/build.gradle @@ -0,0 +1,47 @@ +plugins { + id "com.android.application" + id "org.jetbrains.kotlin.android" +} + +repositories { + mavenLocal() + google() + mavenCentral() +} + +android { + namespace = "com.example.android_many_source_dirs_app" + compileSdkVersion 33 + + defaultConfig { + applicationId "com.example" + minSdkVersion 24 + targetSdkVersion 33 + versionCode 1 + versionName "1.0" + } + + // Needed for older AGP. It can be removed when the lowest supported AGP version is 4.2.0 or newer. + compileOptions { + sourceCompatibility 1.8 + targetCompatibility 1.8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets.getByName("test").kotlin.srcDirs += 'src/test/reserveUnitTest' + sourceSets.getByName("androidTest").kotlin.srcDirs += 'src/androidTest/additionalTest' + sourceSets.getByName("main").kotlin.srcDirs += 'src/main/extraSources' + +} + +dependencies { + implementation "androidx.core:core-ktx:1.6.0" + implementation "com.google.android.material:material:1.6.0" + implementation "androidx.appcompat:appcompat:1.4.1" + testImplementation "junit:junit:4.13.2" + androidTestImplementation "androidx.test.ext:junit:1.1.5" + androidTestImplementation "androidx.test.espresso:espresso-core:3.5.1" +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/gradle.properties new file mode 100644 index 00000000000..2d8d1e4dd15 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/gradle.properties @@ -0,0 +1 @@ +android.useAndroidX=true \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/androidTest/additionalTest/android_many_source_dirs_app/BaseInstrumentedTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/androidTest/additionalTest/android_many_source_dirs_app/BaseInstrumentedTest.kt new file mode 100644 index 00000000000..e7f76c30c62 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/androidTest/additionalTest/android_many_source_dirs_app/BaseInstrumentedTest.kt @@ -0,0 +1,10 @@ +package android_many_source_dirs_app + +open class BaseInstrumentedTest { + + fun setUp() {} + + fun updateUserInfo() { + + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/androidTest/java/com/example/android_many_source_dirs_app/ExampleInstrumentedTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/androidTest/java/com/example/android_many_source_dirs_app/ExampleInstrumentedTest.kt new file mode 100644 index 00000000000..e460e121456 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/androidTest/java/com/example/android_many_source_dirs_app/ExampleInstrumentedTest.kt @@ -0,0 +1,25 @@ +package com.example.android_many_source_dirs_app + +import android_many_source_dirs_app.BaseInstrumentedTest +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest : BaseInstrumentedTest() { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.example.android_many_source_dirs_app", appContext.packageName) + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/AndroidManifest.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..2fe3e78c055 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/extraSources/android_many_source_dirs_app/NotesApplication.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/extraSources/android_many_source_dirs_app/NotesApplication.kt new file mode 100644 index 00000000000..7411af2e0b2 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/extraSources/android_many_source_dirs_app/NotesApplication.kt @@ -0,0 +1,6 @@ +package android_many_source_dirs_app + +import android.app.Application + +class NotesApplication : Application() { +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/java/com/example/android_many_source_dirs_app/MainActivity.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/java/com/example/android_many_source_dirs_app/MainActivity.kt new file mode 100644 index 00000000000..fbdb18ef5ff --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/java/com/example/android_many_source_dirs_app/MainActivity.kt @@ -0,0 +1,15 @@ +package com.example.android_many_source_dirs_app + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android_many_source_dirs_app.NotesApplication + +public class MainActivity : AppCompatActivity() { + + private lateinit var notesApp: NotesApplication + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/drawable/ic_launcher_background.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000000..07d5da9cbf1 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/drawable/ic_launcher_foreground.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 00000000000..2b068d11462 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/layout/activity_main.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/layout/activity_main.xml new file mode 100644 index 00000000000..17eab17ba76 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/layout/activity_main.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 00000000000..6f3b755bf50 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/values/strings.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/values/strings.xml new file mode 100644 index 00000000000..5f5434775aa --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + Android_many_source_dirs_app + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/test/java/com/example/android_many_source_dirs_app/ExampleUnitTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/test/java/com/example/android_many_source_dirs_app/ExampleUnitTest.kt new file mode 100644 index 00000000000..afe72628225 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/test/java/com/example/android_many_source_dirs_app/ExampleUnitTest.kt @@ -0,0 +1,18 @@ +package com.example.android_many_source_dirs_app + +import android_many_source_dirs_app.BaseUnitTest +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest : BaseUnitTest() { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/test/reserveUnitTest/android_many_source_dirs_app/BaseUnitTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/test/reserveUnitTest/android_many_source_dirs_app/BaseUnitTest.kt new file mode 100644 index 00000000000..978355ccfe7 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtraSourceDirsApp/src/test/reserveUnitTest/android_many_source_dirs_app/BaseUnitTest.kt @@ -0,0 +1,6 @@ +package android_many_source_dirs_app + +open class BaseUnitTest { + + fun createTestData(){} +} \ No newline at end of file