blob: f54071f44ad4661c558a33a0c82d5dadb5763815 [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.tools.idea.gradle.actions;
import com.android.ide.common.gradle.model.IdeAndroidProject;
import com.android.tools.idea.gradle.project.GradleProjectInfo;
import com.android.tools.idea.gradle.project.ProjectStructure;
import com.android.tools.idea.gradle.project.build.invoker.GradleBuildInvoker;
import com.android.tools.idea.gradle.project.build.invoker.TestCompileType;
import com.android.tools.idea.gradle.project.facet.gradle.GradleFacet;
import com.android.tools.idea.gradle.project.model.AndroidModelFeatures;
import com.android.tools.idea.gradle.project.model.AndroidModuleModel;
import com.android.tools.idea.gradle.project.model.GradleModuleModel;
import com.android.tools.idea.gradle.run.OutputBuildAction;
import com.android.tools.idea.gradle.stubs.gradle.GradleProjectStub;
import com.android.tools.idea.testing.Facets;
import com.android.tools.idea.testing.IdeComponents;
import com.google.common.collect.ImmutableList;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.module.Module;
import com.intellij.testFramework.IdeaTestCase;
import org.gradle.tooling.model.GradleProject;
import org.jetbrains.android.facet.AndroidFacet;
import org.jetbrains.annotations.NotNull;
import org.mockito.Mock;
import static com.android.SdkConstants.GRADLE_PATH_SEPARATOR;
import static com.android.builder.model.AndroidProject.PROJECT_TYPE_DYNAMIC_FEATURE;
import static com.android.tools.idea.Projects.getBaseDirPath;
import static com.android.tools.idea.testing.Facets.createAndAddGradleFacet;
import static java.util.Collections.emptyList;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.*;
import static org.mockito.MockitoAnnotations.initMocks;
/**
* Tests for {@link BuildApkAction}.
*/
public class BuildApkActionTest extends IdeaTestCase {
@Mock private GradleProjectInfo myGradleProjectInfo;
@Mock private GradleBuildInvoker myBuildInvoker;
@Mock private ProjectStructure myProjectStructure;
@Mock private AndroidModuleModel myAndroidModel;
@Mock private IdeAndroidProject myIdeAndroidProject;
@Mock private AndroidModuleModel myAndroidModel2;
@Mock private IdeAndroidProject myIdeAndroidProject2;
private BuildApkAction myAction;
@Override
protected void setUp() throws Exception {
super.setUp();
initMocks(this);
new IdeComponents(myProject).replaceProjectService(GradleBuildInvoker.class, myBuildInvoker);
new IdeComponents(myProject).replaceProjectService(GradleProjectInfo.class, myGradleProjectInfo);
new IdeComponents(myProject).replaceProjectService(ProjectStructure.class, myProjectStructure);
myAction = new BuildApkAction();
}
public void testActionPerformed() {
Module app1Module = createModule("app1");
Module app2Module = createModule("app2");
Module[] appModules = {app1Module, app2Module};
when(myProjectStructure.getAppModules()).thenReturn(ImmutableList.copyOf(appModules));
when(myGradleProjectInfo.isBuildWithGradle()).thenReturn(true);
AnActionEvent event = mock(AnActionEvent.class);
when(event.getProject()).thenReturn(getProject());
myAction.actionPerformed(event);
verify(myBuildInvoker).assemble(eq(appModules), eq(TestCompileType.ALL), eq(emptyList()), any(OutputBuildAction.class));
}
public void testActionPerformedForDynamicApp() {
// Setup "app" as a dynamic app with a single feature "feature1"
Module appModule = createModule("app");
setUpModuleAsAndroidModule(appModule, myAndroidModel, myIdeAndroidProject);
Module featureModule = createModule("feature1");
setUpModuleAsAndroidModule(featureModule, myAndroidModel2, myIdeAndroidProject2);
when(myIdeAndroidProject.getDynamicFeatures()).thenReturn(ImmutableList.of(":feature1"));
when(myIdeAndroidProject2.getProjectType()).thenReturn(PROJECT_TYPE_DYNAMIC_FEATURE);
when(myProjectStructure.getAppModules()).thenReturn(ImmutableList.of(appModule));
when(myGradleProjectInfo.isBuildWithGradle()).thenReturn(true);
AnActionEvent event = mock(AnActionEvent.class);
when(event.getProject()).thenReturn(getProject());
myAction.actionPerformed(event);
Module[] allModules = {appModule, featureModule};
verify(myBuildInvoker).assemble(eq(allModules), eq(TestCompileType.ALL), eq(emptyList()), any(OutputBuildAction.class));
}
private static void setUpModuleAsAndroidModule(Module module, AndroidModuleModel androidModel, IdeAndroidProject ideAndroidProject) {
setUpModuleAsGradleModule(module);
when(androidModel.getAndroidProject()).thenReturn(ideAndroidProject);
AndroidModelFeatures androidModelFeatures = mock(AndroidModelFeatures.class);
when(androidModel.getFeatures()).thenReturn(androidModelFeatures);
AndroidFacet androidFacet = Facets.createAndAddAndroidFacet(module);
androidFacet.getConfiguration().setModel(androidModel);
}
private static void setUpModuleAsGradleModule(@NotNull Module module) {
GradleFacet gradleFacet = createAndAddGradleFacet(module);
String gradlePath = GRADLE_PATH_SEPARATOR + module.getName();
gradleFacet.getConfiguration().GRADLE_PROJECT_PATH = gradlePath;
GradleProject gradleProjectStub = new GradleProjectStub(emptyList(), gradlePath, getBaseDirPath(module.getProject()));
GradleModuleModel model = new GradleModuleModel(module.getName(), gradleProjectStub, emptyList(), null, null, null);
gradleFacet.setGradleModuleModel(model);
}
}