]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-11169 add ability to verify log arguments
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Mon, 20 Aug 2018 11:56:23 +0000 (13:56 +0200)
committerSonarTech <sonartech@sonarsource.com>
Tue, 21 Aug 2018 18:21:01 +0000 (20:21 +0200)
sonar-plugin-api/src/main/java/org/sonar/api/utils/log/ListInterceptor.java
sonar-plugin-api/src/main/java/org/sonar/api/utils/log/LogAndArguments.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/utils/log/LogTester.java
sonar-plugin-api/src/test/java/org/sonar/api/utils/log/LogTesterTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/util/ProgressReportTest.java

index b5288a6ce0f995f8aae25518974b83dea9671aaa..3bd9d5a69284056f23cda122898be4027cb419cd 100644 (file)
@@ -21,55 +21,73 @@ package org.sonar.api.utils.log;
 
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ListMultimap;
-
-import javax.annotation.Nullable;
-
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import javax.annotation.Nullable;
 
-class ListInterceptor implements LogInterceptor {
+public class ListInterceptor implements LogInterceptor {
 
-  private final List<String> logs = new ArrayList<>();
-  private final ListMultimap<LoggerLevel, String> logsByLevel = ArrayListMultimap.create();
+  private final List<LogAndArguments> logs = new ArrayList<>();
+  private final ListMultimap<LoggerLevel, LogAndArguments> logsByLevel = ArrayListMultimap.create();
 
   @Override
   public void log(LoggerLevel level, String msg) {
-    logs.add(msg);
-    logsByLevel.put(level, msg);
+    LogAndArguments l = new LogAndArguments(msg, msg);
+    add(level, l);
   }
 
   @Override
   public void log(LoggerLevel level, String msg, @Nullable Object arg) {
     String s = ConsoleFormatter.format(msg, arg);
-    logs.add(s);
-    logsByLevel.put(level, s);
+    LogAndArguments l = new LogAndArguments(s, msg, arg);
+    add(level, l);
   }
 
   @Override
   public void log(LoggerLevel level, String msg, @Nullable Object arg1, @Nullable Object arg2) {
     String s = ConsoleFormatter.format(msg, arg1, arg2);
-    logs.add(s);
-    logsByLevel.put(level, s);
+    LogAndArguments l = new LogAndArguments(s, msg, arg1, arg2);
+    add(level, l);
   }
 
   @Override
   public void log(LoggerLevel level, String msg, Object... args) {
     String s = ConsoleFormatter.format(msg, args);
-    logs.add(s);
-    logsByLevel.put(level, s);
+    LogAndArguments l = new LogAndArguments(s, msg, args);
+    add(level, l);
   }
 
   @Override
   public void log(LoggerLevel level, String msg, Throwable thrown) {
-    logs.add(msg);
-    logsByLevel.put(level, msg);
+    LogAndArguments l = new LogAndArguments(msg, msg, thrown);
+    add(level, l);
+  }
+
+  private void add(LoggerLevel level, LogAndArguments l) {
+    logs.add(l);
+    logsByLevel.put(level, l);
   }
 
   public List<String> logs() {
-    return logs;
+    return logs.stream().map(LogAndArguments::getFormattedMsg).collect(Collectors.toList());
+  }
+
+  public Optional<String> findFirst(Predicate<String> logPredicate) {
+    return logs.stream().map(LogAndArguments::getFormattedMsg).filter(logPredicate).findFirst();
   }
 
   public List<String> logs(LoggerLevel level) {
+    return logsByLevel.get(level).stream().map(LogAndArguments::getFormattedMsg).collect(Collectors.toList());
+  }
+
+  public List<LogAndArguments> getLogs() {
+    return logs;
+  }
+
+  public List<LogAndArguments> getLogs(LoggerLevel level) {
     return logsByLevel.get(level);
   }
 
@@ -77,4 +95,5 @@ class ListInterceptor implements LogInterceptor {
     logs.clear();
     logsByLevel.clear();
   }
+
 }
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/LogAndArguments.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/LogAndArguments.java
new file mode 100644 (file)
index 0000000..5e4ad44
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2018 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.api.utils.log;
+
+import java.util.Optional;
+import javax.annotation.Nullable;
+
+public final class LogAndArguments {
+  private final String rawMsg;
+  private final Object[] args;
+  private final String msg;
+
+  LogAndArguments(String msg, String rawMsg) {
+    this.rawMsg = rawMsg;
+    this.msg = msg;
+    this.args = null;
+  }
+
+  LogAndArguments(String msg, String rawMsg, @Nullable Object arg1) {
+    this.rawMsg = rawMsg;
+    this.args = new Object[] {arg1};
+    this.msg = msg;
+  }
+
+  LogAndArguments(String msg, String rawMsg, @Nullable Object arg1, @Nullable Object arg2) {
+    this.rawMsg = rawMsg;
+    this.msg = msg;
+    this.args = new Object[] {arg1, arg2};
+  }
+
+  LogAndArguments(String msg, String rawMsg, Object... args) {
+    this.rawMsg = rawMsg;
+    this.msg = msg;
+    this.args = args;
+  }
+
+  public String getRawMsg() {
+    return rawMsg;
+  }
+
+  public Optional<Object[]> getArgs() {
+    return Optional.ofNullable(args);
+  }
+
+  public String getFormattedMsg() {
+    return msg;
+  }
+}
index 4d4edf256eeb85cdb50af4f00f9170b49fd8f8a6..a58bbe8f30c09a424a2b606dc56b0629ce685839 100644 (file)
@@ -20,6 +20,8 @@
 package org.sonar.api.utils.log;
 
 import java.util.List;
+import java.util.Optional;
+import java.util.function.Predicate;
 import org.junit.rules.ExternalResource;
 
 /**
@@ -90,6 +92,10 @@ public class LogTester extends ExternalResource {
     return ((ListInterceptor) LogInterceptors.get()).logs();
   }
 
+  public Optional<String> findFirstLog(Predicate<String> msgPredicate) {
+    return ((ListInterceptor) LogInterceptors.get()).findFirst(msgPredicate);
+  }
+
   /**
    * Logs in chronological order (item at index 0 is the oldest one) for
    * a given level
@@ -98,6 +104,21 @@ public class LogTester extends ExternalResource {
     return ((ListInterceptor) LogInterceptors.get()).logs(level);
   }
 
+  /**
+   * Logs with arguments in chronological order (item at index 0 is the oldest one)
+   */
+  public List<LogAndArguments> getLogs() {
+    return ((ListInterceptor) LogInterceptors.get()).getLogs();
+  }
+
+  /**
+   * Logs with arguments in chronological order (item at index 0 is the oldest one) for
+   * a given level
+   */
+  public List<LogAndArguments> getLogs(LoggerLevel level) {
+    return ((ListInterceptor) LogInterceptors.get()).getLogs(level);
+  }
+
   public LogTester clear() {
     ((ListInterceptor) LogInterceptors.get()).clear();
     return this;
index 0d43ce38e317a266c4c4c897e458364e7366f6d1..6a459beea43fc50c6dbaff87e307b24d8b94c566 100644 (file)
@@ -99,7 +99,7 @@ public class LogTesterTest {
     assertThat(touchedTrace.get()).isFalse();
     assertThat(touchedDebug.get()).isTrue();
     touchedDebug.set(false);
-    underTest.logs().clear();
+    underTest.clear();
 
     // change level to TRACE
     underTest.setLevel(LoggerLevel.TRACE);
index 32a9811f5b98245dcacc9696275be09893486951..6c536b0e5276ca9612d28b868b88a60dfcb256f9 100644 (file)
@@ -60,7 +60,7 @@ public class ProgressReportTest {
     underTest.message("Some message");
     boolean logged = false;
     while (!logged) {
-      logged = logTester.logs().contains("Some message");
+      logged = logTester.findFirstLog("Some message"::equals).isPresent();
     }
     underTest.stop("stop");
   }