blob: 8520b697d8514cc2c12c9aca28700d396ec95821 [file] [log] [blame]
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.build.gradle.tasks.ir
import com.android.build.api.artifact.BuildableArtifact
import com.android.build.gradle.internal.api.dsl.DslScope
import com.android.build.gradle.internal.core.GradleVariantConfiguration
import com.android.build.gradle.internal.incremental.InstantRunBuildContext
import com.android.build.gradle.internal.scope.BuildArtifactsHolder
import com.android.build.gradle.internal.scope.BuildOutput
import com.android.build.gradle.internal.scope.ExistingBuildElements
import com.android.build.gradle.internal.scope.GlobalScope
import com.android.build.gradle.internal.scope.InternalArtifactType
import com.android.build.gradle.internal.scope.MutableTaskContainer
import com.android.build.gradle.internal.scope.OutputFactory
import com.android.build.gradle.internal.scope.VariantScope
import com.android.build.gradle.options.ProjectOptions
import com.android.builder.core.VariantTypeImpl
import com.android.builder.core.AndroidBuilder
import com.android.builder.errors.EvalIssueReporter
import com.android.builder.internal.FakeAndroidTarget
import com.android.builder.utils.FileCache
import com.android.utils.ILogger
import com.google.common.collect.Iterables
import com.google.common.truth.Truth.assertThat
import org.apache.commons.io.FileUtils
import org.gradle.api.Project
import org.gradle.api.file.Directory
import org.gradle.api.file.FileCollection
import org.gradle.api.file.FileTree
import org.gradle.api.provider.Provider
import org.gradle.testfixtures.ProjectBuilder
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TemporaryFolder
import org.mockito.ArgumentMatchers.any
import org.mockito.Mock
import org.mockito.Mockito.`when`
import org.mockito.MockitoAnnotations
import java.io.File
import java.io.IOException
/**
* Tests for {@link InstantRunMainApkResourcesBuilder}
*/
open class InstantRunMainApkResourcesBuilderTest {
@Rule @JvmField
var temporaryFolder = TemporaryFolder()
@Rule @JvmField
var manifestFileFolder = TemporaryFolder()
@Rule @JvmField
var emptyFolder = TemporaryFolder()
@Mock private lateinit var resources: BuildableArtifact
@Mock private lateinit var fileCollection: FileCollection
private lateinit var manifestFiles: Provider<Directory>
@Mock internal lateinit var fileTree: FileTree
@Mock internal var buildContext: InstantRunBuildContext? = null
@Mock internal var logger: ILogger? = null
@Mock private lateinit var variantConfiguration: GradleVariantConfiguration
@Mock private lateinit var buildArtifactsHolder: BuildArtifactsHolder
@Mock private lateinit var variantScope: VariantScope
@Mock private lateinit var globalScope: GlobalScope
@Mock private lateinit var fileCache: FileCache
@Mock private lateinit var dslScope: DslScope
@Mock private lateinit var issueReporter: EvalIssueReporter
@Mock private lateinit var projectOptions: ProjectOptions
@Mock
private lateinit var androidBuilder: AndroidBuilder
internal lateinit var project: Project
internal lateinit var task: InstantRunMainApkResourcesBuilder
internal lateinit var testDir: File
@Before
@Throws(IOException::class)
fun setUp() {
MockitoAnnotations.initMocks(this)
testDir = temporaryFolder.newFolder()
project = ProjectBuilder.builder().withProjectDir(testDir).build()
`when`(variantScope.fullVariantName).thenReturn("variantName")
`when`(variantConfiguration.baseName).thenReturn("variantName")
`when`(globalScope.buildCache).thenReturn(fileCache)
`when`(globalScope.project).thenReturn(project)
`when`(globalScope.projectOptions).thenReturn(projectOptions)
`when`(variantScope.getTaskName(any(String::class.java))).thenReturn("taskFoo")
`when`(variantScope.globalScope).thenReturn(globalScope)
`when`(variantScope.artifacts).thenReturn(buildArtifactsHolder)
`when`(variantConfiguration.type).thenReturn(VariantTypeImpl.BASE_APK)
`when`(variantScope.taskContainer).thenReturn(MutableTaskContainer())
variantScope.taskContainer.preBuildTask = project.tasks.register("preBuildTask")
`when`(buildArtifactsHolder.getFinalArtifactFiles(InternalArtifactType.MERGED_RES))
.thenReturn(resources)
`when`(dslScope.issueReporter).thenReturn(issueReporter)
`when`(resources.get()).thenReturn(fileCollection)
`when`(fileCollection.asFileTree).thenReturn(fileTree)
`when`(androidBuilder.target).thenReturn(FakeAndroidTarget("", ""))
}
@Test
fun testConfigAction() {
task = project.tasks.create("test", InstantRunMainApkResourcesBuilder::class.java)
val configAction = InstantRunMainApkResourcesBuilder.CreationAction(
variantScope,
InternalArtifactType.MERGED_RES)
val outDir = temporaryFolder.newFolder()
manifestFiles = project.layout.buildDirectory.dir(emptyFolder.root.absolutePath)
`when`(buildArtifactsHolder.getFinalProduct<Directory>(
InternalArtifactType.INSTANT_RUN_MERGED_MANIFESTS)).thenReturn(manifestFiles)
`when`(buildArtifactsHolder.appendArtifact(
InternalArtifactType.INSTANT_RUN_MAIN_APK_RESOURCES,
task.name,
"out")).thenReturn(outDir)
configAction.preConfigure(task.name)
configAction.configure(task)
assertThat(task.resourceFiles).isEqualTo(resources)
assertThat(task.manifestFiles).isEqualTo(manifestFiles)
assertThat(task.outputDirectory).isEqualTo(outDir)
}
@Test
fun testSingleApkData() {
task = project.tasks.create("test", InstantRunMainApkResourcesBuilder::class.java)
InstantRunMainApkResourcesBuilder.doProcessSplit = false
val configAction = InstantRunMainApkResourcesBuilder.CreationAction(
variantScope,
InternalArtifactType.MERGED_RES)
val outDir = temporaryFolder.newFolder()
val manifestFile = manifestFileFolder.newFile()
FileUtils.write(manifestFile,
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
"<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
" package=\"com.example.spollom.myapplication\"\n" +
" android:versionCode=\"1\"\n" +
" android:versionName=\"1.0\">\n" +
"</manifest>\n")
BuildOutput(InternalArtifactType.INSTANT_RUN_MERGED_MANIFESTS,
OutputFactory("test", variantConfiguration).addMainApk(),
manifestFile)
.save(manifestFileFolder.root)
manifestFiles = project.layout.buildDirectory.dir(project.provider { manifestFileFolder.root.absolutePath })
`when`(buildArtifactsHolder.getFinalProduct<Directory>(
InternalArtifactType.INSTANT_RUN_MERGED_MANIFESTS)).thenReturn(manifestFiles)
`when`(buildArtifactsHolder.appendArtifact(
InternalArtifactType.INSTANT_RUN_MAIN_APK_RESOURCES,
task.name,
"out")).thenReturn(outDir)
configAction.preConfigure(task.name)
configAction.configure(task)
task.setAndroidBuilder(androidBuilder)
task.doFullTaskAction()
val resultingFiles = outDir.listFiles()
assertThat(resultingFiles).hasLength(2)
assertThat(resultingFiles.filter { it.name == "output.json" }).hasSize(1)
val buildArtifacts = ExistingBuildElements.from(
InternalArtifactType.INSTANT_RUN_MAIN_APK_RESOURCES, outDir)
assertThat(buildArtifacts.size()).isEqualTo(1)
val buildArtifact = Iterables.getOnlyElement(buildArtifacts)
assertThat(buildArtifact.type).isEqualTo(
InternalArtifactType.INSTANT_RUN_MAIN_APK_RESOURCES)
assertThat(buildArtifact.apkData.type.toString()).isEqualTo("MAIN")
}
}