/*
* Copyright (C) 2015 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.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.Lists;
import com.google.common.io.Files;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.List;
/**
* Implementation of TestProject that can create large scale projects with lots of modules.
*/
public class LargeTestProject<T extends GradleModule> implements TestProject {
public static final int SMALL_DEPTH = 4;
public static final int SMALL_BREADTH = 2;
public static final int MEDIUM_DEPTH = 4;
public static final int MEDIUM_BREADTH = 3;
public static final int LARGE_DEPTH = 5;
public static final int LARGE_BREADTH = 4;
public static final int VERY_LARGE_DEPTH = 5;
public static final int VERY_LARGE_BREADTH = 5;
@NonNull
private final GradleModuleFactory factory;
private final int maxDepth;
private final int maxBreadth;
public static final class Builder {
private Class<? extends GradleModule> moduleClass;
private int maxDepth = 1;
private int maxBreadth = 1;
public Builder withModule(@NonNull Class<? extends GradleModule> moduleClass) {
this.moduleClass = moduleClass;
return this;
}
public Builder withDepth(int depth) {
this.maxDepth = depth;
return this;
}
public Builder withBreadth(int breadth) {
this.maxBreadth = breadth;
return this;
}
public LargeTestProject create() throws IOException {
return new LargeTestProject(new GradleModuleFactory(moduleClass), maxDepth, maxBreadth);
}
}
@NonNull
public static Builder builder() {
return new Builder();
}
public LargeTestProject(
@NonNull GradleModuleFactory factory, int maxDepth, int maxBreadth) {
this.factory = factory;
this.maxDepth = maxDepth;
this.maxBreadth = maxBreadth;
}
@Override
public void write(@NonNull File projectDir, @Nullable String buildScriptContent)
throws IOException {
GradleModule gradleModule = createProject(factory, 0, ":", projectDir, "0");
createSettingsGradle(gradleModule, projectDir);
createGradleProperties(projectDir);
Files.write(
buildScriptContent,
new File(projectDir, "build.gradle"),
Charset.defaultCharset());
}
@Override
public boolean containsFullBuildScript() {
return false;
}
private GradleModule createProject(
@NonNull GradleModuleFactory factory,
int depth,
@NonNull String path,
@NonNull File location,
@NonNull String suffix) throws IOException {
List<GradleModule> deps = Lists.newArrayList();
if (depth < maxDepth) {
for (int i = 0 ; i < maxBreadth ; i++) {
String newSuffix = suffix + (i+1);
GradleModule project = createProject(
factory,
depth + 1,
path + "lib" + newSuffix+":",
new File(location, "lib" + newSuffix),
newSuffix);
deps.add(project);
}
}
GradleModule project = factory.createModule(
new File(location, "main" + suffix),
path + "main" + suffix,
deps);
project.create();
return project;
}
private static void createSettingsGradle(
@NonNull GradleModule project,
@NonNull File location) throws IOException {
StringBuilder builder = new StringBuilder();
buildSettingsGradle(project, builder);
Files.write(builder.toString(), new File(location, "settings.gradle"),
Charset.defaultCharset());
}
private static void buildSettingsGradle(
@NonNull GradleModule project,
@NonNull StringBuilder builder) {
builder.append("include '").append(project.getGradlePath()).append("'\n");
for (GradleModule dep : project.getProjectDeps()) {
buildSettingsGradle(dep, builder);
}
}
private static void createGradleProperties(@NonNull File location) throws IOException {
Files.write(
"org.gradle.jvmargs=-Xmx6096m -XX:MaxPermSize=1024m\n" +
"org.gradle.daemon=true\n",
new File(location, "gradle.properties"), Charset.defaultCharset());
}
}