From 878cec92f8e39fd46628a83bba970293129de710 Mon Sep 17 00:00:00 2001 From: simonbrandhof Date: Mon, 24 Jan 2011 19:06:38 +0100 Subject: SONAR-791 When the source directory is not exactly the java package root, Sonar should stop the analysis --- .../testdetailsviewer/TestsViewerDefinition.java | 6 +- .../java/org/sonar/plugins/core/CorePlugin.java | 1 - .../plugins/core/sensors/JavaSourceImporter.java | 55 ----------------- .../core/batch/ExcludedResourceFilterTest.java | 3 +- .../core/sensors/JavaSourceImporterTest.java | 71 ---------------------- .../sonar/plugins/squid/JavaSourceImporter.java | 48 +++++++++++++++ .../java/org/sonar/plugins/squid/SquidPlugin.java | 38 +++++------- .../java/org/sonar/plugins/squid/SquidSensor.java | 32 ++++++++-- .../plugins/squid/bridges/Lcom4BlocksBridge.java | 15 +++-- .../plugins/squid/JavaSourceImporterTest.java | 60 ++++++++++++++++++ .../sonar/plugins/surefire/SurefireSensorTest.java | 49 +++++++-------- 11 files changed, 188 insertions(+), 190 deletions(-) delete mode 100644 plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/sensors/JavaSourceImporter.java delete mode 100644 plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/sensors/JavaSourceImporterTest.java create mode 100644 plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/JavaSourceImporter.java create mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/JavaSourceImporterTest.java (limited to 'plugins') diff --git a/plugins/sonar-core-gwt/src/main/java/org/sonar/plugins/core/testdetailsviewer/TestsViewerDefinition.java b/plugins/sonar-core-gwt/src/main/java/org/sonar/plugins/core/testdetailsviewer/TestsViewerDefinition.java index 0cca72a7d7b..98bc53a0437 100644 --- a/plugins/sonar-core-gwt/src/main/java/org/sonar/plugins/core/testdetailsviewer/TestsViewerDefinition.java +++ b/plugins/sonar-core-gwt/src/main/java/org/sonar/plugins/core/testdetailsviewer/TestsViewerDefinition.java @@ -20,13 +20,13 @@ package org.sonar.plugins.core.testdetailsviewer; import org.sonar.api.measures.CoreMetrics; -import org.sonar.api.resources.Resource; +import org.sonar.api.resources.Qualifiers; import org.sonar.api.web.*; import org.sonar.plugins.core.testdetailsviewer.client.TestsViewer; -@ResourceQualifier(Resource.QUALIFIER_UNIT_TEST_CLASS) +@ResourceQualifier(Qualifiers.UNIT_TEST_FILE) @NavigationSection(NavigationSection.RESOURCE_TAB) -@DefaultTab(metrics={CoreMetrics.TESTS_KEY, CoreMetrics.TEST_EXECUTION_TIME_KEY, CoreMetrics.TEST_SUCCESS_DENSITY_KEY, CoreMetrics.TEST_FAILURES_KEY, CoreMetrics.TEST_ERRORS_KEY, CoreMetrics.SKIPPED_TESTS_KEY}) +@DefaultTab(metrics = {CoreMetrics.TESTS_KEY, CoreMetrics.TEST_EXECUTION_TIME_KEY, CoreMetrics.TEST_SUCCESS_DENSITY_KEY, CoreMetrics.TEST_FAILURES_KEY, CoreMetrics.TEST_ERRORS_KEY, CoreMetrics.SKIPPED_TESTS_KEY}) @UserRole(UserRole.CODEVIEWER) public class TestsViewerDefinition extends GwtPage { diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/CorePlugin.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/CorePlugin.java index 8af552c5f52..944fc9a572d 100644 --- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/CorePlugin.java +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/CorePlugin.java @@ -207,7 +207,6 @@ public class CorePlugin implements Plugin { extensions.add(JavaColorizerFormat.class); // batch - extensions.add(JavaSourceImporter.class); extensions.add(ProfileSensor.class); extensions.add(ProjectLinksSensor.class); extensions.add(AsynchronousMeasuresSensor.class); diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/sensors/JavaSourceImporter.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/sensors/JavaSourceImporter.java deleted file mode 100644 index 1b8f32a8892..00000000000 --- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/sensors/JavaSourceImporter.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2009 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * Sonar 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. - * - * Sonar 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 Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.core.sensors; - -import org.sonar.api.batch.AbstractSourceImporter; -import org.sonar.api.batch.Phase; -import org.sonar.api.batch.ResourceCreationLock; -import org.sonar.api.resources.Java; -import org.sonar.api.resources.JavaFile; -import org.sonar.api.resources.Resource; - -import java.io.File; -import java.util.List; - -@Phase(name = Phase.Name.PRE) -public class JavaSourceImporter extends AbstractSourceImporter { - private ResourceCreationLock lock; - - public JavaSourceImporter(ResourceCreationLock lock) { - super(Java.INSTANCE); - this.lock = lock; - } - - @Override - protected Resource createResource(File file, List sourceDirs, boolean unitTest) { - return (file != null && !file.getName().contains("$")) ? JavaFile.fromIOFile(file, sourceDirs, unitTest) : null; - } - - @Override - protected void onFinished() { - lock.lock(); - } - - @Override - public String toString() { - return getClass().getSimpleName(); - } -} diff --git a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/batch/ExcludedResourceFilterTest.java b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/batch/ExcludedResourceFilterTest.java index a6066489274..b65b0500747 100644 --- a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/batch/ExcludedResourceFilterTest.java +++ b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/batch/ExcludedResourceFilterTest.java @@ -20,6 +20,7 @@ package org.sonar.plugins.core.batch; import org.junit.Test; +import org.sonar.api.resources.Qualifiers; import org.sonar.api.resources.Resource; import static org.hamcrest.core.Is.is; @@ -59,7 +60,7 @@ public class ExcludedResourceFilterTest { ExcludedResourceFilter filter = new ExcludedResourceFilter(new String[]{"**/foo/*.java", "**/bar/*"}); Resource unitTest = mock(Resource.class); - when(unitTest.getQualifier()).thenReturn(Resource.QUALIFIER_UNIT_TEST_CLASS); + when(unitTest.getQualifier()).thenReturn(Qualifiers.UNIT_TEST_FILE); // match exclusion pattern when(unitTest.matchFilePattern("**/bar/*")).thenReturn(true); diff --git a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/sensors/JavaSourceImporterTest.java b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/sensors/JavaSourceImporterTest.java deleted file mode 100644 index 0b47543b33a..00000000000 --- a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/sensors/JavaSourceImporterTest.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2009 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * Sonar 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. - * - * Sonar 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 Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.plugins.core.sensors; - -import org.apache.commons.io.FileUtils; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.Matchers.nullValue; -import static org.junit.Assert.assertThat; -import static org.mockito.Mockito.mock; - -import org.junit.Test; -import org.sonar.api.batch.ResourceCreationLock; -import org.sonar.api.resources.JavaFile; -import org.sonar.api.resources.JavaPackage; -import org.sonar.api.resources.Resource; -import org.sonar.api.resources.ResourceUtils; - -import java.io.File; -import java.io.IOException; -import java.util.Arrays; - -public class JavaSourceImporterTest { - - @Test - public void shouldCreateResource() throws IOException { - JavaSourceImporter importer = new JavaSourceImporter(mock(ResourceCreationLock.class)); - Resource clazz = importer.createResource(new File(newDir("source1"), "/MyClass.java"), Arrays.asList(newDir("source1")), false); - assertThat(clazz, is(JavaFile.class)); - assertThat(clazz.getKey(), is(JavaPackage.DEFAULT_PACKAGE_NAME + ".MyClass")); - assertThat(clazz.getName(), is("MyClass")); - } - - @Test - public void shouldCreateTestResource() throws IOException { - JavaSourceImporter importer = new JavaSourceImporter(mock(ResourceCreationLock.class)); - Resource resource = importer.createResource(new File(newDir("tests"), "/MyClassTest.java"), Arrays.asList(newDir("tests")), true); - assertThat(resource, is(JavaFile.class)); - assertThat(ResourceUtils.isUnitTestClass(resource), is(true)); - } - - @Test - public void doNotSaveInnerClasses() throws IOException { - // example : https://svn.apache.org/repos/asf/geronimo/server/trunk/plugins/corba/geronimo-corba/src/test/java/org/apache/geronimo/corba/compiler/other/Generic$Interface.java - JavaSourceImporter importer = new JavaSourceImporter(mock(ResourceCreationLock.class)); - Resource resource = importer.createResource(new File(newDir("tests"), "/Generic$Interface.java"), Arrays.asList(newDir("tests")), true); - assertThat(resource, nullValue()); - } - - private File newDir(String relativePath) throws IOException { - File target = new File("target", relativePath); - FileUtils.forceMkdir(target); - return target; - } -} \ No newline at end of file diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/JavaSourceImporter.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/JavaSourceImporter.java new file mode 100644 index 00000000000..87e7699ba88 --- /dev/null +++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/JavaSourceImporter.java @@ -0,0 +1,48 @@ +/* + * Sonar, open source software quality management tool. + * Copyright (C) 2009 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * Sonar 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. + * + * Sonar 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 Sonar; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 + */ +package org.sonar.plugins.squid; + +import org.sonar.api.batch.*; +import org.sonar.api.resources.Java; +import org.sonar.api.resources.JavaFile; +import org.sonar.api.resources.Resource; +import org.sonar.java.api.JavaUtils; + +import java.io.File; +import java.util.List; + +@DependsUpon(classes=SquidSensor.class) +@DependedUpon(JavaUtils.BARRIER_AFTER_SQUID) +public class JavaSourceImporter extends AbstractSourceImporter { + + public JavaSourceImporter() { + super(Java.INSTANCE); + } + + @Override + protected Resource createResource(File file, List sourceDirs, boolean unitTest) { + return file != null ? JavaFile.fromIOFile(file, sourceDirs, unitTest) : null; + } + + @Override + public String toString() { + return getClass().getSimpleName(); + } +} diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidPlugin.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidPlugin.java index 16ba011d56d..856c3438fea 100644 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidPlugin.java +++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidPlugin.java @@ -24,25 +24,25 @@ import org.sonar.api.Plugin; import org.sonar.api.Properties; import org.sonar.api.Property; -import java.util.ArrayList; +import java.util.Arrays; import java.util.List; -@Properties( { +@Properties({ @Property(key = SquidPluginProperties.SQUID_ANALYSE_ACCESSORS_PROPERTY, - defaultValue = SquidPluginProperties.SQUID_ANALYSE_ACCESSORS_DEFAULT_VALUE - + "", - name = "Separate accessors", - description = "Flag whether Squid should separate accessors (getters/setters) from methods. " + - "In that case, accessors are not counted in metrics such as complexity or API documentation.", - project = true, global = true), + defaultValue = SquidPluginProperties.SQUID_ANALYSE_ACCESSORS_DEFAULT_VALUE + + "", + name = "Separate accessors", + description = "Flag whether Squid should separate accessors (getters/setters) from methods. " + + "In that case, accessors are not counted in metrics such as complexity or API documentation.", + project = true, global = true), @Property(key = SquidPluginProperties.FIELDS_TO_EXCLUDE_FROM_LCOM4_COMPUTATION, - defaultValue = SquidPluginProperties.FIELDS_TO_EXCLUDE_FROM_LCOM4_COMPUTATION_DEFAULT_VALUE, - name = "List of fields to exclude from LCOM4 computation", - description = "Some fields should not be taken into account when computing LCOM4 measure as they " + - "unexpectedly and artificially decrease the LCOM4 measure. " - + "The best example is a logger used by all methods of a class. " + - "All field names to exclude from LCOM4 computation must be separated by a comma.", - project = true, global = true) }) + defaultValue = SquidPluginProperties.FIELDS_TO_EXCLUDE_FROM_LCOM4_COMPUTATION_DEFAULT_VALUE, + name = "List of fields to exclude from LCOM4 computation", + description = "Some fields should not be taken into account when computing LCOM4 measure as they " + + "unexpectedly and artificially decrease the LCOM4 measure. " + + "The best example is a logger used by all methods of a class. " + + "All field names to exclude from LCOM4 computation must be separated by a comma.", + project = true, global = true)}) public class SquidPlugin implements Plugin { public String getKey() { @@ -58,13 +58,7 @@ public class SquidPlugin implements Plugin { } public List getExtensions() { - List list = new ArrayList(); - - list.add(SquidSearchProxy.class); - list.add(SquidSensor.class); - list.add(SquidRuleRepository.class); - - return list; + return Arrays.asList(SquidSearchProxy.class, SquidSensor.class, SquidRuleRepository.class, JavaSourceImporter.class); } @Override diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidSensor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidSensor.java index 5abb4f50b67..c1b242e09de 100644 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidSensor.java +++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidSensor.java @@ -26,7 +26,9 @@ import org.sonar.api.checks.AnnotationCheckFactory; import org.sonar.api.checks.NoSonarFilter; import org.sonar.api.profiles.RulesProfile; import org.sonar.api.resources.Java; +import org.sonar.api.resources.JavaFile; import org.sonar.api.resources.Project; +import org.sonar.java.api.JavaUtils; import java.io.File; import java.nio.charset.Charset; @@ -34,20 +36,22 @@ import java.util.Collection; import java.util.List; @Phase(name = Phase.Name.PRE) -/* TODO is the flag still used ? */ -@DependedUpon(value = Sensor.FLAG_SQUID_ANALYSIS, classes = NoSonarFilter.class) +@DependsUpon(JavaUtils.BARRIER_BEFORE_SQUID) +@DependedUpon(value = JavaUtils.BARRIER_AFTER_SQUID, classes = NoSonarFilter.class) public class SquidSensor implements Sensor { private SquidSearchProxy proxy; private NoSonarFilter noSonarFilter; private RulesProfile profile; private ProjectClasspath projectClasspath; + private ResourceCreationLock lock; - public SquidSensor(RulesProfile profile, SquidSearchProxy proxy, NoSonarFilter noSonarFilter, ProjectClasspath projectClasspath) { + public SquidSensor(RulesProfile profile, SquidSearchProxy proxy, NoSonarFilter noSonarFilter, ProjectClasspath projectClasspath, ResourceCreationLock lock) { this.proxy = proxy; this.noSonarFilter = noSonarFilter; this.profile = profile; this.projectClasspath = projectClasspath; + this.lock = lock; } public boolean shouldExecuteOnProject(Project project) { @@ -56,6 +60,12 @@ public class SquidSensor implements Sensor { @SuppressWarnings("unchecked") public void analyse(Project project, SensorContext context) { + analyzeMainSources(project, context); + browseTestSources(project, context); + lock.lock(); + } + + private void analyzeMainSources(Project project, SensorContext context) { boolean analyzePropertyAccessors = project.getConfiguration().getBoolean(SquidPluginProperties.SQUID_ANALYSE_ACCESSORS_PROPERTY, SquidPluginProperties.SQUID_ANALYSE_ACCESSORS_DEFAULT_VALUE); String fieldNamesToExcludeFromLcom4Computation = project.getConfiguration().getString( @@ -66,16 +76,26 @@ public class SquidSensor implements Sensor { AnnotationCheckFactory factory = AnnotationCheckFactory.create(profile, SquidConstants.REPOSITORY_KEY, SquidRuleRepository.getCheckClasses()); SquidExecutor squidExecutor = new SquidExecutor(analyzePropertyAccessors, fieldNamesToExcludeFromLcom4Computation, factory, charset); - squidExecutor.scan(getSourceFiles(project), getBytecodeFiles(project)); + squidExecutor.scan(getMainSourceFiles(project), getMainBytecodeFiles(project)); squidExecutor.save(project, context, noSonarFilter); squidExecutor.initSonarProxy(proxy); } - private List getSourceFiles(Project project) { + private void browseTestSources(Project project, SensorContext context) { + for (File testFile : getTestSourceFiles(project)) { + context.index(JavaFile.fromIOFile(testFile, project.getFileSystem().getTestDirs(), true)); + } + } + + private List getTestSourceFiles(Project project) { + return project.getFileSystem().getTestFiles(Java.INSTANCE); + } + + private List getMainSourceFiles(Project project) { return project.getFileSystem().getJavaSourceFiles(); } - private Collection getBytecodeFiles(Project project) { + private Collection getMainBytecodeFiles(Project project) { Collection bytecodeFiles = projectClasspath.getElements(); if ( !hasProjectBytecodeFiles(project)) { File classesDir = project.getFileSystem().getBuildOutputDir(); diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/Lcom4BlocksBridge.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/Lcom4BlocksBridge.java index 14a9b1b09b7..8971e618b4e 100644 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/Lcom4BlocksBridge.java +++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/Lcom4BlocksBridge.java @@ -19,9 +19,11 @@ */ package org.sonar.plugins.squid.bridges; +import com.google.common.collect.Lists; import org.sonar.api.measures.CoreMetrics; import org.sonar.api.measures.Measure; import org.sonar.api.measures.PersistenceMode; +import org.sonar.api.resources.Qualifiers; import org.sonar.api.resources.Resource; import org.sonar.java.bytecode.asm.AsmField; import org.sonar.java.bytecode.asm.AsmMethod; @@ -29,7 +31,10 @@ import org.sonar.java.bytecode.asm.AsmResource; import org.sonar.squid.api.SourceFile; import org.sonar.squid.measures.Metric; -import java.util.*; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Set; public class Lcom4BlocksBridge extends Bridge { @@ -62,7 +67,7 @@ public class Lcom4BlocksBridge extends Bridge { protected String serialize(List> blocks) { sortBlocks(blocks); - + StringBuilder sb = new StringBuilder(); sb.append('['); @@ -102,7 +107,7 @@ public class Lcom4BlocksBridge extends Bridge { } protected List sortResourcesInBlock(Set block) { - List result = new ArrayList(); + List result = Lists.newArrayList(); result.addAll(block); Collections.sort(result, new Comparator() { @@ -127,10 +132,10 @@ public class Lcom4BlocksBridge extends Bridge { private static String toQualifier(AsmResource asmResource) { if (asmResource instanceof AsmField) { - return Resource.QUALIFIER_FIELD; + return Qualifiers.FIELD; } if (asmResource instanceof AsmMethod) { - return Resource.QUALIFIER_METHOD; + return Qualifiers.METHOD; } throw new IllegalArgumentException("Wrong ASM resource: " + asmResource.getClass()); } diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/JavaSourceImporterTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/JavaSourceImporterTest.java new file mode 100644 index 00000000000..c6667a6920e --- /dev/null +++ b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/plugins/squid/JavaSourceImporterTest.java @@ -0,0 +1,60 @@ +/* + * Sonar, open source software quality management tool. + * Copyright (C) 2009 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * Sonar 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. + * + * Sonar 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 Sonar; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 + */ +package org.sonar.plugins.squid; + +import org.apache.commons.io.FileUtils; +import org.junit.Test; +import org.sonar.api.resources.JavaFile; +import org.sonar.api.resources.JavaPackage; +import org.sonar.api.resources.Resource; +import org.sonar.api.resources.ResourceUtils; + +import java.io.File; +import java.io.IOException; +import java.util.Arrays; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +public class JavaSourceImporterTest { + + @Test + public void shouldDefineMainFile() throws IOException { + JavaSourceImporter importer = new JavaSourceImporter(); + Resource clazz = importer.createResource(new File(newDir("source1"), "/MyClass.java"), Arrays.asList(newDir("source1")), false); + assertThat(clazz, is(JavaFile.class)); + assertThat(clazz.getKey(), is(JavaPackage.DEFAULT_PACKAGE_NAME + ".MyClass")); + assertThat(clazz.getName(), is("MyClass")); + } + + @Test + public void shouldDefineTestFile() throws IOException { + JavaSourceImporter importer = new JavaSourceImporter(); + Resource resource = importer.createResource(new File(newDir("tests"), "/MyClassTest.java"), Arrays.asList(newDir("tests")), true); + assertThat(resource, is(JavaFile.class)); + assertThat(ResourceUtils.isUnitTestClass(resource), is(true)); + } + + private File newDir(String relativePath) throws IOException { + File target = new File("target", relativePath); + FileUtils.forceMkdir(target); + return target; + } +} \ No newline at end of file diff --git a/plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/SurefireSensorTest.java b/plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/SurefireSensorTest.java index e21df1d9648..450570ff6bc 100644 --- a/plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/SurefireSensorTest.java +++ b/plugins/sonar-surefire-plugin/src/test/java/org/sonar/plugins/surefire/SurefireSensorTest.java @@ -19,19 +19,6 @@ */ package org.sonar.plugins.surefire; -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; -import static org.mockito.Matchers.anyDouble; -import static org.mockito.Matchers.anyObject; -import static org.mockito.Matchers.argThat; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - import org.apache.commons.lang.ObjectUtils; import org.custommonkey.xmlunit.DetailedDiff; import org.custommonkey.xmlunit.Diff; @@ -46,6 +33,7 @@ import org.sonar.api.measures.Metric; import org.sonar.api.resources.Java; import org.sonar.api.resources.JavaFile; import org.sonar.api.resources.Project; +import org.sonar.api.resources.Qualifiers; import org.sonar.api.test.IsMeasure; import org.sonar.api.test.IsResource; import org.sonar.api.test.MavenTestUtils; @@ -55,6 +43,15 @@ import java.io.FileReader; import java.io.StringReader; import java.net.URISyntaxException; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThat; +import static org.mockito.Matchers.anyDouble; +import static org.mockito.Matchers.anyObject; +import static org.mockito.Matchers.argThat; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.*; + public class SurefireSensorTest { @Test @@ -94,7 +91,7 @@ public class SurefireSensorTest { new SurefireSensor().collect(newJarProject(), context, new File(getClass().getResource( "/org/sonar/plugins/surefire/SurefireSensorTest/doNotInsertZeroTestsOnClasses/").toURI())); - verify(context, never()).saveMeasure(argThat(new IsResource(JavaFile.SCOPE_ENTITY, JavaFile.QUALIFIER_UNIT_TEST_CLASS)), + verify(context, never()).saveMeasure(argThat(new IsResource(JavaFile.SCOPE_ENTITY, Qualifiers.UNIT_TEST_FILE)), (Metric) anyObject(), anyDouble()); } @@ -123,11 +120,11 @@ public class SurefireSensorTest { new SurefireSensor().collect(newJarProject(), context, new File(getClass().getResource( "/org/sonar/plugins/surefire/SurefireSensorTest/many-results/").toURI())); - verify(context, times(6)).saveMeasure(argThat(new IsResource(JavaFile.SCOPE_ENTITY, JavaFile.QUALIFIER_UNIT_TEST_CLASS)), + verify(context, times(6)).saveMeasure(argThat(new IsResource(JavaFile.SCOPE_ENTITY, Qualifiers.UNIT_TEST_FILE)), eq(CoreMetrics.TESTS), anyDouble()); - verify(context, times(36)).saveMeasure(argThat(new IsResource(JavaFile.SCOPE_ENTITY, JavaFile.QUALIFIER_UNIT_TEST_CLASS)), + verify(context, times(36)).saveMeasure(argThat(new IsResource(JavaFile.SCOPE_ENTITY, Qualifiers.UNIT_TEST_FILE)), (Metric) anyObject(), anyDouble()); - verify(context, times(6)).saveMeasure(argThat(new IsResource(JavaFile.SCOPE_ENTITY, JavaFile.QUALIFIER_UNIT_TEST_CLASS)), + verify(context, times(6)).saveMeasure(argThat(new IsResource(JavaFile.SCOPE_ENTITY, Qualifiers.UNIT_TEST_FILE)), argThat(new IsMeasure(CoreMetrics.TEST_DATA))); verify(context) @@ -147,13 +144,13 @@ public class SurefireSensorTest { "/org/sonar/plugins/surefire/SurefireSensorTest/shouldHandleTestSuiteDetails/").toURI())); // 3 classes, 6 measures by class - verify(context, times(3)).saveMeasure(argThat(new IsResource(JavaFile.SCOPE_ENTITY, JavaFile.QUALIFIER_UNIT_TEST_CLASS)), + verify(context, times(3)).saveMeasure(argThat(new IsResource(JavaFile.SCOPE_ENTITY, Qualifiers.UNIT_TEST_FILE)), eq(CoreMetrics.SKIPPED_TESTS), anyDouble()); - verify(context, times(3)).saveMeasure(argThat(new IsResource(JavaFile.SCOPE_ENTITY, JavaFile.QUALIFIER_UNIT_TEST_CLASS)), + verify(context, times(3)).saveMeasure(argThat(new IsResource(JavaFile.SCOPE_ENTITY, Qualifiers.UNIT_TEST_FILE)), eq(CoreMetrics.TESTS), anyDouble()); - verify(context, times(18)).saveMeasure(argThat(new IsResource(JavaFile.SCOPE_ENTITY, JavaFile.QUALIFIER_UNIT_TEST_CLASS)), + verify(context, times(18)).saveMeasure(argThat(new IsResource(JavaFile.SCOPE_ENTITY, Qualifiers.UNIT_TEST_FILE)), (Metric) anyObject(), anyDouble()); - verify(context, times(3)).saveMeasure(argThat(new IsResource(JavaFile.SCOPE_ENTITY, JavaFile.QUALIFIER_UNIT_TEST_CLASS)), + verify(context, times(3)).saveMeasure(argThat(new IsResource(JavaFile.SCOPE_ENTITY, Qualifiers.UNIT_TEST_FILE)), argThat(new IsMeasure(CoreMetrics.TEST_DATA))); verify(context).saveMeasure(eq(new JavaFile("org.sonar.core.ExtensionsFinderTest", true)), eq(CoreMetrics.TESTS), eq(4d)); @@ -191,14 +188,14 @@ public class SurefireSensorTest { "/org/sonar/plugins/surefire/SurefireSensorTest/shouldSaveErrorsAndFailuresInXML/").toURI())); // 1 classes, 6 measures by class - verify(context, times(1)).saveMeasure(argThat(new IsResource(JavaFile.SCOPE_ENTITY, JavaFile.QUALIFIER_UNIT_TEST_CLASS)), + verify(context, times(1)).saveMeasure(argThat(new IsResource(JavaFile.SCOPE_ENTITY, Qualifiers.UNIT_TEST_FILE)), eq(CoreMetrics.SKIPPED_TESTS), anyDouble()); - verify(context, times(1)).saveMeasure(argThat(new IsResource(JavaFile.SCOPE_ENTITY, JavaFile.QUALIFIER_UNIT_TEST_CLASS)), + verify(context, times(1)).saveMeasure(argThat(new IsResource(JavaFile.SCOPE_ENTITY, Qualifiers.UNIT_TEST_FILE)), eq(CoreMetrics.TESTS), anyDouble()); - verify(context, times(6)).saveMeasure(argThat(new IsResource(JavaFile.SCOPE_ENTITY, JavaFile.QUALIFIER_UNIT_TEST_CLASS)), + verify(context, times(6)).saveMeasure(argThat(new IsResource(JavaFile.SCOPE_ENTITY, Qualifiers.UNIT_TEST_FILE)), (Metric) anyObject(), anyDouble()); - verify(context, times(1)).saveMeasure(argThat(new IsResource(JavaFile.SCOPE_ENTITY, JavaFile.QUALIFIER_UNIT_TEST_CLASS)), + verify(context, times(1)).saveMeasure(argThat(new IsResource(JavaFile.SCOPE_ENTITY, Qualifiers.UNIT_TEST_FILE)), argThat(new IsMeasure(CoreMetrics.TEST_DATA))); verify(context).saveMeasure(eq(new JavaFile("org.sonar.core.ExtensionsFinderTest", true)), @@ -283,7 +280,7 @@ public class SurefireSensorTest { public boolean matches(Object obj) { try { - if ( !ObjectUtils.equals(CoreMetrics.TEST_DATA, ((Measure) obj).getMetric())) { + if (!ObjectUtils.equals(CoreMetrics.TEST_DATA, ((Measure) obj).getMetric())) { return false; } -- cgit v1.2.3