1
2
3
4 package net.sourceforge.pmd;
5
6 import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
7 import static com.github.tomakehurst.wiremock.client.WireMock.findAll;
8 import static com.github.tomakehurst.wiremock.client.WireMock.get;
9 import static com.github.tomakehurst.wiremock.client.WireMock.getRequestedFor;
10 import static com.github.tomakehurst.wiremock.client.WireMock.head;
11 import static com.github.tomakehurst.wiremock.client.WireMock.headRequestedFor;
12 import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
13 import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
14 import static com.github.tomakehurst.wiremock.client.WireMock.urlMatching;
15 import static com.github.tomakehurst.wiremock.client.WireMock.verify;
16 import static org.junit.Assert.assertEquals;
17 import static org.junit.Assert.assertTrue;
18
19 import java.io.File;
20 import java.io.InputStream;
21 import java.util.List;
22
23 import org.apache.commons.io.IOUtils;
24 import org.junit.Test;
25
26 import com.github.tomakehurst.wiremock.junit.WireMockRule;
27
28 public class RuleSetReferenceIdTest {
29
30 private static void assertRuleSetReferenceId(final boolean expectedExternal, final String expectedRuleSetFileName,
31 final boolean expectedAllRules, final String expectedRuleName, final String expectedToString,
32 final RuleSetReferenceId reference) {
33
34 assertEquals("Wrong external", expectedExternal, reference.isExternal());
35 assertEquals("Wrong RuleSet file name", expectedRuleSetFileName, reference.getRuleSetFileName());
36 assertEquals("Wrong all Rule reference", expectedAllRules, reference.isAllRules());
37 assertEquals("Wrong Rule name", expectedRuleName, reference.getRuleName());
38 assertEquals("Wrong toString()", expectedToString, reference.toString());
39 }
40
41 @Test(expected = IllegalArgumentException.class)
42 public void testCommaInSingleId() {
43
44 new RuleSetReferenceId("bad,id");
45 }
46
47 @Test(expected = IllegalArgumentException.class)
48 public void testInternalWithInternal() {
49
50 new RuleSetReferenceId("SomeRule", new RuleSetReferenceId("SomeOtherRule"));
51 }
52
53 @Test(expected = IllegalArgumentException.class)
54 public void testExternalWithExternal() {
55
56 new RuleSetReferenceId("someruleset.xml/SomeRule", new RuleSetReferenceId("someruleset.xml/SomeOtherRule"));
57 }
58
59 @Test(expected = IllegalArgumentException.class)
60 public void testExternalWithInternal() {
61
62 new RuleSetReferenceId("someruleset.xml/SomeRule", new RuleSetReferenceId("SomeOtherRule"));
63 }
64
65 @Test
66 public void testInteralWithExternal() {
67
68
69 new RuleSetReferenceId("SomeRule", new RuleSetReferenceId("someruleset.xml/SomeOtherRule"));
70 }
71
72 @Test
73 public void testEmptyRuleSet() {
74
75
76 RuleSetReferenceId reference = new RuleSetReferenceId(null);
77 assertRuleSetReferenceId(true, null, true, null, "anonymous all Rule", reference);
78 }
79
80 @Test
81 public void testInternalWithExternalRuleSet() {
82
83
84
85 RuleSetReferenceId internalRuleSetReferenceId = new RuleSetReferenceId("MockRuleName");
86 assertRuleSetReferenceId(false, null, false, "MockRuleName", "MockRuleName", internalRuleSetReferenceId);
87 RuleSetReferenceId externalRuleSetReferenceId = new RuleSetReferenceId("rulesets/java/basic.xml");
88 assertRuleSetReferenceId(true, "rulesets/java/basic.xml", true, null, "rulesets/java/basic.xml",
89 externalRuleSetReferenceId);
90
91 RuleSetReferenceId pairRuleSetReferenceId = new RuleSetReferenceId("MockRuleName", externalRuleSetReferenceId);
92 assertRuleSetReferenceId(true, "rulesets/java/basic.xml", false, "MockRuleName",
93 "rulesets/java/basic.xml/MockRuleName", pairRuleSetReferenceId);
94 }
95
96 @Test
97 public void constructor_GivenHttpUrlId_SucceedsAndProcessesIdCorrectly() {
98
99 final String sonarRulesetUrlId =
100 "http://localhost:54321/profiles/export?format=pmd&language=java&name=Sonar%2520way";
101
102 RuleSetReferenceId ruleSetReferenceId = new RuleSetReferenceId(" " + sonarRulesetUrlId + " ");
103 assertRuleSetReferenceId(true, sonarRulesetUrlId, true, null, sonarRulesetUrlId, ruleSetReferenceId);
104 }
105
106 @org.junit.Rule
107 public WireMockRule wireMockRule = new WireMockRule(0);
108
109 @Test
110 public void constructor_GivenHttpUrl_InputStream() throws Exception {
111 String path = "/profiles/export?format=pmd&language=java&name=Sonar%2520way";
112 String rulesetUrl = "http://localhost:" + wireMockRule.port() + path;
113 stubFor(head(urlEqualTo(path)).willReturn(aResponse().withStatus(200)));
114 stubFor(get(urlEqualTo(path)).willReturn(aResponse().withStatus(200).withHeader("Content-type", "text/xml").withBody("xyz")));
115
116 RuleSetReferenceId ruleSetReferenceId = new RuleSetReferenceId(" " + rulesetUrl + " ");
117 assertRuleSetReferenceId(true, rulesetUrl, true, null, rulesetUrl, ruleSetReferenceId);
118
119 InputStream inputStream = ruleSetReferenceId.getInputStream(RuleSetReferenceIdTest.class.getClassLoader());
120 String loaded = IOUtils.toString(inputStream, "UTF-8");
121 assertEquals("xyz", loaded);
122
123 verify(1, headRequestedFor(urlEqualTo(path)));
124 verify(0, headRequestedFor(urlEqualTo("/profiles")));
125 verify(1, getRequestedFor(urlEqualTo(path)));
126 assertEquals(1, findAll(headRequestedFor(urlMatching(".*"))).size());
127 assertEquals(1, findAll(getRequestedFor(urlMatching(".*"))).size());
128 }
129
130 @Test
131 public void constructor_GivenHttpUrl_SingleRule_InputStream() throws Exception {
132 String path = "/profiles/export?format=pmd&language=java&name=Sonar%2520way";
133 String completePath = path + "/DummyBasicMockRule";
134 String hostpart = "http://localhost:" + wireMockRule.port();
135 String basicRuleSet = IOUtils.toString(RuleSetReferenceId.class.getResourceAsStream("/rulesets/dummy/basic.xml"));
136
137 stubFor(head(urlEqualTo(completePath)).willReturn(aResponse().withStatus(404)));
138 stubFor(head(urlEqualTo(path)).willReturn(aResponse().withStatus(200).withHeader("Content-type", "text/xml")));
139 stubFor(get(urlEqualTo(path)).willReturn(aResponse().withStatus(200).withHeader("Content-type", "text/xml").withBody(basicRuleSet)));
140
141
142 RuleSetReferenceId ruleSetReferenceId = new RuleSetReferenceId(" " + hostpart + completePath + " ");
143 assertRuleSetReferenceId(true, hostpart + path, false, "DummyBasicMockRule", hostpart + completePath, ruleSetReferenceId);
144
145 InputStream inputStream = ruleSetReferenceId.getInputStream(RuleSetReferenceIdTest.class.getClassLoader());
146 String loaded = IOUtils.toString(inputStream, "UTF-8");
147 assertEquals(basicRuleSet, loaded);
148
149 verify(1, headRequestedFor(urlEqualTo(completePath)));
150 verify(1, headRequestedFor(urlEqualTo(path)));
151 verify(1, getRequestedFor(urlEqualTo(path)));
152 verify(0, getRequestedFor(urlEqualTo(completePath)));
153 assertEquals(2, findAll(headRequestedFor(urlMatching(".*"))).size());
154 assertEquals(1, findAll(getRequestedFor(urlMatching(".*"))).size());
155 }
156
157 @Test
158 public void testOneSimpleRuleSet() {
159
160 List<RuleSetReferenceId> references = RuleSetReferenceId.parse("dummy-basic");
161 assertEquals(1, references.size());
162 assertRuleSetReferenceId(true, "rulesets/dummy/basic.xml", true, null, "rulesets/dummy/basic.xml", references
163 .get(0));
164 }
165
166 @Test
167 public void testMultipleSimpleRuleSet() {
168 List<RuleSetReferenceId> references = RuleSetReferenceId.parse("dummy-unusedcode,dummy-basic");
169 assertEquals(2, references.size());
170 assertRuleSetReferenceId(true, "rulesets/dummy/unusedcode.xml", true, null, "rulesets/dummy/unusedcode.xml",
171 references.get(0));
172 assertRuleSetReferenceId(true, "rulesets/dummy/basic.xml", true, null, "rulesets/dummy/basic.xml", references
173 .get(1));
174 }
175
176
177
178
179 @Test
180 public void testMultipleRulesWithSpaces() {
181 List<RuleSetReferenceId> references = RuleSetReferenceId.parse("dummy-basic, dummy-unusedcode, dummy2-basic");
182 assertEquals(3, references.size());
183 assertRuleSetReferenceId(true, "rulesets/dummy/basic.xml", true, null, "rulesets/dummy/basic.xml", references.get(0));
184 assertRuleSetReferenceId(true, "rulesets/dummy/unusedcode.xml", true, null, "rulesets/dummy/unusedcode.xml", references.get(1));
185 assertRuleSetReferenceId(true, "rulesets/dummy2/basic.xml", true, null, "rulesets/dummy2/basic.xml", references.get(2));
186 }
187
188 @Test
189 public void testOneReleaseRuleSet() {
190 List<RuleSetReferenceId> references = RuleSetReferenceId.parse("50");
191 assertEquals(1, references.size());
192 assertRuleSetReferenceId(true, "rulesets/releases/50.xml", true, null, "rulesets/releases/50.xml", references
193 .get(0));
194 }
195
196 @Test
197 public void testOneFullRuleSet() {
198 List<RuleSetReferenceId> references = RuleSetReferenceId.parse("rulesets/java/unusedcode.xml");
199 assertEquals(1, references.size());
200 assertRuleSetReferenceId(true, "rulesets/java/unusedcode.xml", true, null, "rulesets/java/unusedcode.xml",
201 references.get(0));
202 }
203
204 @Test
205 public void testOneFullRuleSetURL() {
206 List<RuleSetReferenceId> references = RuleSetReferenceId.parse("file://somepath/rulesets/java/unusedcode.xml");
207 assertEquals(1, references.size());
208 assertRuleSetReferenceId(true, "file://somepath/rulesets/java/unusedcode.xml", true, null,
209 "file://somepath/rulesets/java/unusedcode.xml", references.get(0));
210 }
211
212 @Test
213 public void testMultipleFullRuleSet() {
214 List<RuleSetReferenceId> references = RuleSetReferenceId
215 .parse("rulesets/java/unusedcode.xml,rulesets/java/basic.xml");
216 assertEquals(2, references.size());
217 assertRuleSetReferenceId(true, "rulesets/java/unusedcode.xml", true, null, "rulesets/java/unusedcode.xml",
218 references.get(0));
219 assertRuleSetReferenceId(true, "rulesets/java/basic.xml", true, null, "rulesets/java/basic.xml", references
220 .get(1));
221 }
222
223 @Test
224 public void testMixRuleSet() {
225 List<RuleSetReferenceId> references = RuleSetReferenceId.parse("rulesets/dummy/unusedcode.xml,dummy2-basic");
226 assertEquals(2, references.size());
227 assertRuleSetReferenceId(true, "rulesets/dummy/unusedcode.xml", true, null, "rulesets/dummy/unusedcode.xml",
228 references.get(0));
229 assertRuleSetReferenceId(true, "rulesets/dummy2/basic.xml", true, null, "rulesets/dummy2/basic.xml", references
230 .get(1));
231 }
232
233 @Test
234 public void testUnknownRuleSet() {
235 List<RuleSetReferenceId> references = RuleSetReferenceId.parse("nonexistant.xml");
236 assertEquals(1, references.size());
237 assertRuleSetReferenceId(true, "nonexistant.xml", true, null, "nonexistant.xml", references.get(0));
238 }
239
240 @Test
241 public void testUnknownAndSimpleRuleSet() {
242 List<RuleSetReferenceId> references = RuleSetReferenceId.parse("dummy-basic,nonexistant.xml");
243 assertEquals(2, references.size());
244 assertRuleSetReferenceId(true, "rulesets/dummy/basic.xml", true, null, "rulesets/dummy/basic.xml", references
245 .get(0));
246 assertRuleSetReferenceId(true, "nonexistant.xml", true, null, "nonexistant.xml", references.get(1));
247 }
248
249 @Test
250 public void testSimpleRuleSetAndRule() {
251 List<RuleSetReferenceId> references = RuleSetReferenceId.parse("dummy-basic/DummyBasicMockRule");
252 assertEquals(1, references.size());
253 assertRuleSetReferenceId(true, "rulesets/dummy/basic.xml", false, "DummyBasicMockRule",
254 "rulesets/dummy/basic.xml/DummyBasicMockRule", references.get(0));
255 }
256
257 @Test
258 public void testFullRuleSetAndRule() {
259 List<RuleSetReferenceId> references = RuleSetReferenceId.parse("rulesets/java/basic.xml/EmptyCatchBlock");
260 assertEquals(1, references.size());
261 assertRuleSetReferenceId(true, "rulesets/java/basic.xml", false, "EmptyCatchBlock",
262 "rulesets/java/basic.xml/EmptyCatchBlock", references.get(0));
263 }
264
265 @Test
266 public void testFullRuleSetURLAndRule() {
267 List<RuleSetReferenceId> references = RuleSetReferenceId
268 .parse("file://somepath/rulesets/java/unusedcode.xml/EmptyCatchBlock");
269 assertEquals(1, references.size());
270 assertRuleSetReferenceId(true, "file://somepath/rulesets/java/unusedcode.xml", false, "EmptyCatchBlock",
271 "file://somepath/rulesets/java/unusedcode.xml/EmptyCatchBlock", references.get(0));
272 }
273
274 @Test
275 public void testInternalRuleSetAndRule() {
276 List<RuleSetReferenceId> references = RuleSetReferenceId.parse("EmptyCatchBlock");
277 assertEquals(1, references.size());
278 assertRuleSetReferenceId(false, null, false, "EmptyCatchBlock", "EmptyCatchBlock", references.get(0));
279 }
280
281 @Test
282 public void testRelativePathRuleSet() {
283 List<RuleSetReferenceId> references = RuleSetReferenceId.parse("pmd/pmd-ruleset.xml");
284 assertEquals(1, references.size());
285 assertRuleSetReferenceId(true, "pmd/pmd-ruleset.xml", true, null, "pmd/pmd-ruleset.xml", references.get(0));
286 }
287
288 @Test
289 public void testAbsolutePathRuleSet() {
290 List<RuleSetReferenceId> references = RuleSetReferenceId.parse("/home/foo/pmd/pmd-ruleset.xml");
291 assertEquals(1, references.size());
292 assertRuleSetReferenceId(true, "/home/foo/pmd/pmd-ruleset.xml", true, null,
293 "/home/foo/pmd/pmd-ruleset.xml", references.get(0));
294 }
295
296 @Test
297 public void testFooRules() throws Exception {
298 String fooRulesFile = new File("./src/test/resources/net/sourceforge/pmd/rulesets/foo-project/foo-rules").getCanonicalPath();
299 List<RuleSetReferenceId> references = RuleSetReferenceId.parse(fooRulesFile);
300 assertEquals(1, references.size());
301 assertRuleSetReferenceId(true, fooRulesFile, true, null, fooRulesFile, references.get(0));
302 }
303
304 @Test
305 public void testNullRulesetString() throws Exception {
306 List<RuleSetReferenceId> references = RuleSetReferenceId.parse(null);
307 assertTrue(references.isEmpty());
308 }
309
310 public static junit.framework.Test suite() {
311 return new junit.framework.JUnit4TestAdapter(RuleSetReferenceIdTest.class);
312 }
313 }