| /* |
| * 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 |
| } |
| } |
| } |