]> source.dussan.org Git - sonarqube.git/commitdiff
Improve quality
authorDuarte Meneses <duarte.meneses@sonarsource.com>
Tue, 25 Aug 2015 12:44:47 +0000 (14:44 +0200)
committerDuarte Meneses <duarte.meneses@sonarsource.com>
Fri, 28 Aug 2015 13:54:30 +0000 (15:54 +0200)
sonar-batch/src/main/java/org/sonar/batch/analysis/AnalysisTempFolderProvider.java
sonar-batch/src/main/java/org/sonar/batch/bootstrap/AbstractAnalysisMode.java
sonar-batch/src/main/java/org/sonar/batch/bootstrap/GlobalTempFolderProvider.java
sonar-batch/src/main/java/org/sonar/batch/scan/MutableProjectReactorProvider.java
sonar-batch/src/main/java/org/sonar/batch/scan/ProjectLock.java
sonar-batch/src/main/java/org/sonar/batch/scan/ProjectReactorBuilder.java
sonar-batch/src/test/java/org/sonar/batch/cache/DefaultProjectCacheStatusTest.java [new file with mode: 0644]
sonar-batch/src/test/java/org/sonar/batch/cache/ProjectCacheStatusTest.java [deleted file]
sonar-batch/src/test/java/org/sonar/batch/repository/DefaultGlobalRepositoriesLoaderTest.java
sonar-batch/src/test/java/org/sonar/batch/scan/ProjectLockTest.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/bootstrap/ProjectDefinition.java

index 63078cdb64825a6b251e79fc7f1a1105d6924430..cf4578291a47e0376d2c7d91659f0125a6436ab0 100644 (file)
@@ -66,6 +66,7 @@ public class AnalysisTempFolderProvider extends ProviderAdapter implements Compo
 
   @Override
   public void dispose(PicoContainer container) {
+    //nothing to do
   }
 
   @Override
index 52d73c8bf4117cbc4ee3fc50006dab7d79fdf57f..95fa28749a56f570b8d1e390f543bf380ac52f8e 100644 (file)
@@ -27,7 +27,7 @@ import java.util.Arrays;
 import org.sonar.api.batch.AnalysisMode;
 
 public abstract class AbstractAnalysisMode implements AnalysisMode {
-  protected final static String[] VALID_MODES = {CoreProperties.ANALYSIS_MODE_PREVIEW, CoreProperties.ANALYSIS_MODE_PUBLISH, CoreProperties.ANALYSIS_MODE_ISSUES};
+  private static final String[] VALID_MODES = {CoreProperties.ANALYSIS_MODE_PREVIEW, CoreProperties.ANALYSIS_MODE_PUBLISH, CoreProperties.ANALYSIS_MODE_ISSUES};
 
   protected boolean preview;
   protected boolean issues;
index 9ccec68c9bd3fb264f2a3d6ffe3584ba5b0e81d4..2a277ac8c717c51a02af5cba48ee610f89a73e22 100644 (file)
@@ -162,6 +162,7 @@ public class GlobalTempFolderProvider extends ProviderAdapter implements Compone
 
   @Override
   public void dispose(PicoContainer container) {
+  //nothing to do
   }
 
   @Override
index a9b2957870208039fc05172becdc7922676b2e17..a77fab56223b91e5729d4f4cb3f52ce16c61a8e9 100644 (file)
@@ -59,7 +59,7 @@ public class MutableProjectReactorProvider extends ProviderAdapter {
     return reactor;
   }
 
-  private void cleanDirectory(File dir) {
+  private static void cleanDirectory(File dir) {
     try {
       FileUtils.deleteDirectory(dir);
       Files.createDirectories(dir.toPath());
index 695fbb687b2583c58f141918a1fe0370733b3704..ce62584abc9debccfcb0bfc0d0cf92a34989ef22 100644 (file)
@@ -53,19 +53,20 @@ public class ProjectLock implements Startable {
       lockFile = lockChannel.tryLock(0, 1024, false);
 
       if (lockFile == null) {
-        failAlreadyInProgress();
+        failAlreadyInProgress(null);
       }
     } catch (OverlappingFileLockException e) {
-      failAlreadyInProgress();
+      failAlreadyInProgress(e);
     } catch (IOException e) {
       throw new IllegalStateException("Failed to create project lock in " + lockFilePath.toString(), e);
     }
   }
   
-  private static void failAlreadyInProgress() {
-    throw new IllegalStateException("Another SonarQube analysis is already in progress for this project");
+  private static void failAlreadyInProgress(Exception e) {
+    throw new IllegalStateException("Another SonarQube analysis is already in progress for this project", e);
   }
 
+  @Override
   public void stop() {
     if (lockFile != null) {
       try {
index 670bf714eef8be8ee8b211b2790ac57eac219345..abbb9602d1a7df2e6e704cd23b3768d8573f4391 100644 (file)
@@ -149,10 +149,10 @@ public class ProjectReactorBuilder {
     // Sort module by reverse lexicographic order to avoid issue when one module id is a prefix of another one
     Collections.sort(moduleIds);
     Collections.reverse(moduleIds);
-    
+
     Map<String, Map<String, String>> result = new HashMap<>();
     result.put(currentModuleId, currentModuleProperties);
-    
+
     for (String moduleId : moduleIds) {
       Map<String, Map<String, String>> subModuleProps = extractPropertiesByModule(moduleId, currentModuleProperties);
       checkRepeatedModuleNames(result.keySet(), subModuleProps.keySet());
@@ -166,8 +166,8 @@ public class ProjectReactorBuilder {
     union.addAll(currentModules);
     union.retainAll(modulesToMerge);
     if (!union.isEmpty()) {
-      if(union.size() > 1) {
-      throw new IllegalStateException(String.format("Modules have the following repeated names: %s. Each module must have a unique name.", union));
+      if (union.size() > 1) {
+        throw new IllegalStateException(String.format("Modules have the following repeated names: %s. Each module must have a unique name.", union));
       } else {
         throw new IllegalStateException(String.format("Two modules have the same name: %s. Each module must have a unique name.", union.iterator().next()));
       }
diff --git a/sonar-batch/src/test/java/org/sonar/batch/cache/DefaultProjectCacheStatusTest.java b/sonar-batch/src/test/java/org/sonar/batch/cache/DefaultProjectCacheStatusTest.java
new file mode 100644 (file)
index 0000000..838edd0
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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.batch.cache;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.sonar.home.cache.PersistentCacheLoader;
+
+import org.junit.internal.runners.statements.ExpectException;
+import org.junit.rules.ExpectedException;
+
+import java.io.IOException;
+import java.util.Date;
+
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.any;
+import org.junit.Test;
+import org.sonar.home.cache.Logger;
+import org.junit.rules.TemporaryFolder;
+import org.junit.Rule;
+import org.junit.Before;
+import org.sonar.batch.bootstrap.ServerClient;
+import org.sonar.home.cache.PersistentCache;
+
+public class DefaultProjectCacheStatusTest {
+  private static final String PROJ_KEY = "project1";
+  @Rule
+  public TemporaryFolder tmp = new TemporaryFolder();
+  
+  @Rule
+  public ExpectedException exception = ExpectedException.none();
+
+  ProjectCacheStatus cacheStatus;
+  PersistentCache cache;
+  ServerClient client;
+
+  @Before
+  public void setUp() {
+    cache = new PersistentCache(tmp.getRoot().toPath(), Long.MAX_VALUE, mock(Logger.class), null);
+    client = mock(ServerClient.class);
+    when(client.getURL()).thenReturn("localhost");
+    cacheStatus = new DefaultProjectCacheStatus(cache, client);
+  }
+
+  @Test
+  public void errorDelete() throws IOException {
+    cache = mock(PersistentCache.class);
+    doThrow(IOException.class).when(cache).put(anyString(), any(byte[].class));
+    cacheStatus = new DefaultProjectCacheStatus(cache, client);
+
+    exception.expect(IllegalStateException.class);
+    exception.expectMessage("Failed to delete cache sync status");
+    cacheStatus.delete(PROJ_KEY);
+  }
+  
+  @Test
+  public void errorSave() throws IOException {
+    cache = mock(PersistentCache.class);
+    doThrow(IOException.class).when(cache).put(anyString(), any(byte[].class));
+    cacheStatus = new DefaultProjectCacheStatus(cache, client);
+
+    exception.expect(IllegalStateException.class);
+    exception.expectMessage("Failed to write cache sync status");
+    cacheStatus.save(PROJ_KEY);
+  }
+  
+  @Test
+  public void errorStatus() throws IOException {
+    cache = mock(PersistentCache.class);
+    doThrow(IOException.class).when(cache).get(anyString(), any(PersistentCacheLoader.class));
+    cacheStatus = new DefaultProjectCacheStatus(cache, client);
+
+    exception.expect(IllegalStateException.class);
+    exception.expectMessage("Failed to read cache sync status");
+    cacheStatus.getSyncStatus(PROJ_KEY);
+  }
+  
+  @Test
+  public void testSave() {
+    cacheStatus.save(PROJ_KEY);
+    assertThat(cacheStatus.getSyncStatus(PROJ_KEY)).isNotNull();
+    assertThat(age(cacheStatus.getSyncStatus(PROJ_KEY))).isLessThan(2000);
+    assertThat(cacheStatus.getSyncStatus(PROJ_KEY + "1")).isNull();
+  }
+
+  @Test
+  public void testDelete() {
+    cacheStatus.save(PROJ_KEY);
+    cacheStatus.delete(PROJ_KEY);
+    assertThat(cacheStatus.getSyncStatus(PROJ_KEY)).isNull();
+  }
+
+  private long age(Date date) {
+    return (new Date().getTime()) - date.getTime();
+  }
+}
diff --git a/sonar-batch/src/test/java/org/sonar/batch/cache/ProjectCacheStatusTest.java b/sonar-batch/src/test/java/org/sonar/batch/cache/ProjectCacheStatusTest.java
deleted file mode 100644 (file)
index 34075f2..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2014 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube 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.
- *
- * SonarQube 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.batch.cache;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.Date;
-
-import org.junit.Test;
-import org.sonar.home.cache.Logger;
-import org.junit.rules.TemporaryFolder;
-import org.junit.Rule;
-import org.junit.Before;
-import org.sonar.batch.bootstrap.ServerClient;
-import org.sonar.home.cache.PersistentCache;
-
-public class ProjectCacheStatusTest {
-  private static final String PROJ_KEY = "project1";
-  @Rule
-  public TemporaryFolder tmp = new TemporaryFolder();
-
-  ProjectCacheStatus cacheStatus;
-  PersistentCache cache;
-  ServerClient client;
-
-  @Before
-  public void setUp() {
-    cache = new PersistentCache(tmp.getRoot().toPath(), Long.MAX_VALUE, mock(Logger.class), null);
-    client = mock(ServerClient.class);
-    when(client.getURL()).thenReturn("localhost");
-    cacheStatus = new DefaultProjectCacheStatus(cache, client);
-  }
-
-  @Test
-  public void testSave() {
-    cacheStatus.save(PROJ_KEY);
-    assertThat(cacheStatus.getSyncStatus(PROJ_KEY)).isNotNull();
-    assertThat(age(cacheStatus.getSyncStatus(PROJ_KEY))).isLessThan(2000);
-    assertThat(cacheStatus.getSyncStatus(PROJ_KEY + "1")).isNull();
-  }
-
-  @Test
-  public void testDelete() {
-    cacheStatus.save(PROJ_KEY);
-    cacheStatus.delete(PROJ_KEY);
-    assertThat(cacheStatus.getSyncStatus(PROJ_KEY)).isNull();
-  }
-
-  private long age(Date date) {
-    return (new Date().getTime()) - date.getTime();
-  }
-}
index 8e9e96a28f92020c6fe8af88c530c90119c1ac70..ee9786e53a66dc33a44223fb252b5182651b106e 100644 (file)
@@ -57,6 +57,18 @@ public class DefaultGlobalRepositoriesLoaderTest {
     verify(wsLoader).loadString(BATCH_GLOBAL_URL);
     verifyNoMoreInteractions(wsLoader);
   }
+  
+  @Test
+  public void testFromServer() {
+    result = new WSLoaderResult<>(new GlobalRepositories().toJson(), false);
+    when(wsLoader.loadString(BATCH_GLOBAL_URL)).thenReturn(result);
+    MutableBoolean fromCache = new MutableBoolean();
+    globalRepositoryLoader.load(fromCache);
+
+    assertThat(fromCache.booleanValue()).isFalse();
+    verify(wsLoader).loadString(BATCH_GLOBAL_URL);
+    verifyNoMoreInteractions(wsLoader);
+  }
 
   public void testWithoutArg() {
     globalRepositoryLoader.load(null);
index b3eb55252e824c52dde102eb8fba99f7a4cb0d2b..91bcb4162b5bb9b54c21d2c6152f0029beb85b7d 100644 (file)
 package org.sonar.batch.scan;
 
 import org.junit.rules.ExpectedException;
-
 import org.sonar.api.batch.bootstrap.ProjectDefinition;
 import org.sonar.api.batch.bootstrap.ProjectReactor;
 
+import java.io.File;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.nio.file.Paths;
 
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -45,12 +46,16 @@ public class ProjectLockTest {
 
   @Before
   public void setUp() {
+    lock = setUpTest(tempFolder.getRoot());
+  }
+  
+  private ProjectLock setUpTest(File file) {
     ProjectReactor projectReactor = mock(ProjectReactor.class);
     ProjectDefinition projectDefinition = mock(ProjectDefinition.class);
     when(projectReactor.getRoot()).thenReturn(projectDefinition);
-    when(projectDefinition.getBaseDir()).thenReturn(tempFolder.getRoot());
+    when(projectDefinition.getBaseDir()).thenReturn(file);
 
-    lock = new ProjectLock(projectReactor);
+    return new ProjectLock(projectReactor);
   }
 
   @Test
@@ -79,5 +84,19 @@ public class ProjectLockTest {
     lock.tryLock();
     lock.stop();
   }
+  
+  @Test
+  public void errorLock() {
+    lock = setUpTest(Paths.get("path", "that", "wont", "exist", "ever").toFile());
+    exception.expect(IllegalStateException.class);
+    exception.expectMessage("Failed to create project lock in");
+    lock.tryLock();
+  }
+  
+  @Test
+  public void errorDeleteLock() {
+    lock = setUpTest(Paths.get("path", "that", "wont", "exist", "ever").toFile());
+    lock.stop();
+  }
 
 }
index 88f80180cc939416952e233edd6f2d871370ee17..bae6ea57511b338b940fd792297c9c23be535d44 100644 (file)
@@ -116,22 +116,20 @@ public class ProjectDefinition {
     return baseDir;
   }
 
-  public ProjectDefinition setWorkDir(@Nullable File workDir) {
+  public ProjectDefinition setWorkDir(File workDir) {
     this.workDir = workDir;
     return this;
   }
 
-  @CheckForNull
   public File getWorkDir() {
     return workDir;
   }
 
-  public ProjectDefinition setBuildDir(@Nullable File d) {
+  public ProjectDefinition setBuildDir( File d) {
     this.buildDir = d;
     return this;
   }
 
-  @CheckForNull
   public File getBuildDir() {
     return buildDir;
   }