]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-9721 Send SonarQube and plugins versions
authorTeryk Bellahsene <teryk.bellahsene@sonarsource.com>
Wed, 23 Aug 2017 10:24:46 +0000 (12:24 +0200)
committerTeryk Bellahsene <teryk@users.noreply.github.com>
Wed, 30 Aug 2017 14:24:53 +0000 (16:24 +0200)
server/sonar-server/src/main/java/org/sonar/server/telemetry/TelemetryDaemon.java
server/sonar-server/src/test/java/org/sonar/server/telemetry/FakeServer.java
server/sonar-server/src/test/java/org/sonar/server/telemetry/TelemetryDaemonTest.java
server/sonar-server/src/test/resources/org/sonar/server/telemetry/telemetry-example.json [new file with mode: 0644]

index 6105c25507ead5683edf4660be814527575c5029..a49ef426b009f682203bd3f8cae5e3407ba06da2 100644 (file)
@@ -35,6 +35,7 @@ import org.sonar.api.utils.System2;
 import org.sonar.api.utils.log.Logger;
 import org.sonar.api.utils.log.Loggers;
 import org.sonar.api.utils.text.JsonWriter;
+import org.sonar.core.platform.PluginRepository;
 import org.sonar.server.property.InternalProperties;
 
 import static org.sonar.api.utils.DateUtils.formatDate;
@@ -55,15 +56,18 @@ public class TelemetryDaemon implements Startable {
   private final Configuration config;
   private final InternalProperties internalProperties;
   private final Server server;
+  private final PluginRepository pluginRepository;
   private final System2 system2;
 
   private ScheduledExecutorService executorService;
 
-  public TelemetryDaemon(TelemetryClient telemetryClient, Configuration config, InternalProperties internalProperties, Server server, System2 system2) {
+  public TelemetryDaemon(TelemetryClient telemetryClient, Configuration config, InternalProperties internalProperties, Server server, PluginRepository pluginRepository,
+    System2 system2) {
     this.telemetryClient = telemetryClient;
     this.config = config;
     this.internalProperties = internalProperties;
     this.server = server;
+    this.pluginRepository = pluginRepository;
     this.system2 = system2;
   }
 
@@ -135,6 +139,14 @@ public class TelemetryDaemon implements Startable {
     try (JsonWriter writer = JsonWriter.of(json)) {
       writer.beginObject();
       writer.prop("id", server.getId());
+      writer.prop("version", server.getVersion());
+      writer.name("plugins");
+      writer.beginObject();
+      pluginRepository.getPluginInfos().forEach(plugin -> {
+        String version = plugin.getVersion() == null ? "undefined" : plugin.getVersion().getName();
+        writer.prop(plugin.getKey(), version);
+      });
+      writer.endObject();
       writer.endObject();
     }
     telemetryClient.upload(json.toString());
index a4c788e6930c9297f0a2ee65cf357d77fb5f72f9..a793b0cc0bb09b96b359a5ecc6104312d1dbdbb3 100644 (file)
@@ -27,6 +27,7 @@ import org.sonar.api.platform.Server;
 
 class FakeServer extends Server {
   private String id;
+  private String version;
 
   @Override
   public String getId() {
@@ -46,7 +47,12 @@ class FakeServer extends Server {
 
   @Override
   public String getVersion() {
-    return null;
+    return this.version;
+  }
+
+  public FakeServer setVersion(String version) {
+    this.version = version;
+    return this;
   }
 
   @Override
index 1f07c1484d83b054032df97cfc17ffb4127575d7..5a1c4c331a94efdd9507812fb16007f1fc133850 100644 (file)
 package org.sonar.server.telemetry;
 
 import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
 import org.junit.Before;
 import org.junit.Test;
+import org.mockito.ArgumentCaptor;
 import org.sonar.api.config.PropertyDefinitions;
 import org.sonar.api.config.internal.MapSettings;
 import org.sonar.api.utils.internal.TestSystem2;
 import org.sonar.core.config.TelemetryProperties;
+import org.sonar.core.platform.PluginInfo;
+import org.sonar.core.platform.PluginRepository;
 import org.sonar.server.property.InternalProperties;
 import org.sonar.server.property.MapInternalProperties;
+import org.sonar.updatecenter.common.Version;
 
 import static org.apache.commons.lang.RandomStringUtils.randomAlphanumeric;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Matchers.anyString;
-import static org.mockito.Matchers.contains;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.timeout;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 import static org.sonar.api.utils.DateUtils.parseDate;
 import static org.sonar.core.config.TelemetryProperties.PROP_ENABLE;
 import static org.sonar.core.config.TelemetryProperties.PROP_FREQUENCY;
 import static org.sonar.server.telemetry.TelemetryDaemon.I_PROP_LAST_PING;
+import static org.sonar.test.JsonAssert.assertJson;
 
 public class TelemetryDaemonTest {
 
@@ -50,6 +57,7 @@ public class TelemetryDaemonTest {
   private TelemetryClient client = mock(TelemetryClient.class);
   private InternalProperties internalProperties = new MapInternalProperties();
   private FakeServer server = new FakeServer();
+  private PluginRepository pluginRepository = mock(PluginRepository.class);
   private TestSystem2 system2 = new TestSystem2();
   private MapSettings settings;
 
@@ -60,7 +68,25 @@ public class TelemetryDaemonTest {
     settings = new MapSettings(new PropertyDefinitions(TelemetryProperties.all()));
     system2.setNow(System.currentTimeMillis());
 
-    underTest = new TelemetryDaemon(client, settings.asConfig(), internalProperties, server, system2);
+    underTest = new TelemetryDaemon(client, settings.asConfig(), internalProperties, server, pluginRepository, system2);
+  }
+
+  @Test
+  public void send_telemetry_data() throws IOException {
+    settings.setProperty(PROP_FREQUENCY, "1");
+    String id = "AU-TpxcB-iU5OvuD2FL7";
+    String version = "7.5.4";
+    server.setId(id);
+    server.setVersion(version);
+    List<PluginInfo> plugins = Arrays.asList(newPlugin("java", "4.12.0.11033"), newPlugin("scmgit", "1.2"), new PluginInfo("other"));
+    when(pluginRepository.getPluginInfos()).thenReturn(plugins);
+    underTest.start();
+
+    ArgumentCaptor<String> jsonCaptor = ArgumentCaptor.forClass(String.class);
+    verify(client, timeout(1_000).atLeastOnce()).upload(jsonCaptor.capture());
+    String json = jsonCaptor.getValue();
+    assertJson(json).isSimilarTo(getClass().getResource("telemetry-example.json"));
+    assertJson(getClass().getResource("telemetry-example.json")).isSimilarTo(json);
   }
 
   @Test
@@ -86,13 +112,17 @@ public class TelemetryDaemonTest {
   }
 
   @Test
-  public void send_server_id() throws IOException {
+  public void send_server_id_and_version() throws IOException {
     settings.setProperty(PROP_FREQUENCY, "1");
     String id = randomAlphanumeric(40);
+    String version = randomAlphanumeric(10);
     server.setId(id);
+    server.setVersion(version);
     underTest.start();
 
-    verify(client, timeout(2_000).atLeastOnce()).upload(contains(id));
+    ArgumentCaptor<String> json = ArgumentCaptor.forClass(String.class);
+    verify(client, timeout(1_000).atLeastOnce()).upload(json.capture());
+    assertThat(json.getValue()).contains(id, version);
   }
 
   @Test
@@ -133,4 +163,9 @@ public class TelemetryDaemonTest {
     verify(client, timeout(1_000).never()).upload(anyString());
     verify(client, timeout(1_000).times(1)).optOut(anyString());
   }
+
+  private PluginInfo newPlugin(String key, String version) {
+    return new PluginInfo(key)
+      .setVersion(Version.create(version));
+  }
 }
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/telemetry/telemetry-example.json b/server/sonar-server/src/test/resources/org/sonar/server/telemetry/telemetry-example.json
new file mode 100644 (file)
index 0000000..093a352
--- /dev/null
@@ -0,0 +1,9 @@
+{
+  "id": "AU-TpxcB-iU5OvuD2FL7",
+  "version": "7.5.4",
+  "plugins": {
+    "java": "4.12.0.11033",
+    "scmgit": "1.2",
+    "other": "undefined"
+  }
+}