/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd;
import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
import static com.github.tomakehurst.wiremock.client.WireMock.findAll;
import static com.github.tomakehurst.wiremock.client.WireMock.get;
import static com.github.tomakehurst.wiremock.client.WireMock.getRequestedFor;
import static com.github.tomakehurst.wiremock.client.WireMock.head;
import static com.github.tomakehurst.wiremock.client.WireMock.headRequestedFor;
import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
import static com.github.tomakehurst.wiremock.client.WireMock.urlMatching;
import static com.github.tomakehurst.wiremock.client.WireMock.verify;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.InputStream;
import java.util.List;
import org.apache.commons.io.IOUtils;
import org.junit.Test;
import com.github.tomakehurst.wiremock.junit.WireMockRule;
public class RuleSetReferenceIdTest {
private static void assertRuleSetReferenceId(final boolean expectedExternal, final String expectedRuleSetFileName,
final boolean expectedAllRules, final String expectedRuleName, final String expectedToString,
final RuleSetReferenceId reference) {
assertEquals("Wrong external", expectedExternal, reference.isExternal());
assertEquals("Wrong RuleSet file name", expectedRuleSetFileName, reference.getRuleSetFileName());
assertEquals("Wrong all Rule reference", expectedAllRules, reference.isAllRules());
assertEquals("Wrong Rule name", expectedRuleName, reference.getRuleName());
assertEquals("Wrong toString()", expectedToString, reference.toString());
}
@Test(expected = IllegalArgumentException.class)
public void testCommaInSingleId() {
new RuleSetReferenceId("bad,id");
}
@Test(expected = IllegalArgumentException.class)
public void testInternalWithInternal() {
new RuleSetReferenceId("SomeRule", new RuleSetReferenceId("SomeOtherRule"));
}
@Test(expected = IllegalArgumentException.class)
public void testExternalWithExternal() {
new RuleSetReferenceId("someruleset.xml/SomeRule", new RuleSetReferenceId("someruleset.xml/SomeOtherRule"));
}
@Test(expected = IllegalArgumentException.class)
public void testExternalWithInternal() {
new RuleSetReferenceId("someruleset.xml/SomeRule", new RuleSetReferenceId("SomeOtherRule"));
}
@Test
public void testInteralWithExternal() {
// This is okay
new RuleSetReferenceId("SomeRule", new RuleSetReferenceId("someruleset.xml/SomeOtherRule"));
}
@Test
public void testEmptyRuleSet() {
// This is representative of how the Test framework creates
// RuleSetReferenceId from static RuleSet XMLs
RuleSetReferenceId reference = new RuleSetReferenceId(null);
assertRuleSetReferenceId(true, null, true, null, "anonymous all Rule", reference);
}
@Test
public void testInternalWithExternalRuleSet() {
// This is representative of how the RuleSetFactory temporarily pairs an
// internal reference
// with an external reference.
RuleSetReferenceId internalRuleSetReferenceId = new RuleSetReferenceId("MockRuleName");
assertRuleSetReferenceId(false, null, false, "MockRuleName", "MockRuleName", internalRuleSetReferenceId);
RuleSetReferenceId externalRuleSetReferenceId = new RuleSetReferenceId("rulesets/java/basic.xml");
assertRuleSetReferenceId(true, "rulesets/java/basic.xml", true, null, "rulesets/java/basic.xml",
externalRuleSetReferenceId);
RuleSetReferenceId pairRuleSetReferenceId = new RuleSetReferenceId("MockRuleName", externalRuleSetReferenceId);
assertRuleSetReferenceId(true, "rulesets/java/basic.xml", false, "MockRuleName",
"rulesets/java/basic.xml/MockRuleName", pairRuleSetReferenceId);
}
@Test
public void testConstructorGivenHttpUrlIdSucceedsAndProcessesIdCorrectly() {
final String sonarRulesetUrlId = "http://localhost:54321/profiles/export?format=pmd&language=java&name=Sonar%2520way";
RuleSetReferenceId ruleSetReferenceId = new RuleSetReferenceId(" " + sonarRulesetUrlId + " ");
assertRuleSetReferenceId(true, sonarRulesetUrlId, true, null, sonarRulesetUrlId, ruleSetReferenceId);
}
@org.junit.Rule
public WireMockRule wireMockRule = new WireMockRule(0);
@Test
public void testConstructorGivenHttpUrlInputStream() throws Exception {
String path = "/profiles/export?format=pmd&language=java&name=Sonar%2520way";
String rulesetUrl = "http://localhost:" + wireMockRule.port() + path;
stubFor(head(urlEqualTo(path)).willReturn(aResponse().withStatus(200)));
stubFor(get(urlEqualTo(path))
.willReturn(aResponse().withStatus(200).withHeader("Content-type", "text/xml").withBody("xyz")));
RuleSetReferenceId ruleSetReferenceId = new RuleSetReferenceId(" " + rulesetUrl + " ");
assertRuleSetReferenceId(true, rulesetUrl, true, null, rulesetUrl, ruleSetReferenceId);
try (InputStream inputStream = ruleSetReferenceId.getInputStream(RuleSetReferenceIdTest.class.getClassLoader());) {
String loaded = IOUtils.toString(inputStream, "UTF-8");
assertEquals("xyz", loaded);
}
verify(1, headRequestedFor(urlEqualTo(path)));
verify(0, headRequestedFor(urlEqualTo("/profiles")));
verify(1, getRequestedFor(urlEqualTo(path)));
assertEquals(1, findAll(headRequestedFor(urlMatching(".*"))).size());
assertEquals(1, findAll(getRequestedFor(urlMatching(".*"))).size());
}
@Test
public void testConstructorGivenHttpUrlSingleRuleInputStream() throws Exception {
String path = "/profiles/export?format=pmd&language=java&name=Sonar%2520way";
String completePath = path + "/DummyBasicMockRule";
String hostpart = "http://localhost:" + wireMockRule.port();
String basicRuleSet = IOUtils
.toString(RuleSetReferenceId.class.getResourceAsStream("/rulesets/dummy/basic.xml"));
stubFor(head(urlEqualTo(completePath)).willReturn(aResponse().withStatus(404)));
stubFor(head(urlEqualTo(path)).willReturn(aResponse().withStatus(200).withHeader("Content-type", "text/xml")));
stubFor(get(urlEqualTo(path))
.willReturn(aResponse().withStatus(200).withHeader("Content-type", "text/xml").withBody(basicRuleSet)));
RuleSetReferenceId ruleSetReferenceId = new RuleSetReferenceId(" " + hostpart + completePath + " ");
assertRuleSetReferenceId(true, hostpart + path, false, "DummyBasicMockRule", hostpart + completePath,
ruleSetReferenceId);
try (InputStream inputStream = ruleSetReferenceId.getInputStream(RuleSetReferenceIdTest.class.getClassLoader());) {
String loaded = IOUtils.toString(inputStream, "UTF-8");
assertEquals(basicRuleSet, loaded);
}
verify(1, headRequestedFor(urlEqualTo(completePath)));
verify(1, headRequestedFor(urlEqualTo(path)));
verify(1, getRequestedFor(urlEqualTo(path)));
verify(0, getRequestedFor(urlEqualTo(completePath)));
assertEquals(2, findAll(headRequestedFor(urlMatching(".*"))).size());
assertEquals(1, findAll(getRequestedFor(urlMatching(".*"))).size());
}
@Test
public void testOneSimpleRuleSet() {
List<RuleSetReferenceId> references = RuleSetReferenceId.parse("dummy-basic");
assertEquals(1, references.size());
assertRuleSetReferenceId(true, "rulesets/dummy/basic.xml", true, null, "rulesets/dummy/basic.xml",
references.get(0));
}
@Test
public void testMultipleSimpleRuleSet() {
List<RuleSetReferenceId> references = RuleSetReferenceId.parse("dummy-unusedcode,dummy-basic");
assertEquals(2, references.size());
assertRuleSetReferenceId(true, "rulesets/dummy/unusedcode.xml", true, null, "rulesets/dummy/unusedcode.xml",
references.get(0));
assertRuleSetReferenceId(true, "rulesets/dummy/basic.xml", true, null, "rulesets/dummy/basic.xml",
references.get(1));
}
/**
* See https://sourceforge.net/p/pmd/bugs/1201/
*/
@Test
public void testMultipleRulesWithSpaces() {
List<RuleSetReferenceId> references = RuleSetReferenceId.parse("dummy-basic, dummy-unusedcode, dummy2-basic");
assertEquals(3, references.size());
assertRuleSetReferenceId(true, "rulesets/dummy/basic.xml", true, null, "rulesets/dummy/basic.xml",
references.get(0));
assertRuleSetReferenceId(true, "rulesets/dummy/unusedcode.xml", true, null, "rulesets/dummy/unusedcode.xml",
references.get(1));
assertRuleSetReferenceId(true, "rulesets/dummy2/basic.xml", true, null, "rulesets/dummy2/basic.xml",
references.get(2));
}
@Test
public void testOneReleaseRuleSet() {
List<RuleSetReferenceId> references = RuleSetReferenceId.parse("50");
assertEquals(1, references.size());
assertRuleSetReferenceId(true, "rulesets/releases/50.xml", true, null, "rulesets/releases/50.xml",
references.get(0));
}
@Test
public void testOneFullRuleSet() {
List<RuleSetReferenceId> references = RuleSetReferenceId.parse("rulesets/java/unusedcode.xml");
assertEquals(1, references.size());
assertRuleSetReferenceId(true, "rulesets/java/unusedcode.xml", true, null, "rulesets/java/unusedcode.xml",
references.get(0));
}
@Test
public void testOneFullRuleSetURL() {
List<RuleSetReferenceId> references = RuleSetReferenceId.parse("file://somepath/rulesets/java/unusedcode.xml");
assertEquals(1, references.size());
assertRuleSetReferenceId(true, "file://somepath/rulesets/java/unusedcode.xml", true, null,
"file://somepath/rulesets/java/unusedcode.xml", references.get(0));
}
@Test
public void testMultipleFullRuleSet() {
List<RuleSetReferenceId> references = RuleSetReferenceId
.parse("rulesets/java/unusedcode.xml,rulesets/java/basic.xml");
assertEquals(2, references.size());
assertRuleSetReferenceId(true, "rulesets/java/unusedcode.xml", true, null, "rulesets/java/unusedcode.xml",
references.get(0));
assertRuleSetReferenceId(true, "rulesets/java/basic.xml", true, null, "rulesets/java/basic.xml",
references.get(1));
}
@Test
public void testMixRuleSet() {
List<RuleSetReferenceId> references = RuleSetReferenceId.parse("rulesets/dummy/unusedcode.xml,dummy2-basic");
assertEquals(2, references.size());
assertRuleSetReferenceId(true, "rulesets/dummy/unusedcode.xml", true, null, "rulesets/dummy/unusedcode.xml",
references.get(0));
assertRuleSetReferenceId(true, "rulesets/dummy2/basic.xml", true, null, "rulesets/dummy2/basic.xml",
references.get(1));
}
@Test
public void testUnknownRuleSet() {
List<RuleSetReferenceId> references = RuleSetReferenceId.parse("nonexistant.xml");
assertEquals(1, references.size());
assertRuleSetReferenceId(true, "nonexistant.xml", true, null, "nonexistant.xml", references.get(0));
}
@Test
public void testUnknownAndSimpleRuleSet() {
List<RuleSetReferenceId> references = RuleSetReferenceId.parse("dummy-basic,nonexistant.xml");
assertEquals(2, references.size());
assertRuleSetReferenceId(true, "rulesets/dummy/basic.xml", true, null, "rulesets/dummy/basic.xml",
references.get(0));
assertRuleSetReferenceId(true, "nonexistant.xml", true, null, "nonexistant.xml", references.get(1));
}
@Test
public void testSimpleRuleSetAndRule() {
List<RuleSetReferenceId> references = RuleSetReferenceId.parse("dummy-basic/DummyBasicMockRule");
assertEquals(1, references.size());
assertRuleSetReferenceId(true, "rulesets/dummy/basic.xml", false, "DummyBasicMockRule",
"rulesets/dummy/basic.xml/DummyBasicMockRule", references.get(0));
}
@Test
public void testFullRuleSetAndRule() {
List<RuleSetReferenceId> references = RuleSetReferenceId.parse("rulesets/java/basic.xml/EmptyCatchBlock");
assertEquals(1, references.size());
assertRuleSetReferenceId(true, "rulesets/java/basic.xml", false, "EmptyCatchBlock",
"rulesets/java/basic.xml/EmptyCatchBlock", references.get(0));
}
@Test
public void testFullRuleSetURLAndRule() {
List<RuleSetReferenceId> references = RuleSetReferenceId
.parse("file://somepath/rulesets/java/unusedcode.xml/EmptyCatchBlock");
assertEquals(1, references.size());
assertRuleSetReferenceId(true, "file://somepath/rulesets/java/unusedcode.xml", false, "EmptyCatchBlock",
"file://somepath/rulesets/java/unusedcode.xml/EmptyCatchBlock", references.get(0));
}
@Test
public void testInternalRuleSetAndRule() {
List<RuleSetReferenceId> references = RuleSetReferenceId.parse("EmptyCatchBlock");
assertEquals(1, references.size());
assertRuleSetReferenceId(false, null, false, "EmptyCatchBlock", "EmptyCatchBlock", references.get(0));
}
@Test
public void testRelativePathRuleSet() {
List<RuleSetReferenceId> references = RuleSetReferenceId.parse("pmd/pmd-ruleset.xml");
assertEquals(1, references.size());
assertRuleSetReferenceId(true, "pmd/pmd-ruleset.xml", true, null, "pmd/pmd-ruleset.xml", references.get(0));
}
@Test
public void testAbsolutePathRuleSet() {
List<RuleSetReferenceId> references = RuleSetReferenceId.parse("/home/foo/pmd/pmd-ruleset.xml");
assertEquals(1, references.size());
assertRuleSetReferenceId(true, "/home/foo/pmd/pmd-ruleset.xml", true, null, "/home/foo/pmd/pmd-ruleset.xml",
references.get(0));
}
@Test
public void testFooRules() throws Exception {
String fooRulesFile = new File("./src/test/resources/net/sourceforge/pmd/rulesets/foo-project/foo-rules")
.getCanonicalPath();
List<RuleSetReferenceId> references = RuleSetReferenceId.parse(fooRulesFile);
assertEquals(1, references.size());
assertRuleSetReferenceId(true, fooRulesFile, true, null, fooRulesFile, references.get(0));
}
@Test
public void testNullRulesetString() throws Exception {
List<RuleSetReferenceId> references = RuleSetReferenceId.parse(null);
assertTrue(references.isEmpty());
}
public static junit.framework.Test suite() {
return new junit.framework.JUnit4TestAdapter(RuleSetReferenceIdTest.class);
}
}