View Javadoc
1   package org.apache.maven.it;
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 org.apache.maven.it.util.ResourceExtractor;
23  import org.eclipse.jetty.server.Handler;
24  import org.eclipse.jetty.server.NetworkConnector;
25  import org.eclipse.jetty.server.Request;
26  import org.eclipse.jetty.server.Server;
27  import org.eclipse.jetty.server.handler.AbstractHandler;
28  import org.eclipse.jetty.server.handler.HandlerList;
29  
30  import javax.servlet.http.HttpServletRequest;
31  import javax.servlet.http.HttpServletResponse;
32  import java.io.File;
33  import java.util.Deque;
34  import java.util.concurrent.ConcurrentLinkedDeque;
35  
36  import static org.hamcrest.CoreMatchers.hasItem;
37  import static org.hamcrest.MatcherAssert.assertThat;
38  
39  /**
40   * This is a test set for <a href="https://issues.apache.org/jira/browse/MNG-4781">MNG-4781</a>.
41   *
42   * @author Benjamin Bentmann
43   */
44  public class MavenITmng4781DeploymentToNexusStagingRepoTest
45      extends AbstractMavenIntegrationTestCase
46  {
47      private Server server;
48  
49      private int port;
50  
51      private final Deque<String> requestedUris = new ConcurrentLinkedDeque<>();
52  
53      private final Deque<String> deployedUris = new ConcurrentLinkedDeque<>();
54  
55      public MavenITmng4781DeploymentToNexusStagingRepoTest()
56      {
57          super( "[2.0.3,)" );
58      }
59  
60      public void setUp()
61          throws Exception
62      {
63          Handler repoHandler = new AbstractHandler()
64          {
65              private volatile boolean putSeen;
66  
67              @Override
68              public void handle( String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response )
69              {
70                  System.out.println( "Handling " + request.getMethod() + " " + request.getRequestURL() );
71  
72                  if ( "PUT".equalsIgnoreCase( request.getMethod() ) )
73                  {
74                      response.setStatus( HttpServletResponse.SC_CREATED );
75                      deployedUris.add( request.getRequestURI() );
76                      putSeen = true;
77                  }
78                  else if ( !putSeen )
79                  {
80                      response.setStatus( HttpServletResponse.SC_BAD_REQUEST );
81                  }
82                  else
83                  {
84                      response.setStatus( HttpServletResponse.SC_NOT_FOUND );
85                      requestedUris.add( request.getRequestURI() );
86                  }
87  
88                  ( (Request) request ).setHandled( true );
89              }
90          };
91  
92          HandlerList handlerList = new HandlerList();
93          handlerList.addHandler( repoHandler );
94  
95          server = new Server( 0 );
96          server.setHandler( handlerList );
97          server.start();
98          if ( server.isFailed() )
99          {
100             fail( "Couldn't bind the server socket to a free port!" );
101         }
102         port = ( (NetworkConnector) server.getConnectors()[0] ).getLocalPort();
103         System.out.println( "Bound server socket to the port " + port );
104     }
105 
106     protected void tearDown()
107         throws Exception
108     {
109         if ( server != null )
110         {
111             server.stop();
112             server.join();
113         }
114 
115         requestedUris.clear();
116         deployedUris.clear();
117     }
118 
119     /**
120      * Verify that deployment to a Nexus-like staging repository works. The subtle difference compared to an ordinary
121      * HTTP/WebDAV server is that those staging repos yield a HTTP 400 (and not 404) for every GET request until a
122      * PUT request is made (which initializes the staging repo). The bottom line is that remote metadata must not be
123      * requested before the first artifact is deployed.
124      *
125      * @throws Exception in case of failure
126      */
127     public void testit()
128         throws Exception
129     {
130         File testDir = ResourceExtractor.simpleExtractResources( getClass(), "/mng-4781" );
131 
132         Verifier verifier = newVerifier( testDir.getAbsolutePath() );
133         verifier.setAutoclean( false );
134         verifier.addCliOption( "-DdeploymentPort=" + port );
135         verifier.executeGoal( "validate" );
136         verifier.verifyErrorFreeLog();
137         verifier.resetStreams();
138 
139         assertThat( deployedUris, hasItem( "/repo/org/apache/maven/its/mng4781/release/1.0/release-1.0.jar" ) );
140         assertThat( deployedUris, hasItem( "/repo/org/apache/maven/its/mng4781/release/1.0/release-1.0.pom" ) );
141         assertThat( deployedUris, hasItem( "/repo/org/apache/maven/its/mng4781/release/maven-metadata.xml" ) );
142         assertThat( requestedUris, hasItem( "/repo/org/apache/maven/its/mng4781/release/maven-metadata.xml" ) );
143     }
144 }