blob: e5b20b8334065d6b4c0323f721a328ca6145c4a5 [file] [log] [blame]
package com.android.build.gradle.integration.application
import com.android.build.gradle.integration.common.fixture.BaseGradleExecutor
import com.android.build.gradle.integration.common.fixture.GradleTestProject
import com.android.build.gradle.integration.common.fixture.app.HelloWorldLibraryApp
import com.android.build.gradle.internal.scope.InternalArtifactType
import com.android.build.gradle.options.BooleanOption
import com.android.utils.FileUtils
import com.google.common.truth.Truth.assertThat
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TemporaryFolder
import java.io.File
import java.nio.charset.Charset
/**
* Tests to verify that library partial-r files are updated appropriately.
*/
class ParseLibraryResourcesPartialRTest {
@get:Rule
val project = GradleTestProject.builder()
.fromTestApp(HelloWorldLibraryApp.create())
// http://b/149978740
.withConfigurationCaching(BaseGradleExecutor.ConfigurationCaching.OFF)
.addGradleProperties(
"${BooleanOption.ENABLE_PARTIAL_R_INCREMENTAL_BUILDS.propertyName}=true")
.create()
@get:Rule
val temporaryFolder = TemporaryFolder()
@Test
fun `test incremental builds do not modify unnecessary partial r files`() {
val executor = project.executor()
executor.run("assembleDebug")
val partialRIntermediateDir = FileUtils.join(project.projectDir,
"lib", "build", "intermediates", InternalArtifactType
.LOCAL_ONLY_PARTIAL_SYMBOL_DIRECTORY.getFolderName(), "debug", "partial-r")
val partialRFiles = partialRIntermediateDir.listFiles()
?: error("No partial-r files generated.")
checkLibPartialRFiles(partialRFiles.toList())
val originalTimeStamps = partialRFiles.map(File::lastModified)
//Incremental build with no changes.
val incrementalBuildResult = executor.run("assembleDebug")
assertThat(incrementalBuildResult.upToDateTasks).contains(":lib:parseDebugLocalResources")
assertThat(partialRFiles[0].lastModified()).isEqualTo(originalTimeStamps[0])
assertThat(partialRFiles[1].lastModified()).isEqualTo(originalTimeStamps[1])
}
@Test
fun `test incremental builds modify partial r files when resource is modified`() {
project.execute("assembleDebug")
val partialRIntermediateDir = FileUtils.join(project.projectDir,
"lib", "build", "intermediates", InternalArtifactType.
LOCAL_ONLY_PARTIAL_SYMBOL_DIRECTORY.getFolderName(), "debug", "partial-r")
val partialRFiles =
partialRIntermediateDir.listFiles() ?: error("No partial-r files generated.")
checkLibPartialRFiles(partialRFiles.toList())
// Layout (modified resource)
val libLayoutPartialR =
FileUtils.join(partialRIntermediateDir, "layout_main.xml.flat-R.txt")
val libLayoutFile = FileUtils.join(project.projectDir,
"lib", "src", "main", "res", "layout", "main.xml")
val libLayoutPartialROriginalTimestamp = libLayoutPartialR.lastModified()
val modifiedLibLayout = libLayoutFile.readText(Charset.defaultCharset())
.replace("@+id/text", "@+id/changed_text")
FileUtils.writeToFile(libLayoutFile, modifiedLibLayout)
// Values (non-modified resource)
val libValuesPartialR =
FileUtils.join(partialRIntermediateDir, "values_values.arsc.flat-R.txt")
val libValuesPartialROriginalTimestamp = libValuesPartialR.lastModified()
// Incremental build with layout/main.xml changed resource name.
val result = project.executor().run("assembleDebug")
assertThat(result.upToDateTasks).doesNotContain(":lib:parseDebugLocalResources")
assertThat(libLayoutPartialR.lastModified())
.isGreaterThan(libLayoutPartialROriginalTimestamp)
assertThat(libLayoutPartialR.readText(Charset.defaultCharset())).contains("changed_text")
assertThat(libValuesPartialR.lastModified()).isEqualTo(libValuesPartialROriginalTimestamp)
}
private fun checkLibPartialRFiles(files : List<File>) =
assertThat(files.map { it.name }).containsExactly(
"layout_main.xml.flat-R.txt",
"values_values.arsc.flat-R.txt"
)
}