blob: 4f89e807f6225e27facdba526b2d4bd5437dbc6b [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.build.gradle.integration.application;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import com.android.AndroidProjectTypes;
import com.android.build.api.variant.VariantOutputConfiguration;
import com.android.build.api.variant.impl.BuiltArtifactImpl;
import com.android.build.api.variant.impl.BuiltArtifactsImpl;
import com.android.build.api.variant.impl.BuiltArtifactsLoaderImpl;
import com.android.build.gradle.integration.common.category.SmokeTests;
import com.android.build.gradle.integration.common.fixture.BaseGradleExecutor;
import com.android.build.gradle.integration.common.fixture.GradleTestProject;
import com.android.build.gradle.integration.common.fixture.ModelContainer;
import com.android.build.gradle.integration.common.utils.AndroidProjectUtils;
import com.android.build.gradle.integration.common.utils.ProjectBuildOutputUtils;
import com.android.build.gradle.integration.common.utils.TestFileUtils;
import com.android.build.gradle.options.BooleanOption;
import com.android.builder.core.BuilderConstants;
import com.android.builder.model.AaptOptions;
import com.android.builder.model.AndroidArtifact;
import com.android.builder.model.AndroidProject;
import com.android.builder.model.JavaCompileOptions;
import com.android.builder.model.SyncIssue;
import com.android.builder.model.Variant;
import com.android.builder.model.VariantBuildInformation;
import com.google.common.truth.Truth;
import java.io.File;
import java.util.Map;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import org.gradle.api.JavaVersion;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
/**
* Assemble tests for basic.
*/
@Category(SmokeTests.class)
public class BasicTest {
@ClassRule
public static GradleTestProject project =
GradleTestProject.builder()
.fromTestProject("basic")
// http://b/149978740
.addGradleProperties(
BooleanOption.INCLUDE_DEPENDENCY_INFO_IN_APKS.getPropertyName()
+ "=false")
.create();
public static AndroidProject model;
@BeforeClass
public static void getModel() throws Exception {
// basic project overwrites buildConfigField which emits a sync warning
project.execute("clean", "assembleDebug", "assembleRelease");
ModelContainer<AndroidProject> container =
project.model().ignoreSyncIssues().fetchAndroidProjects();
model = container.getOnlyModel();
container
.getOnlyModelSyncIssues()
.forEach(
issue -> {
assertThat(issue.getSeverity()).isEqualTo(SyncIssue.SEVERITY_WARNING);
assertThat(issue.getMessage())
.containsMatch(Pattern.compile(".*value is being replaced.*"));
});
}
@AfterClass
public static void cleanUp() {
project = null;
model = null;
}
@Test
public void report() throws Exception {
project.executor()
// https://github.com/gradle/gradle/issues/12871
.withConfigurationCaching(BaseGradleExecutor.ConfigurationCaching.OFF)
.run("androidDependencies");
}
@Test
public void basicModel() {
assertNotEquals(
"Library Project",
model.getProjectType(),
AndroidProjectTypes.PROJECT_TYPE_LIBRARY);
assertEquals("Project Type", AndroidProjectTypes.PROJECT_TYPE_APP, model.getProjectType());
assertEquals(
"Compile Target", GradleTestProject.getCompileSdkHash(), model.getCompileTarget());
assertFalse("Non empty bootclasspath", model.getBootClasspath().isEmpty());
assertNotNull("aaptOptions not null", model.getAaptOptions());
assertEquals(
"aaptOptions namespacing",
AaptOptions.Namespacing.DISABLED,
model.getAaptOptions().getNamespacing());
// Since source and target compatibility are not explicitly set in the build.gradle,
// the default value depends on the JDK used.
JavaVersion expected = JavaVersion.VERSION_1_8;
JavaCompileOptions javaCompileOptions = model.getJavaCompileOptions();
assertEquals(
expected.toString(),
javaCompileOptions.getSourceCompatibility());
assertEquals(
expected.toString(),
javaCompileOptions.getTargetCompatibility());
assertEquals("UTF-8", javaCompileOptions.getEncoding());
}
@Test
public void sourceProvidersModel() {
AndroidProjectUtils.testDefaultSourceSets(model, project.getProjectDir());
// test the source provider for the artifacts
for (Variant variant : model.getVariants()) {
AndroidArtifact artifact = variant.getMainArtifact();
assertNull(artifact.getVariantSourceProvider());
assertNull(artifact.getMultiFlavorSourceProvider());
}
}
@Test
public void checkDebugAndReleaseOutputHaveDifferentNames() {
Truth.assertThat(model.getVariantsBuildInformation()).named("variant count").hasSize(2);
// debug variant
VariantBuildInformation debugVariant =
AndroidProjectUtils.getVariantBuildInformationByName(model, BuilderConstants.DEBUG);
// release variant
VariantBuildInformation releaseVariant =
AndroidProjectUtils.getVariantBuildInformationByName(
model, BuilderConstants.RELEASE);
String debugFile = ProjectBuildOutputUtils.getSingleOutputFile(debugVariant);
String releaseFile = ProjectBuildOutputUtils.getSingleOutputFile(releaseVariant);
Assert.assertFalse("debug: $debugFile / release: $releaseFile", debugFile == releaseFile);
}
@Test
public void weDontFailOnLicenceDotTxtWhenPackagingDependencies() throws Exception {
project.execute("assembleAndroidTest");
}
@Test
public void testBuildOutputModel() throws Exception {
project.execute("assemble", "assembleDebugAndroidTest", "testDebugUnitTest");
Map<String, AndroidProject> multi =
project.model().ignoreSyncIssues().fetchAndroidProjects().getOnlyModelMap();
AndroidProject mainModule = multi.get(":");
assertThat(mainModule.getVariantsBuildInformation()).hasSize(2);
assertThat(
mainModule.getVariantsBuildInformation().stream()
.map(VariantBuildInformation::getVariantName)
.collect(Collectors.toList()))
.containsExactly("debug", "release");
for (VariantBuildInformation variantBuildOutput :
mainModule.getVariantsBuildInformation()) {
assertThat(variantBuildOutput.getAssembleTaskName()).contains("assemble");
assertThat(variantBuildOutput.getAssembleTaskOutputListingFile()).isNotNull();
File listingFile = new File(variantBuildOutput.getAssembleTaskOutputListingFile());
BuiltArtifactsImpl builtArtifacts =
BuiltArtifactsLoaderImpl.loadFromFile(
listingFile, listingFile.getParentFile().toPath());
assertThat(builtArtifacts).isNotNull();
assertThat(builtArtifacts.getElements()).hasSize(1);
BuiltArtifactImpl built = builtArtifacts.getElements().iterator().next();
assertThat(new File(built.getOutputFile()).exists()).isTrue();
assertThat(built.getVariantOutputConfiguration().getFilters()).isEmpty();
assertThat(built.getVariantOutputConfiguration().getOutputType())
.isEqualTo(VariantOutputConfiguration.OutputType.SINGLE);
}
}
@Test
public void testRenderscriptDidNotRun() throws Exception {
// Execute renderscript task and check if it was skipped
project.execute("compileDebugRenderscript");
assertThat(
project.getBuildResult()
.getTask(":compileDebugRenderscript")
.getExecutionState()
.toString())
.isEqualTo("SKIPPED");
}
@Test
public void testFlatDirWarning() throws Exception {
TestFileUtils.appendToFile(
project.getBuildFile(), "repositories { flatDir { dirs \"libs\" } }");
project.executor().run("clean", "assembleDebug");
ModelContainer<AndroidProject> onlyModel =
project.model().ignoreSyncIssues(SyncIssue.SEVERITY_WARNING).fetchAndroidProjects();
assertThat(
onlyModel.getOnlyModelSyncIssues().stream()
.map(syncIssue -> syncIssue.getMessage())
.filter(syncIssues -> syncIssues.contains("flatDir"))
.collect(Collectors.toList())
.size())
.isEqualTo(1);
}
}