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