diff options
Diffstat (limited to 'gradle-model/src/test/java/com/android/build')
-rw-r--r-- | gradle-model/src/test/java/com/android/build/gradle/model/AndroidProjectTest.java | 452 |
1 files changed, 297 insertions, 155 deletions
diff --git a/gradle-model/src/test/java/com/android/build/gradle/model/AndroidProjectTest.java b/gradle-model/src/test/java/com/android/build/gradle/model/AndroidProjectTest.java index 8c8bea4..0d0c779 100644 --- a/gradle-model/src/test/java/com/android/build/gradle/model/AndroidProjectTest.java +++ b/gradle-model/src/test/java/com/android/build/gradle/model/AndroidProjectTest.java @@ -19,7 +19,11 @@ package com.android.build.gradle.model; import com.android.annotations.NonNull; import com.android.builder.model.AndroidLibrary; import com.android.builder.model.ProductFlavor; +import com.android.builder.model.SigningConfig; import com.android.builder.model.SourceProvider; +import com.android.builder.signing.KeystoreHelper; +import com.android.prefs.AndroidLocation; +import com.google.common.collect.Maps; import junit.framework.TestCase; import org.gradle.tooling.GradleConnector; import org.gradle.tooling.ProjectConnection; @@ -29,87 +33,31 @@ import java.io.File; import java.net.URISyntaxException; import java.net.URL; import java.security.CodeSource; -import java.util.Arrays; +import java.security.KeyStore; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Set; public class AndroidProjectTest extends TestCase { - public void testBasic() { - // Configure the connector and create the connection - GradleConnector connector = GradleConnector.newConnector(); + private static final Map<String, ProjectData> sProjectModelMap = Maps.newHashMap(); - File projectDir = new File(getTestDir(), "basic"); - connector.forProjectDirectory(projectDir); - - ProjectConnection connection = connector.connect(); - try { - // Load the custom model for the project - AndroidProject model = connection.getModel(AndroidProject.class); - assertNotNull("Model Object null-check", model); - assertEquals("Model Name", "basic", model.getName()); - assertFalse("Library Project", model.isLibrary()); - assertEquals("Compile Target", "android-15", model.getCompileTarget()); - assertFalse("Non empty bootclasspath", model.getBootClasspath().isEmpty()); - - ProductFlavorContainer defaultConfig = model.getDefaultConfig(); - - new SourceProviderTester(model.getName(), projectDir, - "main", defaultConfig.getSourceProvider()) - .test(); - new SourceProviderTester(model.getName(), projectDir, - "instrumentTest", defaultConfig.getTestSourceProvider()) - .test(); - - Map<String, BuildTypeContainer> buildTypes = model.getBuildTypes(); - assertEquals("Build Type Count", 2, buildTypes.size()); - - Map<String, Variant> variants = model.getVariants(); - assertEquals("Variant Count", 2 , variants.size()); - - // debug variant - Variant debugVariant = variants.get("Debug"); - assertNotNull("Debug Variant null-check", debugVariant); - new ProductFlavorTester(debugVariant.getMergedFlavor(), "Debug Merged Flavor") - .setVersionCode(12) - .setVersionName("2.0") - .setMinSdkVersion(16) - .setTargetSdkVersion(16) - .test(); - - // this variant is tested. - assertNotNull("Debug assemble test task null-check", - debugVariant.getAssembleTestTaskName()); - assertNotNull("Debug test output file null-check", debugVariant.getOutputTestFile()); - assertTrue("Debug signed check", debugVariant.isSigned()); - - // release variant, not tested. - Variant releaseVariant = variants.get("Release"); - assertNotNull("Release Variant null-check", releaseVariant); - - assertNull("Release assemble test task null-check", - releaseVariant.getAssembleTestTaskName()); - assertNull("Release test output file null-check", releaseVariant.getOutputTestFile()); - assertFalse("Release signed check", releaseVariant.isSigned()); - - Dependencies dependencies = model.getVariants().get("Debug").getDependencies(); - assertNotNull(dependencies); - assertEquals(2, dependencies.getJars().size()); - assertEquals(1, dependencies.getLibraries().size()); - assertTrue(dependencies.getProjectDependenciesPath().isEmpty()); + private static final class ProjectData { + AndroidProject model; + File projectDir; + } - } finally { - // Clean up - connection.close(); + private ProjectData getModelForProject(String projectName) { + ProjectData projectData = sProjectModelMap.get(projectName); + if (projectData != null) { + return projectData; } - } - public void testMigrated() { // Configure the connector and create the connection GradleConnector connector = GradleConnector.newConnector(); - File projectDir = new File(getTestDir(), "migrated"); + File projectDir = new File(getTestDir(), projectName); connector.forProjectDirectory(projectDir); ProjectConnection connection = connector.connect(); @@ -117,114 +65,224 @@ public class AndroidProjectTest extends TestCase { // Load the custom model for the project AndroidProject model = connection.getModel(AndroidProject.class); assertNotNull("Model Object null-check", model); - assertEquals("Model Name", "migrated", model.getName()); - assertFalse("Library Project", model.isLibrary()); - - ProductFlavorContainer defaultConfig = model.getDefaultConfig(); - - new SourceProviderTester(model.getName(), projectDir, - "main", defaultConfig.getSourceProvider()) - .setJavaDir("src") - .setResourcesDir("src") - .setAidlDir("src") - .setRenderscriptDir("src") - .setResDir("res") - .setAssetsDir("assets") - .setManifestFile("AndroidManifest.xml") - .test(); - - new SourceProviderTester(model.getName(), projectDir, - "instrumentTest", defaultConfig.getTestSourceProvider()) - .setJavaDir("tests/java") - .setResourcesDir("tests/resources") - .setAidlDir("tests/aidl") - .setJniDir("tests/jni") - .setRenderscriptDir("tests/rs") - .setResDir("tests/res") - .setAssetsDir("tests/assets") - .setManifestFile("tests/AndroidManifest.xml") - .test(); + assertEquals("Model Name", projectName, model.getName()); + + projectData = new ProjectData(); + projectData.model = model; + projectData.projectDir = projectDir; + + sProjectModelMap.put(projectName, projectData); + + return projectData; } finally { - // Clean up connection.close(); } } - public void testRenamedApk() { - // Configure the connector and create the connection - GradleConnector connector = GradleConnector.newConnector(); + public void testBasic() { + // Load the custom model for the project + ProjectData projectData = getModelForProject("basic"); - File projectDir = new File(getTestDir(), "renamedApk"); - connector.forProjectDirectory(projectDir); + AndroidProject model = projectData.model; - ProjectConnection connection = connector.connect(); - try { - // Load the custom model for the project - AndroidProject model = connection.getModel(AndroidProject.class); - assertNotNull("Model Object null-check", model); - assertEquals("Model Name", "renamedApk", model.getName()); + assertFalse("Library Project", model.isLibrary()); + assertEquals("Compile Target", "android-15", model.getCompileTarget()); + assertFalse("Non empty bootclasspath", model.getBootClasspath().isEmpty()); + } - Map<String, Variant> variants = model.getVariants(); - assertEquals("Variant Count", 2 , variants.size()); + public void testBasicSourceProviders() throws Exception { + // Load the custom model for the project + ProjectData projectData = getModelForProject("basic"); - File buildDir = new File(projectDir, "build"); + AndroidProject model = projectData.model; + File projectDir = projectData.projectDir; - for (Variant variant : variants.values()) { - assertEquals("Output file for " + variant.getName(), - new File(buildDir, variant.getName() + ".apk"), - variant.getOutputFile()); - } + ProductFlavorContainer defaultConfig = model.getDefaultConfig(); - } finally { - // Clean up - connection.close(); - } + new SourceProviderTester(model.getName(), projectDir, + "main", defaultConfig.getSourceProvider()) + .test(); + new SourceProviderTester(model.getName(), projectDir, + "instrumentTest", defaultConfig.getTestSourceProvider()) + .test(); + + Map<String, BuildTypeContainer> buildTypes = model.getBuildTypes(); + assertEquals("Build Type Count", 2, buildTypes.size()); } - public void testFlavors() { - // Configure the connector and create the connection - GradleConnector connector = GradleConnector.newConnector(); + public void testBasicVariantDetails() throws Exception { + // Load the custom model for the project + ProjectData projectData = getModelForProject("basic"); + + AndroidProject model = projectData.model; + + Map<String, Variant> variants = model.getVariants(); + assertEquals("Variant Count", 2 , variants.size()); + + // debug variant + Variant debugVariant = variants.get("Debug"); + assertNotNull("Debug Variant null-check", debugVariant); + new ProductFlavorTester(debugVariant.getMergedFlavor(), "Debug Merged Flavor") + .setVersionCode(12) + .setVersionName("2.0") + .setMinSdkVersion(16) + .setTargetSdkVersion(16) + .test(); + + ArtifactInfo debugMainInfo = debugVariant.getMainArtifactInfo(); + assertNotNull("Debug main info null-check", debugMainInfo); + assertEquals("Debug package name", "com.android.tests.basic.debug", + debugMainInfo.getPackageName()); + assertTrue("Debug signed check", debugMainInfo.isSigned()); + assertEquals("Debug signingConfig name", "myConfig", debugMainInfo.getSigningConfigName()); + + // this variant is tested. + ArtifactInfo debugTestInfo = debugVariant.getTestArtifactInfo(); + assertNotNull("Test info null-check", debugTestInfo); + assertEquals("Test package name", "com.android.tests.basic.debug.test", + debugTestInfo.getPackageName()); + assertNotNull("Test output file null-check", debugTestInfo.getOutputFile()); + assertTrue("Test signed check", debugTestInfo.isSigned()); + assertEquals("Test signingConfig name", "myConfig", debugTestInfo.getSigningConfigName()); + + // release variant, not tested. + Variant releaseVariant = variants.get("Release"); + assertNotNull("Release Variant null-check", releaseVariant); + + ArtifactInfo relMainInfo = releaseVariant.getMainArtifactInfo(); + assertNotNull("Release main info null-check", relMainInfo); + assertEquals("Release package name", "com.android.tests.basic", + relMainInfo.getPackageName()); + assertFalse("Release signed check", relMainInfo.isSigned()); + assertNull("Release signingConfig name", relMainInfo.getSigningConfigName()); + + ArtifactInfo relTestInfo = releaseVariant.getTestArtifactInfo(); + assertNull("Release test info null-check", relTestInfo); + + // check debug dependencies + Dependencies dependencies = debugMainInfo.getDependencies(); + assertNotNull(dependencies); + assertEquals(2, dependencies.getJars().size()); + assertEquals(1, dependencies.getLibraries().size()); + assertTrue(dependencies.getProjectDependenciesPath().isEmpty()); + } - File projectDir = new File(getTestDir(), "flavors"); - connector.forProjectDirectory(projectDir); + public void testBasicSigningConfigs() throws Exception { + // Load the custom model for the project + ProjectData projectData = getModelForProject("basic"); - ProjectConnection connection = connector.connect(); - try { - // Load the custom model for the project - AndroidProject model = connection.getModel(AndroidProject.class); - assertNotNull("Model Object null-check", model); - assertEquals("Model Name", "flavors", model.getName()); - assertFalse("Library Project", model.isLibrary()); + AndroidProject model = projectData.model; - ProductFlavorContainer defaultConfig = model.getDefaultConfig(); + assertEquals("Number of signingConfig", 2, model.getSigningConfigs().size()); - new SourceProviderTester(model.getName(), projectDir, - "main", defaultConfig.getSourceProvider()) - .test(); - new SourceProviderTester(model.getName(), projectDir, - "instrumentTest", defaultConfig.getTestSourceProvider()) - .test(); + SigningConfig debugSigningConfig = model.getSigningConfigs().get(0); + new SigningConfigTester(debugSigningConfig, "debug", true).test(); - Map<String, BuildTypeContainer> buildTypes = model.getBuildTypes(); - assertEquals("Build Type Count", 2, buildTypes.size()); + SigningConfig mySigningConfig = model.getSigningConfigs().get(1); + new SigningConfigTester(mySigningConfig, "myConfig", true) + .setStoreFile(new File(projectData.projectDir, "debug.keystore")) + .test(); - Map<String, Variant> variants = model.getVariants(); - assertEquals("Variant Count", 8 , variants.size()); + } - Variant f1faDebugVariant = variants.get("F1FaDebug"); - assertNotNull("F1faDebug Variant null-check", f1faDebugVariant); - new ProductFlavorTester(f1faDebugVariant.getMergedFlavor(), "F1faDebug Merged Flavor") - .test(); - new VariantTester(f1faDebugVariant, projectDir, "flavors-f1fa-debug-unaligned.apk").test(); + public void testMigrated() throws Exception { + // Load the custom model for the project + ProjectData projectData = getModelForProject("migrated"); + + AndroidProject model = projectData.model; + File projectDir = projectData.projectDir; + + assertNotNull("Model Object null-check", model); + assertEquals("Model Name", "migrated", model.getName()); + assertFalse("Library Project", model.isLibrary()); + + ProductFlavorContainer defaultConfig = model.getDefaultConfig(); + + new SourceProviderTester(model.getName(), projectDir, + "main", defaultConfig.getSourceProvider()) + .setJavaDir("src") + .setResourcesDir("src") + .setAidlDir("src") + .setRenderscriptDir("src") + .setResDir("res") + .setAssetsDir("assets") + .setManifestFile("AndroidManifest.xml") + .test(); + + new SourceProviderTester(model.getName(), projectDir, + "instrumentTest", defaultConfig.getTestSourceProvider()) + .setJavaDir("tests/java") + .setResourcesDir("tests/resources") + .setAidlDir("tests/aidl") + .setJniDir("tests/jni") + .setRenderscriptDir("tests/rs") + .setResDir("tests/res") + .setAssetsDir("tests/assets") + .setManifestFile("tests/AndroidManifest.xml") + .test(); + } + public void testRenamedApk() throws Exception { + // Load the custom model for the project + ProjectData projectData = getModelForProject("renamedApk"); - } finally { - // Clean up - connection.close(); + AndroidProject model = projectData.model; + File projectDir = projectData.projectDir; + + assertNotNull("Model Object null-check", model); + assertEquals("Model Name", "renamedApk", model.getName()); + + Map<String, Variant> variants = model.getVariants(); + assertEquals("Variant Count", 2 , variants.size()); + + File buildDir = new File(projectDir, "build"); + + for (Variant variant : variants.values()) { + ArtifactInfo mainInfo = variant.getMainArtifactInfo(); + assertNotNull( + "Null-check on mainArtifactInfo for " + variant.getDisplayName(), + mainInfo); + + assertEquals("Output file for " + variant.getName(), + new File(buildDir, variant.getName() + ".apk"), + mainInfo.getOutputFile()); } } + public void testFlavors() { + // Load the custom model for the project + ProjectData projectData = getModelForProject("flavors"); + + AndroidProject model = projectData.model; + File projectDir = projectData.projectDir; + + assertNotNull("Model Object null-check", model); + assertEquals("Model Name", "flavors", model.getName()); + assertFalse("Library Project", model.isLibrary()); + + ProductFlavorContainer defaultConfig = model.getDefaultConfig(); + + new SourceProviderTester(model.getName(), projectDir, + "main", defaultConfig.getSourceProvider()) + .test(); + new SourceProviderTester(model.getName(), projectDir, + "instrumentTest", defaultConfig.getTestSourceProvider()) + .test(); + + Map<String, BuildTypeContainer> buildTypes = model.getBuildTypes(); + assertEquals("Build Type Count", 2, buildTypes.size()); + + Map<String, Variant> variants = model.getVariants(); + assertEquals("Variant Count", 8 , variants.size()); + + Variant f1faDebugVariant = variants.get("F1FaDebug"); + assertNotNull("F1faDebug Variant null-check", f1faDebugVariant); + new ProductFlavorTester(f1faDebugVariant.getMergedFlavor(), "F1faDebug Merged Flavor") + .test(); + new VariantTester(f1faDebugVariant, projectDir, "flavors-f1fa-debug-unaligned.apk").test(); + } + public void testTicTacToe() { // Configure the connector and create the connection GradleConnector connector = GradleConnector.newConnector(); @@ -254,7 +312,7 @@ public class AndroidProjectTest extends TestCase { assertEquals("Library Project", "lib".equals(name), androidProject.isLibrary()); if (!"lib".equals(name)) { - Dependencies dependencies = androidProject.getVariants().get("Debug").getDependencies(); + Dependencies dependencies = androidProject.getVariants().get("Debug").getMainArtifactInfo().getDependencies(); assertNotNull(dependencies); List<AndroidLibrary> libs = dependencies.getLibraries(); @@ -315,7 +373,7 @@ public class AndroidProjectTest extends TestCase { Variant flavor1Debug = variants.get("Flavor1Debug"); assertNotNull(flavor1Debug); - Dependencies dependencies = flavor1Debug.getDependencies(); + Dependencies dependencies = flavor1Debug.getMainArtifactInfo().getDependencies(); assertNotNull(dependencies); List<AndroidLibrary> libs = dependencies.getLibraries(); assertNotNull(libs); @@ -331,7 +389,7 @@ public class AndroidProjectTest extends TestCase { Variant flavor2Debug = variants.get("Flavor2Debug"); assertNotNull(flavor2Debug); - dependencies = flavor2Debug.getDependencies(); + dependencies = flavor2Debug.getMainArtifactInfo().getDependencies(); assertNotNull(dependencies); libs = dependencies.getLibraries(); assertNotNull(libs); @@ -585,10 +643,94 @@ public class AndroidProjectTest extends TestCase { String variantName = variant.getName(); File build = new File(projectDir, "build"); File apk = new File(build, "apk/" + outputFileName); - assertEquals(variantName + " output", apk, variant.getOutputFile()); + assertEquals(variantName + " output", apk, variant.getMainArtifactInfo().getOutputFile()); - List<File> sourceFolders = variant.getGeneratedSourceFolders(); + List<File> sourceFolders = variant.getMainArtifactInfo().getGeneratedSourceFolders(); assertEquals("Gen src Folder count", 4, sourceFolders.size()); } } + + private static final class SigningConfigTester { + + public static final String DEFAULT_PASSWORD = "android"; + public static final String DEFAULT_ALIAS = "AndroidDebugKey"; + + @NonNull private final SigningConfig signingConfig; + @NonNull private final String name; + private File storeFile = null; + private String storePassword = null; + private String keyAlias = null; + private String keyPassword = null; + private String storeType = KeyStore.getDefaultType(); + private boolean isSigningReady = false; + + SigningConfigTester(@NonNull SigningConfig signingConfig, @NonNull String name, + boolean isDebug) throws AndroidLocation.AndroidLocationException { + assertNotNull(String.format("SigningConfig '%s' null-check", name), signingConfig); + this.signingConfig = signingConfig; + this.name = name; + + if (isDebug) { + storeFile = new File(KeystoreHelper.defaultDebugKeystoreLocation()); + storePassword = DEFAULT_PASSWORD; + keyAlias = DEFAULT_ALIAS; + keyPassword = DEFAULT_PASSWORD; + isSigningReady = true; + } + } + + SigningConfigTester setStoreFile(File storeFile) { + this.storeFile = storeFile; + return this; + } + + SigningConfigTester setStorePassword(String storePassword) { + this.storePassword = storePassword; + return this; + } + + SigningConfigTester setKeyAlias(String keyAlias) { + this.keyAlias = keyAlias; + return this; + } + + SigningConfigTester setKeyPassword(String keyPassword) { + this.keyPassword = keyPassword; + return this; + } + + SigningConfigTester setStoreType(String storeType) { + this.storeType = storeType; + return this; + } + + SigningConfigTester setSigningReady(boolean isSigningReady) { + this.isSigningReady = isSigningReady; + return this; + } + + void test() { + assertEquals("SigningConfig name", name, signingConfig.getName()); + + assertEquals(String.format("SigningConfig '%s' storeFile", name), + storeFile, signingConfig.getStoreFile()); + + assertEquals(String.format("SigningConfig '%s' storePassword", name), + storePassword, signingConfig.getStorePassword()); + + String scAlias = signingConfig.getKeyAlias(); + assertEquals(String.format("SigningConfig '%s' keyAlias", name), + keyAlias != null ? keyAlias.toLowerCase(Locale.getDefault()) : keyAlias, + scAlias != null ? scAlias.toLowerCase(Locale.getDefault()) : scAlias); + + assertEquals(String.format("SigningConfig '%s' keyPassword", name), + keyPassword, signingConfig.getKeyPassword()); + + assertEquals(String.format("SigningConfig '%s' storeType", name), + storeType, signingConfig.getStoreType()); + + assertEquals(String.format("SigningConfig '%s' isSigningReady", name), + isSigningReady, signingConfig.isSigningReady()); + } + } } |