blob: bb3c680c36e260c5e49b61b3b597969037ce0741 [file] [log] [blame]
/*
* Copyright (C) 2014 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.tools.idea.gradle.variant.conflict;
import com.android.builder.model.AndroidProject;
import com.android.tools.idea.gradle.IdeaAndroidProject;
import com.android.tools.idea.gradle.facet.AndroidGradleFacet;
import com.android.tools.idea.gradle.stubs.android.*;
import com.intellij.facet.FacetManager;
import com.intellij.facet.ModifiableFacetModel;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.testFramework.IdeaTestCase;
import org.jetbrains.android.facet.AndroidFacet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.android.model.impl.JpsAndroidModuleProperties;
import org.jetbrains.plugins.gradle.util.GradleConstants;
import java.io.File;
import java.util.List;
/**
* Tests for {@link ConflictSet}
*/
public class ConflictSetTest extends IdeaTestCase {
private Module myLibModule;
private IdeaAndroidProject myApp;
private IdeaAndroidProject myLib;
private String myLibGradlePath;
@Override
protected void setUp() throws Exception {
super.setUp();
myLibModule = createModule("lib");
myLibGradlePath = ":lib";
setUpApp();
setUpLib();
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
setUpMainModuleAsApp();
setUpLibModule();
setUpModuleDependencies();
}
});
}
private void setUpApp() {
File rootDirPath = new File(myProject.getBasePath());
AndroidProjectStub project = new AndroidProjectStub("app");
VariantStub variant = project.addVariant("debug");
myApp = new IdeaAndroidProject(GradleConstants.SYSTEM_ID, myModule.getName(), rootDirPath, project, variant.getName(),
AndroidProject.ARTIFACT_ANDROID_TEST);
}
private void setUpLib() {
File moduleFilePath = new File(myLibModule.getModuleFilePath());
AndroidProjectStub project = new AndroidProjectStub("lib");
project.setIsLibrary(true);
VariantStub variant = project.addVariant("debug");
myLib = new IdeaAndroidProject(GradleConstants.SYSTEM_ID, myModule.getName(), moduleFilePath.getParentFile(), project,
variant.getName(), AndroidProject.ARTIFACT_ANDROID_TEST);
}
private void setUpMainModuleAsApp() {
FacetManager facetManager = FacetManager.getInstance(myModule);
ModifiableFacetModel facetModel = facetManager.createModifiableModel();
try {
AndroidFacet facet = createFacet(facetManager, false);
facet.setAndroidModel(myApp);
facetModel.addFacet(facet);
}
finally {
facetModel.commit();
}
}
private void setUpLibModule() {
FacetManager facetManager = FacetManager.getInstance(myLibModule);
ModifiableFacetModel facetModel = facetManager.createModifiableModel();
try {
AndroidFacet androidFacet = createFacet(facetManager, true);
androidFacet.setAndroidModel(myLib);
facetModel.addFacet(androidFacet);
AndroidGradleFacet gradleFacet = facetManager.createFacet(AndroidGradleFacet.getFacetType(), AndroidGradleFacet.NAME, null);
gradleFacet.getConfiguration().GRADLE_PROJECT_PATH = myLibGradlePath;
facetModel.addFacet(gradleFacet);
}
finally {
facetModel.commit();
}
}
@NotNull
private static AndroidFacet createFacet(@NotNull FacetManager facetManager, boolean library) {
AndroidFacet facet = facetManager.createFacet(AndroidFacet.getFacetType(), AndroidFacet.NAME, null);
JpsAndroidModuleProperties facetState = facet.getProperties();
facetState.ALLOW_USER_CONFIGURATION = false;
facetState.LIBRARY_PROJECT = library;
return facet;
}
private void setUpModuleDependencies() {
// Make module depend on myLibModule.
ModuleRootManager moduleRootManager = ModuleRootManager.getInstance(myModule);
ModifiableRootModel rootModel = moduleRootManager.getModifiableModel();
try {
rootModel.addModuleOrderEntry(myLibModule);
}
finally {
rootModel.commit();
}
}
public void testFindSelectionConflictsWithoutConflict() {
setUpDependencyOnLibrary("debug");
List<Conflict> conflicts = ConflictSet.findConflicts(myProject).getSelectionConflicts();
assertTrue(conflicts.isEmpty());
}
public void testFindSelectionConflictsWithoutEmptyVariantDependency() {
setUpDependencyOnLibrary("");
List<Conflict> conflicts = ConflictSet.findConflicts(myProject).getSelectionConflicts();
assertTrue(conflicts.isEmpty());
}
public void testFindSelectionConflictsWithoutNullVariantDependency() {
setUpDependencyOnLibrary(null);
List<Conflict> conflicts = ConflictSet.findConflicts(myProject).getSelectionConflicts();
assertTrue(conflicts.isEmpty());
}
public void testFindSelectionConflictsWithConflict() {
setUpDependencyOnLibrary("release");
List<Conflict> conflicts = ConflictSet.findConflicts(myProject).getSelectionConflicts();
assertEquals(1, conflicts.size());
Conflict conflict = conflicts.get(0);
assertSame(myLibModule, conflict.getSource());
assertSame("debug", conflict.getSelectedVariant());
List<Conflict.AffectedModule> affectedModules = conflict.getAffectedModules();
assertEquals(1, affectedModules.size());
Conflict.AffectedModule affectedModule = affectedModules.get(0);
assertSame(myModule, affectedModule.getTarget());
assertSame("release", affectedModule.getExpectedVariant());
}
private void setUpDependencyOnLibrary(@Nullable String projectVariant) {
VariantStub selectedVariant = (VariantStub)myApp.getSelectedVariant();
AndroidArtifactStub mainArtifact = selectedVariant.getMainArtifact();
DependenciesStub dependencies = mainArtifact.getDependencies();
File jarFile = new File(myProject.getBasePath(), "file.jar");
AndroidLibraryStub lib = new AndroidLibraryStub(jarFile, jarFile, myLibGradlePath, projectVariant);
dependencies.addLibrary(lib);
}
}