From 3be4a0c53385a59c40e87f7e8ba5283b1c5928d3 Mon Sep 17 00:00:00 2001 From: Duarte Meneses Date: Mon, 10 Aug 2015 15:04:49 +0200 Subject: [PATCH] SONAR-6777 Project cache sync --- .../org/sonar/batch/bootstrap/WSLoader.java | 4 +- .../batch/cache/ProjectCacheSynchronizer.java | 64 +++++-- .../batch/issue/DefaultIssueCallback.java | 14 +- .../DefaultServerLineHashesLoader.java | 4 +- .../issue/tracking/ServerIssueRepository.java | 15 +- .../repository/DefaultServerIssuesLoader.java | 2 +- .../GlobalRepositoriesProvider.java | 7 +- .../ProjectRepositoriesProvider.java | 7 +- .../batch/repository/ServerIssuesLoader.java | 2 +- .../repository/user/UserRepositoryLoader.java | 32 ++-- .../org/sonar/batch/rule/RulesProvider.java | 6 +- .../sonar/batch/scan/report/JSONReport.java | 28 ++- .../bootstrap/BatchPluginJarExploderTest.java | 2 +- .../bootstrap/BatchPluginPredicateTest.java | 12 ++ .../sonar/batch/bootstrap/WSLoaderTest.java | 87 ++++++++-- .../cache/ProjectCacheSynchronizerTest.java | 114 ++++++++++++ .../batch/issue/DefaultIssueCallbackTest.java | 5 +- .../batch/mediumtest/BatchMediumTester.java | 11 +- .../IssueModeAndReportsMediumTest.java | 17 +- .../DefaultServerIssuesLoaderTest.java | 6 +- .../user/UserRepositoryLoaderTest.java | 41 ++++- .../batch/rule/DefaultRulesLoaderTest.java | 6 +- .../batch/scan/report/JSONReportTest.java | 7 +- .../sonar-checkstyle-plugin-2.8.jar | Bin .../JdbcDriverHolderTest/jdbc-driver.jar | Bin 537 -> 0 bytes .../api_rules_list.protobuf | Bin 0 -> 27390 bytes .../api_sources_hash_GitScmProvider.text | 49 ++++++ .../api_sources_hash_JGitBlameCommand.text | 149 ++++++++++++++++ .../batch_issues.protobuf | Bin 0 -> 788 bytes .../batch_project.json | 164 ++++++++++++++++++ .../batch_users.protobuf | 0 .../should_persist_component_data-result.xml | 4 - .../should_persist_component_data.xml | 3 - .../java/org/sonar/api/CoreProperties.java | 2 - .../sonar/api/utils/log/DefaultProfiler.java | 17 +- .../java/org/sonar/api/utils/log/Loggers.java | 2 +- .../org/sonar/api/utils/log/NullProfiler.java | 5 + .../org/sonar/api/utils/log/Profiler.java | 2 + 38 files changed, 747 insertions(+), 143 deletions(-) rename sonar-batch/src/test/resources/org/sonar/batch/bootstrap/{BatchPluginUnzipperTest => BatchPluginJarExploderTest}/sonar-checkstyle-plugin-2.8.jar (100%) delete mode 100644 sonar-batch/src/test/resources/org/sonar/batch/bootstrap/JdbcDriverHolderTest/jdbc-driver.jar create mode 100644 sonar-batch/src/test/resources/org/sonar/batch/cache/ProjectCacheSynchronizerTest/api_rules_list.protobuf create mode 100644 sonar-batch/src/test/resources/org/sonar/batch/cache/ProjectCacheSynchronizerTest/api_sources_hash_GitScmProvider.text create mode 100644 sonar-batch/src/test/resources/org/sonar/batch/cache/ProjectCacheSynchronizerTest/api_sources_hash_JGitBlameCommand.text create mode 100644 sonar-batch/src/test/resources/org/sonar/batch/cache/ProjectCacheSynchronizerTest/batch_issues.protobuf create mode 100644 sonar-batch/src/test/resources/org/sonar/batch/cache/ProjectCacheSynchronizerTest/batch_project.json create mode 100644 sonar-batch/src/test/resources/org/sonar/batch/cache/ProjectCacheSynchronizerTest/batch_users.protobuf delete mode 100644 sonar-batch/src/test/resources/org/sonar/batch/index/FileHashesPersisterTest/should_persist_component_data-result.xml delete mode 100644 sonar-batch/src/test/resources/org/sonar/batch/index/FileHashesPersisterTest/should_persist_component_data.xml diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/WSLoader.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/WSLoader.java index 5d9930630bd..1b03acd1cea 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/WSLoader.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/WSLoader.java @@ -126,7 +126,7 @@ public class WSLoader { throw new IllegalStateException(FAIL_MSG, serverNotAvailable.getCause()); } } - throw new IllegalStateException(FAIL_MSG, cacheNotAvailable.getCause()); + throw new IllegalStateException("Data is not cached", cacheNotAvailable.getCause()); } } @@ -142,7 +142,7 @@ public class WSLoader { throw new IllegalStateException(FAIL_MSG, serverNotAvailable.getCause()); } } - throw new IllegalStateException(FAIL_MSG, serverNotAvailable.getCause()); + throw new IllegalStateException("Server is not available", serverNotAvailable.getCause()); } } diff --git a/sonar-batch/src/main/java/org/sonar/batch/cache/ProjectCacheSynchronizer.java b/sonar-batch/src/main/java/org/sonar/batch/cache/ProjectCacheSynchronizer.java index 2854dce0985..9f0c0f4250a 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/cache/ProjectCacheSynchronizer.java +++ b/sonar-batch/src/main/java/org/sonar/batch/cache/ProjectCacheSynchronizer.java @@ -19,11 +19,14 @@ */ package org.sonar.batch.cache; -import org.sonar.api.batch.bootstrap.ProjectReactor; +import org.apache.commons.lang.StringUtils; -import org.sonar.batch.bootstrap.AnalysisProperties; -import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.sonar.api.utils.log.Profiler; +import org.sonar.api.batch.bootstrap.ProjectReactor; +import org.sonar.batch.bootstrap.AnalysisProperties; import org.sonar.batch.protocol.input.BatchInput.ServerIssue; import com.google.common.base.Function; import org.sonar.batch.protocol.input.FileData; @@ -42,7 +45,7 @@ import org.sonar.batch.repository.ServerIssuesLoader; import org.sonar.batch.repository.ProjectRepositoriesLoader; public class ProjectCacheSynchronizer { - private static final Logger LOG = Loggers.get(ProjectCacheSynchronizer.class); + private static final Logger LOG = LoggerFactory.getLogger(ProjectCacheSynchronizer.class); private ProjectDefinition project; private AnalysisProperties properties; private ProjectRepositoriesLoader projectRepositoryLoader; @@ -63,39 +66,62 @@ public class ProjectCacheSynchronizer { } public void load(boolean force) { + Profiler profiler = Profiler.create(Loggers.get(ProjectCacheSynchronizer.class)); Date lastSync = cacheStatus.getSyncStatus(project.getKeyWithBranch()); if (lastSync != null) { - LOG.debug("Found project [" + project.getKeyWithBranch() + " ] cache [" + lastSync + "]"); - if (!force) { + LOG.info("Found project [{}] cache [{}]", project.getKeyWithBranch(), lastSync); return; + } else { + LOG.info("Found project [{}] cache [{}], refreshing data..", project.getKeyWithBranch(), lastSync); } + cacheStatus.delete(project.getKeyWithBranch()); + } else { + LOG.info("Cache for project [{}] not found, fetching data..", project.getKeyWithBranch()); } - cacheStatus.delete(project.getKeyWithBranch()); + profiler.startInfo("Load project repository"); ProjectRepositories projectRepo = projectRepositoryLoader.load(project, properties); + profiler.stopInfo(projectRepositoryLoader.loadedFromCache()); if (projectRepo.lastAnalysisDate() == null) { + LOG.debug("No previous analysis found"); + LOG.info("Succesfully synchronized project cache"); return; } - IssueAccumulator consumer = new IssueAccumulator(); - issuesLoader.load(project.getKeyWithBranch(), consumer, false); + profiler.startInfo("Load server issues"); + UserLoginAccumulator consumer = new UserLoginAccumulator(); + boolean fromCache = issuesLoader.load(project.getKeyWithBranch(), consumer); + profiler.stopInfo(fromCache); + profiler.startInfo("Load user information (" + consumer.loginSet.size() + " users)"); for (String login : consumer.loginSet) { userRepository.load(login); } + stopInfo(profiler, "Load user information", fromCache); - loadLineHashes(projectRepo.fileDataByModuleAndPath()); + loadLineHashes(projectRepo.fileDataByModuleAndPath(), profiler); + cacheStatus.save(project.getKeyWithBranch()); + + LOG.info("Succesfully synchronized project cache"); } private String getComponentKey(String moduleKey, String filePath) { return moduleKey + ":" + filePath; } - private void loadLineHashes(Map> fileDataByModuleAndPath) { + private void loadLineHashes(Map> fileDataByModuleAndPath, Profiler profiler) { + int numFiles = 0; + + for (Map fileDataByPath : fileDataByModuleAndPath.values()) { + numFiles += fileDataByPath.size(); + } + + profiler.startInfo("Load line file hashes (" + numFiles + " files)"); + for (Entry> e1 : fileDataByModuleAndPath.entrySet()) { String moduleKey = e1.getKey(); @@ -104,15 +130,27 @@ public class ProjectCacheSynchronizer { lineHashesLoader.getLineHashes(getComponentKey(moduleKey, filePath)); } } + + profiler.stopInfo("Load line file hashes (done)"); } - private static class IssueAccumulator implements Function { + private static class UserLoginAccumulator implements Function { Set loginSet = new HashSet<>(); @Override public Void apply(ServerIssue input) { - loginSet.add(input.getAssigneeLogin()); + if (!StringUtils.isEmpty(input.getAssigneeLogin())) { + loginSet.add(input.getAssigneeLogin()); + } return null; } } + + private static void stopInfo(Profiler profiler, String msg, boolean fromCache) { + if (fromCache) { + profiler.stopInfo(msg + " (done from cache)"); + } else { + profiler.stopInfo(msg + " (done)"); + } + } } diff --git a/sonar-batch/src/main/java/org/sonar/batch/issue/DefaultIssueCallback.java b/sonar-batch/src/main/java/org/sonar/batch/issue/DefaultIssueCallback.java index 9973b50f612..05caaec7f3c 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/issue/DefaultIssueCallback.java +++ b/sonar-batch/src/main/java/org/sonar/batch/issue/DefaultIssueCallback.java @@ -19,13 +19,13 @@ */ package org.sonar.batch.issue; +import org.apache.commons.lang.StringUtils; + import org.sonar.api.rule.RuleKey; import org.sonar.api.batch.rule.Rule; import org.sonar.api.batch.rule.Rules; import org.sonar.batch.protocol.input.BatchInput.User; -import java.util.ArrayList; -import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -91,7 +91,7 @@ public class DefaultIssueCallback implements IssueCallback { } private void collectInfo(DefaultIssue issue) { - if (issue.assignee() != null) { + if (!StringUtils.isEmpty(issue.assignee())) { userLoginNames.add(issue.assignee()); } if (issue.getRuleKey() != null) { @@ -104,9 +104,11 @@ public class DefaultIssueCallback implements IssueCallback { } private void getUsers() { - Collection users = userRepository.load(new ArrayList<>(userLoginNames)); - for (User user : users) { - userMap.put(user.getLogin(), user.getName()); + for (String loginName : userLoginNames) { + User user = userRepository.load(loginName); + if (user != null) { + userMap.put(user.getLogin(), user.getName()); + } } } diff --git a/sonar-batch/src/main/java/org/sonar/batch/issue/tracking/DefaultServerLineHashesLoader.java b/sonar-batch/src/main/java/org/sonar/batch/issue/tracking/DefaultServerLineHashesLoader.java index e704b5ee621..c6a405d0d36 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/issue/tracking/DefaultServerLineHashesLoader.java +++ b/sonar-batch/src/main/java/org/sonar/batch/issue/tracking/DefaultServerLineHashesLoader.java @@ -51,9 +51,9 @@ public class DefaultServerLineHashesLoader implements ServerLineHashesLoader { return result.get(); } finally { if (result.isFromCache()) { - profiler.stopDebug(); - } else { profiler.stopDebug("Load line hashes (done from cache)"); + } else { + profiler.stopDebug(); } } } diff --git a/sonar-batch/src/main/java/org/sonar/batch/issue/tracking/ServerIssueRepository.java b/sonar-batch/src/main/java/org/sonar/batch/issue/tracking/ServerIssueRepository.java index e2d03e28ec9..6b78815f6b6 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/issue/tracking/ServerIssueRepository.java +++ b/sonar-batch/src/main/java/org/sonar/batch/issue/tracking/ServerIssueRepository.java @@ -40,6 +40,7 @@ import org.sonar.core.component.ComponentKeys; public class ServerIssueRepository { private static final Logger LOG = Loggers.get(ServerIssueRepository.class); + private static final String LOG_MSG = "Load server issues"; private final Caches caches; private Cache issuesCache; @@ -55,25 +56,17 @@ public class ServerIssueRepository { } public void load() { - Profiler profiler = Profiler.create(LOG).startInfo("Load server issues"); + Profiler profiler = Profiler.create(LOG).startInfo(LOG_MSG); this.issuesCache = caches.createCache("previousIssues"); caches.registerValueCoder(ServerIssue.class, new ServerIssueValueCoder()); - boolean fromCache = previousIssuesLoader.load(reactor.getRoot().getKeyWithBranch(), new SaveIssueConsumer(), false); - stopDebug(profiler, "Load server issues", fromCache); + boolean fromCache = previousIssuesLoader.load(reactor.getRoot().getKeyWithBranch(), new SaveIssueConsumer()); + profiler.stopInfo(fromCache); } public Iterable byComponent(BatchComponent component) { return issuesCache.values(component.batchId()); } - private static void stopDebug(Profiler profiler, String msg, boolean fromCache) { - if (fromCache) { - profiler.stopDebug(msg + " (done from cache)"); - } else { - profiler.stopDebug(msg + " (done)"); - } - } - private class SaveIssueConsumer implements Function { @Override diff --git a/sonar-batch/src/main/java/org/sonar/batch/repository/DefaultServerIssuesLoader.java b/sonar-batch/src/main/java/org/sonar/batch/repository/DefaultServerIssuesLoader.java index 63fc7578df9..048f869e316 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/repository/DefaultServerIssuesLoader.java +++ b/sonar-batch/src/main/java/org/sonar/batch/repository/DefaultServerIssuesLoader.java @@ -39,7 +39,7 @@ public class DefaultServerIssuesLoader implements ServerIssuesLoader { } @Override - public boolean load(String componentKey, Function consumer, boolean incremental) { + public boolean load(String componentKey, Function consumer) { WSLoaderResult result = wsLoader.loadSource("/batch/issues?key=" + BatchUtils.encodeForUrl(componentKey)); parseIssues(result.get(), consumer); return result.isFromCache(); diff --git a/sonar-batch/src/main/java/org/sonar/batch/repository/GlobalRepositoriesProvider.java b/sonar-batch/src/main/java/org/sonar/batch/repository/GlobalRepositoriesProvider.java index 3bdab15c126..bad8be3dcde 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/repository/GlobalRepositoriesProvider.java +++ b/sonar-batch/src/main/java/org/sonar/batch/repository/GlobalRepositoriesProvider.java @@ -35,12 +35,7 @@ public class GlobalRepositoriesProvider extends ProviderAdapter { if (globalReferentials == null) { Profiler profiler = Profiler.create(LOG).startInfo(LOG_MSG); globalReferentials = loader.load(); - - if (loader.loadedFromCache()) { - profiler.stopInfo(LOG_MSG + " (done from cache)"); - } else { - profiler.stopInfo(); - } + profiler.stopInfo(loader.loadedFromCache()); } return globalReferentials; } diff --git a/sonar-batch/src/main/java/org/sonar/batch/repository/ProjectRepositoriesProvider.java b/sonar-batch/src/main/java/org/sonar/batch/repository/ProjectRepositoriesProvider.java index 27be9a46b80..adf4e8b1d30 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/repository/ProjectRepositoriesProvider.java +++ b/sonar-batch/src/main/java/org/sonar/batch/repository/ProjectRepositoriesProvider.java @@ -39,12 +39,7 @@ public class ProjectRepositoriesProvider extends ProviderAdapter { if (projectReferentials == null) { Profiler profiler = Profiler.create(LOG).startInfo(LOG_MSG); projectReferentials = loader.load(reactor.getRoot(), taskProps); - - if (loader.loadedFromCache()) { - profiler.stopInfo(LOG_MSG + " (done from cache)"); - } else { - profiler.stopInfo(); - } + profiler.stopInfo(loader.loadedFromCache()); if (analysisMode.isIssues() && projectReferentials.lastAnalysisDate() == null) { LOG.warn("No analysis has been found on the server for this project. All issues will be marked as 'new'."); diff --git a/sonar-batch/src/main/java/org/sonar/batch/repository/ServerIssuesLoader.java b/sonar-batch/src/main/java/org/sonar/batch/repository/ServerIssuesLoader.java index 250648b3bcf..21681c87136 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/repository/ServerIssuesLoader.java +++ b/sonar-batch/src/main/java/org/sonar/batch/repository/ServerIssuesLoader.java @@ -24,6 +24,6 @@ import org.sonar.batch.protocol.input.BatchInput.ServerIssue; public interface ServerIssuesLoader { - boolean load(String componentKey, Function consumer, boolean incremental); + boolean load(String componentKey, Function consumer); } diff --git a/sonar-batch/src/main/java/org/sonar/batch/repository/user/UserRepositoryLoader.java b/sonar-batch/src/main/java/org/sonar/batch/repository/user/UserRepositoryLoader.java index 43d2383b50d..a6193dc278a 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/repository/user/UserRepositoryLoader.java +++ b/sonar-batch/src/main/java/org/sonar/batch/repository/user/UserRepositoryLoader.java @@ -19,17 +19,15 @@ */ package org.sonar.batch.repository.user; -import org.sonar.batch.bootstrap.WSLoaderResult; +import com.google.common.collect.Lists; -import org.sonar.api.utils.log.Profiler; -import org.sonar.api.utils.log.Logger; -import org.sonar.api.utils.log.Loggers; +import com.google.common.base.Joiner; +import org.sonar.batch.bootstrap.AbstractServerLoader; +import org.sonar.batch.bootstrap.WSLoaderResult; import org.sonar.batch.util.BatchUtils; import org.sonar.batch.bootstrap.WSLoader; import com.google.common.io.ByteSource; import com.google.common.base.Function; -import com.google.common.base.Joiner; -import com.google.common.collect.Lists; import org.sonar.batch.protocol.input.BatchInput; import java.io.IOException; @@ -39,8 +37,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; -public class UserRepositoryLoader { - private static final Logger LOG = Loggers.get(UserRepositoryLoader.class); +public class UserRepositoryLoader extends AbstractServerLoader { private final WSLoader wsLoader; public UserRepositoryLoader(WSLoader wsLoader) { @@ -48,28 +45,25 @@ public class UserRepositoryLoader { } public BatchInput.User load(String userLogin) { - ByteSource byteSource = loadUsers(new UserEncodingFunction().apply(userLogin)); + ByteSource byteSource = loadQuery(new UserEncodingFunction().apply(userLogin)); return parseUser(byteSource); } + /** + * Not cache friendly. Should not be used if a cache hit is expected. + */ public Collection load(List userLogins) { if (userLogins.isEmpty()) { return Collections.emptyList(); } - ByteSource byteSource = loadUsers(Joiner.on(',').join(Lists.transform(userLogins, new UserEncodingFunction()))); + ByteSource byteSource = loadQuery(Joiner.on(',').join(Lists.transform(userLogins, new UserEncodingFunction()))); return parseUsers(byteSource); } - private ByteSource loadUsers(String loginsQuery) { - Profiler profiler = Profiler.create(LOG).startDebug("Load user repository"); + private ByteSource loadQuery(String loginsQuery) { WSLoaderResult result = wsLoader.loadSource("/batch/users?logins=" + loginsQuery); - if (result.isFromCache()) { - profiler.stopInfo("Load user repository (done from cache)"); - } else { - profiler.stopInfo(); - } - + super.loadedFromCache = result.isFromCache(); return result.get(); } @@ -82,7 +76,7 @@ public class UserRepositoryLoader { private static BatchInput.User parseUser(ByteSource input) { try (InputStream is = input.openStream()) { - return BatchInput.User.parseFrom(is); + return BatchInput.User.parseDelimitedFrom(is); } catch (IOException e) { throw new IllegalStateException("Unable to get user details from server", e); } diff --git a/sonar-batch/src/main/java/org/sonar/batch/rule/RulesProvider.java b/sonar-batch/src/main/java/org/sonar/batch/rule/RulesProvider.java index df0c231ed3d..866bcdcb73b 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/rule/RulesProvider.java +++ b/sonar-batch/src/main/java/org/sonar/batch/rule/RulesProvider.java @@ -56,11 +56,7 @@ public class RulesProvider extends ProviderAdapter { newRule.setInternalKey(r.getInternalKey()); } - if (ref.loadedFromCache()) { - profiler.stopInfo(LOG_MSG + " (done from cache)"); - } else { - profiler.stopInfo(); - } + profiler.stopInfo(ref.loadedFromCache()); return builder.build(); } diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan/report/JSONReport.java b/sonar-batch/src/main/java/org/sonar/batch/scan/report/JSONReport.java index 30c56af99d7..68c2f5f94db 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/scan/report/JSONReport.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/report/JSONReport.java @@ -19,7 +19,10 @@ */ package org.sonar.batch.scan.report; +import org.sonar.batch.protocol.input.BatchInput.User; + import com.google.common.annotations.VisibleForTesting; + import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; @@ -27,9 +30,11 @@ import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; import java.util.Collection; +import java.util.LinkedList; +import java.util.List; import java.util.Set; + import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -47,14 +52,12 @@ import org.sonar.api.config.Settings; import org.sonar.api.platform.Server; import org.sonar.api.resources.Project; import org.sonar.api.rule.RuleKey; -import org.sonar.api.utils.SonarException; import org.sonar.api.utils.text.JsonWriter; import org.sonar.batch.issue.IssueCache; import org.sonar.batch.protocol.input.BatchInput; import org.sonar.batch.repository.user.UserRepositoryLoader; import org.sonar.batch.scan.filesystem.InputPathCache; import org.sonar.core.issue.DefaultIssue; - import static com.google.common.collect.Sets.newHashSet; @Properties({ @@ -120,12 +123,11 @@ public class JSONReport implements Reporter { writeJsonIssues(json, ruleKeys, userLogins); writeJsonComponents(json); writeJsonRules(json, ruleKeys); - Collection users = userRepository.load(new ArrayList<>(userLogins)); - writeUsers(json, users); + writeUsers(json, userLogins); json.endObject().close(); } catch (IOException e) { - throw new SonarException("Unable to write JSON report", e); + throw new IllegalStateException("Unable to write JSON report", e); } } @@ -147,10 +149,10 @@ public class JSONReport implements Reporter { .prop("assignee", issue.assignee()) .prop("effortToFix", issue.effortToFix()) .propDateTime("creationDate", issue.creationDate()); - if (issue.reporter() != null) { + if (!StringUtils.isEmpty(issue.reporter())) { logins.add(issue.reporter()); } - if (issue.assignee() != null) { + if (!StringUtils.isEmpty(issue.assignee())) { logins.add(issue.assignee()); } json.endObject(); @@ -212,7 +214,15 @@ public class JSONReport implements Reporter { json.endArray(); } - private static void writeUsers(JsonWriter json, Collection users) throws IOException { + private void writeUsers(JsonWriter json, Collection userLogins) throws IOException { + List users = new LinkedList(); + for (String userLogin : userLogins) { + User user = userRepository.load(userLogin); + if (user != null) { + users.add(user); + } + } + json.name("users").beginArray(); for (BatchInput.User user : users) { json diff --git a/sonar-batch/src/test/java/org/sonar/batch/bootstrap/BatchPluginJarExploderTest.java b/sonar-batch/src/test/java/org/sonar/batch/bootstrap/BatchPluginJarExploderTest.java index 631d78634a0..a7c1c8d4e60 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/bootstrap/BatchPluginJarExploderTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/bootstrap/BatchPluginJarExploderTest.java @@ -71,7 +71,7 @@ public class BatchPluginJarExploderTest { } File getFileFromCache(String filename) throws IOException { - File src = FileUtils.toFile(BatchPluginJarExploderTest.class.getResource("/org/sonar/batch/bootstrap/BatchPluginUnzipperTest/" + filename)); + File src = FileUtils.toFile(BatchPluginJarExploderTest.class.getResource("/org/sonar/batch/bootstrap/BatchPluginJarExploderTest/" + filename)); File destFile = new File(new File(userHome, "" + filename.hashCode()), filename); FileUtils.copyFile(src, destFile); return destFile; diff --git a/sonar-batch/src/test/java/org/sonar/batch/bootstrap/BatchPluginPredicateTest.java b/sonar-batch/src/test/java/org/sonar/batch/bootstrap/BatchPluginPredicateTest.java index 66429da2715..104b8ad74a1 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/bootstrap/BatchPluginPredicateTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/bootstrap/BatchPluginPredicateTest.java @@ -69,6 +69,18 @@ public class BatchPluginPredicateTest { assertThat(predicate.apply("cobertura")).isFalse(); } + @Test + public void verify_both_inclusions_and_exclusions_issues() { + when(mode.isIssues()).thenReturn(true); + settings + .setProperty(CoreProperties.PREVIEW_INCLUDE_PLUGINS, "checkstyle,pmd,findbugs") + .setProperty(CoreProperties.PREVIEW_EXCLUDE_PLUGINS, "cobertura"); + BatchPluginPredicate predicate = new BatchPluginPredicate(settings, mode); + assertThat(predicate.apply("checkstyle")).isTrue(); + assertThat(predicate.apply("pmd")).isTrue(); + assertThat(predicate.apply("cobertura")).isFalse(); + } + @Test public void test_exclusions_without_any_inclusions() { when(mode.isPreview()).thenReturn(true); diff --git a/sonar-batch/src/test/java/org/sonar/batch/bootstrap/WSLoaderTest.java b/sonar-batch/src/test/java/org/sonar/batch/bootstrap/WSLoaderTest.java index 781c1ad255c..766d6603ece 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/bootstrap/WSLoaderTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/bootstrap/WSLoaderTest.java @@ -19,6 +19,10 @@ */ package org.sonar.batch.bootstrap; +import org.hamcrest.Matchers; + +import org.junit.rules.ExpectedException; +import org.junit.Rule; import org.sonar.api.utils.HttpDownloader; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; @@ -29,6 +33,7 @@ import org.mockito.InOrder; import java.io.IOException; import java.net.URI; +import static org.junit.Assert.*; import static org.mockito.Mockito.mock; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Matchers.anyBoolean; @@ -55,6 +60,8 @@ public class WSLoaderTest { private ServerClient client; @Mock private PersistentCache cache; + @Rule + public ExpectedException exception = ExpectedException.none(); @Before public void setUp() throws IOException { @@ -77,14 +84,13 @@ public class WSLoaderTest { assertResult(loader.loadString(ID), cacheValue, true); assertResult(loader.loadString(ID), cacheValue, true); - // only try once the server - verify(client, times(1)).load(anyString(), anyString(), anyBoolean(), anyInt(), anyInt()); - verify(cache, times(2)).get(ID, null); + assertUsedServer(1); + assertUsedCache(2); } @Test public void test_cache_strategy_fallback() throws IOException { - when(cache.get(ID, null)).thenReturn(null); + turnCacheEmpty(); WSLoader loader = new WSLoader(LoadStrategy.CACHE_FIRST, cache, client); assertResult(loader.load(ID), serverValue.getBytes(), false); @@ -113,23 +119,38 @@ public class WSLoaderTest { verify(cache).put(ID, serverValue.getBytes()); } - @Test(expected = NullPointerException.class) + @Test public void test_throw_cache_exception_fallback() throws IOException { turnServerOffline(); + when(cache.get(ID, null)).thenThrow(new NullPointerException()); WSLoader loader = new WSLoader(LoadStrategy.SERVER_FIRST, cache, client); - loader.load(ID); + + try { + loader.load(ID); + fail("NPE expected"); + } catch (NullPointerException e) { + assertUsedServer(1); + assertUsedCache(1); + } } - @Test(expected = IllegalStateException.class) + @Test public void test_throw_cache_exception() throws IOException { when(cache.get(ID, null)).thenThrow(new IllegalStateException()); WSLoader loader = new WSLoader(LoadStrategy.CACHE_FIRST, cache, client); - loader.load(ID); + + try { + loader.load(ID); + fail("IllegalStateException expected"); + } catch (IllegalStateException e) { + assertUsedServer(0); + assertUsedCache(1); + } } - @Test(expected = IllegalStateException.class) + @Test public void test_throw_http_exceptions() { HttpDownloader.HttpException httpException = mock(HttpDownloader.HttpException.class); IllegalStateException wrapperException = new IllegalStateException(httpException); @@ -140,13 +161,47 @@ public class WSLoaderTest { try { loader.load(ID); + fail("IllegalStateException expected"); } catch (IllegalStateException e) { // cache should not be used verifyNoMoreInteractions(cache); - throw e; } } + @Test + public void test_server_only_not_available() { + turnServerOffline(); + + exception.expect(IllegalStateException.class); + exception.expectMessage(Matchers.is("Server is not available")); + + WSLoader loader = new WSLoader(LoadStrategy.SERVER_ONLY, cache, client); + loader.load(ID); + } + + @Test + public void test_server_cache_not_available() throws IOException { + turnServerOffline(); + turnCacheEmpty(); + + exception.expect(IllegalStateException.class); + exception.expectMessage(Matchers.is("Server is not accessible and data is not cached")); + + WSLoader loader = new WSLoader(LoadStrategy.SERVER_FIRST, cache, client); + loader.load(ID); + } + + @Test + public void test_cache_only_available() throws IOException { + turnCacheEmpty(); + + exception.expect(IllegalStateException.class); + exception.expectMessage(Matchers.is("Data is not cached")); + + WSLoader loader = new WSLoader(LoadStrategy.CACHE_ONLY, cache, client); + loader.load(ID); + } + @Test public void test_server_strategy() throws IOException { WSLoader loader = new WSLoader(LoadStrategy.SERVER_FIRST, cache, client); @@ -170,6 +225,14 @@ public class WSLoaderTest { assertResult(loader.loadString(ID), serverValue, false); } + private void assertUsedCache(int times) throws IOException { + verify(cache, times(times)).get(ID, null); + } + + private void assertUsedServer(int times) { + verify(client, times(times)).load(anyString(), anyString(), anyBoolean(), anyInt(), anyInt()); + } + private void assertResult(WSLoaderResult result, T expected, boolean fromCache) { assertThat(result).isNotNull(); assertThat(result.get()).isEqualTo(expected); @@ -179,4 +242,8 @@ public class WSLoaderTest { private void turnServerOffline() { when(client.load(anyString(), anyString(), anyBoolean(), anyInt(), anyInt())).thenThrow(new IllegalStateException()); } + + private void turnCacheEmpty() throws IOException { + when(cache.get(ID, null)).thenReturn(null); + } } diff --git a/sonar-batch/src/test/java/org/sonar/batch/cache/ProjectCacheSynchronizerTest.java b/sonar-batch/src/test/java/org/sonar/batch/cache/ProjectCacheSynchronizerTest.java index 7e4ce898915..3cf688897f0 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/cache/ProjectCacheSynchronizerTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/cache/ProjectCacheSynchronizerTest.java @@ -19,6 +19,120 @@ */ package org.sonar.batch.cache; +import static org.mockito.Mockito.when; +import org.sonar.batch.issue.tracking.DefaultServerLineHashesLoader; +import org.sonar.batch.repository.DefaultServerIssuesLoader; +import org.sonar.batch.scan.ProjectAnalysisMode; +import org.sonar.batch.repository.DefaultProjectRepositoriesLoader; +import org.sonar.api.batch.bootstrap.ProjectReactor; +import org.sonar.batch.bootstrap.WSLoaderResult; +import org.sonar.batch.bootstrap.WSLoader; +import com.google.common.io.ByteSource; + +import java.io.IOException; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.Date; +import java.util.HashMap; + +import static org.mockito.Matchers.anyString; + +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import com.google.common.io.Resources; +import org.junit.Test; +import org.junit.Before; +import org.mockito.MockitoAnnotations; +import org.mockito.Mock; +import org.sonar.api.batch.bootstrap.ProjectDefinition; +import org.sonar.batch.bootstrap.AnalysisProperties; +import org.sonar.batch.issue.tracking.ServerLineHashesLoader; +import org.sonar.batch.repository.ProjectRepositoriesLoader; +import org.sonar.batch.repository.ServerIssuesLoader; +import org.sonar.batch.repository.user.UserRepositoryLoader; + public class ProjectCacheSynchronizerTest { + private static final String BATCH_PROJECT = "/batch/project?key=org.codehaus.sonar-plugins%3Asonar-scm-git-plugin&preview=true"; + private static final String ISSUES = "/batch/issues?key=org.codehaus.sonar-plugins%3Asonar-scm-git-plugin"; + private static final String LINE_HASHES1 = "/api/sources/hash?key=org.codehaus.sonar-plugins%3Asonar-scm-git-plugin%3Asrc%2Ftest%2Fjava%2Forg%2Fsonar%2Fplugins%2Fscm%2Fgit%2FJGitBlameCommandTest.java"; + private static final String LINE_HASHES2 = "/api/sources/hash?key=org.codehaus.sonar-plugins%3Asonar-scm-git-plugin%3Asrc%2Fmain%2Fjava%2Forg%2Fsonar%2Fplugins%2Fscm%2Fgit%2FGitScmProvider.java"; + + @Mock + private ProjectDefinition project; + @Mock + private ProjectReactor projectReactor; + @Mock + private ProjectCacheStatus cacheStatus; + @Mock + private ProjectAnalysisMode analysisMode; + @Mock + private AnalysisProperties properties; + @Mock + private WSLoader ws; + + private ProjectRepositoriesLoader projectRepositoryLoader; + private ServerIssuesLoader issuesLoader; + private ServerLineHashesLoader lineHashesLoader; + private UserRepositoryLoader userRepositoryLoader; + + @Before + public void setUp() throws IOException { + MockitoAnnotations.initMocks(this); + + String batchProject = getResourceAsString("batch_project.json"); + ByteSource issues = getResourceAsByteSource("batch_issues.protobuf"); + String lineHashes2 = getResourceAsString("api_sources_hash_GitScmProvider.text"); + String lineHashes1 = getResourceAsString("api_sources_hash_JGitBlameCommand.text"); + + when(ws.loadString(BATCH_PROJECT)).thenReturn(new WSLoaderResult<>(batchProject, false)); + when(ws.loadSource(ISSUES)).thenReturn(new WSLoaderResult<>(issues, false)); + when(ws.loadString(LINE_HASHES1)).thenReturn(new WSLoaderResult<>(lineHashes1, false)); + when(ws.loadString(LINE_HASHES2)).thenReturn(new WSLoaderResult<>(lineHashes2, false)); + + when(analysisMode.isIssues()).thenReturn(true); + when(project.getKeyWithBranch()).thenReturn("org.codehaus.sonar-plugins:sonar-scm-git-plugin"); + when(projectReactor.getRoot()).thenReturn(project); + when(properties.properties()).thenReturn(new HashMap()); + + projectRepositoryLoader = new DefaultProjectRepositoriesLoader(ws, analysisMode); + issuesLoader = new DefaultServerIssuesLoader(ws); + lineHashesLoader = new DefaultServerLineHashesLoader(ws); + userRepositoryLoader = new UserRepositoryLoader(ws); + } + + @Test + public void testSync() { + ProjectCacheSynchronizer sync = new ProjectCacheSynchronizer(projectReactor, projectRepositoryLoader, properties, issuesLoader, lineHashesLoader, userRepositoryLoader, + cacheStatus); + sync.load(false); + + verify(ws).loadString(BATCH_PROJECT); + verify(ws).loadSource(ISSUES); + verify(ws).loadString(LINE_HASHES1); + verify(ws).loadString(LINE_HASHES2); + verifyNoMoreInteractions(ws); + + verify(cacheStatus).save(anyString()); + } + + @Test + public void testDontSyncIfNotForce() { + when(cacheStatus.getSyncStatus("org.codehaus.sonar-plugins:sonar-scm-git-plugin")).thenReturn(new Date()); + + ProjectCacheSynchronizer sync = new ProjectCacheSynchronizer(projectReactor, projectRepositoryLoader, properties, issuesLoader, lineHashesLoader, userRepositoryLoader, + cacheStatus); + sync.load(false); + + verifyNoMoreInteractions(ws); + } + + private String getResourceAsString(String name) throws IOException { + URL resource = this.getClass().getResource(getClass().getSimpleName() + "/" + name); + return Resources.toString(resource, StandardCharsets.UTF_8); + } + private ByteSource getResourceAsByteSource(String name) throws IOException { + URL resource = this.getClass().getResource(getClass().getSimpleName() + "/" + name); + return Resources.asByteSource(resource); + } } diff --git a/sonar-batch/src/test/java/org/sonar/batch/issue/DefaultIssueCallbackTest.java b/sonar-batch/src/test/java/org/sonar/batch/issue/DefaultIssueCallbackTest.java index 41d5bddfbca..de1b59fed36 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/issue/DefaultIssueCallbackTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/issue/DefaultIssueCallbackTest.java @@ -39,7 +39,6 @@ import java.util.List; import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyListOf; import static org.assertj.core.api.Assertions.assertThat; import org.junit.Test; @@ -68,7 +67,7 @@ public class DefaultIssueCallbackTest { BatchInput.User.Builder userBuilder = BatchInput.User.newBuilder(); userBuilder.setLogin("user"); userBuilder.setName("name"); - when(userRepository.load(anyListOf(String.class))).thenReturn(ImmutableList.of(userBuilder.build())); + when(userRepository.load("user")).thenReturn(userBuilder.build()); Rule r = mock(Rule.class); when(r.name()).thenReturn("rule name"); @@ -128,7 +127,7 @@ public class DefaultIssueCallbackTest { } }; - when(userRepository.load(anyListOf(String.class))).thenReturn(new LinkedList()); + when(userRepository.load(any(String.class))).thenReturn(null); when(rules.find(any(RuleKey.class))).thenReturn(null); DefaultIssueCallback issueCallback = new DefaultIssueCallback(issueCache, listener, userRepository, rules); diff --git a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/BatchMediumTester.java b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/BatchMediumTester.java index 522d8b5fa1a..3e4ddedacf5 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/BatchMediumTester.java +++ b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/BatchMediumTester.java @@ -60,7 +60,6 @@ import org.sonar.batch.report.ReportPublisher; import org.sonar.batch.repository.GlobalRepositoriesLoader; import org.sonar.batch.repository.ProjectRepositoriesLoader; import org.sonar.batch.repository.ServerIssuesLoader; -import org.sonar.core.component.ComponentKeys; /** * Main utility class for writing batch medium tests. @@ -336,7 +335,7 @@ public class BatchMediumTester { @Override public boolean loadedFromCache() { - return true; + return false; } } @@ -385,13 +384,11 @@ public class BatchMediumTester { } @Override - public boolean load(String componentKey, Function consumer, boolean incremental) { + public boolean load(String componentKey, Function consumer) { for (ServerIssue serverIssue : serverIssues) { - if (!incremental || ComponentKeys.createEffectiveKey(serverIssue.getModuleKey(), serverIssue.hasPath() ? serverIssue.getPath() : null).equals(componentKey)) { - consumer.apply(serverIssue); - } + consumer.apply(serverIssue); } - return false; + return true; } } diff --git a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issuesmode/IssueModeAndReportsMediumTest.java b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issuesmode/IssueModeAndReportsMediumTest.java index 9b0a4a7a643..02e9a6a718d 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issuesmode/IssueModeAndReportsMediumTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issuesmode/IssueModeAndReportsMediumTest.java @@ -19,6 +19,8 @@ */ package org.sonar.batch.mediumtest.issuesmode; +import org.sonar.batch.protocol.input.BatchInput.ServerIssue; + import com.google.common.collect.ImmutableMap; import java.io.File; @@ -80,7 +82,7 @@ public class IssueModeAndReportsMediumTest { .activateRule(new ActiveRule("manual", "MyManualIssue", null, "My manual issue", "MAJOR", null, null)) .setPreviousAnalysisDate(new Date()) // Existing issue that is still detected - .mockServerIssue(org.sonar.batch.protocol.input.BatchInput.ServerIssue.newBuilder().setKey("xyz") + .mockServerIssue(ServerIssue.newBuilder().setKey("xyz") .setModuleKey("sample") .setPath("xources/hello/HelloJava.xoo") .setRuleRepository("xoo") @@ -92,7 +94,7 @@ public class IssueModeAndReportsMediumTest { .setStatus("OPEN") .build()) // Existing issue that is no more detected (will be closed) - .mockServerIssue(org.sonar.batch.protocol.input.BatchInput.ServerIssue.newBuilder().setKey("resolved") + .mockServerIssue(ServerIssue.newBuilder().setKey("resolved") .setModuleKey("sample") .setPath("xources/hello/HelloJava.xoo") .setRuleRepository("xoo") @@ -104,7 +106,7 @@ public class IssueModeAndReportsMediumTest { .setStatus("OPEN") .build()) // Existing issue on project that is no more detected - .mockServerIssue(org.sonar.batch.protocol.input.BatchInput.ServerIssue.newBuilder().setKey("resolved-on-project") + .mockServerIssue(ServerIssue.newBuilder().setKey("resolved-on-project") .setModuleKey("sample") .setRuleRepository("xoo") .setRuleKey("OneIssuePerModule") @@ -113,7 +115,7 @@ public class IssueModeAndReportsMediumTest { .setStatus("OPEN") .build()) // Manual issue - .mockServerIssue(org.sonar.batch.protocol.input.BatchInput.ServerIssue.newBuilder().setKey("manual") + .mockServerIssue(ServerIssue.newBuilder().setKey("manual") .setModuleKey("sample") .setPath("xources/hello/HelloJava.xoo") .setRuleRepository("manual") @@ -155,6 +157,7 @@ public class IssueModeAndReportsMediumTest { int openIssues = 0; int resolvedIssue = 0; for (Issue issue : result.trackedIssues()) { + System.out.println(issue.message() + " " + issue.key() + " " + issue.ruleKey()); if (issue.isNew()) { newIssues++; } else if (issue.resolution() != null) { @@ -239,13 +242,11 @@ public class IssueModeAndReportsMediumTest { @Test public void testIssueCallback() throws Exception { - File projectDir = new File(IssuesMediumTest.class.getResource("/mediumtest/xoo/sample").toURI()); - File tmpDir = temp.newFolder(); - FileUtils.copyDirectory(projectDir, tmpDir); + File projectDir = copyProject("/mediumtest/xoo/sample"); IssueRecorder issueListener = new IssueRecorder(); TaskResult result = tester - .newScanTask(new File(tmpDir, "sonar-project.properties")) + .newScanTask(new File(projectDir, "sonar-project.properties")) .setIssueListener(issueListener) .start(); diff --git a/sonar-batch/src/test/java/org/sonar/batch/repository/DefaultServerIssuesLoaderTest.java b/sonar-batch/src/test/java/org/sonar/batch/repository/DefaultServerIssuesLoaderTest.java index e9381790ad7..f318c27363e 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/repository/DefaultServerIssuesLoaderTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/repository/DefaultServerIssuesLoaderTest.java @@ -51,7 +51,7 @@ public class DefaultServerIssuesLoaderTest { @Test public void loadFromWs() throws Exception { ByteSource bs = mock(ByteSource.class); - when(wsLoader.loadSource("/batch/issues?key=foo")).thenReturn(new WSLoaderResult(bs, true)); + when(wsLoader.loadSource("/batch/issues?key=foo")).thenReturn(new WSLoaderResult<>(bs, true)); ByteArrayOutputStream bos = new ByteArrayOutputStream(); @@ -70,7 +70,7 @@ public class DefaultServerIssuesLoaderTest { result.add(input); return null; } - }, false); + }); assertThat(result).extracting("key").containsExactly("ab1", "ab2"); } @@ -80,6 +80,6 @@ public class DefaultServerIssuesLoaderTest { ByteSource source = mock(ByteSource.class); when(source.openBufferedStream()).thenThrow(IOException.class); when(wsLoader.loadSource("/batch/issues?key=foo")).thenReturn(new WSLoaderResult(source, true)); - loader.load("foo", mock(Function.class), false); + loader.load("foo", mock(Function.class)); } } diff --git a/sonar-batch/src/test/java/org/sonar/batch/repository/user/UserRepositoryLoaderTest.java b/sonar-batch/src/test/java/org/sonar/batch/repository/user/UserRepositoryLoaderTest.java index bd0b3e7af88..8f583afba41 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/repository/user/UserRepositoryLoaderTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/repository/user/UserRepositoryLoaderTest.java @@ -19,8 +19,9 @@ */ package org.sonar.batch.repository.user; -import org.junit.rules.ExpectedException; +import com.google.common.collect.ImmutableMap; +import org.junit.rules.ExpectedException; import org.junit.Rule; import org.mockito.Mockito; import org.sonar.batch.bootstrap.WSLoaderResult; @@ -34,6 +35,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; +import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; @@ -49,16 +51,34 @@ public class UserRepositoryLoaderTest { WSLoader wsLoader = mock(WSLoader.class); UserRepositoryLoader userRepo = new UserRepositoryLoader(wsLoader); + Map userMap = ImmutableMap.of("fmallet", "Freddy Mallet", "sbrandhof", "Simon"); + WSLoaderResult res = new WSLoaderResult<>(createUsersMock(userMap), true); + when(wsLoader.loadSource("/batch/users?logins=fmallet,sbrandhof")).thenReturn(res); + + assertThat(userRepo.load(Arrays.asList("fmallet", "sbrandhof"))).extracting("login", "name").containsOnly(tuple("fmallet", "Freddy Mallet"), tuple("sbrandhof", "Simon")); + } + + @Test + public void testLoadSingleUser() throws IOException { + WSLoader wsLoader = mock(WSLoader.class); + UserRepositoryLoader userRepo = new UserRepositoryLoader(wsLoader); + + WSLoaderResult res = new WSLoaderResult<>(createUsersMock(ImmutableMap.of("fmallet", "Freddy Mallet")), true); + when(wsLoader.loadSource("/batch/users?logins=fmallet")).thenReturn(res); + + assertThat(userRepo.load("fmallet").getName()).isEqualTo("Freddy Mallet"); + } + + private ByteSource createUsersMock(Map users) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); - BatchInput.User.Builder builder = BatchInput.User.newBuilder(); - builder.setLogin("fmallet").setName("Freddy Mallet").build().writeDelimitedTo(out); - builder.setLogin("sbrandhof").setName("Simon").build().writeDelimitedTo(out); + for (Map.Entry user : users.entrySet()) { + BatchInput.User.Builder builder = BatchInput.User.newBuilder(); + builder.setLogin(user.getKey()).setName(user.getValue()).build().writeDelimitedTo(out); + } ByteSource source = mock(ByteSource.class); - when(wsLoader.loadSource("/batch/users?logins=fmallet,sbrandhof")).thenReturn(new WSLoaderResult<>(source, true)); when(source.openStream()).thenReturn(new ByteArrayInputStream(out.toByteArray())); - - assertThat(userRepo.load(Arrays.asList("fmallet", "sbrandhof"))).extracting("login", "name").containsOnly(tuple("fmallet", "Freddy Mallet"), tuple("sbrandhof", "Simon")); + return source; } @Test @@ -66,7 +86,10 @@ public class UserRepositoryLoaderTest { WSLoader wsLoader = mock(WSLoader.class); UserRepositoryLoader userRepo = new UserRepositoryLoader(wsLoader); ByteSource source = mock(ByteSource.class); - when(wsLoader.loadSource("/batch/users?logins=fmallet,sbrandhof")).thenReturn(new WSLoaderResult<>(source, true)); + + WSLoaderResult res = new WSLoaderResult<>(source, true); + + when(wsLoader.loadSource("/batch/users?logins=fmallet,sbrandhof")).thenReturn(res); InputStream errorInputStream = mock(InputStream.class); Mockito.doThrow(IOException.class).when(errorInputStream).read(); @@ -75,6 +98,6 @@ public class UserRepositoryLoaderTest { exception.expect(IllegalStateException.class); exception.expectMessage("Unable to get user details from server"); - assertThat(userRepo.load(Arrays.asList("fmallet", "sbrandhof"))).extracting("login", "name").containsOnly(tuple("fmallet", "Freddy Mallet"), tuple("sbrandhof", "Simon")); + userRepo.load(Arrays.asList("fmallet", "sbrandhof")); } } diff --git a/sonar-batch/src/test/java/org/sonar/batch/rule/DefaultRulesLoaderTest.java b/sonar-batch/src/test/java/org/sonar/batch/rule/DefaultRulesLoaderTest.java index 7b213f0dbbc..bd1a2e65da9 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/rule/DefaultRulesLoaderTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/rule/DefaultRulesLoaderTest.java @@ -41,7 +41,7 @@ public class DefaultRulesLoaderTest { public void testParseServerResponse() throws IOException { WSLoader wsLoader = mock(WSLoader.class); ByteSource source = Resources.asByteSource(this.getClass().getResource("DefaultRulesLoader/response.protobuf")); - when(wsLoader.loadSource(anyString())).thenReturn(new WSLoaderResult(source, true)); + when(wsLoader.loadSource(anyString())).thenReturn(new WSLoaderResult<>(source, true)); DefaultRulesLoader loader = new DefaultRulesLoader(wsLoader); List ruleList = loader.load(); assertThat(ruleList).hasSize(318); @@ -51,13 +51,13 @@ public class DefaultRulesLoaderTest { public void testLoadedFromCache() { WSLoader wsLoader = mock(WSLoader.class); ByteSource source = Resources.asByteSource(this.getClass().getResource("DefaultRulesLoader/response.protobuf")); - when(wsLoader.loadSource(anyString())).thenReturn(new WSLoaderResult(source, true)); + when(wsLoader.loadSource(anyString())).thenReturn(new WSLoaderResult<>(source, true)); DefaultRulesLoader loader = new DefaultRulesLoader(wsLoader); loader.load(); assertThat(loader.loadedFromCache()).isTrue(); } - + @Test(expected = IllegalStateException.class) public void testGetLoadedFromCacheBefore() { DefaultRulesLoader loader = new DefaultRulesLoader(mock(WSLoader.class)); diff --git a/sonar-batch/src/test/java/org/sonar/batch/scan/report/JSONReportTest.java b/sonar-batch/src/test/java/org/sonar/batch/scan/report/JSONReportTest.java index a5392d36288..c2ccdd2458e 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/scan/report/JSONReportTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/scan/report/JSONReportTest.java @@ -21,6 +21,7 @@ package org.sonar.batch.scan.report; import com.google.common.collect.Lists; import com.google.common.io.Resources; + import java.io.File; import java.io.IOException; import java.io.StringWriter; @@ -28,6 +29,7 @@ import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Collections; import java.util.TimeZone; + import org.junit.Before; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -50,9 +52,7 @@ import org.sonar.batch.repository.user.UserRepositoryLoader; import org.sonar.batch.scan.filesystem.InputPathCache; import org.sonar.core.issue.DefaultIssue; import org.sonar.test.JsonAssert; - import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Matchers.anyListOf; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; @@ -118,7 +118,8 @@ public class JSONReportTest { when(issueCache.all()).thenReturn(Lists.newArrayList(issue)); BatchInput.User user1 = BatchInput.User.newBuilder().setLogin("julien").setName("Julien").build(); BatchInput.User user2 = BatchInput.User.newBuilder().setLogin("simon").setName("Simon").build(); - when(userRepository.load(anyListOf(String.class))).thenReturn(Lists.newArrayList(user1, user2)); + when(userRepository.load("julien")).thenReturn(user1); + when(userRepository.load("simon")).thenReturn(user2); StringWriter writer = new StringWriter(); jsonReport.writeJson(writer); diff --git a/sonar-batch/src/test/resources/org/sonar/batch/bootstrap/BatchPluginUnzipperTest/sonar-checkstyle-plugin-2.8.jar b/sonar-batch/src/test/resources/org/sonar/batch/bootstrap/BatchPluginJarExploderTest/sonar-checkstyle-plugin-2.8.jar similarity index 100% rename from sonar-batch/src/test/resources/org/sonar/batch/bootstrap/BatchPluginUnzipperTest/sonar-checkstyle-plugin-2.8.jar rename to sonar-batch/src/test/resources/org/sonar/batch/bootstrap/BatchPluginJarExploderTest/sonar-checkstyle-plugin-2.8.jar diff --git a/sonar-batch/src/test/resources/org/sonar/batch/bootstrap/JdbcDriverHolderTest/jdbc-driver.jar b/sonar-batch/src/test/resources/org/sonar/batch/bootstrap/JdbcDriverHolderTest/jdbc-driver.jar deleted file mode 100644 index c2bde4e5fffa199fc70c562670d4e82a31edbd5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 537 zcmWIWW@Zs#-~hroVQXv{kN_tG3xls~h@-BjpPT-_Qw$8u3<2Kk93T};P-Ou)HH!dM zz%~0i`gyv!28ZbRx_$ONbK1vSSMMUPx31Q?Gv_x48C)@b@U%$J%U8$K_hRWP7S0(j zC67qY($26D6M3>ktKymJ>&#C@ABz~lwr^j4sRQIn5C+-K1$N0qG^euwMbq;0^%3qv zSHTTc0aT?|Qc>c4njK>P#IvijS%GqFKpf!B$Rxsm8aObYg8~N?zA)ZAz7vx=JuYkOZ0C#~*kPfKl1H4&5-Ua%Ih2aH| ImSzO;03X0$@c;k- diff --git a/sonar-batch/src/test/resources/org/sonar/batch/cache/ProjectCacheSynchronizerTest/api_rules_list.protobuf b/sonar-batch/src/test/resources/org/sonar/batch/cache/ProjectCacheSynchronizerTest/api_rules_list.protobuf new file mode 100644 index 0000000000000000000000000000000000000000..1d417ce28801b53269cfb9b0ddac41442f9e4e68 GIT binary patch literal 27390 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 G(*D03KN#r% literal 0 HcmV?d00001 diff --git a/sonar-batch/src/test/resources/org/sonar/batch/cache/ProjectCacheSynchronizerTest/api_sources_hash_GitScmProvider.text b/sonar-batch/src/test/resources/org/sonar/batch/cache/ProjectCacheSynchronizerTest/api_sources_hash_GitScmProvider.text new file mode 100644 index 00000000000..a9ad538e80a --- /dev/null +++ b/sonar-batch/src/test/resources/org/sonar/batch/cache/ProjectCacheSynchronizerTest/api_sources_hash_GitScmProvider.text @@ -0,0 +1,49 @@ +523048e7f5ca9550505f2d8ea6d587e7 +50ff1975ec4309da19591231c6b5104b +eba1d423f8632818ce94c4eac1b90713 +6112a40c70ed55453a0753030d5564a4 +3389dae361af79b04c9c8e7057f60cc6 +eac5fc1130394e7268b1cfbc54cd7e4d +c0b153d8c08365f2de343e278d3b54c7 +eb4521cb5d193e1d37ecac25b0ffea43 +9210ed0dec59ed663c744d7fb68f0275 +3389dae361af79b04c9c8e7057f60cc6 +cd0fbdfa49d32525ecbdb8dab19dafe6 +ea12a10f5b7730daa639fe133867e088 +69739b9bc9312dfb1a6b8625a08c652a +ec21e054f7f5748d0161fe27cdad6462 +3389dae361af79b04c9c8e7057f60cc6 +951a83e8074813100da0cba92092b385 +c93caecd79a332773cfb06cd5d3b8895 +5832d52d5fcb22a3350f62c856993f0d +c4c9bdd47ee05028cb84873da0ebf2b5 +f89e422b117e518acef69df33f199d10 + +90aa2aae2384f6412c3b86d085d5ffa5 +647f262205ad09f32b0091df388992ed + +943d54ba3e8812437c4d26ef8aa263f8 + +340385b760d1441d3b74e5e39399cc0c + +a94613fd32125cd63160b0c1cf2bd078 + +3415664f5f4a608772e6a4c73a993804 +597b7f5598c56e77bd28b9ff15a30802 +cbb184dd8e05c9709e5dcaedaa0495cf + +2c953c12d2eb6ea958b7f3045ecf8e81 +864d4d5a0cd65f52d791700443cec75e +1b2437750694bba602fedc0a568c65de +cbb184dd8e05c9709e5dcaedaa0495cf + +2c953c12d2eb6ea958b7f3045ecf8e81 +d18a921e891f6f9af8564a882efea289 +8bc5ef2851a7dcf1cf096a68e2a47ba6 +cbb184dd8e05c9709e5dcaedaa0495cf + +2c953c12d2eb6ea958b7f3045ecf8e81 +9cf0f8aa69740d88788fb437589ed33f +0df2777822bbc7799716a10478ca58d4 +cbb184dd8e05c9709e5dcaedaa0495cf +cbb184dd8e05c9709e5dcaedaa0495cf diff --git a/sonar-batch/src/test/resources/org/sonar/batch/cache/ProjectCacheSynchronizerTest/api_sources_hash_JGitBlameCommand.text b/sonar-batch/src/test/resources/org/sonar/batch/cache/ProjectCacheSynchronizerTest/api_sources_hash_JGitBlameCommand.text new file mode 100644 index 00000000000..e21a25bd7b6 --- /dev/null +++ b/sonar-batch/src/test/resources/org/sonar/batch/cache/ProjectCacheSynchronizerTest/api_sources_hash_JGitBlameCommand.text @@ -0,0 +1,149 @@ +523048e7f5ca9550505f2d8ea6d587e7 +50ff1975ec4309da19591231c6b5104b +eba1d423f8632818ce94c4eac1b90713 +6112a40c70ed55453a0753030d5564a4 +3389dae361af79b04c9c8e7057f60cc6 +eac5fc1130394e7268b1cfbc54cd7e4d +c0b153d8c08365f2de343e278d3b54c7 +eb4521cb5d193e1d37ecac25b0ffea43 +9210ed0dec59ed663c744d7fb68f0275 +3389dae361af79b04c9c8e7057f60cc6 +cd0fbdfa49d32525ecbdb8dab19dafe6 +ea12a10f5b7730daa639fe133867e088 +69739b9bc9312dfb1a6b8625a08c652a +ec21e054f7f5748d0161fe27cdad6462 +3389dae361af79b04c9c8e7057f60cc6 +951a83e8074813100da0cba92092b385 +c93caecd79a332773cfb06cd5d3b8895 +5832d52d5fcb22a3350f62c856993f0d +c4c9bdd47ee05028cb84873da0ebf2b5 +f89e422b117e518acef69df33f199d10 + +9e0ae10d6ada18721c856844d765b465 +ea3c894506f93b88c9fc6c9790da9008 +c5c303a0f47f5f15f22b6776fc1c8c93 +4f592acdcfc11c97e7f19231de9d69b0 +6aea6951956275cb62d01063a1e695fe +293f7a3f08e54359c17d5e984f721665 +18d24bd6a2c2c15d3914502e2776e372 +107e08f15be7e18888da7e69948ac3ba +90aa2aae2384f6412c3b86d085d5ffa5 +ef76944333105582ae8d3a51d29b3b8a +2a592c3d07126847ae4cbbed4a2b4d46 +6f382821d6f35beb6ae4080607046898 + +943d54ba3e8812437c4d26ef8aa263f8 +6fa05171389dfbeda44181c98e580d18 +391715e38dad3a13b75205d527e82c8a +bb3900a63a8cecc1e79592e054915c97 +7c8d40302b1200413bc859331a4f241d +0e2ad2ad1ad56b970e4348a3967d1e81 +049ace1ff1516be8a5fd7cddc0ab2f30 +d2c44db3922004ac2ae41fb402d005b1 +b0ba7766e9e1fddaf40e86b62a5c2900 + +62e220c0092e8ae61f5937f18e4b03bc + +a5eeb3bd06bd4499f8a9ad20ba426bbd + +2bb44a6b46970b3efd87cc8a68848fae + +5b9e24bad64529f3e35ba4f1aed892f2 +78f4e1ffbbf29629025b20f6b1be36f5 +cbb184dd8e05c9709e5dcaedaa0495cf + +2c953c12d2eb6ea958b7f3045ecf8e81 +0f253056876c021c4fd3f3e5ddc4d5b6 +520e98566046a173f9250aa3b7a40ec9 +c31394024dee65cba7e5c526c69af278 +80d5b17efc16ace990c07580fc3e85eb +d28bc6d296024d650b16efe1369128b0 +38ba857d93d3a54a6b7f1bfc1b8fb090 +d41f14cd3267e8d9c17b47ddcb71b0c1 +54f339c05c18199eca937a31fdc07857 +7efc34bf8e2ba01cec26c50875ac8acd +5a29aee8cfe3a5110dc892ab8adfc17f +d271e10accbea4cb6365b85150505b0d +cbb184dd8e05c9709e5dcaedaa0495cf +cbb184dd8e05c9709e5dcaedaa0495cf + +319f70c2d340b01002c3539d09dabbec +b225a5ae163bfc56684d172522993825 +791c95e71dd996b4d723f96df3f37ca4 +80d5b17efc16ace990c07580fc3e85eb +2a8af480cbdcc0ee9b44187a078c8fe7 +4340b548cda0dbc6043cbf4cf49d1b12 +2df758e8d85494e7ee23a02d4c3aa6a7 +e44feb14b61ab99767239eaded464459 +eb375774c265dedeefeb29283ceea9bc +c87c662bc284c5f9c01d3551957ee32e +cbb184dd8e05c9709e5dcaedaa0495cf +cbb184dd8e05c9709e5dcaedaa0495cf +cbb184dd8e05c9709e5dcaedaa0495cf + +1fcefdfae441ded6478da69428a30f12 +8fcd1ffa896d0e214539b1bfa179f3e8 +7a64b5f6e57cc9f13d5a1be99b9f7c23 +8884d72adb8d93474c6af620a7d6fdba +cbb184dd8e05c9709e5dcaedaa0495cf +7e53b1d2085d8c7ae88417eccc5a0893 +cbb184dd8e05c9709e5dcaedaa0495cf + +5f68d8059a28922be107658c3890c230 +6ded45bc62f1d535345e67001dac69d5 +34165242e2230ffca31d7942ec577e6b +02f5ec563dbaaef9ef402c6941a36c98 +784b65e21ca0539f3cefb1710ccc7768 +982e86cf85e0f121ba1a2f0ef462aa6b +cbb184dd8e05c9709e5dcaedaa0495cf +80d5b17efc16ace990c07580fc3e85eb +34c0d764eb79cc7c6dccb53e711fd4be +a5b2391dd7127292b7240c7c8c1ee92a +54d7949984c901073fffda9956190c12 +da38c234aa3fdca9ec1e0e2b991d3568 +6b2decb38be3882440910fd75ec508cd +ce51581950deb12616108c0e909f9c53 +cbb184dd8e05c9709e5dcaedaa0495cf +cbb184dd8e05c9709e5dcaedaa0495cf + +e8165f1ae4cf11035542d4b60ac7b14d +c8272ad357e7feaf2671a0612e52d3b5 +2c953c12d2eb6ea958b7f3045ecf8e81 +209935c0f7c635d91164fe2b14314a3d +448b1c0a64288dbeac516ba67c9f2574 +540c13e9e156b687226421b24f2df178 +cbb184dd8e05c9709e5dcaedaa0495cf +c0c97e22db5055def551d1cef15fb251 +cbb184dd8e05c9709e5dcaedaa0495cf + +8983f749749a87599ea48c8bc08cac86 +f298d78afda5708f64ded32af0e7f541 +248e216059cad9c12bc8ff8b3b6289e2 +80d5b17efc16ace990c07580fc3e85eb +318ddd60a422c3d0435acd5f7aa6923c +7c3bca9656325d15227ffac4ce5dfde9 +7d992ab2241888573c1c7bdfe5d33a35 +cd620097a91b074942d29535e822ebb0 +a50e423de97896afb97123424a960664 +35bb4ed816814a612f9605aec97c69fb +cbb184dd8e05c9709e5dcaedaa0495cf +280db1f26dcc577de8fc62d40627112b +e5b027822061ae041ced3d958b6f7f37 +11a0dde589dec02e8d95c4ea6d83780f +e5acab4c66ae60432ccc5a45d718d152 +3c4b4570f7e4c7037693b1aa1fd5a9ca +420d9af4c91e3248bb2a4e72a683a03a +d69bf14adaf9ea45b48c0fdfefa4f69d +505b97969baa28c3f607a38ee02f4f2d +cbb184dd8e05c9709e5dcaedaa0495cf +da94121a62e940229bd622927ad7702f +9d2a20a55b185c4a864efd3484a870fa +cbb184dd8e05c9709e5dcaedaa0495cf +daada2d57491a2d0b4d237f29fc039dc +53220ad5b69915dec696a01167d5237b +2fb05fbd558fb020eacca16faa325246 +cbb184dd8e05c9709e5dcaedaa0495cf +423c485e2882c1fd9a1b19983b812f50 +cbb184dd8e05c9709e5dcaedaa0495cf + +cbb184dd8e05c9709e5dcaedaa0495cf diff --git a/sonar-batch/src/test/resources/org/sonar/batch/cache/ProjectCacheSynchronizerTest/batch_issues.protobuf b/sonar-batch/src/test/resources/org/sonar/batch/cache/ProjectCacheSynchronizerTest/batch_issues.protobuf new file mode 100644 index 0000000000000000000000000000000000000000..8b610d8f73cc488bf0690256a4c584590383b88d GIT binary patch literal 788 zcmc)IyN=W_6b4{!+fY(cSrHVAXGiv4@3@f{F*> zA*gr>9)vd_!;VBrxuuW(zxjTDyK(!T0Nu5%($qrds8nr7O#_B@+*!*JjjR2gD$eWD zMUNZUrZUA5W;*rTbr{p?@|D~`*CFq(cORzNRRe^v`T!qcSFir&s(q_k^3{^Bo;?Zq zQ4a$?j>7<>FL(LkAf0c6e{k@Y3$ED7s(JxuNQw&x`6SM#kj_ryQkZ(oSP&pZ%8-LA z$bfkheR*{K>9u#aUcEkkX^E&!*D}Ywkj%20G46yC#xvu=T6ELT@4tThKK!~^XfT>9 z%P49zR0`)86-3%KQduLI*PLCk#rxIarG?#w-oL>qrjXpP7 xXEHCl&+&rfO-KYkIh=BcV|jG*-#?JM{gu?t1M}83Y}wa#(sk1K+SYt8@CP@Q1}^{r literal 0 HcmV?d00001 diff --git a/sonar-batch/src/test/resources/org/sonar/batch/cache/ProjectCacheSynchronizerTest/batch_project.json b/sonar-batch/src/test/resources/org/sonar/batch/cache/ProjectCacheSynchronizerTest/batch_project.json new file mode 100644 index 00000000000..2887ce18d10 --- /dev/null +++ b/sonar-batch/src/test/resources/org/sonar/batch/cache/ProjectCacheSynchronizerTest/batch_project.json @@ -0,0 +1,164 @@ +{ + "timestamp": 0, + "qprofilesByLanguage": { + "java": { + "key": "java-sonar-way-72608", + "name": "Sonar way", + "language": "java", + "rulesUpdatedAt": "2015-08-10T12:06:53+0200" + } + }, + "activeRules": [ + { + "repositoryKey": "common-java", + "ruleKey": "DuplicatedBlocks", + "name": "Source files should not have any duplicated blocks", + "severity": "MAJOR", + "language": "java", + "params": {} + }, + { + "repositoryKey": "common-java", + "ruleKey": "InsufficientBranchCoverage", + "name": "Branches should have sufficient coverage by unit tests", + "severity": "MAJOR", + "language": "java", + "params": { + "minimumBranchCoverageRatio": "65.0" + } + }, + { + "repositoryKey": "squid", + "ruleKey": "RightCurlyBraceStartLineCheck", + "name": "A close curly brace should be located at the beginning of a line", + "severity": "MINOR", + "internalKey": "RightCurlyBraceStartLineCheck", + "language": "java", + "params": {} + }, + { + "repositoryKey": "squid", + "ruleKey": "UselessParenthesesCheck", + "name": "Useless parentheses around expressions should be removed to prevent any misunderstanding", + "severity": "MAJOR", + "internalKey": "UselessParenthesesCheck", + "language": "java", + "params": {} + }, + { + "repositoryKey": "squid", + "ruleKey": "ObjectFinalizeCheck", + "name": "The Object.finalize() method should not be called", + "severity": "CRITICAL", + "internalKey": "ObjectFinalizeCheck", + "language": "java", + "params": {} + }, + { + "repositoryKey": "squid", + "ruleKey": "ObjectFinalizeOverridenCheck", + "name": "The Object.finalize() method should not be overriden", + "severity": "CRITICAL", + "internalKey": "ObjectFinalizeOverridenCheck", + "language": "java", + "params": {} + }, + { + "repositoryKey": "squid", + "ruleKey": "ObjectFinalizeOverridenCallsSuperFinalizeCheck", + "name": "super.finalize() should be called at the end of Object.finalize() implementations", + "severity": "BLOCKER", + "internalKey": "ObjectFinalizeOverridenCallsSuperFinalizeCheck", + "language": "java", + "params": {} + }, + { + "repositoryKey": "squid", + "ruleKey": "ClassVariableVisibilityCheck", + "name": "Class variable fields should not have public accessibility", + "severity": "MAJOR", + "internalKey": "ClassVariableVisibilityCheck", + "language": "java", + "params": {} + }, + { + "repositoryKey": "squid", + "ruleKey": "S2188", + "name": "JUnit test cases should call super methods", + "severity": "CRITICAL", + "internalKey": "S2188", + "language": "java", + "params": {} + }, + { + "repositoryKey": "squid", + "ruleKey": "S2186", + "name": "JUnit assertions should not be used in \"run\" methods", + "severity": "CRITICAL", + "internalKey": "S2186", + "language": "java", + "params": {} + }, + { + "repositoryKey": "squid", + "ruleKey": "S2187", + "name": "TestCases should contain tests", + "severity": "MAJOR", + "internalKey": "S2187", + "language": "java", + "params": {} + }, + { + "repositoryKey": "squid", + "ruleKey": "S2391", + "name": "JUnit framework methods should be declared properly", + "severity": "CRITICAL", + "internalKey": "S2391", + "language": "java", + "params": {} + }, + { + "repositoryKey": "squid", + "ruleKey": "S2325", + "name": "\"private\" methods that don\u0027t access instance data should be \"static\"", + "severity": "MINOR", + "internalKey": "S2325", + "language": "java", + "params": {} + }, + { + "repositoryKey": "squid", + "ruleKey": "S1166", + "name": "Exception handlers should preserve the original exception", + "severity": "CRITICAL", + "internalKey": "S1166", + "language": "java", + "params": { + "exceptions": "java.lang.InterruptedException, java.lang.NumberFormatException, java.text.ParseException, java.net.MalformedURLException" + } + }, + { + "repositoryKey": "squid", + "ruleKey": "S2970", + "name": "Assertions should be complete", + "severity": "CRITICAL", + "internalKey": "S2970", + "language": "java", + "params": {} + } + + ], + "settingsByModule": {}, + "fileDataByModuleAndPath": { + "org.codehaus.sonar-plugins:sonar-scm-git-plugin": { + "src/test/java/org/sonar/plugins/scm/git/JGitBlameCommandTest.java": { + "needBlame": true + }, + "src/main/java/org/sonar/plugins/scm/git/GitScmProvider.java": { + "hash": "90082117d0dc0f1189ab7e4990a20667", + "needBlame": true + } + } + }, + "lastAnalysisDate": "2015-08-10T13:20:09+0200" +} \ No newline at end of file diff --git a/sonar-batch/src/test/resources/org/sonar/batch/cache/ProjectCacheSynchronizerTest/batch_users.protobuf b/sonar-batch/src/test/resources/org/sonar/batch/cache/ProjectCacheSynchronizerTest/batch_users.protobuf new file mode 100644 index 00000000000..e69de29bb2d diff --git a/sonar-batch/src/test/resources/org/sonar/batch/index/FileHashesPersisterTest/should_persist_component_data-result.xml b/sonar-batch/src/test/resources/org/sonar/batch/index/FileHashesPersisterTest/should_persist_component_data-result.xml deleted file mode 100644 index b710ad3c272..00000000000 --- a/sonar-batch/src/test/resources/org/sonar/batch/index/FileHashesPersisterTest/should_persist_component_data-result.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/sonar-batch/src/test/resources/org/sonar/batch/index/FileHashesPersisterTest/should_persist_component_data.xml b/sonar-batch/src/test/resources/org/sonar/batch/index/FileHashesPersisterTest/should_persist_component_data.xml deleted file mode 100644 index a83b8aad101..00000000000 --- a/sonar-batch/src/test/resources/org/sonar/batch/index/FileHashesPersisterTest/should_persist_component_data.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/CoreProperties.java b/sonar-plugin-api/src/main/java/org/sonar/api/CoreProperties.java index 8e508b0d565..c023f8a0782 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/CoreProperties.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/CoreProperties.java @@ -446,8 +446,6 @@ public interface CoreProperties { */ String ANALYSIS_MODE_ISSUES = "issues"; - String ANALYSIS_MODE_PUBLISH = "publish"; - /** * @since 5.2 */ diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/DefaultProfiler.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/DefaultProfiler.java index cfeb9b29604..266e4f10742 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/DefaultProfiler.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/DefaultProfiler.java @@ -94,24 +94,31 @@ class DefaultProfiler extends Profiler { @Override public Profiler stopTrace() { - return doStopWithoutMessage(LoggerLevel.TRACE); + return doStopWithoutMessage(LoggerLevel.TRACE, " (done)"); } @Override public Profiler stopDebug() { - return doStopWithoutMessage(LoggerLevel.DEBUG); + return doStopWithoutMessage(LoggerLevel.DEBUG, " (done)"); } @Override public Profiler stopInfo() { - return doStopWithoutMessage(LoggerLevel.INFO); + return stopInfo(false); } + - private Profiler doStopWithoutMessage(LoggerLevel level) { + @Override + public Profiler stopInfo(boolean cacheUsed) { + String suffix = cacheUsed ? " (done from cache)" : " (done)"; + return doStopWithoutMessage(LoggerLevel.INFO, suffix); + } + + private Profiler doStopWithoutMessage(LoggerLevel level, String suffix) { if (startMessage == null) { throw new IllegalStateException("Profiler#stopXXX() can't be called without any message defined in start methods"); } - doStop(level, startMessage, " (done)"); + doStop(level, startMessage, suffix); return this; } diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/Loggers.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/Loggers.java index dc82b8b3f2b..c559d92cea4 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/Loggers.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/Loggers.java @@ -36,7 +36,7 @@ public abstract class Loggers { } } - public static Logger get(Class name) { + public static Logger get(Class name) { return factory.newInstance(name.getName()); } diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/NullProfiler.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/NullProfiler.java index 65a943e9447..7f0e3721a65 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/NullProfiler.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/NullProfiler.java @@ -93,4 +93,9 @@ class NullProfiler extends Profiler { // nothing to do return this; } + + @Override + public Profiler stopInfo(boolean cacheUsed) { + return this; + } } diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/Profiler.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/Profiler.java index c22d4ed2939..d82c5622de3 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/Profiler.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/Profiler.java @@ -65,6 +65,8 @@ public abstract class Profiler { public abstract Profiler stopDebug(); public abstract Profiler stopInfo(); + + public abstract Profiler stopInfo(boolean cacheUsed); public abstract Profiler stopTrace(String message); -- 2.39.5