From c7b2240c8e725933593f0a7bbd649ce5e9a75644 Mon Sep 17 00:00:00 2001 From: "Alexander.Likhachev" Date: Wed, 9 Aug 2023 17:46:58 +0200 Subject: [PATCH] [Build, IGS] Add support for checking global consent --- .../src/main/kotlin/ConsentManager.kt | 15 ++++++---- .../InternalGradleSetupSettingsPlugin.kt | 3 +- .../src/test/kotlin/ConsentManagerTest.kt | 28 ++++++++++++++++++- 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/repo/gradle-settings-conventions/internal-gradle-setup/src/main/kotlin/ConsentManager.kt b/repo/gradle-settings-conventions/internal-gradle-setup/src/main/kotlin/ConsentManager.kt index d8bec40356c..4596e24688f 100644 --- a/repo/gradle-settings-conventions/internal-gradle-setup/src/main/kotlin/ConsentManager.kt +++ b/repo/gradle-settings-conventions/internal-gradle-setup/src/main/kotlin/ConsentManager.kt @@ -36,14 +36,19 @@ internal fun String.formatWithLink(link: String) = replace(linkPlaceholder, link internal class ConsentManager( private val modifier: LocalPropertiesModifier, + private val globalConsentGiven: Boolean? = null, private val input: BufferedReader = System.`in`.bufferedReader(), private val output: PrintStream = System.out, ) { - fun getUserDecision() = when { - modifier.initiallyContains(USER_REFUSAL_MARKER) -> false - modifier.initiallyContains(USER_CONSENT_MARKER) -> true - isInIdeaSync -> false - else -> null + fun getUserDecision(): Boolean? { + return when { + modifier.initiallyContains(USER_REFUSAL_MARKER) -> false + modifier.initiallyContains(USER_CONSENT_MARKER) -> true + globalConsentGiven == false -> false + globalConsentGiven == true -> true + isInIdeaSync -> false + else -> null + } } fun askForConsent(consentDetailsLink: String? = null): Boolean { diff --git a/repo/gradle-settings-conventions/internal-gradle-setup/src/main/kotlin/InternalGradleSetupSettingsPlugin.kt b/repo/gradle-settings-conventions/internal-gradle-setup/src/main/kotlin/InternalGradleSetupSettingsPlugin.kt index 8e3cbdd1287..946ed786936 100644 --- a/repo/gradle-settings-conventions/internal-gradle-setup/src/main/kotlin/InternalGradleSetupSettingsPlugin.kt +++ b/repo/gradle-settings-conventions/internal-gradle-setup/src/main/kotlin/InternalGradleSetupSettingsPlugin.kt @@ -18,6 +18,7 @@ private const val DOMAIN_NAME = "kotlin-build-properties.labs.jb.gg" private const val SETUP_JSON_URL = "https://$DOMAIN_NAME/setup.json" private const val PLUGIN_SWITCH_PROPERTY = "kotlin.build.internal.gradle.setup" +private const val CONSENT_GRADLE_PROPERTY = "kotlin.build.internal.gradle.setup.consent" abstract class InternalGradleSetupSettingsPlugin : Plugin { private val log = Logging.getLogger(javaClass) @@ -33,7 +34,7 @@ abstract class InternalGradleSetupSettingsPlugin : Plugin { } try { val modifier = LocalPropertiesModifier(target.rootDir.resolve("local.properties")) - val consentManager = ConsentManager(modifier) + val consentManager = ConsentManager(modifier, target.providers.gradleProperty(CONSENT_GRADLE_PROPERTY).orNull?.toBoolean()) val initialDecision = consentManager.getUserDecision() if (initialDecision == false) { log.debug("Skipping automatic local.properties configuration as you've opted out") diff --git a/repo/gradle-settings-conventions/internal-gradle-setup/src/test/kotlin/ConsentManagerTest.kt b/repo/gradle-settings-conventions/internal-gradle-setup/src/test/kotlin/ConsentManagerTest.kt index a88aecb3d74..ba2e40925f7 100644 --- a/repo/gradle-settings-conventions/internal-gradle-setup/src/test/kotlin/ConsentManagerTest.kt +++ b/repo/gradle-settings-conventions/internal-gradle-setup/src/test/kotlin/ConsentManagerTest.kt @@ -49,6 +49,32 @@ class ConsentManagerTest { assertEquals(false, ConsentManager(modifier).getUserDecision()) } + @Test + @DisplayName("if there's no local consent, but the global one is given") + fun testGlobalConsentGiven() { + assertEquals(true, ConsentManager(modifier, true).getUserDecision()) + } + + @Test + @DisplayName("if there's no local consent, but the global one is refused") + fun testGlobalConsentRefusal() { + assertEquals(false, ConsentManager(modifier, false).getUserDecision()) + } + + @Test + @DisplayName("local given consent takes priority over the global one") + fun testLocalGivenConsentTakesPriority() { + localPropertiesFile.toFile().writeText(USER_CONSENT_MARKER) + assertEquals(true, ConsentManager(modifier, false).getUserDecision()) + } + + @Test + @DisplayName("local refused consent takes priority over the global one") + fun testLocalRefusedConsentTakesPriority() { + localPropertiesFile.toFile().writeText(USER_REFUSAL_MARKER) + assertEquals(false, ConsentManager(modifier, true).getUserDecision()) + } + @Test fun testConsentRequestAgree() = testUserDecision("yes", true, USER_CONSENT_MARKER) @@ -76,7 +102,7 @@ class ConsentManagerTest { StringInputStream(prompt).bufferedReader().use { input -> val outputStream = ByteArrayOutputStream(255) PrintStream(outputStream).use { printStream -> - val consentManager = ConsentManager(modifier, input, printStream) + val consentManager = ConsentManager(modifier, null, input, printStream) val userDecision = consentManager.askForConsent(consentDetailsLink) assertEquals(expectedDecision, userDecision) val content = Files.readAllLines(localPropertiesFile)