View Javadoc

1   package org.apache.maven.index;
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.io.FileInputStream;
24  import java.util.HashSet;
25  import java.util.Properties;
26  import java.util.Set;
27  
28  import junit.framework.Assert;
29  
30  import org.apache.maven.index.NexusIndexer;
31  import org.apache.maven.index.context.IndexingContext;
32  import org.apache.maven.index.packer.IndexPacker;
33  import org.apache.maven.index.packer.IndexPackingRequest;
34  import org.codehaus.plexus.util.FileUtils;
35  
36  public class Nexus1911IncrementalTest
37      extends AbstractIndexCreatorHelper
38  {
39      NexusIndexer indexer;
40  
41      IndexingContext context;
42  
43      IndexingContext reindexedContext;
44  
45      IndexPacker packer;
46  
47      File indexDir;
48  
49      File indexPackDir;
50  
51      File reposTargetDir;
52  
53      @Override
54      protected void setUp()
55          throws Exception
56      {
57          super.setUp();
58  
59          indexer = lookup( NexusIndexer.class );
60          packer = lookup( IndexPacker.class );
61  
62          indexDir = super.getDirectory( "index/nexus-1911" );
63          indexPackDir = indexDir; //super.getDirectory( "index/nexus-1911-pack" );
64  
65          File reposSrcDir = new File( getBasedir(), "src/test/nexus-1911" );
66          this.reposTargetDir = super.getDirectory( "repos/nexus-1911" );
67  
68          FileUtils.copyDirectoryStructure( reposSrcDir, reposTargetDir );
69  
70          File repo = new File( reposTargetDir, "repo" );
71          repo.mkdirs();
72          reindexedContext =
73              context = indexer.addIndexingContext( "test", "test", repo, indexDir, null, null, DEFAULT_CREATORS );
74          indexer.scan( context );
75      }
76  
77      @Override
78      protected void tearDown()
79          throws Exception
80      {
81          indexer.removeIndexingContext( context, true );
82          super.deleteDirectory( this.reposTargetDir );
83          super.deleteDirectory( this.indexDir );
84          super.deleteDirectory( this.indexPackDir );
85          super.tearDown();
86      }
87  
88      public void testNoIncremental()
89          throws Exception
90      {
91          IndexPackingRequest request = new IndexPackingRequest( context, indexPackDir );
92          request.setCreateIncrementalChunks( true );
93          packer.packIndex( request );
94  
95          Set<String> filenames = getFilenamesFromFiles( indexPackDir.listFiles() );
96          Properties props = getPropertiesFromFiles( indexPackDir.listFiles() );
97  
98          Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".zip" ) );
99          Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".gz" ) );
100         Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".properties" ) );
101         Assert.assertFalse( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".1.gz" ) );
102         Assert.assertFalse( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".2.gz" ) );
103 
104         Assert.assertNotNull( props );
105 
106         Assert.assertNull( props.getProperty( IndexingContext.INDEX_CHUNK_PREFIX + "0" ) );
107         Assert.assertNull( props.getProperty( IndexingContext.INDEX_CHUNK_PREFIX + "1" ) );
108         Assert.assertNull( props.getProperty( IndexingContext.INDEX_CHUNK_PREFIX + "2" ) );
109         Assert.assertNull( props.getProperty( IndexingContext.INDEX_CHUNK_PREFIX + "3" ) );
110         Assert.assertNull( props.getProperty( IndexingContext.INDEX_CHUNK_PREFIX + "4" ) );
111         Assert.assertEquals( props.getProperty( IndexingContext.INDEX_CHUNK_COUNTER ), "0" );
112         Assert.assertNotNull( props.getProperty( IndexingContext.INDEX_CHAIN_ID ) );
113     }
114 
115     public void test1Incremental()
116         throws Exception
117     {
118         IndexPackingRequest request = new IndexPackingRequest( context, indexPackDir );
119         request.setCreateIncrementalChunks( true );
120         packer.packIndex( request );
121 
122         copyRepoContentsAndReindex( new File( getBasedir(), "src/test/nexus-1911/repo-inc-1" ), request );
123 
124         Set<String> filenames = getFilenamesFromFiles( indexPackDir.listFiles() );
125         Properties props = getPropertiesFromFiles( indexPackDir.listFiles() );
126 
127         Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".zip" ) );
128         Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".gz" ) );
129         Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".properties" ) );
130         Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".1.gz" ) );
131         Assert.assertFalse( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".2.gz" ) );
132 
133         Assert.assertNotNull( props );
134 
135         Assert.assertEquals( props.getProperty( IndexingContext.INDEX_CHUNK_PREFIX + "0" ), "1" );
136         Assert.assertNull( props.getProperty( IndexingContext.INDEX_CHUNK_PREFIX + "1" ) );
137         Assert.assertNull( props.getProperty( IndexingContext.INDEX_CHUNK_PREFIX + "2" ) );
138         Assert.assertNull( props.getProperty( IndexingContext.INDEX_CHUNK_PREFIX + "3" ) );
139         Assert.assertNull( props.getProperty( IndexingContext.INDEX_CHUNK_PREFIX + "4" ) );
140         Assert.assertEquals( props.getProperty( IndexingContext.INDEX_CHUNK_COUNTER ), "1" );
141         Assert.assertNotNull( props.getProperty( IndexingContext.INDEX_CHAIN_ID ) );
142     }
143 
144     public void test2Incremental()
145         throws Exception
146     {
147         IndexPackingRequest request = new IndexPackingRequest( context, indexPackDir );
148         request.setCreateIncrementalChunks( true );
149         packer.packIndex( request );
150 
151         copyRepoContentsAndReindex( new File( getBasedir(), "src/test/nexus-1911/repo-inc-1" ), request );
152         copyRepoContentsAndReindex( new File( getBasedir(), "src/test/nexus-1911/repo-inc-2" ), request );
153 
154         Set<String> filenames = getFilenamesFromFiles( indexPackDir.listFiles() );
155         Properties props = getPropertiesFromFiles( indexPackDir.listFiles() );
156 
157         Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".zip" ) );
158         Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".gz" ) );
159         Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".properties" ) );
160         Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".1.gz" ) );
161         Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".2.gz" ) );
162         Assert.assertFalse( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".3.gz" ) );
163 
164         Assert.assertNotNull( props );
165 
166         Assert.assertEquals( props.getProperty( IndexingContext.INDEX_CHUNK_PREFIX + "0" ), "2" );
167         Assert.assertEquals( props.getProperty( IndexingContext.INDEX_CHUNK_PREFIX + "1" ), "1" );
168         Assert.assertNull( props.getProperty( IndexingContext.INDEX_CHUNK_PREFIX + "2" ) );
169         Assert.assertNull( props.getProperty( IndexingContext.INDEX_CHUNK_PREFIX + "3" ) );
170         Assert.assertNull( props.getProperty( IndexingContext.INDEX_CHUNK_PREFIX + "4" ) );
171         Assert.assertEquals( props.getProperty( IndexingContext.INDEX_CHUNK_COUNTER ), "2" );
172         Assert.assertNotNull( props.getProperty( IndexingContext.INDEX_CHAIN_ID ) );
173     }
174 
175     public void test3Incremental()
176         throws Exception
177     {
178         IndexPackingRequest request = new IndexPackingRequest( context, indexPackDir );
179         request.setCreateIncrementalChunks( true );
180         packer.packIndex( request );
181 
182         copyRepoContentsAndReindex( new File( getBasedir(), "src/test/nexus-1911/repo-inc-1" ), request );
183         copyRepoContentsAndReindex( new File( getBasedir(), "src/test/nexus-1911/repo-inc-2" ), request );
184         copyRepoContentsAndReindex( new File( getBasedir(), "src/test/nexus-1911/repo-inc-3" ), request );
185 
186         Set<String> filenames = getFilenamesFromFiles( indexPackDir.listFiles() );
187         Properties props = getPropertiesFromFiles( indexPackDir.listFiles() );
188 
189         Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".zip" ) );
190         Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".gz" ) );
191         Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".properties" ) );
192         Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".1.gz" ) );
193         Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".2.gz" ) );
194         Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".3.gz" ) );
195 
196         Assert.assertNotNull( props );
197 
198         Assert.assertEquals( props.getProperty( IndexingContext.INDEX_CHUNK_PREFIX + "0" ), "3" );
199         Assert.assertEquals( props.getProperty( IndexingContext.INDEX_CHUNK_PREFIX + "1" ), "2" );
200         Assert.assertEquals( props.getProperty( IndexingContext.INDEX_CHUNK_PREFIX + "2" ), "1" );
201         Assert.assertNull( props.getProperty( IndexingContext.INDEX_CHUNK_PREFIX + "3" ) );
202         Assert.assertNull( props.getProperty( IndexingContext.INDEX_CHUNK_PREFIX + "4" ) );
203         Assert.assertEquals( props.getProperty( IndexingContext.INDEX_CHUNK_COUNTER ), "3" );
204         Assert.assertNotNull( props.getProperty( IndexingContext.INDEX_CHAIN_ID ) );
205     }
206 
207     public void testMaxChunks()
208         throws Exception
209     {
210         IndexPackingRequest request = new IndexPackingRequest( context, indexPackDir );
211         request.setCreateIncrementalChunks( true );
212         request.setMaxIndexChunks( 3 );
213         packer.packIndex( request );
214 
215         copyRepoContentsAndReindex( new File( getBasedir(), "src/test/nexus-1911/repo-inc-1" ), request );
216         copyRepoContentsAndReindex( new File( getBasedir(), "src/test/nexus-1911/repo-inc-2" ), request );
217         copyRepoContentsAndReindex( new File( getBasedir(), "src/test/nexus-1911/repo-inc-3" ), request );
218         copyRepoContentsAndReindex( new File( getBasedir(), "src/test/nexus-1911/repo-inc-4" ), request );
219 
220         Set<String> filenames = getFilenamesFromFiles( indexPackDir.listFiles() );
221         Properties props = getPropertiesFromFiles( indexPackDir.listFiles() );
222 
223         Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".zip" ) );
224         Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".gz" ) );
225         Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".properties" ) );
226         Assert.assertFalse( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".1.gz" ) );
227         Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".2.gz" ) );
228         Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".3.gz" ) );
229         Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".4.gz" ) );
230 
231         Assert.assertNotNull( props );
232 
233         Assert.assertEquals( props.getProperty( IndexingContext.INDEX_CHUNK_PREFIX + "0" ), "4" );
234         Assert.assertEquals( props.getProperty( IndexingContext.INDEX_CHUNK_PREFIX + "1" ), "3" );
235         Assert.assertEquals( props.getProperty( IndexingContext.INDEX_CHUNK_PREFIX + "2" ), "2" );
236         Assert.assertNull( props.getProperty( IndexingContext.INDEX_CHUNK_PREFIX + "3" ) );
237         Assert.assertNull( props.getProperty( IndexingContext.INDEX_CHUNK_PREFIX + "4" ) );
238         Assert.assertEquals( props.getProperty( IndexingContext.INDEX_CHUNK_COUNTER ), "4" );
239         Assert.assertNotNull( props.getProperty( IndexingContext.INDEX_CHAIN_ID ) );
240     }
241 
242     private void copyRepoContentsAndReindex( File src, IndexPackingRequest request )
243         throws Exception
244     {
245         File reposTargetDir = new File( getBasedir(), "target/repos/nexus-1911/repo" );
246 
247         FileUtils.copyDirectoryStructure( src, reposTargetDir );
248 
249         // this was ALWAYS broken, if incremental reindex wanted, this has to be TRUE!!!
250         // TODO: fix this!
251         indexer.scan( reindexedContext, false );
252 
253         packer.packIndex( request );
254     }
255 
256     private Set<String> getFilenamesFromFiles( File[] files )
257     {
258         Set<String> filenames = new HashSet<String>();
259 
260         for ( int i = 0; i < files.length; i++ )
261         {
262             filenames.add( files[i].getName() );
263         }
264 
265         return filenames;
266     }
267 
268     private Properties getPropertiesFromFiles( File[] files )
269         throws Exception
270     {
271         Properties props = new Properties();
272         File propertyFile = null;
273 
274         for ( int i = 0; i < files.length; i++ )
275         {
276             if ( ( IndexingContext.INDEX_REMOTE_PROPERTIES_FILE ).equalsIgnoreCase( files[i].getName() ) )
277             {
278                 propertyFile = files[i];
279                 break;
280             }
281         }
282 
283         FileInputStream fis = null;
284 
285         try
286         {
287             fis = new FileInputStream( propertyFile );
288             props.load( fis );
289         }
290         finally
291         {
292             fis.close();
293         }
294 
295         return props;
296     }
297 }