blob: 5914da2da564b42c6ac5e785254c1495414965dc [file] [log] [blame]
/*
* Copyright (C) 2021 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.integration.common.fixture.model
import com.android.build.gradle.integration.common.fixture.GradleTestProject
import com.android.build.gradle.integration.common.fixture.ModelBuilderV2
import com.android.build.gradle.integration.common.fixture.testprojects.TestProjectBuilder
import com.android.build.gradle.integration.common.fixture.testprojects.TestProjectBuilderImpl
import org.junit.Rule
/**
* Compare models to golden files that contains only the delta to a reference project state.
*
* This is meant to be used as a base class for tests running sync.
*/
abstract class ReferenceModelComparator(
/**
* A lambda that configures the base project state to be compared against
*/
referenceConfig: TestProjectBuilder.() -> Unit,
/**
* A lambda that configures the project with the modification.
* This is applied on top of [referenceConfig]
*/
deltaConfig: TestProjectBuilder.() -> Unit,
/**
* Sync options to be used when syncing both the base state and the modified project state.
*/
private val syncOptions: ModelBuilderV2.() -> ModelBuilderV2 = { this }
) : BaseModelComparator {
private val referenceBuilder = createBaseProject(referenceConfig)
private val deltaBuilder = createBaseProject(referenceConfig).also(deltaConfig)
@get:Rule
val referenceProject = GradleTestProject.builder()
.withName("referenceProject")
.fromTestApp(referenceBuilder)
.create()
@get:Rule
val deltaProject =
GradleTestProject.builder().fromTestApp(deltaBuilder).create()
protected fun modelV2() : ModelBuilderV2 {
return syncOptions(deltaProject.modelV2())
}
fun compareAndroidProjectWith(goldenFileSuffix: String) {
val referenceResult = syncOptions(referenceProject.modelV2()).fetchAndroidProjects()
val result = syncOptions(deltaProject.modelV2()).fetchAndroidProjects()
Comparator(this, result, referenceResult).compare(
model = result.container.singleModel,
referenceModel = referenceResult.container.singleModel,
goldenFile = goldenFileSuffix
)
}
fun compareVariantDependenciesWith(
variantName: String,
goldenFileSuffix: String
) {
val referenceResult = syncOptions(referenceProject.modelV2()).fetchVariantDependencies(variantName)
val result = syncOptions(deltaProject.modelV2()).fetchVariantDependencies(variantName)
Comparator(this, result, referenceResult).compare(
model = result.container.singleModel,
goldenFile = goldenFileSuffix
)
}
companion object {
private fun createBaseProject(action: TestProjectBuilder.() -> Unit): TestProjectBuilderImpl {
val builder = TestProjectBuilderImpl()
action(builder)
return builder
}
}
}