From 2cfca8ab7d8e27e1adb3cb8dc26718773f53afcf Mon Sep 17 00:00:00 2001 From: Coralie PIRIOU Date: Tue, 20 May 2025 19:09:15 +0200 Subject: [PATCH 1/6] SGDP001 Google Consent Android Rule --- android-plugin/README.md | 5 ++ .../java/io/ecocode/java/JavaCheckList.java | 4 +- .../privacy/GoogleAndroidAdsConsentRule.java | 77 +++++++++++++++++++ .../android/java/ecocode_java_profile.json | 1 + .../io/ecocode/rules/java/SGDP001.html | 8 ++ .../io/ecocode/rules/java/SGDP001.json | 17 ++++ .../privacy/GoogleAndroidAdsConsentCheck.java | 4 + .../ecocode/java/JavaRulesDefinitionTest.java | 6 ++ .../GoogleAndroidAdsConsentRuleTest.java | 19 +++++ 9 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 android-plugin/src/main/java/io/ecocode/java/checks/social/privacy/GoogleAndroidAdsConsentRule.java create mode 100644 android-plugin/src/main/resources/io/ecocode/rules/java/SGDP001.html create mode 100644 android-plugin/src/main/resources/io/ecocode/rules/java/SGDP001.json create mode 100644 android-plugin/src/test/files/social/privacy/GoogleAndroidAdsConsentCheck.java create mode 100644 android-plugin/src/test/java/io/ecocode/java/checks/social/privacy/GoogleAndroidAdsConsentRuleTest.java diff --git a/android-plugin/README.md b/android-plugin/README.md index a46b90e8..d580c61a 100644 --- a/android-plugin/README.md +++ b/android-plugin/README.md @@ -51,6 +51,11 @@ cd /codenarc-converter/CodeNarc ./gradlew build -x test ``` +```sh + cd .\codenarc-converter\CodeNarc\ + +``` + Add custom CodeNarc to Maven dependencies: ```sh diff --git a/android-plugin/src/main/java/io/ecocode/java/JavaCheckList.java b/android-plugin/src/main/java/io/ecocode/java/JavaCheckList.java index cc6cd6fb..bc288c10 100644 --- a/android-plugin/src/main/java/io/ecocode/java/JavaCheckList.java +++ b/android-plugin/src/main/java/io/ecocode/java/JavaCheckList.java @@ -29,6 +29,7 @@ import io.ecocode.java.checks.environment.power.ChargeAwarenessRule; import io.ecocode.java.checks.environment.power.SaveModeAwarenessRule; import io.ecocode.java.checks.environment.sobriety.*; +import io.ecocode.java.checks.social.privacy.GoogleAndroidAdsConsentRule; import io.ecocode.java.checks.social.privacy.GoogleTrackerRule; import io.ecocode.java.checks.social.privacy.TrackingIdRule; import org.sonar.plugins.java.api.JavaCheck; @@ -54,7 +55,8 @@ public static List> getChecks() { public static List> getJavaSocialChecks() { return Collections.unmodifiableList(Arrays.asList( GoogleTrackerRule.class, - TrackingIdRule.class + TrackingIdRule.class, + GoogleAndroidAdsConsentRule.class )); } diff --git a/android-plugin/src/main/java/io/ecocode/java/checks/social/privacy/GoogleAndroidAdsConsentRule.java b/android-plugin/src/main/java/io/ecocode/java/checks/social/privacy/GoogleAndroidAdsConsentRule.java new file mode 100644 index 00000000..1a3ba26e --- /dev/null +++ b/android-plugin/src/main/java/io/ecocode/java/checks/social/privacy/GoogleAndroidAdsConsentRule.java @@ -0,0 +1,77 @@ +package io.ecocode.java.checks.social.privacy; + +import io.ecocode.java.checks.helpers.TreeHelper; +import org.sonar.check.Rule; +import org.sonar.plugins.java.api.JavaFileScanner; +import org.sonar.plugins.java.api.JavaFileScannerContext; +import org.sonar.plugins.java.api.tree.*; + +import java.util.ArrayList; +import java.util.List; + +/** + * Check the presence of the import com.google.android.ads.consent + *

+ * To support publishers in meeting their duties under the EU User Consent Policy, Google offers a Consent SDK. + * Hence, importing classes from com.google.android.ads.consent is considered as a good practice. + */ +@Rule(key = "SGDP001", name = "Google Consent") +public class GoogleAndroidAdsConsentRule extends BaseTreeVisitor implements JavaFileScanner { + + private static final String ERROR_MESSAGE_GOOGLE_ANDROID_ADS_CONSENT_NOT_USED = "Check user consent by using com.google.android.ads.consent.* "; + + @Override + public void scanFile(JavaFileScannerContext context) { + CompilationUnitTree cut = context.getTree(); + + GoogleAndroidAdsConsentImports googleTrackerImport = new GoogleAndroidAdsConsentImports(); + + for (ImportClauseTree importClauseTree : cut.imports()) { + ImportTree importTree = null; + + if (importClauseTree.is(Tree.Kind.IMPORT)) { + importTree = (ImportTree) importClauseTree; + } + + if (importTree == null) { + // discard empty statements, which can be part of imports + continue; + } + + googleTrackerImport.collectTrackerImport(importTree); + } + + handleResult(context, googleTrackerImport); + scan(cut); + } + + private void handleResult(JavaFileScannerContext context, GoogleAndroidAdsConsentImports googleTrackerImport) { + if (!googleTrackerImport.hasGoogleTrackerImports()) { + context.addIssueOnProject(this, ERROR_MESSAGE_GOOGLE_ANDROID_ADS_CONSENT_NOT_USED); + } + } + + /** + * New package com.google.android.gms.ads ?? + */ + private static class GoogleAndroidAdsConsentImports { + private static final String STR_GOOGLE_ADS_CONSENT_IMPORT = "com.google.android.ads.consent"; + + private final List googleAdsConsentTrackerImport = new ArrayList<>(); + + public List getGoogleAdsConsentTrackerImports() { + return googleAdsConsentTrackerImport; + } + + public boolean hasGoogleTrackerImports() { + return !googleAdsConsentTrackerImport.isEmpty(); + } + + public void collectTrackerImport(ImportTree importTree) { + String importName = TreeHelper.fullQualifiedName(importTree.qualifiedIdentifier()); + if (importName.startsWith(STR_GOOGLE_ADS_CONSENT_IMPORT)) { + googleAdsConsentTrackerImport.add(importTree); + } + } + } +} diff --git a/android-plugin/src/main/resources/io/ecocode/android/java/ecocode_java_profile.json b/android-plugin/src/main/resources/io/ecocode/android/java/ecocode_java_profile.json index 128c33ad..9e1b91c5 100644 --- a/android-plugin/src/main/resources/io/ecocode/android/java/ecocode_java_profile.json +++ b/android-plugin/src/main/resources/io/ecocode/android/java/ecocode_java_profile.json @@ -34,6 +34,7 @@ "EC530", "EC531", "EC532", + "EC533", "EC534" ] } diff --git a/android-plugin/src/main/resources/io/ecocode/rules/java/SGDP001.html b/android-plugin/src/main/resources/io/ecocode/rules/java/SGDP001.html new file mode 100644 index 00000000..d48dba26 --- /dev/null +++ b/android-plugin/src/main/resources/io/ecocode/rules/java/SGDP001.html @@ -0,0 +1,8 @@ + +

+ Check user consent by using com.google.android.ads.consent.* +

+

+ To support publishers in meeting their duties under the EU User Consent Policy, Google offers a Consent SDK. + Hence, importing classes from com.google.android.ads.consent is considered as a good practice. +

diff --git a/android-plugin/src/main/resources/io/ecocode/rules/java/SGDP001.json b/android-plugin/src/main/resources/io/ecocode/rules/java/SGDP001.json new file mode 100644 index 00000000..4cb39944 --- /dev/null +++ b/android-plugin/src/main/resources/io/ecocode/rules/java/SGDP001.json @@ -0,0 +1,17 @@ +{ + "title": "Privacy: Google Consent", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "20min" + }, + "tags": [ + "privacy", + "social", + "ecocode", + "android", + "eco-design" + ], + "defaultSeverity": "Minor" +} \ No newline at end of file diff --git a/android-plugin/src/test/files/social/privacy/GoogleAndroidAdsConsentCheck.java b/android-plugin/src/test/files/social/privacy/GoogleAndroidAdsConsentCheck.java new file mode 100644 index 00000000..75f94ca1 --- /dev/null +++ b/android-plugin/src/test/files/social/privacy/GoogleAndroidAdsConsentCheck.java @@ -0,0 +1,4 @@ +import com.google.android.ads.consent.Test; + +public class Test { +} \ No newline at end of file diff --git a/android-plugin/src/test/java/io/ecocode/java/JavaRulesDefinitionTest.java b/android-plugin/src/test/java/io/ecocode/java/JavaRulesDefinitionTest.java index 2f169ec9..96ad0f2c 100644 --- a/android-plugin/src/test/java/io/ecocode/java/JavaRulesDefinitionTest.java +++ b/android-plugin/src/test/java/io/ecocode/java/JavaRulesDefinitionTest.java @@ -58,6 +58,12 @@ private void assertSocialRuleProperties(Repository repository) { assertThat(trackIdRule.name()).isEqualTo("Privacy: Tracking Id"); assertThat(trackIdRule.debtRemediationFunction().type()).isEqualTo(Type.CONSTANT_ISSUE); assertThat(trackIdRule.type()).isEqualTo(RuleType.CODE_SMELL); + + Rule googleConsentRule = repository.rule("SGDP001"); + assertThat(googleConsentRule).isNotNull(); + assertThat(googleConsentRule.name()).isEqualTo("Privacy: Google Consent"); + assertThat(googleConsentRule.debtRemediationFunction().type()).isEqualTo(Type.CONSTANT_ISSUE); + assertThat(googleConsentRule.type()).isEqualTo(RuleType.CODE_SMELL); } private void assertEnergyRuleProperties(Repository repository) { diff --git a/android-plugin/src/test/java/io/ecocode/java/checks/social/privacy/GoogleAndroidAdsConsentRuleTest.java b/android-plugin/src/test/java/io/ecocode/java/checks/social/privacy/GoogleAndroidAdsConsentRuleTest.java new file mode 100644 index 00000000..5701d99f --- /dev/null +++ b/android-plugin/src/test/java/io/ecocode/java/checks/social/privacy/GoogleAndroidAdsConsentRuleTest.java @@ -0,0 +1,19 @@ +package io.ecocode.java.checks.social.privacy; + +import org.junit.Test; +import org.sonar.java.checks.verifier.CheckVerifier; + +public class GoogleAndroidAdsConsentRuleTest { + @Test + public void verify() { + + CheckVerifier.newVerifier().onFile("src/test/files/social/privacy/GoogleTrackerGoogleCheck.java") + .withCheck(new GoogleAndroidAdsConsentRule()) + .verifyIssueOnProject("Check user consent by using com.google.android.ads.consent.* "); + CheckVerifier.newVerifier().onFile("src/test/files/social/privacy/GoogleAndroidAdsConsentCheck.java") + .withCheck(new GoogleAndroidAdsConsentRule()) + .verifyNoIssues(); + + + } +} From 2852fc6ea330bfc7c70bd0cb8082152d37776748 Mon Sep 17 00:00:00 2001 From: Coralie PIRIOU Date: Tue, 20 May 2025 19:10:22 +0200 Subject: [PATCH 2/6] SGDP001 Google Consent --- CHANGELOG.md | 2 ++ codenarc-converter/CodeNarc/README.md | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6838d4d7..afc2a1e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- add rule SGDP001 google ads consent + ### Changed - SPRI004: Add rule to avoid use of Tracking Id using TelephonyManager#getDeviceId() - The embedded Groovy language analyzer was reconfigured to scan only `.gradle` files since it is the files we are interested in for diff --git a/codenarc-converter/CodeNarc/README.md b/codenarc-converter/CodeNarc/README.md index 3876de0d..ad0b924d 100644 --- a/codenarc-converter/CodeNarc/README.md +++ b/codenarc-converter/CodeNarc/README.md @@ -28,7 +28,7 @@ CodeNarc requires ## AVAILABLE FROM MAVEN CENTRAL REPOSITORY -For projects built using Gradle or Maven, **CodeNarc** is available from the [Maven Central Repository]((https://mvnrepository.com/artifact/org.codenarc/CodeNarc)). +For projects built using Gradle or Maven, **CodeNarc** is available from the [Maven Central Repository](https://mvnrepository.com/artifact/org.codenarc/CodeNarc). - groupId = org.codenarc - artifactId = CodeNarc From 8b765c0a659e86e54e7bf3e1eceefce851518bb8 Mon Sep 17 00:00:00 2001 From: Coralie PIRIOU Date: Wed, 21 May 2025 12:11:42 +0200 Subject: [PATCH 3/6] SGDP001 good smell instead of code smell --- CHANGELOG.md | 2 +- .../java/io/ecocode/java/JavaCheckList.java | 2 +- .../GoogleAndroidAdsConsentRule.java | 52 ++++++++----------- .../rules/java/{SGDP001.html => EC533.html} | 3 +- .../rules/java/{SGDP001.json => EC533.json} | 8 +-- .../ecocode/java/JavaRulesDefinitionTest.java | 4 +- .../GoogleAndroidAdsConsentRuleTest.java | 5 +- 7 files changed, 35 insertions(+), 41 deletions(-) rename android-plugin/src/main/java/io/ecocode/java/checks/social/{privacy => gdpr}/GoogleAndroidAdsConsentRule.java (51%) rename android-plugin/src/main/resources/io/ecocode/rules/java/{SGDP001.html => EC533.html} (65%) rename android-plugin/src/main/resources/io/ecocode/rules/java/{SGDP001.json => EC533.json} (62%) diff --git a/CHANGELOG.md b/CHANGELOG.md index afc2a1e7..7ba6c326 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- add rule SGDP001 google ads consent +- Rule EC533 google ads consent ### Changed - SPRI004: Add rule to avoid use of Tracking Id using TelephonyManager#getDeviceId() diff --git a/android-plugin/src/main/java/io/ecocode/java/JavaCheckList.java b/android-plugin/src/main/java/io/ecocode/java/JavaCheckList.java index bc288c10..ac6e6c90 100644 --- a/android-plugin/src/main/java/io/ecocode/java/JavaCheckList.java +++ b/android-plugin/src/main/java/io/ecocode/java/JavaCheckList.java @@ -29,7 +29,7 @@ import io.ecocode.java.checks.environment.power.ChargeAwarenessRule; import io.ecocode.java.checks.environment.power.SaveModeAwarenessRule; import io.ecocode.java.checks.environment.sobriety.*; -import io.ecocode.java.checks.social.privacy.GoogleAndroidAdsConsentRule; +import io.ecocode.java.checks.social.gdpr.GoogleAndroidAdsConsentRule; import io.ecocode.java.checks.social.privacy.GoogleTrackerRule; import io.ecocode.java.checks.social.privacy.TrackingIdRule; import org.sonar.plugins.java.api.JavaCheck; diff --git a/android-plugin/src/main/java/io/ecocode/java/checks/social/privacy/GoogleAndroidAdsConsentRule.java b/android-plugin/src/main/java/io/ecocode/java/checks/social/gdpr/GoogleAndroidAdsConsentRule.java similarity index 51% rename from android-plugin/src/main/java/io/ecocode/java/checks/social/privacy/GoogleAndroidAdsConsentRule.java rename to android-plugin/src/main/java/io/ecocode/java/checks/social/gdpr/GoogleAndroidAdsConsentRule.java index 1a3ba26e..598c4265 100644 --- a/android-plugin/src/main/java/io/ecocode/java/checks/social/privacy/GoogleAndroidAdsConsentRule.java +++ b/android-plugin/src/main/java/io/ecocode/java/checks/social/gdpr/GoogleAndroidAdsConsentRule.java @@ -1,24 +1,24 @@ -package io.ecocode.java.checks.social.privacy; +package io.ecocode.java.checks.social.gdpr; import io.ecocode.java.checks.helpers.TreeHelper; import org.sonar.check.Rule; import org.sonar.plugins.java.api.JavaFileScanner; import org.sonar.plugins.java.api.JavaFileScannerContext; import org.sonar.plugins.java.api.tree.*; - -import java.util.ArrayList; -import java.util.List; +import org.sonarsource.analyzer.commons.annotations.DeprecatedRuleKey; /** * Check the presence of the import com.google.android.ads.consent + * or com.google.android.ump:user-messaging-platform *

* To support publishers in meeting their duties under the EU User Consent Policy, Google offers a Consent SDK. - * Hence, importing classes from com.google.android.ads.consent is considered as a good practice. + * Hence, importing classes from com.google.android.ads.consent or com.google.android.ump:user-messaging-platform is considered as a good practice. */ -@Rule(key = "SGDP001", name = "Google Consent") +@Rule(key = "EC533", name = "GDPR: Google Consent") +@DeprecatedRuleKey(repositoryKey = "ecoCode-java", ruleKey = "SGDP001") public class GoogleAndroidAdsConsentRule extends BaseTreeVisitor implements JavaFileScanner { - private static final String ERROR_MESSAGE_GOOGLE_ANDROID_ADS_CONSENT_NOT_USED = "Check user consent by using com.google.android.ads.consent.* "; + private static final String INFO_MESSAGE_GOOGLE_ANDROID_ADS_CONSENT_USED = "Good Smell : User Consent"; @Override public void scanFile(JavaFileScannerContext context) { @@ -26,6 +26,7 @@ public void scanFile(JavaFileScannerContext context) { GoogleAndroidAdsConsentImports googleTrackerImport = new GoogleAndroidAdsConsentImports(); + boolean isGoogleAdsConsentImported = false; for (ImportClauseTree importClauseTree : cut.imports()) { ImportTree importTree = null; @@ -34,44 +35,35 @@ public void scanFile(JavaFileScannerContext context) { } if (importTree == null) { - // discard empty statements, which can be part of imports continue; } - googleTrackerImport.collectTrackerImport(importTree); + if (googleTrackerImport.verifyImportGoogleAdsConsent(importTree)) { + isGoogleAdsConsentImported = true; + break; + } + } + + if (isGoogleAdsConsentImported) { + context.addIssueOnProject(this, INFO_MESSAGE_GOOGLE_ANDROID_ADS_CONSENT_USED); } - handleResult(context, googleTrackerImport); scan(cut); } - private void handleResult(JavaFileScannerContext context, GoogleAndroidAdsConsentImports googleTrackerImport) { - if (!googleTrackerImport.hasGoogleTrackerImports()) { - context.addIssueOnProject(this, ERROR_MESSAGE_GOOGLE_ANDROID_ADS_CONSENT_NOT_USED); - } - } /** - * New package com.google.android.gms.ads ?? + * Deprecated : com.google.android.ads.consent + *

+ * Android 5.0 (API 21) : com.google.android.ump:user-messaging-platform */ private static class GoogleAndroidAdsConsentImports { private static final String STR_GOOGLE_ADS_CONSENT_IMPORT = "com.google.android.ads.consent"; + private static final String STR_GOOGLE_ADS_UMP_CONSENT_IMPORT = "com.google.android.ump"; - private final List googleAdsConsentTrackerImport = new ArrayList<>(); - - public List getGoogleAdsConsentTrackerImports() { - return googleAdsConsentTrackerImport; - } - - public boolean hasGoogleTrackerImports() { - return !googleAdsConsentTrackerImport.isEmpty(); - } - - public void collectTrackerImport(ImportTree importTree) { + public boolean verifyImportGoogleAdsConsent(ImportTree importTree) { String importName = TreeHelper.fullQualifiedName(importTree.qualifiedIdentifier()); - if (importName.startsWith(STR_GOOGLE_ADS_CONSENT_IMPORT)) { - googleAdsConsentTrackerImport.add(importTree); - } + return importName.startsWith(STR_GOOGLE_ADS_CONSENT_IMPORT) || importName.startsWith(STR_GOOGLE_ADS_UMP_CONSENT_IMPORT); } } } diff --git a/android-plugin/src/main/resources/io/ecocode/rules/java/SGDP001.html b/android-plugin/src/main/resources/io/ecocode/rules/java/EC533.html similarity index 65% rename from android-plugin/src/main/resources/io/ecocode/rules/java/SGDP001.html rename to android-plugin/src/main/resources/io/ecocode/rules/java/EC533.html index d48dba26..08587089 100644 --- a/android-plugin/src/main/resources/io/ecocode/rules/java/SGDP001.html +++ b/android-plugin/src/main/resources/io/ecocode/rules/java/EC533.html @@ -1,6 +1,7 @@

- Check user consent by using com.google.android.ads.consent.* + Good Smell : User consent checked by using com.google.android.ads.consent.* or com.google.android.ump.* + since Android API 21

To support publishers in meeting their duties under the EU User Consent Policy, Google offers a Consent SDK. diff --git a/android-plugin/src/main/resources/io/ecocode/rules/java/SGDP001.json b/android-plugin/src/main/resources/io/ecocode/rules/java/EC533.json similarity index 62% rename from android-plugin/src/main/resources/io/ecocode/rules/java/SGDP001.json rename to android-plugin/src/main/resources/io/ecocode/rules/java/EC533.json index 4cb39944..ecd65d10 100644 --- a/android-plugin/src/main/resources/io/ecocode/rules/java/SGDP001.json +++ b/android-plugin/src/main/resources/io/ecocode/rules/java/EC533.json @@ -1,17 +1,17 @@ { - "title": "Privacy: Google Consent", + "title": "GDPR: Google Consent", "type": "CODE_SMELL", "status": "ready", "remediation": { "func": "Constant\/Issue", - "constantCost": "20min" + "constantCost": "0min" }, "tags": [ - "privacy", + "gdpr", "social", "ecocode", "android", "eco-design" ], - "defaultSeverity": "Minor" + "defaultSeverity": "Info" } \ No newline at end of file diff --git a/android-plugin/src/test/java/io/ecocode/java/JavaRulesDefinitionTest.java b/android-plugin/src/test/java/io/ecocode/java/JavaRulesDefinitionTest.java index 96ad0f2c..e90f882e 100644 --- a/android-plugin/src/test/java/io/ecocode/java/JavaRulesDefinitionTest.java +++ b/android-plugin/src/test/java/io/ecocode/java/JavaRulesDefinitionTest.java @@ -59,9 +59,9 @@ private void assertSocialRuleProperties(Repository repository) { assertThat(trackIdRule.debtRemediationFunction().type()).isEqualTo(Type.CONSTANT_ISSUE); assertThat(trackIdRule.type()).isEqualTo(RuleType.CODE_SMELL); - Rule googleConsentRule = repository.rule("SGDP001"); + Rule googleConsentRule = repository.rule("EC533"); assertThat(googleConsentRule).isNotNull(); - assertThat(googleConsentRule.name()).isEqualTo("Privacy: Google Consent"); + assertThat(googleConsentRule.name()).isEqualTo("GDPR: Google Consent"); assertThat(googleConsentRule.debtRemediationFunction().type()).isEqualTo(Type.CONSTANT_ISSUE); assertThat(googleConsentRule.type()).isEqualTo(RuleType.CODE_SMELL); } diff --git a/android-plugin/src/test/java/io/ecocode/java/checks/social/privacy/GoogleAndroidAdsConsentRuleTest.java b/android-plugin/src/test/java/io/ecocode/java/checks/social/privacy/GoogleAndroidAdsConsentRuleTest.java index 5701d99f..e04ce76c 100644 --- a/android-plugin/src/test/java/io/ecocode/java/checks/social/privacy/GoogleAndroidAdsConsentRuleTest.java +++ b/android-plugin/src/test/java/io/ecocode/java/checks/social/privacy/GoogleAndroidAdsConsentRuleTest.java @@ -1,5 +1,6 @@ package io.ecocode.java.checks.social.privacy; +import io.ecocode.java.checks.social.gdpr.GoogleAndroidAdsConsentRule; import org.junit.Test; import org.sonar.java.checks.verifier.CheckVerifier; @@ -9,10 +10,10 @@ public void verify() { CheckVerifier.newVerifier().onFile("src/test/files/social/privacy/GoogleTrackerGoogleCheck.java") .withCheck(new GoogleAndroidAdsConsentRule()) - .verifyIssueOnProject("Check user consent by using com.google.android.ads.consent.* "); + .verifyNoIssues(); CheckVerifier.newVerifier().onFile("src/test/files/social/privacy/GoogleAndroidAdsConsentCheck.java") .withCheck(new GoogleAndroidAdsConsentRule()) - .verifyNoIssues(); + .verifyIssueOnProject("Good Smell : User Consent"); } From cbb66b43b2496fbc1f9bd5bc9c1c956400c0e2f4 Mon Sep 17 00:00:00 2001 From: Coralie PIRIOU Date: Wed, 21 May 2025 13:09:51 +0200 Subject: [PATCH 4/6] SGDP001 change image --- .../src/main/resources/io/ecocode/rules/java/EC533.html | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/android-plugin/src/main/resources/io/ecocode/rules/java/EC533.html b/android-plugin/src/main/resources/io/ecocode/rules/java/EC533.html index 08587089..2802a97b 100644 --- a/android-plugin/src/main/resources/io/ecocode/rules/java/EC533.html +++ b/android-plugin/src/main/resources/io/ecocode/rules/java/EC533.html @@ -1,6 +1,7 @@ - +

- Good Smell : User consent checked by using com.google.android.ads.consent.* or com.google.android.ump.* + Good Practice ! + User consent checked by using com.google.android.ads.consent.* or com.google.android.ump.* since Android API 21

From 5bbd7fb5f4db6b6453f81ca9ca1a4a9a438321bb Mon Sep 17 00:00:00 2001 From: Coralie PIRIOU Date: Wed, 21 May 2025 13:14:58 +0200 Subject: [PATCH 5/6] SGDP001 change message --- .../src/main/resources/io/ecocode/rules/java/EC533.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/android-plugin/src/main/resources/io/ecocode/rules/java/EC533.html b/android-plugin/src/main/resources/io/ecocode/rules/java/EC533.html index 2802a97b..1feaa0f8 100644 --- a/android-plugin/src/main/resources/io/ecocode/rules/java/EC533.html +++ b/android-plugin/src/main/resources/io/ecocode/rules/java/EC533.html @@ -1,10 +1,10 @@

Good Practice ! - User consent checked by using com.google.android.ads.consent.* or com.google.android.ump.* - since Android API 21 + User consent checked.

To support publishers in meeting their duties under the EU User Consent Policy, Google offers a Consent SDK. - Hence, importing classes from com.google.android.ads.consent is considered as a good practice. + Hence, importing classes from com.google.android.ads.consent.* or com.google.android.ump.* + since Android API 21 is considered as a good practice.

From be2b3dd2d1538c294530921b2176b343f9af8758 Mon Sep 17 00:00:00 2001 From: Coralie PIRIOU Date: Wed, 21 May 2025 14:17:22 +0200 Subject: [PATCH 6/6] SGDP001 fix test package --- .../{privacy => gdpr}/GoogleAndroidAdsConsentCheck.java | 0 .../{privacy => gdpr}/GoogleAndroidAdsConsentRuleTest.java | 5 ++--- 2 files changed, 2 insertions(+), 3 deletions(-) rename android-plugin/src/test/files/social/{privacy => gdpr}/GoogleAndroidAdsConsentCheck.java (100%) rename android-plugin/src/test/java/io/ecocode/java/checks/social/{privacy => gdpr}/GoogleAndroidAdsConsentRuleTest.java (77%) diff --git a/android-plugin/src/test/files/social/privacy/GoogleAndroidAdsConsentCheck.java b/android-plugin/src/test/files/social/gdpr/GoogleAndroidAdsConsentCheck.java similarity index 100% rename from android-plugin/src/test/files/social/privacy/GoogleAndroidAdsConsentCheck.java rename to android-plugin/src/test/files/social/gdpr/GoogleAndroidAdsConsentCheck.java diff --git a/android-plugin/src/test/java/io/ecocode/java/checks/social/privacy/GoogleAndroidAdsConsentRuleTest.java b/android-plugin/src/test/java/io/ecocode/java/checks/social/gdpr/GoogleAndroidAdsConsentRuleTest.java similarity index 77% rename from android-plugin/src/test/java/io/ecocode/java/checks/social/privacy/GoogleAndroidAdsConsentRuleTest.java rename to android-plugin/src/test/java/io/ecocode/java/checks/social/gdpr/GoogleAndroidAdsConsentRuleTest.java index e04ce76c..93a0f517 100644 --- a/android-plugin/src/test/java/io/ecocode/java/checks/social/privacy/GoogleAndroidAdsConsentRuleTest.java +++ b/android-plugin/src/test/java/io/ecocode/java/checks/social/gdpr/GoogleAndroidAdsConsentRuleTest.java @@ -1,6 +1,5 @@ -package io.ecocode.java.checks.social.privacy; +package io.ecocode.java.checks.social.gdpr; -import io.ecocode.java.checks.social.gdpr.GoogleAndroidAdsConsentRule; import org.junit.Test; import org.sonar.java.checks.verifier.CheckVerifier; @@ -11,7 +10,7 @@ public void verify() { CheckVerifier.newVerifier().onFile("src/test/files/social/privacy/GoogleTrackerGoogleCheck.java") .withCheck(new GoogleAndroidAdsConsentRule()) .verifyNoIssues(); - CheckVerifier.newVerifier().onFile("src/test/files/social/privacy/GoogleAndroidAdsConsentCheck.java") + CheckVerifier.newVerifier().onFile("src/test/files/social/gdpr/GoogleAndroidAdsConsentCheck.java") .withCheck(new GoogleAndroidAdsConsentRule()) .verifyIssueOnProject("Good Smell : User Consent");