blob: 56ce8058e89c4bff2906581862904d259b080a8e [file] [log] [blame]
package com.android.build.gradle.integration.common.fixture.app;
import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
import com.android.build.gradle.integration.common.fixture.TestProject;
import com.google.common.collect.Maps;
import com.google.common.io.Files;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Map;
/**
* A TestProject containing multiple TestProject as modules.
*/
public class MultiModuleTestProject implements TestProject {
private Map<String, TestProject> subprojects;
/**
* Creates a MultiModuleTestProject.
*
* @param subprojects a map with gradle project path as key and the corresponding TestProject as
* value.
*/
public MultiModuleTestProject(Map<String, TestProject> subprojects) {
this.subprojects = Maps.newHashMap(subprojects);
}
/**
* Creates a MultiModuleTestProject with multiple subproject of the same TestProject.
*
* @param baseName Base name of the subproject. Actual project name will be baseName + index.
* @param subproject A TestProject.
* @param count Number of subprojects to create.
*/
public MultiModuleTestProject(String baseName, TestProject subproject, int count) {
subprojects = Maps.newHashMapWithExpectedSize(count);
for (int i = 0; i < count; i++) {
subprojects.put(baseName + i, subproject);
}
}
/**
* Return the test project with the given project path.
*/
public TestProject getSubproject(String subprojectPath) {
return subprojects.get(subprojectPath);
}
@Override
public void write(
@NonNull final File projectDir,
@Nullable final String buildScriptContent) throws IOException {
for (Map.Entry<String, ? extends TestProject> entry : subprojects.entrySet()) {
String subprojectPath = entry.getKey();
TestProject subproject = entry.getValue();
File subprojectDir = new File(projectDir, convertGradlePathToDirectory(subprojectPath));
if (!subprojectDir.exists()) {
subprojectDir.mkdirs();
assert subprojectDir.isDirectory();
}
subproject.write(subprojectDir, null);
}
StringBuilder builder = new StringBuilder();
for (String subprojectName : subprojects.keySet()) {
builder.append("include '").append(subprojectName).append("'\n");
}
Files.write(builder.toString(),
new File(projectDir, "settings.gradle"),
Charset.defaultCharset());
Files.write(buildScriptContent,
new File(projectDir, "build.gradle"),
Charset.defaultCharset());
}
@Override
public boolean containsFullBuildScript() {
return false;
}
private static String convertGradlePathToDirectory(String gradlePath) {
return gradlePath.replace(":", "/");
}
}