001: package org.apache.maven.project;
002:
003: /*
004: * Licensed to the Apache Software Foundation (ASF) under one
005: * or more contributor license agreements. See the NOTICE file
006: * distributed with this work for additional information
007: * regarding copyright ownership. The ASF licenses this file
008: * to you under the Apache License, Version 2.0 (the
009: * "License"); you may not use this file except in compliance
010: * with the License. You may obtain a copy of the License at
011: *
012: * http://www.apache.org/licenses/LICENSE-2.0
013: *
014: * Unless required by applicable law or agreed to in writing,
015: * software distributed under the License is distributed on an
016: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017: * KIND, either express or implied. See the License for the
018: * specific language governing permissions and limitations
019: * under the License.
020: */
021:
022: import junit.framework.TestCase;
023: import org.apache.maven.model.Build;
024: import org.apache.maven.model.Dependency;
025: import org.apache.maven.model.Plugin;
026: import org.apache.maven.model.PluginContainer;
027: import org.apache.maven.model.PluginExecution;
028: import org.codehaus.plexus.util.xml.Xpp3Dom;
029: import org.codehaus.plexus.util.xml.Xpp3DomBuilder;
030: import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
031:
032: import java.io.IOException;
033: import java.io.StringReader;
034: import java.util.Collections;
035: import java.util.Iterator;
036: import java.util.List;
037: import java.util.Map;
038:
039: public class ModelUtilsTest extends TestCase {
040:
041: public void testShouldNotInheritPluginWithInheritanceSetToFalse() {
042: PluginContainer parent = new PluginContainer();
043:
044: Plugin parentPlugin = createPlugin("group", "artifact", "1.0",
045: Collections.EMPTY_MAP);
046: parentPlugin.setInherited("false");
047:
048: parent.addPlugin(parentPlugin);
049:
050: PluginContainer child = new PluginContainer();
051:
052: child.addPlugin(createPlugin("group3", "artifact3", "1.0",
053: Collections.EMPTY_MAP));
054:
055: ModelUtils.mergePluginLists(child, parent, true);
056:
057: List results = child.getPlugins();
058:
059: assertEquals(1, results.size());
060:
061: Plugin result1 = (Plugin) results.get(0);
062: assertEquals("group3", result1.getGroupId());
063: assertEquals("artifact3", result1.getArtifactId());
064: }
065:
066: /**
067: * Test that this is the resulting ordering of plugins after merging:
068: *
069: * Given:
070: *
071: * parent: X -> A -> B -> D -> E
072: * child: Y -> A -> C -> D -> F
073: *
074: * Result:
075: *
076: * X -> Y -> A -> B -> C -> D -> E -> F
077: */
078: public void testShouldPreserveChildOrderingOfPluginsAfterParentMerge() {
079: PluginContainer parent = new PluginContainer();
080:
081: parent.addPlugin(createPlugin("group", "artifact", "1.0",
082: Collections.EMPTY_MAP));
083: parent.addPlugin(createPlugin("group2", "artifact2", "1.0",
084: Collections.singletonMap("key", "value")));
085:
086: PluginContainer child = new PluginContainer();
087:
088: child.addPlugin(createPlugin("group3", "artifact3", "1.0",
089: Collections.EMPTY_MAP));
090: child.addPlugin(createPlugin("group2", "artifact2", "1.0",
091: Collections.singletonMap("key2", "value2")));
092:
093: ModelUtils.mergePluginLists(child, parent, true);
094:
095: List results = child.getPlugins();
096:
097: assertEquals(3, results.size());
098:
099: Plugin result1 = (Plugin) results.get(0);
100:
101: assertEquals("group", result1.getGroupId());
102: assertEquals("artifact", result1.getArtifactId());
103:
104: Plugin result2 = (Plugin) results.get(1);
105:
106: assertEquals("group3", result2.getGroupId());
107: assertEquals("artifact3", result2.getArtifactId());
108:
109: Plugin result3 = (Plugin) results.get(2);
110:
111: assertEquals("group2", result3.getGroupId());
112: assertEquals("artifact2", result3.getArtifactId());
113:
114: Xpp3Dom result3Config = (Xpp3Dom) result3.getConfiguration();
115:
116: assertNotNull(result3Config);
117:
118: assertEquals("value", result3Config.getChild("key").getValue());
119: assertEquals("value2", result3Config.getChild("key2")
120: .getValue());
121: }
122:
123: private Plugin createPlugin(String groupId, String artifactId,
124: String version, Map configuration) {
125: Plugin plugin = new Plugin();
126: plugin.setGroupId(groupId);
127: plugin.setArtifactId(artifactId);
128: plugin.setVersion(version);
129:
130: Xpp3Dom config = new Xpp3Dom("configuration");
131:
132: if (configuration != null) {
133: for (Iterator it = configuration.entrySet().iterator(); it
134: .hasNext();) {
135: Map.Entry entry = (Map.Entry) it.next();
136:
137: Xpp3Dom param = new Xpp3Dom(String.valueOf(entry
138: .getKey()));
139: param.setValue(String.valueOf(entry.getValue()));
140:
141: config.addChild(param);
142: }
143: }
144:
145: plugin.setConfiguration(config);
146:
147: return plugin;
148: }
149:
150: public void testShouldInheritOnePluginWithExecution() {
151: Plugin parent = new Plugin();
152: parent.setArtifactId("testArtifact");
153: parent.setGroupId("testGroup");
154: parent.setVersion("1.0");
155:
156: PluginExecution parentExecution = new PluginExecution();
157: parentExecution.setId("testExecution");
158:
159: parent.addExecution(parentExecution);
160:
161: Plugin child = new Plugin();
162: child.setArtifactId("testArtifact");
163: child.setGroupId("testGroup");
164: child.setVersion("1.0");
165:
166: ModelUtils.mergePluginDefinitions(child, parent, false);
167:
168: assertEquals(1, child.getExecutions().size());
169: }
170:
171: public void testShouldMergeInheritedPluginHavingExecutionWithLocalPlugin() {
172: Plugin parent = new Plugin();
173: parent.setArtifactId("testArtifact");
174: parent.setGroupId("testGroup");
175: parent.setVersion("1.0");
176:
177: PluginExecution parentExecution = new PluginExecution();
178: parentExecution.setId("testExecution");
179:
180: parent.addExecution(parentExecution);
181:
182: Plugin child = new Plugin();
183: child.setArtifactId("testArtifact");
184: child.setGroupId("testGroup");
185: child.setVersion("1.0");
186:
187: PluginExecution childExecution = new PluginExecution();
188: childExecution.setId("testExecution2");
189:
190: child.addExecution(childExecution);
191:
192: ModelUtils.mergePluginDefinitions(child, parent, false);
193:
194: assertEquals(2, child.getExecutions().size());
195: }
196:
197: public void testShouldMergeOnePluginWithInheritExecutionWithoutDuplicatingPluginInList() {
198: Plugin parent = new Plugin();
199: parent.setArtifactId("testArtifact");
200: parent.setGroupId("testGroup");
201: parent.setVersion("1.0");
202:
203: PluginExecution parentExecution = new PluginExecution();
204: parentExecution.setId("testExecution");
205:
206: parent.addExecution(parentExecution);
207:
208: Build parentContainer = new Build();
209: parentContainer.addPlugin(parent);
210:
211: Plugin child = new Plugin();
212: child.setArtifactId("testArtifact");
213: child.setGroupId("testGroup");
214: child.setVersion("1.0");
215:
216: Build childContainer = new Build();
217: childContainer.addPlugin(child);
218:
219: ModelUtils.mergePluginLists(childContainer, parentContainer,
220: true);
221:
222: List plugins = childContainer.getPlugins();
223:
224: assertEquals(1, plugins.size());
225:
226: Plugin plugin = (Plugin) plugins.get(0);
227:
228: assertEquals(1, plugin.getExecutions().size());
229: }
230:
231: public void testShouldMergePluginWithDifferentExecutionFromParentWithoutDuplicatingPluginInList() {
232: Plugin parent = new Plugin();
233: parent.setArtifactId("testArtifact");
234: parent.setGroupId("testGroup");
235: parent.setVersion("1.0");
236:
237: PluginExecution parentExecution = new PluginExecution();
238: parentExecution.setId("testExecution");
239:
240: parent.addExecution(parentExecution);
241:
242: Build parentContainer = new Build();
243: parentContainer.addPlugin(parent);
244:
245: Plugin child = new Plugin();
246: child.setArtifactId("testArtifact");
247: child.setGroupId("testGroup");
248: child.setVersion("1.0");
249:
250: PluginExecution childExecution = new PluginExecution();
251: childExecution.setId("testExecution2");
252:
253: child.addExecution(childExecution);
254:
255: Build childContainer = new Build();
256: childContainer.addPlugin(child);
257:
258: ModelUtils.mergePluginLists(childContainer, parentContainer,
259: true);
260:
261: List plugins = childContainer.getPlugins();
262:
263: assertEquals(1, plugins.size());
264:
265: Plugin plugin = (Plugin) plugins.get(0);
266:
267: assertEquals(2, plugin.getExecutions().size());
268: }
269:
270: public void testShouldNOTMergeInheritedPluginHavingInheritEqualFalse() {
271: Plugin parent = new Plugin();
272: parent.setArtifactId("testArtifact");
273: parent.setGroupId("testGroup");
274: parent.setVersion("1.0");
275: parent.setInherited("false");
276:
277: PluginExecution parentExecution = new PluginExecution();
278: parentExecution.setId("testExecution");
279:
280: parent.addExecution(parentExecution);
281:
282: Plugin child = new Plugin();
283: child.setArtifactId("testArtifact");
284: child.setGroupId("testGroup");
285: child.setVersion("1.0");
286:
287: ModelUtils.mergePluginDefinitions(child, parent, true);
288:
289: assertEquals(0, child.getExecutions().size());
290: }
291:
292: /**
293: * Verifies MNG-1499: The order of the merged list should be the plugins specified by the parent followed by the
294: * child list.
295: */
296: public void testShouldKeepOriginalPluginOrdering() {
297: Plugin parentPlugin1 = new Plugin();
298: parentPlugin1.setArtifactId("testArtifact");
299: parentPlugin1.setGroupId("zzz"); // This will put this plugin last in the sorted map
300: parentPlugin1.setVersion("1.0");
301:
302: PluginExecution parentExecution1 = new PluginExecution();
303: parentExecution1.setId("testExecution");
304:
305: parentPlugin1.addExecution(parentExecution1);
306:
307: Plugin parentPlugin2 = new Plugin();
308: parentPlugin2.setArtifactId("testArtifact");
309: parentPlugin2.setGroupId("yyy");
310: parentPlugin2.setVersion("1.0");
311:
312: PluginExecution parentExecution2 = new PluginExecution();
313: parentExecution2.setId("testExecution");
314:
315: parentPlugin2.addExecution(parentExecution2);
316:
317: PluginContainer parentContainer = new PluginContainer();
318: parentContainer.addPlugin(parentPlugin1);
319: parentContainer.addPlugin(parentPlugin2);
320:
321: Plugin childPlugin1 = new Plugin();
322: childPlugin1.setArtifactId("testArtifact");
323: childPlugin1.setGroupId("bbb");
324: childPlugin1.setVersion("1.0");
325:
326: PluginExecution childExecution1 = new PluginExecution();
327: childExecution1.setId("testExecution");
328:
329: childPlugin1.addExecution(childExecution1);
330:
331: Plugin childPlugin2 = new Plugin();
332: childPlugin2.setArtifactId("testArtifact");
333: childPlugin2.setGroupId("aaa");
334: childPlugin2.setVersion("1.0");
335:
336: PluginExecution childExecution2 = new PluginExecution();
337: childExecution2.setId("testExecution");
338:
339: childPlugin2.addExecution(childExecution2);
340:
341: PluginContainer childContainer = new PluginContainer();
342: childContainer.addPlugin(childPlugin1);
343: childContainer.addPlugin(childPlugin2);
344:
345: ModelUtils.mergePluginLists(childContainer, parentContainer,
346: true);
347:
348: assertEquals(4, childContainer.getPlugins().size());
349: assertSame(parentPlugin1, childContainer.getPlugins().get(0));
350: assertSame(parentPlugin2, childContainer.getPlugins().get(1));
351: assertSame(childPlugin1, childContainer.getPlugins().get(2));
352: assertSame(childPlugin2, childContainer.getPlugins().get(3));
353: }
354:
355: /**
356: * Verifies MNG-1499: The ordering of plugin executions should also be in the specified order.
357: */
358: public void testShouldKeepOriginalPluginExecutionOrdering() {
359: Plugin parent = new Plugin();
360: parent.setArtifactId("testArtifact");
361: parent.setGroupId("testGroup");
362: parent.setVersion("1.0");
363:
364: PluginExecution parentExecution1 = new PluginExecution();
365: parentExecution1.setId("zzz"); // Will show up last in the sorted map
366: PluginExecution parentExecution2 = new PluginExecution();
367: parentExecution2.setId("yyy"); // Will show up last in the sorted map
368:
369: parent.addExecution(parentExecution1);
370: parent.addExecution(parentExecution2);
371:
372: // this block verifies MNG-1703
373: Dependency dep = new Dependency();
374: dep.setGroupId("depGroupId");
375: dep.setArtifactId("depArtifactId");
376: dep.setVersion("depVersion");
377: parent.setDependencies(Collections.singletonList(dep));
378:
379: Plugin child = new Plugin();
380: child.setArtifactId("testArtifact");
381: child.setGroupId("testGroup");
382: child.setVersion("1.0");
383:
384: PluginExecution childExecution1 = new PluginExecution();
385: childExecution1.setId("bbb");
386: PluginExecution childExecution2 = new PluginExecution();
387: childExecution2.setId("aaa");
388:
389: child.addExecution(childExecution1);
390: child.addExecution(childExecution2);
391:
392: ModelUtils.mergePluginDefinitions(child, parent, false);
393:
394: assertEquals(4, child.getExecutions().size());
395: assertSame(parentExecution1, child.getExecutions().get(0));
396: assertSame(parentExecution2, child.getExecutions().get(1));
397: assertSame(childExecution1, child.getExecutions().get(2));
398: assertSame(childExecution2, child.getExecutions().get(3));
399:
400: // this block prevents MNG-1703
401: assertEquals(1, child.getDependencies().size());
402: Dependency dep2 = (Dependency) child.getDependencies().get(0);
403: assertEquals(dep.getManagementKey(), dep2.getManagementKey());
404: }
405:
406: public void testShouldOverwritePluginConfigurationSubItemsByDefault()
407: throws XmlPullParserException, IOException {
408: String parentConfigStr = "<configuration><items><item>one</item><item>two</item></items></configuration>";
409: Xpp3Dom parentConfig = Xpp3DomBuilder.build(new StringReader(
410: parentConfigStr));
411:
412: Plugin parentPlugin = createPlugin("group", "artifact", "1",
413: null);
414: parentPlugin.setConfiguration(parentConfig);
415:
416: String childConfigStr = "<configuration><items><item>three</item></items></configuration>";
417: Xpp3Dom childConfig = Xpp3DomBuilder.build(new StringReader(
418: childConfigStr));
419:
420: Plugin childPlugin = createPlugin("group", "artifact", "1",
421: null);
422: childPlugin.setConfiguration(childConfig);
423:
424: ModelUtils.mergePluginDefinitions(childPlugin, parentPlugin,
425: true);
426:
427: Xpp3Dom result = (Xpp3Dom) childPlugin.getConfiguration();
428: Xpp3Dom items = result.getChild("items");
429:
430: assertEquals(1, items.getChildCount());
431:
432: Xpp3Dom item = items.getChild(0);
433: assertEquals("three", item.getValue());
434: }
435:
436: public void testShouldMergePluginConfigurationSubItemsWithMergeAttributeSet()
437: throws XmlPullParserException, IOException {
438: String parentConfigStr = "<configuration><items><item>one</item><item>two</item></items></configuration>";
439: Xpp3Dom parentConfig = Xpp3DomBuilder.build(new StringReader(
440: parentConfigStr));
441:
442: Plugin parentPlugin = createPlugin("group", "artifact", "1",
443: null);
444: parentPlugin.setConfiguration(parentConfig);
445:
446: String childConfigStr = "<configuration><items combine.children=\"append\"><item>three</item></items></configuration>";
447: Xpp3Dom childConfig = Xpp3DomBuilder.build(new StringReader(
448: childConfigStr));
449:
450: Plugin childPlugin = createPlugin("group", "artifact", "1",
451: null);
452: childPlugin.setConfiguration(childConfig);
453:
454: ModelUtils.mergePluginDefinitions(childPlugin, parentPlugin,
455: true);
456:
457: Xpp3Dom result = (Xpp3Dom) childPlugin.getConfiguration();
458: Xpp3Dom items = result.getChild("items");
459:
460: assertEquals(3, items.getChildCount());
461:
462: Xpp3Dom[] item = items.getChildren();
463:
464: assertEquals("one", item[0].getValue());
465: assertEquals("two", item[1].getValue());
466: assertEquals("three", item[2].getValue());
467: }
468: }
|