*/
package org.sonar.server.rule2;
-import org.sonar.check.Cardinality;
-
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.sonar.api.rule.RuleKey;
+import org.sonar.check.Cardinality;
import org.sonar.core.qualityprofile.db.ActiveRuleDao;
import org.sonar.core.rule.RuleDto;
import org.sonar.server.search.BaseNormalizer;
import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
indexField(RuleField.STATUS.key(), rule.getStatus(), document);
indexField(RuleField.LANGUAGE.key(), rule.getLanguage(), document);
indexField(RuleField.INTERNAL_KEY.key(), rule.getConfigKey(), document);
- indexField(RuleField.TEMPLATE.key(), rule.getCardinality()==Cardinality.MULTIPLE, document);
+ indexField(RuleField.TEMPLATE.key(), rule.getCardinality() == Cardinality.MULTIPLE, document);
indexField(RuleField.TAGS.key(), rule.getName(), document);
indexField(RuleField.SYSTEM_TAGS.key(), rule.getName(), document);
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.text.JsonWriter;
import org.sonar.server.rule2.RuleIndex;
+import org.sonar.server.rule2.RuleNormalizer;
import org.sonar.server.rule2.RuleQuery;
import org.sonar.server.rule2.RuleService;
import org.sonar.server.search.Hit;
.createParam("fields")
.setDescription("Comma-separated list of the fields to be returned in response. All the fields are returned by default.")
.setPossibleValues(RuleIndex.PUBLIC_FIELDS)
- .setExampleValue("key,name");
+ .setExampleValue(String.format("%s,%s,%s", RuleNormalizer.RuleField.KEY, RuleNormalizer.RuleField.REPOSITORY, RuleNormalizer.RuleField.LANGUAGE));
}
@Override
*/
package org.sonar.server.search;
+import javax.annotation.CheckForNull;
import java.util.HashMap;
import java.util.Map;
private Integer rank;
- public Hit(Integer rank){
+ public Hit(Integer rank) {
this.fields = new HashMap<String, Object>();
this.rank = rank;
}
- public Map<String, Object> getFields(){
+ public Map<String, Object> getFields() {
return this.fields;
}
- public Integer getRank(){
+ @CheckForNull
+ public Object getField(String key) {
+ return this.fields.get(key);
+ }
+
+ @CheckForNull
+ public String getFieldAsString(String key) {
+ Object val = this.fields.get(key);
+ return val == null ? null : val.toString();
+ }
+
+ public Integer getRank() {
return this.rank;
}
+++ /dev/null
-/*
- * 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.server.rule2;
-//
-//import com.github.tlrx.elasticsearch.test.annotations.ElasticsearchNode;
-//import com.github.tlrx.elasticsearch.test.support.junit.runners.ElasticsearchRunner;
-//import org.elasticsearch.node.Node;
-//import org.junit.Before;
-//import org.junit.Ignore;
-//import org.junit.runner.RunWith;
-//import org.sonar.server.es.ESNode;
-//import org.sonar.server.search.BaseIndex;
-//
-//@RunWith(ElasticsearchRunner.class)
-//@Ignore("Same problem as with BaseIndex test")
-//public class RuleIndexTest {
-//
-// private static final String TEST_NODE_NAME = "es_node_for_tests";
-//
-// @ElasticsearchNode(name = TEST_NODE_NAME,
-// clusterName = BaseIndex.ES_CLUSTER_NAME,
-// local = true, data = true)
-// private Node node;
-//
-// private ESNode esNode;
-//
-// @Before
-// public void setUp() throws Exception {
-// esNode = new ESNode(fileSystem, settings)
-// }
-////
-//// private RuleIndex getRuleIndex(){
-//// LocalNonBlockingWorkQueue queue = new LocalNonBlockingWorkQueue();
-//// Settings settings = new Settings();
-//// settings.setProperty("sonar.log.profilingLevel", "BASIC");
-//// RuleIndex rindex = new RuleIndex(queue, null, new Profiling(settings));
-//// return rindex;
-//// }
-////
-//// @After
-//// public void tearDown() {
-//// if (node != null && !node.isClosed()) {
-//// node.close();
-//// }
-//// }
-////
-//// @Test
-//// public void test_ruleIndex_conencts_to_es() {
-////
-//// RuleIndex ruleIndex = getRuleIndex();
-//// ruleIndex.connect();
-////
-//// assertThat(node.client().admin().cluster().prepareClusterStats().get().getNodesStats().getCounts().getTotal())
-//// .isEqualTo(ruleIndex.getNodesStats().getCounts().getTotal());
-////
-//// ruleIndex.stop();
-////
-//// }
-//}
*/
package org.sonar.server.rule2;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
+import org.sonar.api.rule.RuleKey;
+import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rule.Severity;
import org.sonar.api.utils.DateUtils;
import org.sonar.check.Cardinality;
-import org.sonar.core.qualityprofile.db.ActiveRuleDao;
-import org.sonar.core.qualityprofile.db.ActiveRuleDto;
import org.sonar.core.rule.RuleDto;
import org.sonar.server.search.Hit;
import org.sonar.server.tester.ServerTester;
-import java.util.Date;
-
import static org.fest.assertions.Assertions.assertThat;
-@Ignore
public class RuleMediumTest {
@Rule
- public ServerTester tester = new ServerTester()
- // .setProperty("sonar.log.profilingLevel", "FULL")
- .setProperty("sonar.es.http.port", "8888");
+ public ServerTester tester = new ServerTester();
- private RuleDto dto;
- private ActiveRuleDto adto;
+ @Test
+ public void persist_and_index_new_rule() {
+ // insert db
+ RuleKey ruleKey = RuleKey.of("javascript", "S001");
+ RuleDao dao = tester.get(RuleDao.class);
+ dao.insert(newRuleDto(ruleKey));
- @Before
- public void setup() {
- dto = getRuleDto(1);
- adto = getActiveRuleDto(dto);
- }
+ // verify that rule is persisted in db
+ RuleDto persistedDto = dao.selectByKey(ruleKey);
+ assertThat(persistedDto).isNotNull();
+ assertThat(persistedDto.getId()).isGreaterThanOrEqualTo(0);
+ assertThat(persistedDto.getRuleKey()).isEqualTo(ruleKey.rule());
+ assertThat(persistedDto.getLanguage()).isEqualTo("js");
- @After
- public void teardown() {
- tester.stop();
+ // verify that rule is indexed in es
+ RuleIndex index = tester.get(RuleIndex.class);
+ Hit hit = index.getByKey(ruleKey);
+ assertThat(hit).isNotNull();
+ assertThat(hit.getFieldAsString(RuleNormalizer.RuleField.REPOSITORY.key())).isEqualTo(ruleKey.repository());
+ assertThat(hit.getFieldAsString(RuleNormalizer.RuleField.KEY.key())).isEqualTo(ruleKey.rule());
+ assertThat(hit.getFieldAsString(RuleNormalizer.RuleField.LANGUAGE.key())).isEqualTo("js");
+ assertThat(hit.getFieldAsString(RuleNormalizer.RuleField.NAME.key())).isEqualTo("Rule S001");
+ assertThat(hit.getFieldAsString(RuleNormalizer.RuleField.DESCRIPTION.key())).isEqualTo("Description S001");
+ assertThat(hit.getFieldAsString(RuleNormalizer.RuleField.STATUS.key())).isEqualTo(RuleStatus.READY.toString());
}
- private ActiveRuleDto getActiveRuleDto(RuleDto dto) {
- return new ActiveRuleDto()
- .setId(1)
- .setNoteCreatedAt(new Date())
- .setNoteData("Note data, and some more note and here too.")
- .setRuleId(dto.getId())
- .setProfileId(1)
- .setParentId(0)
- .setSeverity(3);
- }
- private RuleDto getRuleDto(int id) {
+ private RuleDto newRuleDto(RuleKey ruleKey) {
return new RuleDto()
- // .setId(id)
- .setRuleKey("NewRuleKey=" + id)
- .setRepositoryKey("plugin")
- .setName("new name")
- .setDescription("new description")
- .setStatus(org.sonar.api.rules.Rule.STATUS_DEPRECATED)
- .setConfigKey("NewConfigKey")
+ .setRuleKey(ruleKey.rule())
+ .setRepositoryKey(ruleKey.repository())
+ .setName("Rule " + ruleKey.rule())
+ .setDescription("Description " + ruleKey.rule())
+ .setStatus(RuleStatus.READY.toString())
+ .setConfigKey("InternalKey" + ruleKey.rule())
.setSeverity(Severity.INFO)
- .setCardinality(Cardinality.MULTIPLE)
- .setLanguage("dart")
- .setParentId(3)
- .setSubCharacteristicId(100)
- .setDefaultSubCharacteristicId(101)
+ .setCardinality(Cardinality.SINGLE)
+ .setLanguage("js")
.setRemediationFunction("linear")
.setDefaultRemediationFunction("linear_offset")
.setRemediationCoefficient("1h")
.setDefaultRemediationCoefficient("5d")
.setRemediationOffset("5min")
.setDefaultRemediationOffset("10h")
- .setEffortToFixDescription("squid.S115.effortToFix")
+ .setEffortToFixDescription(ruleKey.repository() + "." + ruleKey.rule() + ".effortToFix")
.setCreatedAt(DateUtils.parseDate("2013-12-16"))
.setUpdatedAt(DateUtils.parseDate("2013-12-17"));
}
-
- @Test
- public void test_dao_queue_es_search_loop() {
-
- RuleDao dao = tester.get(RuleDao.class);
- ActiveRuleDao adao = tester.get(ActiveRuleDao.class);
- RuleIndex index = tester.get(RuleIndex.class);
-
- dao.insert(dto);
-
- Hit hit = index.getByKey(dto.getKey());
- assertThat(hit.getFields().get(RuleNormalizer.RuleField.KEY.key())).isEqualTo(dto.getRuleKey().toString());
- }
-
- @Test
- @Ignore
- public void test_ruleservice_getByKey() {
- RuleService service = tester.get(RuleService.class);
- RuleDao dao = tester.get(RuleDao.class);
-
- dao.insert(dto);
-
- org.sonar.server.rule2.Rule rule = service.getByKey(dto.getKey());
-
- assertThat(rule.key()).isEqualTo(dto.getKey());
-
- }
}