]> source.dussan.org Git - sonarqube.git/commitdiff
Add integration tests for manual and common rules
authorSimon Brandhof <simon.brandhof@sonarsource.com>
Tue, 21 Jul 2015 14:37:55 +0000 (16:37 +0200)
committerSimon Brandhof <simon.brandhof@sonarsource.com>
Tue, 21 Jul 2015 15:14:59 +0000 (17:14 +0200)
14 files changed:
.travis.yml
it/it-projects/issue/common-rules/sonar-project.properties [new file with mode: 0644]
it/it-projects/issue/common-rules/src/Sample.xoo [new file with mode: 0644]
it/it-projects/issue/common-rules/src/Sample.xoo.measures [new file with mode: 0644]
it/it-projects/issue/common-rules/test/SampleTest.xoo [new file with mode: 0644]
it/it-projects/issue/common-rules/test/SampleTest.xoo.measures [new file with mode: 0644]
it/it-projects/qualitygate/xoo-sample/sonar-project.properties
it/it-tests/pom.xml
it/it-tests/src/test/java/issue/suite/CommonRulesTest.java [new file with mode: 0644]
it/it-tests/src/test/java/issue/suite/IssueTestSuite.java [new file with mode: 0644]
it/it-tests/src/test/java/issue/suite/ManualRulesTest.java [new file with mode: 0644]
it/it-tests/src/test/resources/issue/suite/CommonRulesTest/xoo-common-rules-profile.xml [new file with mode: 0644]
it/it-tests/src/test/resources/issue/suite/ManualRulesTest/create_edit_delete_manual_rule.html [new file with mode: 0644]
travis.sh

index 94d39521e8523cdeac4405140247af35be1f84ac..579954c8c19ae9e2212c452671d2d7ad17970aba 100644 (file)
@@ -10,6 +10,7 @@ env:
   - JOB=POSTGRES
   - JOB=MYSQL
   - JOB=WEB
+  - JOB=ITS_ISSUE
   - JOB=ITS_QUALITYGATE
   - JOB=ITS_UPDATECENTER
   - JOB=ITS_TESTING
diff --git a/it/it-projects/issue/common-rules/sonar-project.properties b/it/it-projects/issue/common-rules/sonar-project.properties
new file mode 100644 (file)
index 0000000..6cf4f38
--- /dev/null
@@ -0,0 +1,5 @@
+sonar.projectKey=common-rules-project
+sonar.projectName=Sample
+sonar.projectVersion=1.0-SNAPSHOT
+sonar.sources=src
+sonar.tests=test
diff --git a/it/it-projects/issue/common-rules/src/Sample.xoo b/it/it-projects/issue/common-rules/src/Sample.xoo
new file mode 100644 (file)
index 0000000..33b8509
--- /dev/null
@@ -0,0 +1,8 @@
+there are duplications
+in this file
+
+there are duplications
+in this file
+
+there are duplications
+in this file
diff --git a/it/it-projects/issue/common-rules/src/Sample.xoo.measures b/it/it-projects/issue/common-rules/src/Sample.xoo.measures
new file mode 100644 (file)
index 0000000..16cc5ac
--- /dev/null
@@ -0,0 +1,10 @@
+lines:120
+ncloc:100
+complexity:7
+comment_lines:3
+public_api:5
+public_undocumented_api:2
+lines_to_cover:80
+uncovered_lines:70
+conditions_to_cover:10
+uncovered_conditions:9
diff --git a/it/it-projects/issue/common-rules/test/SampleTest.xoo b/it/it-projects/issue/common-rules/test/SampleTest.xoo
new file mode 100644 (file)
index 0000000..6ec4b53
--- /dev/null
@@ -0,0 +1 @@
+this is the test
diff --git a/it/it-projects/issue/common-rules/test/SampleTest.xoo.measures b/it/it-projects/issue/common-rules/test/SampleTest.xoo.measures
new file mode 100644 (file)
index 0000000..ea3e279
--- /dev/null
@@ -0,0 +1,4 @@
+skipped_tests:5
+test_errors:2
+test_failures:1
+tests:10
index 7fe0508130422907c5989c0e926d85f2123c385b..8819d09dd60c17aae33560c4cf38eeea6c86cc01 100644 (file)
@@ -2,4 +2,3 @@ sonar.projectKey=sample
 sonar.projectName=Sample
 sonar.projectVersion=1.0-SNAPSHOT
 sonar.sources=src
-sonar.language=xoo
index 774e9598149c8a4104cb9f1806660b816fcec0d6..6a604298aea0d796c045fdb7d39b15f084980466 100644 (file)
       <type>pom</type>
       <scope>provided</scope>
     </dependency>
+    <dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
+      <version>15.0</version>
+    </dependency>
     <dependency>
       <groupId>org.codehaus.sonar</groupId>
       <artifactId>sonar-ws-client</artifactId>
       <version>5.0</version>
-      <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>com.sonarsource.orchestrator</groupId>
       <artifactId>sonar-orchestrator</artifactId>
       <version>3.2</version>
-      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.sonar</groupId>
+      <artifactId>sonar-update-center-common</artifactId>
+      <version>1.12.1</version>
     </dependency>
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
-      <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>org.assertj</groupId>
       <artifactId>assertj-core</artifactId>
-      <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>org.hamcrest</groupId>
       <artifactId>hamcrest-all</artifactId>
-      <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>com.googlecode.json-simple</groupId>
       <artifactId>json-simple</artifactId>
       <version>1.1</version>
-      <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>org.skyscreamer</groupId>
       <artifactId>jsonassert</artifactId>
       <version>1.2.0</version>
-      <scope>test</scope>
     </dependency>
 
 
diff --git a/it/it-tests/src/test/java/issue/suite/CommonRulesTest.java b/it/it-tests/src/test/java/issue/suite/CommonRulesTest.java
new file mode 100644 (file)
index 0000000..d844b0a
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2009-2014 SonarSource SA
+ * All rights reserved
+ * mailto:contact AT sonarsource DOT com
+ */
+package issue.suite;
+
+import com.sonar.orchestrator.Orchestrator;
+import com.sonar.orchestrator.build.SonarRunner;
+import com.sonar.orchestrator.locator.FileLocation;
+import java.util.List;
+import org.junit.BeforeClass;
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.sonar.wsclient.issue.Issue;
+import org.sonar.wsclient.issue.IssueQuery;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static util.ItUtils.projectDir;
+
+public class CommonRulesTest {
+
+  public static final String FILE_KEY = "common-rules-project:src/Sample.xoo";
+  public static final String TEST_FILE_KEY = "common-rules-project:test/SampleTest.xoo";
+
+  @ClassRule
+  public static Orchestrator orchestrator = IssueTestSuite.ORCHESTRATOR;
+
+  @BeforeClass
+  public static void setUp() {
+    orchestrator.resetData();
+    orchestrator.getServer().restoreProfile(FileLocation.ofClasspath("/issue/suite/CommonRulesTest/xoo-common-rules-profile.xml"));
+    orchestrator.getServer().provisionProject("common-rules-project", "Sample");
+    orchestrator.getServer().associateProjectToQualityProfile("common-rules-project", "xoo", "xoo-common-rules");
+    SonarRunner analysis = SonarRunner.create(projectDir("issue/common-rules"),
+      "sonar.cpd.xoo.minimumTokens", "2",
+      "sonar.cpd.xoo.minimumLines", "2");
+    orchestrator.executeBuild(analysis);
+  }
+
+  @Test
+  public void test_rule_on_duplicated_blocks() {
+    List<Issue> issues = findIssues(FILE_KEY, "common-xoo:DuplicatedBlocks");
+    assertThat(issues).hasSize(1);
+  }
+
+  @Test
+  public void test_rule_on_comments() {
+    List<Issue> issues = findIssues(FILE_KEY, "common-xoo:InsufficientCommentDensity");
+    assertThat(issues.size()).isEqualTo(1);
+  }
+
+  @Test
+  public void test_rule_on_coverage() {
+    List<Issue> issues = findIssues(FILE_KEY, "common-xoo:InsufficientBranchCoverage");
+    assertThat(issues.size()).isEqualTo(1);
+
+    issues = findIssues(FILE_KEY, "common-xoo:InsufficientLineCoverage");
+    assertThat(issues.size()).isEqualTo(1);
+  }
+
+  @Test
+  public void test_rule_on_skipped_tests() {
+    List<Issue> issues = findIssues(TEST_FILE_KEY, "common-xoo:SkippedUnitTests");
+    assertThat(issues.size()).isEqualTo(1);
+  }
+
+  @Test
+  public void test_rule_on_test_errors() {
+    List<Issue> issues = findIssues(TEST_FILE_KEY, "common-xoo:FailedUnitTests");
+    assertThat(issues.size()).isEqualTo(1);
+  }
+
+  private List<Issue> findIssues(String componentKey, String ruleKey) {
+    return orchestrator.getServer().wsClient().issueClient().find(IssueQuery.create().components(componentKey).rules(ruleKey)).list();
+  }
+}
diff --git a/it/it-tests/src/test/java/issue/suite/IssueTestSuite.java b/it/it-tests/src/test/java/issue/suite/IssueTestSuite.java
new file mode 100644 (file)
index 0000000..4f61aa5
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2009-2014 SonarSource SA
+ * All rights reserved
+ * mailto:contact AT sonarsource DOT com
+ */
+package issue.suite;
+
+import com.sonar.orchestrator.Orchestrator;
+import org.junit.ClassRule;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+import util.ItUtils;
+
+@RunWith(Suite.class)
+@Suite.SuiteClasses({
+  ManualRulesTest.class, CommonRulesTest.class
+})
+public class IssueTestSuite {
+
+  @ClassRule
+  public static final Orchestrator ORCHESTRATOR = Orchestrator.builderEnv()
+    .addPlugin(ItUtils.xooPlugin())
+    .build();
+}
diff --git a/it/it-tests/src/test/java/issue/suite/ManualRulesTest.java b/it/it-tests/src/test/java/issue/suite/ManualRulesTest.java
new file mode 100644 (file)
index 0000000..506c649
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2009-2014 SonarSource SA
+ * All rights reserved
+ * mailto:contact AT sonarsource DOT com
+ */
+package issue.suite;
+
+import com.sonar.orchestrator.Orchestrator;
+import com.sonar.orchestrator.selenium.Selenese;
+import java.sql.Connection;
+import java.sql.SQLException;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.ClassRule;
+import org.junit.Test;
+
+public class ManualRulesTest {
+
+  @ClassRule
+  public static Orchestrator orchestrator = IssueTestSuite.ORCHESTRATOR;
+
+  @BeforeClass
+  public static void setup() throws Exception {
+    orchestrator.resetData();
+    deleteManualRules();
+  }
+
+  @AfterClass
+  public static void purgeManualRules() {
+    deleteManualRules();
+  }
+
+  @Test
+  public void testManualRules() {
+    Selenese selenese = Selenese
+      .builder()
+      .setHtmlTestsInClasspath("manual-rules",
+        "/issue/suite/ManualRulesTest/create_edit_delete_manual_rule.html"
+      ).build();
+    orchestrator.executeSelenese(selenese);
+  }
+
+  protected static void deleteManualRules(){
+    try {
+      Connection connection = orchestrator.getDatabase().openConnection();
+      connection.prepareStatement("DELETE FROM rules WHERE rules.plugin_name='manual'").execute();
+    } catch (SQLException e) {
+      throw new IllegalStateException("Fail to remove manual rules", e);
+    }
+  }
+
+}
diff --git a/it/it-tests/src/test/resources/issue/suite/CommonRulesTest/xoo-common-rules-profile.xml b/it/it-tests/src/test/resources/issue/suite/CommonRulesTest/xoo-common-rules-profile.xml
new file mode 100644 (file)
index 0000000..9803527
--- /dev/null
@@ -0,0 +1,55 @@
+<?xml version="1.0"?><!-- Generated by Sonar -->
+<profile>
+  <name>xoo-common-rules</name>
+  <language>xoo</language>
+  <rules>
+    <rule>
+      <repositoryKey>common-xoo</repositoryKey>
+      <key>DuplicatedBlocks</key>
+      <priority>CRITICAL</priority>
+    </rule>
+    <rule>
+      <repositoryKey>common-xoo</repositoryKey>
+      <key>InsufficientBranchCoverage</key>
+      <priority>CRITICAL</priority>
+      <parameters>
+        <parameter>
+          <key>minimumBranchCoverageRatio</key>
+          <value>90</value>
+        </parameter>
+      </parameters>
+    </rule>
+    <rule>
+      <repositoryKey>common-xoo</repositoryKey>
+      <key>InsufficientCommentDensity</key>
+      <priority>CRITICAL</priority>
+      <parameters>
+        <parameter>
+          <key>minimumCommentDensity</key>
+          <value>90.0</value>
+        </parameter>
+      </parameters>
+    </rule>
+    <rule>
+      <repositoryKey>common-xoo</repositoryKey>
+      <key>InsufficientLineCoverage</key>
+      <priority>CRITICAL</priority>
+      <parameters>
+        <parameter>
+          <key>minimumLineCoverageRatio</key>
+          <value>90</value>
+        </parameter>
+      </parameters>
+    </rule>
+    <rule>
+      <repositoryKey>common-xoo</repositoryKey>
+      <key>FailedUnitTests</key>
+      <priority>CRITICAL</priority>
+    </rule>
+    <rule>
+      <repositoryKey>common-xoo</repositoryKey>
+      <key>SkippedUnitTests</key>
+      <priority>CRITICAL</priority>
+    </rule>
+  </rules>
+</profile>
diff --git a/it/it-tests/src/test/resources/issue/suite/ManualRulesTest/create_edit_delete_manual_rule.html b/it/it-tests/src/test/resources/issue/suite/ManualRulesTest/create_edit_delete_manual_rule.html
new file mode 100644 (file)
index 0000000..013655a
--- /dev/null
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head profile="http://selenium-ide.openqa.org/profiles/test-case">
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+    <title>create_edit_delete_manual_rule</title>
+</head>
+<body>
+<table cellpadding="1" cellspacing="1" border="1">
+    <tbody>
+    <tr>
+       <td>open</td>
+       <td>/sonar/sessions/new</td>
+       <td></td>
+</tr>
+<tr>
+       <td>type</td>
+       <td>login</td>
+       <td>admin</td>
+</tr>
+<tr>
+       <td>type</td>
+       <td>password</td>
+       <td>admin</td>
+</tr>
+<tr>
+       <td>clickAndWait</td>
+       <td>commit</td>
+       <td></td>
+</tr>
+<tr>
+       <td>open</td>
+       <td>/sonar/coding_rules</td>
+       <td></td>
+</tr>
+<tr>
+       <td>waitForElementPresent</td>
+       <td>css=.js-create-manual-rule</td>
+       <td></td>
+</tr>
+<tr>
+       <td>click</td>
+       <td>css=.js-create-manual-rule</td>
+       <td></td>
+</tr>
+<tr>
+       <td>waitForVisible</td>
+       <td>coding-rules-manual-rule-creation-create</td>
+       <td></td>
+</tr>
+<tr>
+       <td>type</td>
+       <td>name=name</td>
+       <td>New rule</td>
+</tr>
+<tr>
+       <td>type</td>
+       <td>name=key</td>
+       <td>New_rule</td>
+</tr>
+<tr>
+       <td>type</td>
+       <td>name=markdown_description</td>
+       <td>This is a new rule</td>
+</tr>
+<tr>
+       <td>click</td>
+       <td>coding-rules-manual-rule-creation-create</td>
+       <td></td>
+</tr>
+<tr>
+       <td>waitForElementPresent</td>
+       <td>css=.coding-rules-detail-header</td>
+       <td></td>
+</tr>
+<tr>
+       <td>assertText</td>
+       <td>css=.coding-rule-details</td>
+       <td>glob:*New rule*This is a new rule*</td>
+</tr>
+<tr>
+       <td>click</td>
+       <td>coding-rules-detail-manual-rule-change</td>
+       <td></td>
+</tr>
+<tr>
+       <td>waitForVisible</td>
+       <td>coding-rules-manual-rule-creation-create</td>
+       <td></td>
+</tr>
+<tr>
+       <td>type</td>
+       <td>name=markdown_description</td>
+       <td>Description updated</td>
+</tr>
+<tr>
+       <td>click</td>
+       <td>coding-rules-manual-rule-creation-create</td>
+       <td></td>
+</tr>
+<tr>
+       <td>waitForText</td>
+       <td>css=.coding-rule-details</td>
+       <td>glob:*New rule*Description updated*</td>
+</tr>
+<tr>
+       <td>click</td>
+       <td>coding-rules-detail-rule-delete</td>
+       <td></td>
+</tr>
+<tr>
+       <td>waitForVisible</td>
+       <td>css=[data-confirm=&quot;yes&quot;]</td>
+       <td></td>
+</tr>
+<tr>
+       <td>click</td>
+       <td>css=[data-confirm=&quot;yes&quot;]</td>
+       <td></td>
+</tr>
+<tr>
+       <td>waitForNotText</td>
+       <td>css=.search-navigator-workspace-list</td>
+       <td>glob:*New rule*</td>
+</tr>
+</tbody>
+</table>
+</body>
+</html>
index 0d1567109ff6e880da416a286773a558d11b287a..94bb22762acd016f44633b8b4ce24ab449e44bb4 100755 (executable)
--- a/travis.sh
+++ b/travis.sh
@@ -58,7 +58,7 @@ PRANALYSIS)
   ;;
 
 ITS_QUALITYGATE)
-       installTravisTools
+  installTravisTools
 
   export DISPLAY=:99.0
   travis_start_xvfb
@@ -66,6 +66,15 @@ ITS_QUALITYGATE)
   mvn install -Pit,dev -DskipTests -Dsonar.runtimeVersion=DEV -Dcategory="qualitygate"
   ;;
 
+ITS_ISSUE)
+  installTravisTools
+
+  export DISPLAY=:99.0
+  travis_start_xvfb
+
+  mvn install -Pit,dev -DskipTests -Dsonar.runtimeVersion=DEV -Dcategory="issue"
+  ;;
+
 ITS_UPDATECENTER)
        installTravisTools