View Javadoc
1   /**
2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
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  		// This is okay
69  		new RuleSetReferenceId("SomeRule", new RuleSetReferenceId("someruleset.xml/SomeOtherRule"));
70      }
71  
72      @Test
73      public void testEmptyRuleSet() {
74      	
75  		// This is representative of how the Test framework creates RuleSetReferenceId from static RuleSet XMLs
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  		// This is representative of how the RuleSetFactory temporarily pairs an internal reference
84  		// with an external reference.
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      * See https://sourceforge.net/p/pmd/bugs/1201/
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 }