Skip to content

Commit

Permalink
Add IDE provisioning options
Browse files Browse the repository at this point in the history
  • Loading branch information
6hundreds committed Jan 22, 2024
1 parent 169bba0 commit 343774f
Show file tree
Hide file tree
Showing 7 changed files with 140 additions and 32 deletions.
44 changes: 33 additions & 11 deletions src/main/java/org/gradle/profiler/ScenarioLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,8 @@ class ScenarioLoader {
private static final String ANDROID_STUDIO_SYNC = "android-studio-sync";
private static final String ANDROID_STUDIO_JVM_ARGS = "studio-jvm-args";
private static final String ANDROID_STUDIO_IDEA_PROPERTIES = "idea-properties";
private static final String IDE_VERSION = "ide-version";
private static final String IDE_TYPE = "ide-type";
private static final String JVM_ARGS = "jvm-args";

private static final Map<String, BuildMutatorConfigurator> BUILD_MUTATOR_CONFIGURATORS = ImmutableMap.<String, BuildMutatorConfigurator>builder()
Expand Down Expand Up @@ -310,7 +312,10 @@ private static StudioGradleScenarioDefinition newStudioGradleScenarioDefinition(
Config androidStudioSync = scenario.getConfig(ANDROID_STUDIO_SYNC);
List<String> studioJvmArgs = ConfigUtil.strings(androidStudioSync, ANDROID_STUDIO_JVM_ARGS, ImmutableList.of("-Xms256m", "-Xmx4096m"));
List<String> ideaProperties = ConfigUtil.strings(androidStudioSync, ANDROID_STUDIO_IDEA_PROPERTIES, Collections.emptyList());
return new StudioGradleScenarioDefinition(gradleScenarioDefinition, studioJvmArgs, ideaProperties);
String ideType = ConfigUtil.string(androidStudioSync, IDE_TYPE, null);
String ideVersion = ConfigUtil.string(androidStudioSync, IDE_VERSION, null);

return new StudioGradleScenarioDefinition(gradleScenarioDefinition, studioJvmArgs, ideaProperties, ideType, ideVersion);
}

private static List<BuildMutator> getMutators(Config scenario, String scenarioName, InvocationSettings settings, int warmUpCount, int buildCount) {
Expand Down Expand Up @@ -465,16 +470,7 @@ private static BuildAction getBuildAction(Config scenario, String scenarioName,
List<String> tasks = ConfigUtil.strings(scenario, TASKS);

if (sync) {
if (toolingApi != null) {
throw new IllegalArgumentException(String.format("Scenario '%s': Cannot load tooling model and Android studio sync in same scenario.", scenarioName));
}
if (!tasks.isEmpty()) {
throw new IllegalArgumentException(String.format("Scenario '%s': Cannot run tasks and Android studio sync in same scenario.", scenarioName));
}
if (invocationSettings.getStudioInstallDir() == null) {
throw new IllegalArgumentException("Android Studio installation directory should be specified using --studio-install-dir when measuring Android studio sync.");
}
return new AndroidStudioSyncAction();
return getAndroidStudioSyncAction(scenario, scenarioName, invocationSettings, toolingApi, tasks);
}

if (toolingApi != null) {
Expand All @@ -496,6 +492,32 @@ private static BuildAction getBuildAction(Config scenario, String scenarioName,
}
}

private static BuildAction getAndroidStudioSyncAction(
Config scenario,
String scenarioName,
InvocationSettings invocationSettings,
Config toolingApiScenario,
List<String> tasks
) {
Config sync = scenario.getConfig(ANDROID_STUDIO_SYNC);
String ideType = ConfigUtil.string(sync, IDE_TYPE, null);
String ideVersion = ConfigUtil.string(sync, IDE_VERSION, null);

boolean isStudioProvisioningSpecified = ideType != null && ideVersion != null;
boolean isStudioDirSpecified = invocationSettings.getStudioInstallDir() == null;

if (toolingApiScenario != null) {
throw new IllegalArgumentException(String.format("Scenario '%s': Cannot load tooling model and Android studio sync in same scenario.", scenarioName));
}
if (!tasks.isEmpty()) {
throw new IllegalArgumentException(String.format("Scenario '%s': Cannot run tasks and Android studio sync in same scenario.", scenarioName));
}
if (!isStudioDirSpecified && !isStudioProvisioningSpecified) {
throw new IllegalArgumentException("Android Studio installation directory should be specified using --studio-install-dir when measuring Android studio sync.");
}
return new AndroidStudioSyncAction();
}

private static org.gradle.tooling.BuildAction<?> getToolingAction(Config config, File scenarioFile) {
Class<?> actionType = loadType(config, ACTION, "tooling action", scenarioFile);
if (actionType == null) {
Expand Down
11 changes: 8 additions & 3 deletions src/main/java/org/gradle/profiler/studio/StudioGradleClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Supplier;

import static org.gradle.profiler.client.protocol.messages.StudioRequest.StudioRequestType.*;
import static org.gradle.profiler.client.protocol.messages.StudioSyncRequestCompleted.StudioSyncRequestResult.FAILED;
Expand All @@ -50,17 +51,21 @@ public enum CleanCacheMode {
private final StudioSandbox sandbox;
private boolean isFirstRun;

public StudioGradleClient(StudioGradleBuildConfiguration buildConfiguration, InvocationSettings invocationSettings, CleanCacheMode cleanCacheMode) {
public StudioGradleClient(
StudioGradleBuildConfiguration buildConfiguration,
InvocationSettings invocationSettings,
CleanCacheMode cleanCacheMode
) {
this.isFirstRun = true;
this.cleanCacheMode = cleanCacheMode;
Path studioInstallDir = invocationSettings.getStudioInstallDir().toPath();
Supplier<Path> studioInstallDirSupplier = new StudioInstallDirSupplier(invocationSettings, buildConfiguration);
Optional<File> studioSandboxDir = invocationSettings.getStudioSandboxDir();
this.sandbox = StudioSandboxCreator.createSandbox(studioSandboxDir.map(File::toPath).orElse(null));
Path protocolJar = GradleInstrumentation.unpackPlugin("client-protocol").toPath();
Path studioPlugin = GradleInstrumentation.unpackPlugin("studio-plugin").toPath();
this.studioPluginInstaller = new StudioPluginInstaller(sandbox.getPluginsDir());
studioPluginInstaller.installPlugin(Arrays.asList(studioPlugin, protocolJar));
this.processController = new StudioProcessController(studioInstallDir, sandbox, invocationSettings, buildConfiguration);
this.processController = new StudioProcessController(studioInstallDirSupplier, sandbox, invocationSettings, buildConfiguration);
this.executor = Executors.newSingleThreadExecutor();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package org.gradle.profiler.studio;

import org.gradle.profiler.InvocationSettings;
import org.gradle.profiler.ide.DefaultIdeProvider;
import org.gradle.profiler.ide.Ide;
import org.gradle.profiler.ide.IdeProvider;
import org.gradle.profiler.ide.idea.IDEA;
import org.gradle.profiler.ide.studio.AndroidStudio;
import org.gradle.profiler.studio.invoker.StudioGradleScenarioDefinition.StudioGradleBuildConfiguration;

import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.function.Supplier;

public class StudioInstallDirSupplier implements Supplier<Path> {

private final InvocationSettings invocationSettings;

private final StudioGradleBuildConfiguration buildConfiguration;

private final IdeProvider<Ide> ideProvider;

public StudioInstallDirSupplier(InvocationSettings invocationSettings, StudioGradleBuildConfiguration buildConfiguration) {
this.invocationSettings = invocationSettings;
this.buildConfiguration = buildConfiguration;
this.ideProvider = new DefaultIdeProvider();
}

@Override
public Path get() {
File studioInstallDir = invocationSettings.getStudioInstallDir();
if (studioInstallDir != null) {
return studioInstallDir.toPath();
}

Ide ide;
if (buildConfiguration.getIdeType().equals("IC")) {
ide = new IDEA(buildConfiguration.getIdeVersion());
} else if (buildConfiguration.getIdeType().equals("AI")) {
ide = new AndroidStudio(buildConfiguration.getIdeVersion());
} else {
throw new IllegalArgumentException("Unknown IDE product was requested");
}

return ideProvider.provideIde(ide, Paths.get("/Users/sopivalov/Projects/foo"), Paths.get("/Users/sopivalov/Projects/foo/downloads")).toPath();
}
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,27 @@
package org.gradle.profiler.studio.invoker;

import org.gradle.profiler.GradleBuildConfiguration;
import org.gradle.profiler.InvocationSettings;
import org.gradle.profiler.VersionUtils;
import org.gradle.profiler.gradle.GradleScenarioDefinition;

import java.util.List;
import java.util.function.Consumer;

public class StudioGradleScenarioDefinition extends GradleScenarioDefinition {

public StudioGradleScenarioDefinition(GradleScenarioDefinition gradleScenarioDefinition, List<String> studioJvmArgs, List<String> ideaProperties) {
public StudioGradleScenarioDefinition(
GradleScenarioDefinition gradleScenarioDefinition,
List<String> studioJvmArgs,
List<String> ideaProperties,
String ideType,
String ideVersion
) {
super(
gradleScenarioDefinition.getName(),
gradleScenarioDefinition.getTitle(),
gradleScenarioDefinition.getInvoker(),
new StudioGradleBuildConfiguration(gradleScenarioDefinition.getBuildConfiguration(), studioJvmArgs, ideaProperties),
new StudioGradleBuildConfiguration(gradleScenarioDefinition.getBuildConfiguration(), studioJvmArgs, ideaProperties, ideType, ideVersion),
gradleScenarioDefinition.getAction(),
gradleScenarioDefinition.getCleanupAction(),
gradleScenarioDefinition.getGradleArgs(),
Expand All @@ -26,12 +35,33 @@ public StudioGradleScenarioDefinition(GradleScenarioDefinition gradleScenarioDef
);
}

@Override
public void visitProblems(InvocationSettings settings, Consumer<String> reporter) {
if (VersionUtils.getJavaVersion() < 17) {
reporter.accept("Running IDE scenarios is only supported for Java 17 and later");
}
super.visitProblems(settings, reporter);
}

@Override
public String getDisplayName() {
return super.getDisplayName() + " and Java " + VersionUtils.getJavaVersion();
}

public static class StudioGradleBuildConfiguration extends GradleBuildConfiguration {

private final List<String> studioJvmArgs;
private final List<String> ideaProperties;
private final String ideType;
private final String ideVersion;

StudioGradleBuildConfiguration(GradleBuildConfiguration gradleBuildConfiguration, List<String> studioJvmArguments, List<String> ideaProperties) {
StudioGradleBuildConfiguration(
GradleBuildConfiguration gradleBuildConfiguration,
List<String> studioJvmArguments,
List<String> ideaProperties,
String ideType,
String ideVersion
) {
super(
gradleBuildConfiguration.getGradleVersion(),
gradleBuildConfiguration.getGradleHome(),
Expand All @@ -41,6 +71,8 @@ public static class StudioGradleBuildConfiguration extends GradleBuildConfigurat
);
this.studioJvmArgs = studioJvmArguments;
this.ideaProperties = ideaProperties;
this.ideType = ideType;
this.ideVersion = ideVersion;
}

public List<String> getStudioJvmArgs() {
Expand All @@ -50,5 +82,13 @@ public List<String> getStudioJvmArgs() {
public List<String> getIdeaProperties() {
return ideaProperties;
}

public String getIdeType() {
return ideType;
}

public String getIdeVersion() {
return ideVersion;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,26 +11,27 @@
import java.nio.file.Path;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

/**
* Controls Studio process and connections.
*/
public class StudioProcessController {

private final Path studioInstallDir;
private final Supplier<Path> studioInstallDirSupplier;
private final StudioSandbox sandbox;
private final InvocationSettings invocationSettings;
private final StudioGradleBuildConfiguration buildConfiguration;

private StudioProcess process;

public StudioProcessController(
Path studioInstallDir,
Supplier<Path> studioInstallDirSupplier,
StudioSandbox sandbox,
InvocationSettings invocationSettings,
StudioGradleBuildConfiguration buildConfiguration
) {
this.studioInstallDir = studioInstallDir;
this.studioInstallDirSupplier = studioInstallDirSupplier;
this.sandbox = sandbox;
this.invocationSettings = invocationSettings;
this.buildConfiguration = buildConfiguration;
Expand Down Expand Up @@ -73,7 +74,7 @@ public boolean isProcessRunning() {
*/
public StudioProcess maybeStartProcess() {
if (!isProcessRunning()) {
process = new StudioProcess(studioInstallDir, sandbox, invocationSettings, buildConfiguration.getStudioJvmArgs(), buildConfiguration.getIdeaProperties());
process = new StudioProcess(studioInstallDirSupplier.get(), sandbox, invocationSettings, buildConfiguration.getStudioJvmArgs(), buildConfiguration.getIdeaProperties());
process.getConnections().getAgentConnection().send(new StudioAgentConnectionParameters(buildConfiguration.getGradleHome()));
}
return process;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,8 @@

public class DefaultIdeProvider implements IdeProvider<Ide> {

private final IDEAProvider ideaProvider;
private final AndroidStudioProvider studioProvider;

public DefaultIdeProvider(IDEAProvider ideaProvider, AndroidStudioProvider studioProvider) {
this.ideaProvider = ideaProvider;
this.studioProvider = studioProvider;
}
private final IDEAProvider ideaProvider = new IDEAProvider();
private final AndroidStudioProvider studioProvider = new AndroidStudioProvider();

@Override
public File provideIde(Ide ide, Path homeDir, Path downloadsDir) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
package org.gradle.profiler.ide


import org.gradle.profiler.ide.idea.IDEA
import org.gradle.profiler.ide.idea.IDEAProvider
import org.gradle.profiler.ide.studio.AndroidStudio
import org.gradle.profiler.ide.studio.AndroidStudioProvider

class IdeProviderTest extends AbstractIdeProvisioningTest {

Expand All @@ -13,7 +10,7 @@ class IdeProviderTest extends AbstractIdeProvisioningTest {
def workDir = tmpDir.newFolder().toPath().toAbsolutePath()
def downloadsDir = workDir.resolve("downloads")
def ideHomeDir = workDir.resolve("ide")
def ideProvider = new DefaultIdeProvider(new IDEAProvider(), new AndroidStudioProvider())
def ideProvider = new DefaultIdeProvider()

when:
def ideFile = ideProvider.provideIde(ide, ideHomeDir, downloadsDir)
Expand Down

0 comments on commit 343774f

Please sign in to comment.