View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.doxia.tools;
20  
21  import javax.inject.Inject;
22  
23  import java.io.File;
24  import java.io.StringReader;
25  import java.io.Writer;
26  import java.util.ArrayList;
27  import java.util.Arrays;
28  import java.util.Collections;
29  import java.util.HashMap;
30  import java.util.Iterator;
31  import java.util.List;
32  import java.util.Locale;
33  import java.util.Properties;
34  
35  import org.apache.maven.doxia.site.LinkItem;
36  import org.apache.maven.doxia.site.SiteModel;
37  import org.apache.maven.doxia.site.Skin;
38  import org.apache.maven.doxia.site.io.xpp3.SiteXpp3Reader;
39  import org.apache.maven.doxia.site.io.xpp3.SiteXpp3Writer;
40  import org.apache.maven.doxia.tools.stubs.MavenProjectStub;
41  import org.apache.maven.doxia.tools.stubs.SiteToolMavenProjectStub;
42  import org.apache.maven.execution.DefaultMavenExecutionRequest;
43  import org.apache.maven.execution.MavenExecutionRequest;
44  import org.apache.maven.project.MavenProject;
45  import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
46  import org.codehaus.plexus.testing.PlexusTest;
47  import org.codehaus.plexus.util.FileUtils;
48  import org.codehaus.plexus.util.IOUtil;
49  import org.codehaus.plexus.util.WriterFactory;
50  import org.eclipse.aether.DefaultRepositorySystemSession;
51  import org.eclipse.aether.RepositorySystemSession;
52  import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
53  import org.eclipse.aether.repository.LocalRepository;
54  import org.junit.jupiter.api.Test;
55  
56  import static org.codehaus.plexus.testing.PlexusExtension.getTestFile;
57  import static org.junit.jupiter.api.Assertions.assertEquals;
58  import static org.junit.jupiter.api.Assertions.assertFalse;
59  import static org.junit.jupiter.api.Assertions.assertNotNull;
60  import static org.junit.jupiter.api.Assertions.assertNotSame;
61  import static org.junit.jupiter.api.Assertions.assertNull;
62  import static org.junit.jupiter.api.Assertions.assertThrows;
63  import static org.junit.jupiter.api.Assertions.assertTrue;
64  
65  /**
66   * @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
67   */
68  @SuppressWarnings("javadoc")
69  @PlexusTest
70  class SiteToolTest {
71  
72      @Inject
73      private DefaultSiteTool tool;
74  
75      /**
76       * @return the local repo directory.
77       *
78       * @throws Exception
79       */
80      protected File getLocalRepoDir() throws Exception {
81          return getTestFile("target/local-repo");
82      }
83  
84      protected RepositorySystemSession newRepoSession() throws Exception {
85          DefaultRepositorySystemSession repoSession = MavenRepositorySystemUtils.newSession();
86          repoSession.setLocalRepositoryManager(new SimpleLocalRepositoryManagerFactory()
87                  .newInstance(repoSession, new LocalRepository(getLocalRepoDir())));
88          return repoSession;
89      }
90  
91      /**
92       * @throws Exception
93       */
94      @Test
95      void getSkinArtifactFromRepository() throws Exception {
96          assertNotNull(tool);
97  
98          SiteToolMavenProjectStub project = new SiteToolMavenProjectStub("site-tool-test");
99          Skin skin = new Skin();
100         skin.setGroupId("org.apache.maven.skins");
101         skin.setArtifactId("maven-fluido-skin");
102         assertNotNull(
103                 tool.getSkinArtifactFromRepository(newRepoSession(), project.getRemoteProjectRepositories(), skin));
104     }
105 
106     private void checkGetRelativePathDirectory(SiteTool tool, String relative, String to, String from) {
107         assertEquals(relative, tool.getRelativePath(to, from));
108         assertEquals(relative, tool.getRelativePath(to + '/', from));
109         assertEquals(relative, tool.getRelativePath(to, from + '/'));
110         assertEquals(relative, tool.getRelativePath(to + '/', from + '/'));
111     }
112 
113     /**
114      * @throws Exception
115      */
116     @Test
117     @SuppressWarnings({"deprecation"})
118     void getRelativePath() throws Exception {
119         assertNotNull(tool);
120 
121         checkGetRelativePathDirectory(tool, "", "http://maven.apache.org", "http://maven.apache.org");
122 
123         checkGetRelativePathDirectory(
124                 tool,
125                 ".." + File.separator + "..",
126                 "http://maven.apache.org",
127                 "http://maven.apache.org/plugins/maven-site-plugin");
128 
129         checkGetRelativePathDirectory(
130                 tool,
131                 "plugins" + File.separator + "maven-site-plugin",
132                 "http://maven.apache.org/plugins/maven-site-plugin",
133                 "http://maven.apache.org");
134 
135         checkGetRelativePathDirectory(tool, "", "dav:https://maven.apache.org", "dav:https://maven.apache.org");
136 
137         checkGetRelativePathDirectory(
138                 tool,
139                 "plugins" + File.separator + "maven-site-plugin",
140                 "dav:http://maven.apache.org/plugins/maven-site-plugin",
141                 "dav:http://maven.apache.org");
142 
143         checkGetRelativePathDirectory(tool, "", "scm:svn:https://maven.apache.org", "scm:svn:https://maven.apache.org");
144 
145         checkGetRelativePathDirectory(
146                 tool,
147                 "plugins" + File.separator + "maven-site-plugin",
148                 "scm:svn:https://maven.apache.org/plugins/maven-site-plugin",
149                 "scm:svn:https://maven.apache.org");
150 
151         String to = "http://maven.apache.org/downloads.html";
152         String from = "http://maven.apache.org/index.html";
153 
154         // MSITE-600, MSHARED-203
155         to = "file:///tmp/bloop";
156         from = "scp://localhost:/tmp/blop";
157         assertEquals(tool.getRelativePath(to, from), to);
158 
159         // note: 'tmp' is the host here which is probably not the intention, but at least the result is correct
160         to = "file://tmp/bloop";
161         from = "scp://localhost:/tmp/blop";
162         assertEquals(to, tool.getRelativePath(to, from));
163 
164         // Tests between files as described in MIDEA-102
165         to = "C:/dev/voca/gateway/parser/gateway-parser.iml";
166         from = "C:/dev/voca/gateway/";
167         assertEquals(
168                 "parser" + File.separator + "gateway-parser.iml",
169                 tool.getRelativePath(to, from),
170                 "Child file using Windows drive letter");
171         to = "C:/foo/child";
172         from = "C:/foo/master";
173         assertEquals(
174                 ".." + File.separator + "child",
175                 tool.getRelativePath(to, from),
176                 "Sibling directory using Windows drive letter");
177         to = "/myproject/myproject-module1";
178         from = "/myproject/myproject";
179         assertEquals(
180                 ".." + File.separator + "myproject-module1",
181                 tool.getRelativePath(to, from),
182                 "Sibling directory with similar name");
183 
184         // Normalized paths as described in MSITE-284
185         assertEquals(
186                 ".." + File.separator + "project-module-1" + File.separator + "src" + File.separator + "site",
187                 tool.getRelativePath(
188                         "Z:\\dir\\project\\project-module-1\\src\\site",
189                         "Z:\\dir\\project\\project-module-1\\..\\project-parent"));
190         assertEquals(
191                 ".." + File.separator + ".." + File.separator + ".." + File.separator + "project-parent",
192                 tool.getRelativePath(
193                         "Z:\\dir\\project\\project-module-1\\..\\project-parent",
194                         "Z:\\dir\\project\\project-module-1\\src\\site"));
195 
196         assertEquals(".." + File.separator + "foo", tool.getRelativePath("../../foo/foo", "../../foo/bar"));
197     }
198 
199     /**
200      * @throws Exception
201      */
202     @Test
203     void getSiteDescriptorFromBasedir() throws Exception {
204         assertNotNull(tool);
205 
206         SiteToolMavenProjectStub project = new SiteToolMavenProjectStub("site-tool-test");
207         assertEquals(
208                 tool.getSiteDescriptor(new File(project.getBasedir(), "src/site"), SiteTool.DEFAULT_LOCALE)
209                         .toString(),
210                 project.getBasedir() + File.separator + "src" + File.separator + "site" + File.separator + "site.xml");
211         assertEquals(
212                 tool.getSiteDescriptor(new File(project.getBasedir(), "src/site"), Locale.ENGLISH)
213                         .toString(),
214                 project.getBasedir() + File.separator + "src" + File.separator + "site" + File.separator + "site.xml");
215         String siteDir = "src/blabla";
216         assertEquals(
217                 tool.getSiteDescriptor(new File(project.getBasedir(), siteDir), SiteTool.DEFAULT_LOCALE)
218                         .toString(),
219                 project.getBasedir() + File.separator + "src" + File.separator + "blabla" + File.separator
220                         + "site.xml");
221 
222         project = new SiteToolMavenProjectStub("site-tool-locales-test/full");
223         Locale bavarian = new Locale("de", "DE", "BY");
224         assertEquals(
225                 tool.getSiteDescriptor(new File(project.getBasedir(), "src/site"), SiteTool.DEFAULT_LOCALE)
226                         .toString(),
227                 project.getBasedir() + File.separator + "src" + File.separator + "site" + File.separator + "site.xml");
228         assertEquals(
229                 tool.getSiteDescriptor(new File(project.getBasedir(), "src/site"), bavarian)
230                         .toString(),
231                 project.getBasedir() + File.separator + "src" + File.separator + "site" + File.separator
232                         + "site_de_DE_BY.xml");
233         assertEquals(
234                 tool.getSiteDescriptor(new File(project.getBasedir(), "src/site"), Locale.GERMANY)
235                         .toString(),
236                 project.getBasedir() + File.separator + "src" + File.separator + "site" + File.separator + "site.xml");
237         assertEquals(
238                 tool.getSiteDescriptor(new File(project.getBasedir(), "src/site"), Locale.ENGLISH)
239                         .toString(),
240                 project.getBasedir() + File.separator + "src" + File.separator + "site" + File.separator + "site.xml");
241         assertEquals(
242                 tool.getSiteDescriptor(new File(project.getBasedir(), "src/site"), Locale.GERMAN)
243                         .toString(),
244                 project.getBasedir() + File.separator + "src" + File.separator + "site" + File.separator + "site.xml");
245 
246         project = new SiteToolMavenProjectStub("site-tool-locales-test/language_country");
247         assertEquals(
248                 tool.getSiteDescriptor(new File(project.getBasedir(), "src/site"), SiteTool.DEFAULT_LOCALE)
249                         .toString(),
250                 project.getBasedir() + File.separator + "src" + File.separator + "site" + File.separator + "site.xml");
251         assertEquals(
252                 tool.getSiteDescriptor(new File(project.getBasedir(), "src/site"), bavarian)
253                         .toString(),
254                 project.getBasedir() + File.separator + "src" + File.separator + "site" + File.separator
255                         + "site_de_DE.xml");
256         assertEquals(
257                 tool.getSiteDescriptor(new File(project.getBasedir(), "src/site"), Locale.GERMANY)
258                         .toString(),
259                 project.getBasedir() + File.separator + "src" + File.separator + "site" + File.separator
260                         + "site_de_DE.xml");
261         assertEquals(
262                 tool.getSiteDescriptor(new File(project.getBasedir(), "src/site"), Locale.ENGLISH)
263                         .toString(),
264                 project.getBasedir() + File.separator + "src" + File.separator + "site" + File.separator + "site.xml");
265         assertEquals(
266                 tool.getSiteDescriptor(new File(project.getBasedir(), "src/site"), Locale.GERMAN)
267                         .toString(),
268                 project.getBasedir() + File.separator + "src" + File.separator + "site" + File.separator + "site.xml");
269 
270         project = new SiteToolMavenProjectStub("site-tool-locales-test/language");
271         assertEquals(
272                 tool.getSiteDescriptor(new File(project.getBasedir(), "src/site"), SiteTool.DEFAULT_LOCALE)
273                         .toString(),
274                 project.getBasedir() + File.separator + "src" + File.separator + "site" + File.separator + "site.xml");
275         assertEquals(
276                 tool.getSiteDescriptor(new File(project.getBasedir(), "src/site"), bavarian)
277                         .toString(),
278                 project.getBasedir() + File.separator + "src" + File.separator + "site" + File.separator
279                         + "site_de.xml");
280         assertEquals(
281                 tool.getSiteDescriptor(new File(project.getBasedir(), "src/site"), Locale.GERMANY)
282                         .toString(),
283                 project.getBasedir() + File.separator + "src" + File.separator + "site" + File.separator
284                         + "site_de.xml");
285         assertEquals(
286                 tool.getSiteDescriptor(new File(project.getBasedir(), "src/site"), Locale.ENGLISH)
287                         .toString(),
288                 project.getBasedir() + File.separator + "src" + File.separator + "site" + File.separator + "site.xml");
289         assertEquals(
290                 tool.getSiteDescriptor(new File(project.getBasedir(), "src/site"), Locale.GERMAN)
291                         .toString(),
292                 project.getBasedir() + File.separator + "src" + File.separator + "site" + File.separator
293                         + "site_de.xml");
294     }
295 
296     /**
297      * @throws Exception
298      */
299     @Test
300     void getSiteDescriptorFromRepository() throws Exception {
301         assertNotNull(tool);
302 
303         SiteToolMavenProjectStub project = new SiteToolMavenProjectStub("site-tool-test");
304         project.setGroupId("org.apache.maven");
305         project.setArtifactId("maven-site");
306         project.setVersion("1.0");
307         String result = getLocalRepoDir() + File.separator + "org" + File.separator + "apache" + File.separator
308                 + "maven" + File.separator + "maven-site" + File.separator + "1.0" + File.separator
309                 + "maven-site-1.0-site.xml";
310 
311         assertEquals(
312                 tool.getSiteDescriptorFromRepository(
313                                 project,
314                                 newRepoSession(),
315                                 project.getRemoteProjectRepositories(),
316                                 SiteTool.DEFAULT_LOCALE)
317                         .toString(),
318                 result);
319     }
320 
321     /**
322      * @throws Exception
323      */
324     @Test
325     void getSiteModel() throws Exception {
326         assertNotNull(tool);
327 
328         SiteToolMavenProjectStub project = new SiteToolMavenProjectStub("site-tool-test");
329         List<MavenProject> reactorProjects = new ArrayList<>();
330 
331         // model from current local build
332         SiteModel model = tool.getSiteModel(
333                 new File(project.getBasedir(), "src/site"),
334                 SiteTool.DEFAULT_LOCALE,
335                 new DefaultMavenExecutionRequest(),
336                 project,
337                 reactorProjects,
338                 newRepoSession(),
339                 project.getRemoteProjectRepositories());
340         assertNotNull(model);
341         assertNotNull(model.getBannerLeft());
342         assertEquals("Maven Site", model.getBannerLeft().getName());
343         assertEquals(
344                 "http://maven.apache.org/images/apache-maven-project.png",
345                 model.getBannerLeft().getImage().getSrc());
346         assertEquals("http://maven.apache.org/", model.getBannerLeft().getHref());
347         assertNotNull(model.getBannerRight());
348         assertNull(model.getBannerRight().getName());
349         assertEquals(
350                 "http://maven.apache.org/images/maven-small.gif",
351                 model.getBannerRight().getImage().getSrc());
352         assertNull(model.getBannerRight().getHref());
353 
354         // model from repo: https://repo1.maven.org/maven2/org/apache/maven/maven/3.8.6/maven-3.8.6-site.xml
355         project.setBasedir(null);
356         project.setGroupId("org.apache.maven");
357         project.setArtifactId("maven");
358         project.setVersion("3.8.6");
359         SiteModel modelFromRepo = tool.getSiteModel(
360                 null,
361                 SiteTool.DEFAULT_LOCALE,
362                 new DefaultMavenExecutionRequest(),
363                 project,
364                 reactorProjects,
365                 newRepoSession(),
366                 project.getRemoteProjectRepositories());
367         assertNotNull(modelFromRepo);
368         assertNotNull(modelFromRepo.getBannerLeft());
369         assertEquals("dummy", modelFromRepo.getBannerLeft().getName());
370         assertEquals(
371                 "https://maven.apache.org/images/apache-maven-project.png",
372                 modelFromRepo.getBannerLeft().getImage().getSrc());
373         assertEquals("https://maven.apache.org/", modelFromRepo.getBannerLeft().getHref());
374         assertNull(modelFromRepo.getBannerRight());
375     }
376 
377     /**
378      * @throws Exception
379      */
380     @Test
381     void getDefaultSiteModel() throws Exception {
382         assertNotNull(tool);
383 
384         SiteToolMavenProjectStub project = new SiteToolMavenProjectStub("no-site-test");
385         String siteDirectory = "src/site";
386         List<MavenProject> reactorProjects = new ArrayList<>();
387 
388         SiteModel model = tool.getSiteModel(
389                 new File(project.getBasedir(), siteDirectory),
390                 SiteTool.DEFAULT_LOCALE,
391                 new DefaultMavenExecutionRequest(),
392                 project,
393                 reactorProjects,
394                 newRepoSession(),
395                 project.getRemoteProjectRepositories());
396         assertNotNull(model);
397     }
398 
399     @Test
400     void getAvailableLocales() throws Exception {
401         assertEquals(Collections.singletonList(SiteTool.DEFAULT_LOCALE), tool.getSiteLocales("default"));
402 
403         assertEquals(
404                 Arrays.asList(SiteTool.DEFAULT_LOCALE, Locale.FRENCH, Locale.ITALIAN),
405                 tool.getSiteLocales("default,fr,it"));
406 
407         // by default, only DEFAULT_LOCALE
408         assertEquals(Collections.singletonList(SiteTool.DEFAULT_LOCALE), tool.getSiteLocales(""));
409     }
410 
411     @Test
412     void getInterpolatedSiteDescriptorContent() throws Exception {
413         assertNotNull(tool);
414 
415         File pomXmlFile = getTestFile("src/test/resources/unit/interpolated-site/pom.xml");
416         assertNotNull(pomXmlFile);
417         assertTrue(pomXmlFile.exists());
418 
419         File descriptorFile = getTestFile("src/test/resources/unit/interpolated-site/src/site/site.xml");
420         assertNotNull(descriptorFile);
421         assertTrue(descriptorFile.exists());
422 
423         String siteDescriptorContent = FileUtils.fileRead(descriptorFile);
424         assertNotNull(siteDescriptorContent);
425         assertTrue(siteDescriptorContent.contains("${project.name}"));
426         assertFalse(siteDescriptorContent.contains(
427                 "Interpolatesite &quot;quoted&quot; &amp; &apos;quoted&apos; &lt;sdf&gt;"));
428 
429         SiteToolMavenProjectStub project = new SiteToolMavenProjectStub("interpolated-site");
430         List<MavenProject> reactorProjects = Collections.<MavenProject>singletonList(project);
431 
432         siteDescriptorContent =
433                 tool.getInterpolatedSiteDescriptorContent(new HashMap<>(), project, siteDescriptorContent);
434         assertNotNull(siteDescriptorContent);
435         assertFalse(siteDescriptorContent.contains("${project.name}"));
436         assertTrue(siteDescriptorContent.contains(
437                 "Interpolatesite &quot;quoted&quot; &amp; &apos;quoted&apos; &lt;sdf&gt;"));
438 
439         SiteModel model = tool.getSiteModel(
440                 new File(project.getBasedir(), "src/site"),
441                 SiteTool.DEFAULT_LOCALE,
442                 project,
443                 reactorProjects,
444                 newRepoSession(),
445                 project.getRemoteProjectRepositories());
446         assertNotNull(model);
447 
448         assertEquals(
449                 "Test " + project.getName(),
450                 model.getBody().getMenus().get(0).getItems().get(1).getName());
451     }
452 
453     // MSHARED-217 -> DOXIATOOLS-34 -> DOXIASITETOOLS-118
454     @Test
455     void siteModelInheritanceAndInterpolation() throws Exception {
456         assertNotNull(tool);
457 
458         SiteToolMavenProjectStub parentProject = new SiteToolMavenProjectStub("interpolation-parent-test");
459         parentProject.setDistgributionManagementSiteUrl("dav+https://davs.codehaus.org/site");
460 
461         SiteToolMavenProjectStub childProject = new SiteToolMavenProjectStub("interpolation-child-test");
462         childProject.setParent(parentProject);
463         childProject.setDistgributionManagementSiteUrl("dav+https://davs.codehaus.org/site/child");
464         Properties effectiveProperties = new Properties();
465         effectiveProperties.putAll(parentProject.getProperties());
466         effectiveProperties.putAll(childProject.getProperties());
467         childProject.setProperties(effectiveProperties);
468 
469         List<MavenProject> reactorProjects = Collections.<MavenProject>singletonList(parentProject);
470         MavenExecutionRequest request = new DefaultMavenExecutionRequest();
471         Properties userProperties = new Properties();
472         userProperties.setProperty("userProp1", "from user properties");
473         userProperties.setProperty("my_property2", "from user properties");
474         request.setUserProperties(userProperties);
475         Properties systemProperties = new Properties();
476         systemProperties.setProperty("systemProp1", "from system properties");
477         systemProperties.setProperty("my_property3", "from system properties");
478         request.setSystemProperties(systemProperties);
479 
480         SiteModel model = tool.getSiteModel(
481                 new File(childProject.getBasedir(), "src/site"),
482                 SiteTool.DEFAULT_LOCALE,
483                 request,
484                 childProject,
485                 reactorProjects,
486                 newRepoSession(),
487                 childProject.getRemoteProjectRepositories());
488         assertNotNull(model);
489 
490         writeModel(model, "unit/interpolation-child-test/effective-site.xml");
491 
492         assertEquals("MSHARED-217 Child", model.getName());
493         // late (classical) interpolation
494         assertEquals(
495                 "project.artifactId = mshared-217-child", model.getBannerLeft().getName());
496         // early interpolation: DOXIASITETOOLS-158
497         assertEquals(
498                 "this.artifactId = mshared-217-parent", model.getBannerRight().getName());
499         // href rebase
500         assertEquals(
501                 "../../index.html",
502                 model.getBody().getBreadcrumbs().iterator().next().getHref());
503         Iterator<LinkItem> links = model.getBody().getLinks().iterator();
504         // late interpolation of pom content
505         assertEquals("project.name = MSHARED-217 Child", links.next().getName());
506         assertEquals("name = name property", links.next().getName());
507         // early interpolation: DOXIASITETOOLS-158
508         assertEquals("this.name = MSHARED-217 Parent", links.next().getName());
509 
510         // late interpolation of project properties
511         assertEquals("my_property = from child pom.xml", links.next().getName());
512         // must be overridden by user property
513         assertEquals("my_property2 = from user properties", links.next().getName());
514         // must not be overridden by system property
515         assertEquals("my_property3 = from parent pom.xml", links.next().getName());
516         // early interpolation of project properties: DOXIASITETOOLS-158
517         assertEquals("this.my_property = from parent pom.xml", links.next().getName());
518 
519         // Env Var interpolation
520         String envPath = links.next().getName();
521         assertTrue(envPath.startsWith("env.PATH = "));
522         assertFalse(envPath.contains("${"));
523         assertNotSame("env.PATH = PATH property from pom", envPath);
524 
525         // property overrides env
526         assertEquals("PATH = PATH property from pom", links.next().getName());
527 
528         // user properties
529         assertEquals("userProp1 = from user properties", links.next().getName());
530 
531         // system properties
532         assertEquals("systemProp1 = from system properties", links.next().getName());
533     }
534 
535     /**
536      * @throws Exception
537      */
538     @Test
539     void convertOldToNewSiteModel() throws Exception {
540         assertNotNull(tool);
541 
542         SiteToolMavenProjectStub project = new SiteToolMavenProjectStub("old-to-new-site-model-conversion-test");
543         List<MavenProject> reactorProjects = new ArrayList<MavenProject>();
544 
545         // model from current local build
546         SiteModel model = tool.getSiteModel(
547                 new File(project.getBasedir(), "src/site"),
548                 SiteTool.DEFAULT_LOCALE,
549                 new DefaultMavenExecutionRequest(),
550                 project,
551                 reactorProjects,
552                 newRepoSession(),
553                 project.getRemoteProjectRepositories());
554         assertNotNull(model);
555 
556         File descriptorFile =
557                 getTestFile("src/test/resources/unit/old-to-new-site-model-conversion-test/src/site/new-site.xml");
558         assertNotNull(descriptorFile);
559         assertTrue(descriptorFile.exists());
560 
561         String siteDescriptorContent = FileUtils.fileRead(descriptorFile);
562         SiteModel newModel = new SiteXpp3Reader().read(new StringReader(siteDescriptorContent));
563         assertNotNull(newModel);
564         assertEquals(newModel, model);
565     }
566 
567     @Test
568     void requireParent() throws Exception {
569         assertNotNull(tool);
570 
571         SiteToolMavenProjectStub project = new SiteToolMavenProjectStub("require-parent-test");
572         MavenProjectStub parentProject = new MavenProjectStub() {
573             @Override
574             public File getBasedir() {
575                 return null; // this should be a non reactor/local project
576             }
577         };
578         parentProject.setGroupId("org.apache.maven.shared.its");
579         parentProject.setArtifactId("mshared-217-parent");
580         parentProject.setVersion("1.0-SNAPSHOT");
581         project.setParent(parentProject);
582         List<MavenProject> reactorProjects = new ArrayList<MavenProject>();
583 
584         RepositorySystemSession repoSession = newRepoSession();
585         // coordinates for site descriptor: <groupId>:<artifactId>:xml:site:<version>
586         new SiteToolMavenProjectStub("require-parent-test");
587         org.eclipse.aether.artifact.Artifact parentArtifact = new org.eclipse.aether.artifact.DefaultArtifact(
588                 "org.apache.maven.shared.its:mshared-217-parent:xml:site:1.0-SNAPSHOT");
589         File parentArtifactInRepoFile = new File(
590                 repoSession.getLocalRepository().getBasedir(),
591                 repoSession.getLocalRepositoryManager().getPathForLocalArtifact(parentArtifact));
592 
593         // model from current local build
594         assertThrows(
595                 SiteToolException.class,
596                 () -> tool.getSiteModel(
597                         new File(project.getBasedir(), "src/site"),
598                         SiteTool.DEFAULT_LOCALE,
599                         new DefaultMavenExecutionRequest(),
600                         project,
601                         reactorProjects,
602                         repoSession,
603                         project.getRemoteProjectRepositories()));
604 
605         // now copy parent site descriptor to repo
606         FileUtils.copyFile(
607                 getTestFile("src/test/resources/unit/require-parent-test/parent-site.xml"), parentArtifactInRepoFile);
608         try {
609             tool.getSiteModel(
610                     new File(project.getBasedir(), "src/site"),
611                     SiteTool.DEFAULT_LOCALE,
612                     new DefaultMavenExecutionRequest(),
613                     project,
614                     reactorProjects,
615                     repoSession,
616                     project.getRemoteProjectRepositories());
617         } finally {
618             parentArtifactInRepoFile.delete();
619         }
620     }
621 
622     private void writeModel(SiteModel model, String to) throws Exception {
623         Writer writer = WriterFactory.newXmlWriter(getTestFile("target/test-classes/" + to));
624         try {
625             new SiteXpp3Writer().write(writer, model);
626         } finally {
627             IOUtil.close(writer);
628         }
629     }
630 }