Skip to content

Commit

Permalink
ANDROID-15083 add variant ordering (#9)
Browse files Browse the repository at this point in the history
* ANDROID-15083 add variant ordering

* ANDROID-15083 update plugin version
  • Loading branch information
jeprubio authored Sep 4, 2024
1 parent 8f9eb42 commit 1fd58f2
Show file tree
Hide file tree
Showing 8 changed files with 96 additions and 19 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ To add the PermissionCheck plugin to your project, you have to add this block of

```groovy
plugins {
id "com.telefonica.manifestcheck" version "1.0.1"
id "com.telefonica.manifestcheck" version "1.0.2"
}
```

Expand All @@ -57,7 +57,7 @@ buildscript {
}
}
dependencies {
classpath "com.telefonica:manifestcheck:1.0.1"
classpath "com.telefonica:manifestcheck:1.0.2"
}
}
```
Expand Down
2 changes: 1 addition & 1 deletion manifestcheck/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ plugins {
}

group = "com.telefonica"
version = "1.0.1" // Also update the version in the README
version = "1.0.2" // Also update the version in the README

val uber: Configuration by configurations.creating

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,14 +77,14 @@ class MultiVariantPermissionCheckIntegrationTest {
val baseline = """
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<baseline>
<variant name="release">
<variant name="debug">
<uses-permission name="android.permission.INTERNET"/>
<uses-permission maxSdkVersion="26" name="android.permission.CAMERA"/>
<uses-permission-sdk-23 name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-feature name="android.hardware.camera.autofocus" required="false"/>
<uses-feature glEsVersion="0x00020000" required="true"/>
</variant>
<variant name="debug">
<variant name="release">
<uses-permission name="android.permission.INTERNET"/>
<uses-permission maxSdkVersion="26" name="android.permission.CAMERA"/>
<uses-permission-sdk-23 name="android.permission.ACCESS_NETWORK_STATE"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,17 +70,17 @@ class SingleVariantPermissionCheckIntegrationTest {
val baseline = """
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<baseline>
<variant name="release">
<variant name="debug">
<uses-permission name="android.permission.INTERNET"/>
<uses-permission maxSdkVersion="26" name="android.permission.CAMERA"/>
<uses-permission-sdk-23 name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-feature name="android.hardware.camera.autofocus" required="false"/>
<uses-feature glEsVersion="0x00020000" required="true"/>
</variant>
<variant name="debug">
<variant name="release">
<uses-permission name="android.permission.INTERNET"/>
<uses-permission maxSdkVersion="26" name="android.permission.CAMERA"/>
<uses-permission-sdk-23 name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-feature name="android.hardware.camera.autofocus" required="false"/>
<uses-feature glEsVersion="0x00020000" required="true"/>
</variant>
</baseline>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ open class PermissionCheckTask : DefaultTask() {

// Create (or recreate) the baseline if needed
if (recreate.get() || !baselineFile.exists()) {
baselineHandler.serialize(permissions)
baselineHandler.serialize(permissions, recreate.get())
project.logger.lifecycle("Created baseline at $baselineFile")
if (!recreate.get()) { // New baseline created without explicit flag -> fail the build
abortBuild()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ abstract class TaskConfigurator {
extension: PermissionCheckExtension,
variantName: String
): TaskProvider<PermissionCheckTask> {
val taskName = "check${variantName.capitalize(Locale.ROOT)}Permissions"
val taskName = "check${variantName.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.ROOT) else it.toString() }}Permissions"

return project.tasks.register(taskName, PermissionCheckTask::class.java) { task ->
task.group = LifecycleBasePlugin.VERIFICATION_GROUP
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,16 @@ internal class BaselineHandler(private val baselineFile: File) {
}
}

fun serialize(permissions: Map<String, Set<BasePermission>>) {
val baseline = deserialize().toMutableMap() // Parse existing baseline and add new or updated permissions
permissions.forEach { (variantName, variantPermissions) ->
fun serialize(permissions: Map<String, Set<BasePermission>>, recreate: Boolean = false) {
val baseline = if (!recreate) deserialize().toMutableMap() else mutableMapOf() // Parse existing baseline and add new or updated permissions
permissions.toSortedMap().forEach { (variantName, variantPermissions) ->
baseline[variantName] = variantPermissions
}

// Package changes into a XML document
val document = createDocumentBuilder().newDocument()
document.appendElement("baseline") {
baseline.forEach { (variantName, variantPermissions) ->
baseline.toSortedMap().forEach { (variantName, variantPermissions) ->

// Create permission entries for a single variant
appendElement("variant") {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,14 +69,14 @@ class BaselineHandlerTest {
val expectedBaselineContent = """
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<baseline>
<variant name="release">
<uses-permission maxSdkVersion="27" name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission-sdk-23 maxSdkVersion="26" name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</variant>
<variant name="debug">
<uses-permission name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission-sdk-23 name="android.permission.INTERNET"/>
</variant>
<variant name="release">
<uses-permission maxSdkVersion="27" name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission-sdk-23 maxSdkVersion="26" name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</variant>
</baseline>
""".trimIndent()
Expand Down Expand Up @@ -230,4 +230,81 @@ class BaselineHandlerTest {
val baselineFile = tempDir.resolve("permission-baseline.json")
assertThrows<IllegalArgumentException> { BaselineHandler(baselineFile) }
}

@Test
fun `Baseline is reordering new added variants`() {
val baselineFile = tempDir.resolve("permission-baseline.xml")
baselineFile.writeText("""
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<baseline>
<variant name="release">
<uses-permission maxSdkVersion="27" name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission-sdk-23 maxSdkVersion="26" name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</variant>
</baseline>
""".trimIndent())

val debugPermissions = setOf(
Permission("android.permission.ACCESS_COARSE_LOCATION"),
Sdk23Permission("android.permission.INTERNET")
)

val baselineHandler = BaselineHandler(baselineFile)
baselineHandler.serialize(mapOf("debug" to debugPermissions))

val expectedBaselineContent = """
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<baseline>
<variant name="debug">
<uses-permission name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission-sdk-23 name="android.permission.INTERNET"/>
</variant>
<variant name="release">
<uses-permission maxSdkVersion="27" name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission-sdk-23 maxSdkVersion="26" name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</variant>
</baseline>
""".trimIndent()
assertEquals(expectedBaselineContent, baselineFile.readText().normaliseLineSeparators())
}

@Test
fun `Baseline is reordering existing variants`() {
val baselineFile = tempDir.resolve("permission-baseline.xml")
baselineFile.writeText("""
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<baseline>
<variant name="release">
<uses-permission maxSdkVersion="27" name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission-sdk-23 maxSdkVersion="26" name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</variant>
<variant name="debug">
<uses-permission name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission-sdk-23 name="android.permission.INTERNET"/>
</variant>
</baseline>
""".trimIndent())

val baselineHandler = BaselineHandler(baselineFile)
baselineHandler.serialize(emptyMap())

val expectedBaselineContent = """
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<baseline>
<variant name="debug">
<uses-permission name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission-sdk-23 name="android.permission.INTERNET"/>
</variant>
<variant name="release">
<uses-permission maxSdkVersion="27" name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission-sdk-23 maxSdkVersion="26" name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</variant>
</baseline>
""".trimIndent()
assertEquals(expectedBaselineContent, baselineFile.readText().normaliseLineSeparators())
}
}

0 comments on commit 1fd58f2

Please sign in to comment.