View Javadoc
1   package org.apache.maven.plugins.dependency;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *  http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import java.io.File;
23  import java.net.InetAddress;
24  import java.nio.file.Path;
25  import java.nio.file.Paths;
26  import java.util.Collections;
27  
28  import org.apache.maven.artifact.repository.ArtifactRepository;
29  import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
30  import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
31  import org.apache.maven.execution.MavenSession;
32  import org.apache.maven.plugin.LegacySupport;
33  import org.apache.maven.plugin.MojoFailureException;
34  import org.apache.maven.plugin.testing.stubs.MavenProjectStub;
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
48      extends AbstractDependencyMojoTestCase
49  {
50      private GetMojo mojo;
51  
52      protected void setUp()
53          throws Exception
54      {
55          // required for mojo lookups to work
56          super.setUp( "markers", false );
57  
58          File testPom = new File( getBasedir(), "target/test-classes/unit/get-test/plugin-config.xml" );
59          mojo = (GetMojo) lookupMojo( "get", testPom );
60  
61          assertNotNull( mojo );
62  
63          LegacySupport legacySupport = lookup( LegacySupport.class );
64          MavenSession mavenSession = newMavenSession( new MavenProjectStub() );
65          Settings settings = mavenSession.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( mavenSession );
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()
84          throws Exception
85      {
86          // Set properties, transitive = default value = true
87          setVariableValueToObject( mojo, "transitive", Boolean.FALSE );
88          setVariableValueToObject( mojo, "remoteRepositories",
89                                    "central::default::https://repo.maven.apache.org/maven2" );
90          mojo.setGroupId( "org.apache.maven" );
91          mojo.setArtifactId( "maven-model" );
92          mojo.setVersion( "2.0.9" );
93  
94          mojo.execute();
95  
96          // Set properties, transitive = false
97          setVariableValueToObject( mojo, "transitive", Boolean.FALSE );
98          mojo.execute();
99      }
100 
101     /**
102      * Test remote repositories parameter
103      * 
104      * @throws Exception in case of errors
105      */
106     public void testRemoteRepositories()
107         throws Exception
108     {
109         setVariableValueToObject( mojo, "remoteRepositories", "central::default::https://repo.maven.apache.org/maven2,"
110             + "central::::https://repo.maven.apache.org/maven2," + "https://repo.maven.apache.org/maven2" );
111         mojo.setGroupId( "org.apache.maven" );
112         mojo.setArtifactId( "maven-model" );
113         mojo.setVersion( "2.0.9" );
114 
115         mojo.execute();
116     }
117 
118     /**
119      * Test remote repositories parameter with basic authentication
120      *
121      * @throws Exception in case of errors
122      */
123     public void testRemoteRepositoriesAuthentication()
124         throws Exception
125     {
126         org.eclipse.jetty.server.Server server = createServer();
127         try {
128             server.start();
129             ServerConnector serverConnector = (ServerConnector)server.getConnectors()[0];
130             String url = "http://" + (serverConnector.getHost() == null ?
131                     InetAddress.getLoopbackAddress().getHostName() : serverConnector.getHost());
132             url = url + ":" + serverConnector.getLocalPort() + "/maven";
133 
134             setVariableValueToObject( mojo, "remoteRepositories", "myserver::default::" + url );
135             mojo.setGroupId( "test" );
136             mojo.setArtifactId( "test" );
137             mojo.setVersion( "1.0" );
138 
139             mojo.execute();
140         }
141         finally
142         {
143             server.stop();
144         }
145     }
146 
147     /**
148      * Test parsing of the remote repositories parameter
149      * 
150      * @throws Exception in case of errors
151      */
152     public void testParseRepository()
153         throws Exception
154     {
155         ArtifactRepositoryPolicy policy = null;
156         ArtifactRepository repo = mojo.parseRepository( "central::default::https://repo.maven.apache.org/maven2", policy );
157         assertEquals( "central", repo.getId() );
158         assertEquals( DefaultRepositoryLayout.class, repo.getLayout().getClass() );
159         assertEquals( "https://repo.maven.apache.org/maven2", repo.getUrl() );
160 
161         try
162         {
163             repo = mojo.parseRepository( "central::legacy::https://repo.maven.apache.org/maven2", policy );
164             fail( "Exception expected: legacy repository not supported anymore" );
165         }
166         catch ( MojoFailureException e )
167         {
168         }
169 
170         repo = mojo.parseRepository( "central::::https://repo.maven.apache.org/maven2", policy );
171         assertEquals( "central", repo.getId() );
172         assertEquals( DefaultRepositoryLayout.class, repo.getLayout().getClass() );
173         assertEquals( "https://repo.maven.apache.org/maven2", repo.getUrl() );
174 
175         repo = mojo.parseRepository( "https://repo.maven.apache.org/maven2", policy );
176         assertEquals( "temp", repo.getId() );
177         assertEquals( DefaultRepositoryLayout.class, repo.getLayout().getClass() );
178         assertEquals( "https://repo.maven.apache.org/maven2", repo.getUrl() );
179 
180         try
181         {
182             mojo.parseRepository( "::::https://repo.maven.apache.org/maven2", policy );
183             fail( "Exception expected" );
184         }
185         catch ( MojoFailureException e )
186         {
187             // expected
188         }
189 
190         try
191         {
192             mojo.parseRepository( "central::https://repo.maven.apache.org/maven2", policy );
193             fail( "Exception expected" );
194         }
195         catch ( MojoFailureException e )
196         {
197             // expected
198         }
199     }
200 
201     private ContextHandler createContextHandler()
202     {
203         ResourceHandler resourceHandler = new ResourceHandler();
204         Path resourceDirectory = Paths.get( "src", "test", "resources", "unit", "get-test", "repository" );
205         resourceHandler.setResourceBase( resourceDirectory.toString() );
206         resourceHandler.setDirectoriesListed( true );
207 
208         ContextHandler contextHandler = new ContextHandler( "/maven" );
209         contextHandler.setHandler( resourceHandler );
210         return contextHandler;
211     }
212 
213     private org.eclipse.jetty.server.Server createServer()
214     {
215         org.eclipse.jetty.server.Server server = new org.eclipse.jetty.server.Server( 0 );
216         server.setStopAtShutdown( true );
217         
218         LoginService loginService = new HashLoginService( "myrealm",
219             "src/test/resources/unit/get-test/realm.properties" );
220         server.addBean( loginService );
221 
222         ConstraintSecurityHandler security = new ConstraintSecurityHandler();
223         server.setHandler( security );
224 
225         Constraint constraint = new Constraint();
226         constraint.setName( "auth" );
227         constraint.setAuthenticate( true );
228         constraint.setRoles(new String[]{ "userrole" });
229 
230         ConstraintMapping mapping = new ConstraintMapping();
231         mapping.setPathSpec( "/*" );
232         mapping.setConstraint( constraint );
233 
234         security.setConstraintMappings( Collections.singletonList( mapping ) );
235         security.setAuthenticator( new BasicAuthenticator() );
236         security.setLoginService( loginService );
237 
238         ContextHandler contextHandler = createContextHandler();
239         contextHandler.setServer( server );
240 
241         security.setHandler( contextHandler );
242         server.setHandler( security );
243         return server;
244     }
245 }