blob: c34a875ae5fcb4d966b94b2346c2f6b41bd3056c [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 org.jetbrains.android.facet;
import com.android.builder.model.ProductFlavorContainer;
import com.android.builder.model.SourceProvider;
import com.android.tools.idea.gradle.IdeaAndroidProject;
import com.android.tools.idea.templates.AndroidGradleTestCase;
import com.google.common.collect.Sets;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.android.sdk.AndroidPlatform;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.util.Collection;
import java.util.Set;
import static org.junit.Assume.assumeTrue;
/**
* Test for utility functions provided by IdeaSourceProvider
*
*/
public class IdeaSourceProviderTest extends AndroidGradleTestCase {
private Module myAppModule;
private Module myLibModule;
private AndroidFacet myAppFacet;
private AndroidFacet myLibFacet;
@Override
public void setUp() throws Exception {
super.setUp();
assumeTrue(CAN_SYNC_PROJECTS);
loadProject("projects/projectWithAppandLib");
assertNotNull(myAndroidFacet);
IdeaAndroidProject androidModel = myAndroidFacet.getAndroidModel();
assertNotNull(androidModel);
// Set up modules
for (Module m : ModuleManager.getInstance(getProject()).getModules()) {
if (m.getName().equals("lib")) {
myLibModule = m;
} else if (m.getName().equals("app")) {
myAppModule = m;
}
}
assertNotNull(myLibModule);
assertNotNull(myAppModule);
myAppFacet = AndroidFacet.getInstance(myAppModule);
myLibFacet = AndroidFacet.getInstance(myLibModule);
assertNotNull(myAppFacet);
assertNotNull(myLibFacet);
addAndroidSdk(myLibModule, getTestSdkPath(), getPlatformDir());
addAndroidSdk(myAppModule, getTestSdkPath(), getPlatformDir());
assertNotNull(AndroidPlatform.getInstance(myAppModule));
assertNotNull(AndroidPlatform.getInstance(myLibModule));
}
/** TODO: Move this test to {@link com.android.tools.idea.gradle.IdeaAndroidProjectTest}. */
public void testGetCurrentSourceProviders() throws Exception {
StringBuilder sb = new StringBuilder();
VirtualFile baseDir = getProject().getBaseDir();
for (IdeaSourceProvider provider : IdeaSourceProvider.getCurrentSourceProviders(myAppFacet)) {
sb.append(getStringRepresentation(provider, baseDir));
}
assertEquals("Manifest File: app/src/main/AndroidManifest.xml\n" +
"Java Directories: [app/src/main/java]\n" +
"Res Directories: [app/src/main/res]\n" +
"Assets Directories: []\n" +
"AIDL Directories: []\n" +
"Renderscript Directories: []\n" +
"Jni Directories: []\n" +
"Resources Directories: []\n" +
"Manifest File: null\n" +
"Java Directories: []\n" +
"Res Directories: []\n" +
"Assets Directories: []\n" +
"AIDL Directories: []\n" +
"Renderscript Directories: []\n" +
"Jni Directories: []\n" +
"Resources Directories: []\n" +
"Manifest File: null\n" +
"Java Directories: []\n" +
"Res Directories: []\n" +
"Assets Directories: []\n" +
"AIDL Directories: []\n" +
"Renderscript Directories: []\n" +
"Jni Directories: []\n" +
"Resources Directories: []\n" +
"Manifest File: null\n" +
"Java Directories: []\n" +
"Res Directories: []\n" +
"Assets Directories: []\n" +
"AIDL Directories: []\n" +
"Renderscript Directories: []\n" +
"Jni Directories: []\n" +
"Resources Directories: []\n", sb.toString());
sb = new StringBuilder();
for (IdeaSourceProvider provider : IdeaSourceProvider.getCurrentSourceProviders(myLibFacet)) {
sb.append(getStringRepresentation(provider, baseDir));
}
assertEquals("Manifest File: lib/src/main/AndroidManifest.xml\n" +
"Java Directories: [lib/src/main/java]\n" +
"Res Directories: [lib/src/main/res]\n" +
"Assets Directories: []\n" +
"AIDL Directories: []\n" +
"Renderscript Directories: []\n" +
"Jni Directories: []\n" +
"Resources Directories: []\n" +
"Manifest File: null\n" +
"Java Directories: []\n" +
"Res Directories: []\n" +
"Assets Directories: []\n" +
"AIDL Directories: []\n" +
"Renderscript Directories: []\n" +
"Jni Directories: []\n" +
"Resources Directories: []\n", sb.toString());
}
/** TODO: Move this test to {@link com.android.tools.idea.gradle.IdeaAndroidProjectTest} */
public void testGetCurrentTestSourceProviders() throws Exception {
StringBuilder sb = new StringBuilder();
VirtualFile baseDir = getProject().getBaseDir();
for (IdeaSourceProvider provider : IdeaSourceProvider.getCurrentTestSourceProviders(myAppFacet)) {
sb.append(getStringRepresentation(provider, baseDir));
}
assertEquals("Manifest File: null\n" +
"Java Directories: []\n" +
"Res Directories: []\n" +
"Assets Directories: []\n" +
"AIDL Directories: []\n" +
"Renderscript Directories: []\n" +
"Jni Directories: []\n" +
"Resources Directories: []\n" +
"Manifest File: null\n" +
"Java Directories: []\n" +
"Res Directories: []\n" +
"Assets Directories: []\n" +
"AIDL Directories: []\n" +
"Renderscript Directories: []\n" +
"Jni Directories: []\n" +
"Resources Directories: []\n", sb.toString());
sb = new StringBuilder();
for (IdeaSourceProvider provider : IdeaSourceProvider.getCurrentTestSourceProviders(myLibFacet)) {
sb.append(getStringRepresentation(provider, baseDir));
}
assertEquals("Manifest File: null\n" +
"Java Directories: []\n" +
"Res Directories: []\n" +
"Assets Directories: []\n" +
"AIDL Directories: []\n" +
"Renderscript Directories: []\n" +
"Jni Directories: []\n" +
"Resources Directories: []\n", sb.toString());
}
/** TODO: Move this test to {@link com.android.tools.idea.gradle.IdeaAndroidProjectTest}. */
public void testGetAllSourceProviders() throws Exception {
StringBuilder sb = new StringBuilder();
File baseDir = new File(getProject().getBaseDir().getPath());
for (SourceProvider provider : IdeaSourceProvider.getAllSourceProviders(myAppFacet)) {
sb.append(getStringRepresentation(provider, baseDir));
}
assertEquals("Name: main\n" +
"Manifest File: app/src/main/AndroidManifest.xml\n" +
"Java Directories: [app/src/main/java]\n" +
"Res Directories: [app/src/main/res]\n" +
"Assets Directories: [app/src/main/assets]\n" +
"AIDL Directories: [app/src/main/aidl]\n" +
"Renderscript Directories: [app/src/main/rs]\n" +
"Jni Directories: [app/src/main/jni]\n" +
"Resources Directories: [app/src/main/resources]\n" +
"Name: paid\n" +
"Manifest File: app/src/paid/AndroidManifest.xml\n" +
"Java Directories: [app/src/paid/java]\n" +
"Res Directories: [app/src/paid/res]\n" +
"Assets Directories: [app/src/paid/assets]\n" +
"AIDL Directories: [app/src/paid/aidl]\n" +
"Renderscript Directories: [app/src/paid/rs]\n" +
"Jni Directories: [app/src/paid/jni]\n" +
"Resources Directories: [app/src/paid/resources]\n" +
"Name: basic\n" +
"Manifest File: app/src/basic/AndroidManifest.xml\n" +
"Java Directories: [app/src/basic/java]\n" +
"Res Directories: [app/src/basic/res]\n" +
"Assets Directories: [app/src/basic/assets]\n" +
"AIDL Directories: [app/src/basic/aidl]\n" +
"Renderscript Directories: [app/src/basic/rs]\n" +
"Jni Directories: [app/src/basic/jni]\n" +
"Resources Directories: [app/src/basic/resources]\n" +
"Name: debug\n" +
"Manifest File: app/src/debug/AndroidManifest.xml\n" +
"Java Directories: [app/src/debug/java]\n" +
"Res Directories: [app/src/debug/res]\n" +
"Assets Directories: [app/src/debug/assets]\n" +
"AIDL Directories: [app/src/debug/aidl]\n" +
"Renderscript Directories: [app/src/debug/rs]\n" +
"Jni Directories: [app/src/debug/jni]\n" +
"Resources Directories: [app/src/debug/resources]\n" +
"Name: release\n" +
"Manifest File: app/src/release/AndroidManifest.xml\n" +
"Java Directories: [app/src/release/java]\n" +
"Res Directories: [app/src/release/res]\n" +
"Assets Directories: [app/src/release/assets]\n" +
"AIDL Directories: [app/src/release/aidl]\n" +
"Renderscript Directories: [app/src/release/rs]\n" +
"Jni Directories: [app/src/release/jni]\n" +
"Resources Directories: [app/src/release/resources]\n" +
"Name: paidDebug\n" +
"Manifest File: app/src/paidDebug/AndroidManifest.xml\n" +
"Java Directories: [app/src/paidDebug/java]\n" +
"Res Directories: [app/src/paidDebug/res]\n" +
"Assets Directories: [app/src/paidDebug/assets]\n" +
"AIDL Directories: [app/src/paidDebug/aidl]\n" +
"Renderscript Directories: [app/src/paidDebug/rs]\n" +
"Jni Directories: [app/src/paidDebug/jni]\n" +
"Resources Directories: [app/src/paidDebug/resources]\n" +
"Name: paidRelease\n" +
"Manifest File: app/src/paidRelease/AndroidManifest.xml\n" +
"Java Directories: [app/src/paidRelease/java]\n" +
"Res Directories: [app/src/paidRelease/res]\n" +
"Assets Directories: [app/src/paidRelease/assets]\n" +
"AIDL Directories: [app/src/paidRelease/aidl]\n" +
"Renderscript Directories: [app/src/paidRelease/rs]\n" +
"Jni Directories: [app/src/paidRelease/jni]\n" +
"Resources Directories: [app/src/paidRelease/resources]\n" +
"Name: basicDebug\n" +
"Manifest File: app/src/basicDebug/AndroidManifest.xml\n" +
"Java Directories: [app/src/basicDebug/java]\n" +
"Res Directories: [app/src/basicDebug/res]\n" +
"Assets Directories: [app/src/basicDebug/assets]\n" +
"AIDL Directories: [app/src/basicDebug/aidl]\n" +
"Renderscript Directories: [app/src/basicDebug/rs]\n" +
"Jni Directories: [app/src/basicDebug/jni]\n" +
"Resources Directories: [app/src/basicDebug/resources]\n" +
"Name: basicRelease\n" +
"Manifest File: app/src/basicRelease/AndroidManifest.xml\n" +
"Java Directories: [app/src/basicRelease/java]\n" +
"Res Directories: [app/src/basicRelease/res]\n" +
"Assets Directories: [app/src/basicRelease/assets]\n" +
"AIDL Directories: [app/src/basicRelease/aidl]\n" +
"Renderscript Directories: [app/src/basicRelease/rs]\n" +
"Jni Directories: [app/src/basicRelease/jni]\n" +
"Resources Directories: [app/src/basicRelease/resources]\n", sb.toString());
sb = new StringBuilder();
for (SourceProvider provider : IdeaSourceProvider.getAllSourceProviders(myLibFacet)) {
sb.append(getStringRepresentation(provider, baseDir));
}
assertEquals("Name: main\n" +
"Manifest File: lib/src/main/AndroidManifest.xml\n" +
"Java Directories: [lib/src/main/java]\n" +
"Res Directories: [lib/src/main/res]\n" +
"Assets Directories: [lib/src/main/assets]\n" +
"AIDL Directories: [lib/src/main/aidl]\n" +
"Renderscript Directories: [lib/src/main/rs]\n" +
"Jni Directories: [lib/src/main/jni]\n" +
"Resources Directories: [lib/src/main/resources]\n" +
"Name: debug\n" +
"Manifest File: lib/src/debug/AndroidManifest.xml\n" +
"Java Directories: [lib/src/debug/java]\n" +
"Res Directories: [lib/src/debug/res]\n" +
"Assets Directories: [lib/src/debug/assets]\n" +
"AIDL Directories: [lib/src/debug/aidl]\n" +
"Renderscript Directories: [lib/src/debug/rs]\n" +
"Jni Directories: [lib/src/debug/jni]\n" +
"Resources Directories: [lib/src/debug/resources]\n" +
"Name: release\n" +
"Manifest File: lib/src/release/AndroidManifest.xml\n" +
"Java Directories: [lib/src/release/java]\n" +
"Res Directories: [lib/src/release/res]\n" +
"Assets Directories: [lib/src/release/assets]\n" +
"AIDL Directories: [lib/src/release/aidl]\n" +
"Renderscript Directories: [lib/src/release/rs]\n" +
"Jni Directories: [lib/src/release/jni]\n" +
"Resources Directories: [lib/src/release/resources]\n", sb.toString());
}
public void testFindSourceProvider() throws Exception {
assertNotNull(myAppFacet.getAndroidModel());
VirtualFile moduleFile = myAppFacet.getAndroidModel().getRootDir();
assertNotNull(moduleFile);
// Try finding main flavor
IdeaSourceProvider mainFlavorSourceProvider = myAppFacet.getMainIdeaSourceProvider();
assertNotNull(mainFlavorSourceProvider);
VirtualFile javaMainSrcFile = moduleFile.findFileByRelativePath("src/main/java/com/example/projectwithappandlib/");
assertNotNull(javaMainSrcFile);
Collection<IdeaSourceProvider> providers = IdeaSourceProvider.getIdeaSourceProvidersForFile(myAppFacet, javaMainSrcFile, null);
assertEquals(1, providers.size());
IdeaSourceProvider actualProvider = providers.iterator().next();
assertEquals(mainFlavorSourceProvider.getManifestFile(),
actualProvider.getManifestFile());
// Try finding paid flavor
ProductFlavorContainer paidFlavor = myAppFacet.getAndroidModel().findProductFlavor("paid");
assertNotNull(paidFlavor);
IdeaSourceProvider paidFlavorSourceProvider = IdeaSourceProvider.create(paidFlavor.getSourceProvider());
assertNotNull(paidFlavorSourceProvider);
VirtualFile javaSrcFile = moduleFile.findFileByRelativePath("src/paid/java/com/example/projectwithappandlib/app/paid");
assertNotNull(javaSrcFile);
providers = IdeaSourceProvider.getIdeaSourceProvidersForFile(myAppFacet, javaSrcFile, null);
assertEquals(1, providers.size());
actualProvider = providers.iterator().next();
assertEquals(paidFlavorSourceProvider.getManifestFile(),
actualProvider.getManifestFile());
}
public String getStringRepresentation(@NotNull SourceProvider sourceProvider, @Nullable File baseFile) {
StringBuilder sb = new StringBuilder();
sb.append("Name: ");
sb.append(sourceProvider.getName());
sb.append('\n');
File manifestFile = sourceProvider.getManifestFile();
String manifestPath = null;
if (manifestFile != null) {
if (baseFile != null) {
manifestPath = FileUtil.getRelativePath(baseFile, manifestFile);
} else {
manifestPath = manifestFile.getPath();
}
}
sb.append("Manifest File: ");
sb.append(manifestPath);
sb.append('\n');
sb.append("Java Directories: ");
sb.append(fileSetToString(sourceProvider.getJavaDirectories(), baseFile));
sb.append('\n');
sb.append("Res Directories: ");
sb.append(fileSetToString(sourceProvider.getResDirectories(), baseFile));
sb.append('\n');
sb.append("Assets Directories: ");
sb.append(fileSetToString(sourceProvider.getAssetsDirectories(), baseFile));
sb.append('\n');
sb.append("AIDL Directories: ");
sb.append(fileSetToString(sourceProvider.getAidlDirectories(), baseFile));
sb.append('\n');
sb.append("Renderscript Directories: ");
sb.append(fileSetToString(sourceProvider.getRenderscriptDirectories(), baseFile));
sb.append('\n');
sb.append("Jni Directories: ");
Set<File> jniDirectories = Sets.newHashSet();
jniDirectories.addAll(sourceProvider.getCDirectories());
jniDirectories.addAll(sourceProvider.getCppDirectories());
sb.append(fileSetToString(jniDirectories, baseFile));
sb.append('\n');
sb.append("Resources Directories: ");
sb.append(fileSetToString(sourceProvider.getResourcesDirectories(), baseFile));
sb.append('\n');
return sb.toString();
}
public String getStringRepresentation(@NotNull IdeaSourceProvider sourceProvider, @Nullable VirtualFile baseFile) {
StringBuilder sb = new StringBuilder();
VirtualFile manifestFile = sourceProvider.getManifestFile();
String manifestPath = null;
if (manifestFile != null) {
if (baseFile != null) {
manifestPath = VfsUtilCore.getRelativePath(manifestFile, baseFile, File.separatorChar);
} else {
manifestPath = manifestFile.getPath();
}
}
sb.append("Manifest File: ");
sb.append(manifestPath);
sb.append('\n');
sb.append("Java Directories: ");
sb.append(fileSetToString(sourceProvider.getJavaDirectories(), baseFile));
sb.append('\n');
sb.append("Res Directories: ");
sb.append(fileSetToString(sourceProvider.getResDirectories(), baseFile));
sb.append('\n');
sb.append("Assets Directories: ");
sb.append(fileSetToString(sourceProvider.getAssetsDirectories(), baseFile));
sb.append('\n');
sb.append("AIDL Directories: ");
sb.append(fileSetToString(sourceProvider.getAidlDirectories(), baseFile));
sb.append('\n');
sb.append("Renderscript Directories: ");
sb.append(fileSetToString(sourceProvider.getRenderscriptDirectories(), baseFile));
sb.append('\n');
sb.append("Jni Directories: ");
sb.append(fileSetToString(sourceProvider.getJniDirectories(), baseFile));
sb.append('\n');
sb.append("Resources Directories: ");
sb.append(fileSetToString(sourceProvider.getResourcesDirectories(), baseFile));
sb.append('\n');
return sb.toString();
}
@NotNull
private static String fileSetToString(@NotNull Collection<VirtualFile> files, @Nullable VirtualFile baseFile) {
StringBuilder sb = new StringBuilder();
sb.append("[");
boolean isFirst = true;
for (VirtualFile vf : files) {
String path = baseFile != null ? VfsUtilCore.getRelativePath(vf, baseFile, File.separatorChar) : vf.getPath();
if (!isFirst) {
sb.append(", ");
} else {
isFirst = false;
}
sb.append(path);
}
sb.append("]");
return sb.toString();
}
@NotNull
private static String fileSetToString(@NotNull Collection<File> files, @Nullable File baseFile) {
StringBuilder sb = new StringBuilder();
sb.append("[");
boolean isFirst = true;
for (File f : files) {
String path = baseFile != null ? FileUtil.getRelativePath(baseFile, f) : f.getPath();
if (!isFirst) {
sb.append(", ");
} else {
isFirst = false;
}
sb.append(path);
}
sb.append("]");
return sb.toString();
}
public void testSourceProviderContainsFile() throws Exception {
assertNotNull(myAppFacet.getAndroidModel());
ProductFlavorContainer paidFlavor = myAppFacet.getAndroidModel().findProductFlavor("paid");
assertNotNull(paidFlavor);
IdeaSourceProvider paidFlavorSourceProvider = IdeaSourceProvider.create(paidFlavor.getSourceProvider());
assertNotNull(paidFlavorSourceProvider);
VirtualFile moduleFile = myAppFacet.getAndroidModel().getRootDir();
assertNotNull(moduleFile);
VirtualFile javaSrcFile = moduleFile.findFileByRelativePath("src/paid/java/com/example/projectwithappandlib/app/paid");
assertNotNull(javaSrcFile);
assertTrue(paidFlavorSourceProvider.containsFile(javaSrcFile));
VirtualFile javaMainSrcFile = moduleFile.findFileByRelativePath("src/main/java/com/example/projectwithappandlib/");
assertNotNull(javaMainSrcFile);
assertFalse(paidFlavorSourceProvider.containsFile(javaMainSrcFile));
}
public void testSourceProviderIsContainedByFolder() throws Exception {
assertNotNull(myAppFacet.getAndroidModel());
ProductFlavorContainer paidFlavor = myAppFacet.getAndroidModel().findProductFlavor("paid");
assertNotNull(paidFlavor);
IdeaSourceProvider paidFlavorSourceProvider = IdeaSourceProvider.create(paidFlavor.getSourceProvider());
assertNotNull(paidFlavorSourceProvider);
VirtualFile moduleFile = myAppFacet.getAndroidModel().getRootDir();
assertNotNull(moduleFile);
VirtualFile javaSrcFile = moduleFile.findFileByRelativePath("src/paid/java/com/example/projectwithappandlib/app/paid");
assertNotNull(javaSrcFile);
assertFalse(paidFlavorSourceProvider.isContainedBy(javaSrcFile));
VirtualFile flavorRoot = moduleFile.findFileByRelativePath("src/paid");
assertNotNull(flavorRoot);
assertTrue(paidFlavorSourceProvider.isContainedBy(flavorRoot));
VirtualFile srcFile = moduleFile.findChild("src");
assertNotNull(srcFile);
assertTrue(paidFlavorSourceProvider.isContainedBy(srcFile));
}
}