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.plugins.dependency;
20  
21  import java.io.File;
22  import java.net.InetAddress;
23  import java.nio.file.Path;
24  import java.nio.file.Paths;
25  import java.util.Collections;
26  
27  import org.apache.maven.artifact.repository.ArtifactRepository;
28  import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
29  import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
30  import org.apache.maven.execution.MavenSession;
31  import org.apache.maven.plugin.LegacySupport;
32  import org.apache.maven.plugin.MojoFailureException;
33  import org.apache.maven.plugins.dependency.testUtils.stubs.DependencyProjectStub;
34  import org.apache.maven.project.MavenProject;
35  import org.apache.maven.settings.Server;
36  import org.apache.maven.settings.Settings;
37  import org.eclipse.jetty.security.ConstraintMapping;
38  import org.eclipse.jetty.security.ConstraintSecurityHandler;
39  import org.eclipse.jetty.security.HashLoginService;
40  import org.eclipse.jetty.security.LoginService;
41  import org.eclipse.jetty.security.authentication.BasicAuthenticator;
42  import org.eclipse.jetty.server.ServerConnector;
43  import org.eclipse.jetty.server.handler.ContextHandler;
44  import org.eclipse.jetty.server.handler.ResourceHandler;
45  import org.eclipse.jetty.util.security.Constraint;
46  
47  public class TestGetMojo extends AbstractDependencyMojoTestCase {
48      private GetMojo mojo;
49  
50      protected void setUp() throws Exception {
51          // required for mojo lookups to work
52          super.setUp("markers", false);
53          MavenProject project = new DependencyProjectStub();
54          getContainer().addComponent(project, MavenProject.class.getName());
55  
56          MavenSession session = newMavenSession(project);
57          getContainer().addComponent(session, MavenSession.class.getName());
58  
59          File testPom = new File(getBasedir(), "target/test-classes/unit/get-test/plugin-config.xml");
60          mojo = (GetMojo) lookupMojo("get", testPom);
61  
62          assertNotNull(mojo);
63  
64          LegacySupport legacySupport = lookup(LegacySupport.class);
65          Settings settings = session.getSettings();
66          Server server = new Server();
67          server.setId("myserver");
68          server.setUsername("foo");
69          server.setPassword("bar");
70          settings.addServer(server);
71          legacySupport.setSession(session);
72  
73          installLocalRepository(legacySupport);
74  
75          setVariableValueToObject(mojo, "session", legacySupport.getSession());
76      }
77  
78      /**
79       * Test transitive parameter
80       *
81       * @throws Exception in case of errors
82       */
83      public void testTransitive() throws Exception {
84          // Set properties, transitive = default value = true
85          setVariableValueToObject(mojo, "transitive", Boolean.FALSE);
86          setVariableValueToObject(mojo, "remoteRepositories", "central::default::https://repo.maven.apache.org/maven2");
87          mojo.setGroupId("org.apache.maven");
88          mojo.setArtifactId("maven-model");
89          mojo.setVersion("2.0.9");
90  
91          mojo.execute();
92  
93          // Set properties, transitive = false
94          setVariableValueToObject(mojo, "transitive", Boolean.FALSE);
95          mojo.execute();
96      }
97  
98      /**
99       * Test remote repositories parameter
100      *
101      * @throws Exception in case of errors
102      */
103     public void testRemoteRepositories() throws Exception {
104         setVariableValueToObject(
105                 mojo,
106                 "remoteRepositories",
107                 "central::default::https://repo.maven.apache.org/maven2,"
108                         + "central::::https://repo.maven.apache.org/maven2," + "https://repo.maven.apache.org/maven2");
109         mojo.setGroupId("org.apache.maven");
110         mojo.setArtifactId("maven-model");
111         mojo.setVersion("2.0.9");
112 
113         mojo.execute();
114     }
115 
116     /**
117      * Test remote repositories parameter with basic authentication
118      *
119      * @throws Exception in case of errors
120      */
121     public void testRemoteRepositoriesAuthentication() throws Exception {
122         org.eclipse.jetty.server.Server server = createServer();
123         try {
124             server.start();
125             ServerConnector serverConnector = (ServerConnector) server.getConnectors()[0];
126             String url = "http://"
127                     + (serverConnector.getHost() == null
128                             ? InetAddress.getLoopbackAddress().getHostName()
129                             : serverConnector.getHost());
130             url = url + ":" + serverConnector.getLocalPort() + "/maven";
131 
132             setVariableValueToObject(mojo, "remoteRepositories", "myserver::default::" + url);
133             mojo.setGroupId("test");
134             mojo.setArtifactId("test");
135             mojo.setVersion("1.0");
136 
137             mojo.execute();
138         } finally {
139             server.stop();
140         }
141     }
142 
143     /**
144      * Test parsing of the remote repositories parameter
145      *
146      * @throws Exception in case of errors
147      */
148     public void testParseRepository() throws Exception {
149         ArtifactRepositoryPolicy policy = null;
150         ArtifactRepository repo =
151                 mojo.parseRepository("central::default::https://repo.maven.apache.org/maven2", policy);
152         assertEquals("central", repo.getId());
153         assertEquals(DefaultRepositoryLayout.class, repo.getLayout().getClass());
154         assertEquals("https://repo.maven.apache.org/maven2", repo.getUrl());
155 
156         try {
157             repo = mojo.parseRepository("central::legacy::https://repo.maven.apache.org/maven2", policy);
158             fail("Exception expected: legacy repository not supported anymore");
159         } catch (MojoFailureException e) {
160         }
161 
162         repo = mojo.parseRepository("central::::https://repo.maven.apache.org/maven2", policy);
163         assertEquals("central", repo.getId());
164         assertEquals(DefaultRepositoryLayout.class, repo.getLayout().getClass());
165         assertEquals("https://repo.maven.apache.org/maven2", repo.getUrl());
166 
167         repo = mojo.parseRepository("https://repo.maven.apache.org/maven2", policy);
168         assertEquals("temp", repo.getId());
169         assertEquals(DefaultRepositoryLayout.class, repo.getLayout().getClass());
170         assertEquals("https://repo.maven.apache.org/maven2", repo.getUrl());
171 
172         try {
173             mojo.parseRepository("::::https://repo.maven.apache.org/maven2", policy);
174             fail("Exception expected");
175         } catch (MojoFailureException e) {
176             // expected
177         }
178 
179         try {
180             mojo.parseRepository("central::https://repo.maven.apache.org/maven2", policy);
181             fail("Exception expected");
182         } catch (MojoFailureException e) {
183             // expected
184         }
185     }
186 
187     private ContextHandler createContextHandler() {
188         ResourceHandler resourceHandler = new ResourceHandler();
189         Path resourceDirectory = Paths.get("src", "test", "resources", "unit", "get-test", "repository");
190         resourceHandler.setResourceBase(resourceDirectory.toString());
191         resourceHandler.setDirectoriesListed(true);
192 
193         ContextHandler contextHandler = new ContextHandler("/maven");
194         contextHandler.setHandler(resourceHandler);
195         return contextHandler;
196     }
197 
198     private org.eclipse.jetty.server.Server createServer() {
199         org.eclipse.jetty.server.Server server = new org.eclipse.jetty.server.Server(0);
200         server.setStopAtShutdown(true);
201 
202         LoginService loginService =
203                 new HashLoginService("myrealm", "src/test/resources/unit/get-test/realm.properties");
204         server.addBean(loginService);
205 
206         ConstraintSecurityHandler security = new ConstraintSecurityHandler();
207         server.setHandler(security);
208 
209         Constraint constraint = new Constraint();
210         constraint.setName("auth");
211         constraint.setAuthenticate(true);
212         constraint.setRoles(new String[] {"userrole"});
213 
214         ConstraintMapping mapping = new ConstraintMapping();
215         mapping.setPathSpec("/*");
216         mapping.setConstraint(constraint);
217 
218         security.setConstraintMappings(Collections.singletonList(mapping));
219         security.setAuthenticator(new BasicAuthenticator());
220         security.setLoginService(loginService);
221 
222         ContextHandler contextHandler = createContextHandler();
223         contextHandler.setServer(server);
224 
225         security.setHandler(contextHandler);
226         server.setHandler(security);
227         return server;
228     }
229 }