diff --git a/common/experiments/BUILD b/common/experiments/BUILD index 4d9961060b8..a3d8ff1a9ef 100644 --- a/common/experiments/BUILD +++ b/common/experiments/BUILD @@ -1,14 +1,14 @@ -load("//build_defs:build_defs.bzl", "intellij_plugin_library") -load( - "//testing:test_defs.bzl", - "intellij_unit_test_suite", -) load( "//:build-visibility.bzl", "COMMON_PLUGINS_VISIBILITY", "G3PLUGINS_VISIBILITY", "SERVICES_EXPERIMENT_SUBPACKAGES", ) +load("//build_defs:build_defs.bzl", "intellij_plugin_library") +load( + "//testing:test_defs.bzl", + "intellij_unit_test_suite", +) licenses(["notice"]) @@ -18,6 +18,7 @@ java_library( resources = [":experiment_properties"], visibility = COMMON_PLUGINS_VISIBILITY, deps = [ + "//common/util:platform", "//intellij_platform_sdk:jsr305", "//intellij_platform_sdk:plugin_api", "//third_party/auto_value", diff --git a/common/experiments/src/com/google/idea/common/experiments/ExperimentServiceImpl.java b/common/experiments/src/com/google/idea/common/experiments/ExperimentServiceImpl.java index 1f4d21448db..d319abc46e2 100644 --- a/common/experiments/src/com/google/idea/common/experiments/ExperimentServiceImpl.java +++ b/common/experiments/src/com/google/idea/common/experiments/ExperimentServiceImpl.java @@ -18,6 +18,7 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.idea.common.util.MorePlatformUtils; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.ApplicationComponent; import com.intellij.openapi.diagnostic.Logger; @@ -28,6 +29,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Supplier; import java.util.stream.Collectors; import javax.annotation.Nullable; @@ -46,6 +48,7 @@ public class ExperimentServiceImpl implements ApplicationComponent, ExperimentSe private final Alarm alarm = new Alarm(ThreadToUse.POOLED_THREAD, ApplicationManager.getApplication()); private final List services; + private final Supplier channelSupplier; private final AtomicInteger experimentScopeCounter = new AtomicInteger(0); private volatile Map experiments = ImmutableMap.of(); @@ -53,12 +56,18 @@ public class ExperimentServiceImpl implements ApplicationComponent, ExperimentSe private final Map queriedExperiments = new ConcurrentHashMap<>(); ExperimentServiceImpl() { - this(ExperimentLoader.EP_NAME.getExtensions()); + this(MorePlatformUtils::getIdeChannel, ExperimentLoader.EP_NAME.getExtensions()); } @VisibleForTesting ExperimentServiceImpl(ExperimentLoader... loaders) { + this(MorePlatformUtils::getIdeChannel, loaders); + } + + @VisibleForTesting + ExperimentServiceImpl(Supplier channelSupplier, ExperimentLoader... loaders) { services = ImmutableList.copyOf(loaders); + this.channelSupplier = channelSupplier; if (ApplicationManager.getApplication().isUnitTestMode()) { refreshExperiments(); } @@ -76,9 +85,17 @@ public void initComponent() { scheduleRefresh(REFRESH_FREQUENCY); } + @Nullable private String getExperiment(Experiment experiment) { queriedExperiments.putIfAbsent(experiment.getKey(), experiment); - return experiments.get(experiment.getKey()); + if (experiments.containsKey(experiment.getKey())) { + return experiments.get(experiment.getKey()); + } + String channelKey = channelSupplier.get() + "." + experiment.getKey(); + if (experiments.containsKey(channelKey)) { + return experiments.get(channelKey); + } + return null; } @Override diff --git a/common/experiments/tests/unittests/com/google/idea/common/experiments/ExperimentServiceImplTest.java b/common/experiments/tests/unittests/com/google/idea/common/experiments/ExperimentServiceImplTest.java index 9fb7cf88f91..d67982f511d 100644 --- a/common/experiments/tests/unittests/com/google/idea/common/experiments/ExperimentServiceImplTest.java +++ b/common/experiments/tests/unittests/com/google/idea/common/experiments/ExperimentServiceImplTest.java @@ -69,6 +69,19 @@ public void testStringProperty() { ExperimentService experimentService = new ExperimentServiceImpl(new MapExperimentLoader("id", STRING_EXPERIMENT.getKey(), "hi")); assertThat(experimentService.getExperimentString(STRING_EXPERIMENT, null)).isEqualTo("hi"); + assertThat(experimentService.getAllQueriedExperiments()) + .containsExactly(STRING_EXPERIMENT.getKey(), STRING_EXPERIMENT); + } + + @Test + public void testChannelProperty() { + ExperimentService experimentService = + new ExperimentServiceImpl( + () -> "beta", + new MapExperimentLoader("id", "beta." + STRING_EXPERIMENT.getKey(), "hi")); + assertThat(experimentService.getExperimentString(STRING_EXPERIMENT, null)).isEqualTo("hi"); + assertThat(experimentService.getAllQueriedExperiments()) + .containsExactly(STRING_EXPERIMENT.getKey(), STRING_EXPERIMENT); } @Test diff --git a/common/util/BUILD b/common/util/BUILD index b2f9ea29a8a..48833c81645 100644 --- a/common/util/BUILD +++ b/common/util/BUILD @@ -18,7 +18,10 @@ java_library( java_library( name = "platform", - srcs = ["src/com/google/idea/common/util/MorePlatformUtils.java"], + srcs = [ + "src/com/google/idea/common/util/MorePlatformUtils.java", + ":channel_java", + ], deps = [ "//intellij_platform_sdk:plugin_api", ], @@ -56,3 +59,72 @@ java_test( "@junit//jar", ], ) + +genrule( + name = "stable", + outs = ["stable.txt"], + cmd = "echo stable > $@", +) + +genrule( + name = "beta", + outs = ["beta.txt"], + cmd = "echo beta > $@", +) + +genrule( + name = "canary", + outs = ["canary.txt"], + cmd = "echo canary > $@", +) + +genrule( + name = "channel_java", + srcs = select( + { + "//intellij_platform_sdk:intellij-latest": [":stable"], + "//intellij_platform_sdk:intellij-latest-mac": [":stable"], + "//intellij_platform_sdk:intellij-beta": [":beta"], + "//intellij_platform_sdk:intellij-under-dev": [":canary"], + "//intellij_platform_sdk:intellij-oss-latest-stable": [":stable"], + "//intellij_platform_sdk:intellij-oss-oldest-stable": [":stable"], + "//intellij_platform_sdk:intellij-oss-under-dev": [":canary"], + "//intellij_platform_sdk:intellij-ue-latest": [":stable"], + "//intellij_platform_sdk:intellij-ue-latest-mac": [":stable"], + "//intellij_platform_sdk:intellij-ue-beta": [":beta"], + "//intellij_platform_sdk:intellij-ue-oss-latest-stable": [":stable"], + "//intellij_platform_sdk:intellij-ue-oss-oldest-stable": [":stable"], + "//intellij_platform_sdk:intellij-ue-oss-under-dev": [":canary"], + "//intellij_platform_sdk:intellij-ue-cc-latest-stable": [":stable"], + "//intellij_platform_sdk:intellij-ue-cc-oldest-stable": [":stable"], + "//intellij_platform_sdk:intellij-ue-cc-under-dev": [":canary"], + "//intellij_platform_sdk:clion-latest": [":stable"], + "//intellij_platform_sdk:clion-latest-mac": [":stable"], + "//intellij_platform_sdk:clion-beta": [":beta"], + "//intellij_platform_sdk:clion-under-dev": [":canary"], + "//intellij_platform_sdk:clion-oss-latest-stable": [":stable"], + "//intellij_platform_sdk:clion-oss-oldest-stable": [":stable"], + "//intellij_platform_sdk:clion-oss-under-dev": [":canary"], + "//intellij_platform_sdk:android-studio-latest": [":stable"], + "//intellij_platform_sdk:android-studio-beta": [":beta"], + "//intellij_platform_sdk:android-studio-canary": [":canary"], + "//intellij_platform_sdk:android-studio-latest-mac": [":stable"], + "//intellij_platform_sdk:android-studio-beta-mac": [":beta"], + "//intellij_platform_sdk:android-studio-canary-mac": [":canary"], + "//intellij_platform_sdk:android-studio-oss-oldest-stable": [":stable"], + "//intellij_platform_sdk:android-studio-oss-latest-stable": [":stable"], + "//intellij_platform_sdk:android-studio-oss-under-dev": [":canary"], + }, + ), + outs = ["com/google/idea/common/util/channel/Channel.java"], + cmd = "\n".join([ + "CHANNEL=$$(cat $<)", + "cat << EOM > $@", + "package com.google.idea.common.util.channel;", + "", + "public class Channel {", + " public static final String CHANNEL = \"$$CHANNEL\";", + "}", + "EOM", + ]), +) diff --git a/common/util/src/com/google/idea/common/util/MorePlatformUtils.java b/common/util/src/com/google/idea/common/util/MorePlatformUtils.java index 98056d58a8f..f28093065b9 100644 --- a/common/util/src/com/google/idea/common/util/MorePlatformUtils.java +++ b/common/util/src/com/google/idea/common/util/MorePlatformUtils.java @@ -15,6 +15,7 @@ */ package com.google.idea.common.util; +import com.google.idea.common.util.channel.Channel; import com.intellij.util.PlatformUtils; /** Additional helpers for {@link PlatformUtils}. */ @@ -41,4 +42,12 @@ public static String getProductIdForLogs() { public static boolean isAndroidStudio() { return "AndroidStudio".equals(PlatformUtils.getPlatformPrefix()); } + + /** + * Returns the channel that the IDE was built from, either {@code stable}, {@code beta} or {@code + * canary}. + */ + public static String getIdeChannel() { + return Channel.CHANNEL; + } }