]> source.dussan.org Git - archiva.git/blob
f806291c8d8267c601e9e67647bab0e71e9560e5
[archiva.git] /
1 package org.apache.archiva.metadata.repository.stats;
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.text.ParseException;
23 import java.util.ArrayList;
24 import java.util.Arrays;
25 import java.util.Collections;
26 import java.util.Date;
27 import java.util.LinkedHashMap;
28 import java.util.List;
29 import java.util.Map;
30
31 import junit.framework.TestCase;
32 import org.apache.archiva.metadata.repository.MetadataRepository;
33 import org.easymock.MockControl;
34
35 public class RepositoryStatisticsManagerTest
36     extends TestCase
37 {
38     private DefaultRepositoryStatisticsManager repositoryStatisticsManager;
39
40     private static final String TEST_REPO_ID = "test-repo";
41
42     private MockControl metadataRepositoryControl;
43
44     private MetadataRepository metadataRepository;
45
46     private static final String FIRST_TEST_SCAN = "20091201.123456.789";
47
48     private static final String SECOND_TEST_SCAN = "20091202.012345.678";
49
50     private Map<String, RepositoryStatistics> statsCreated = new LinkedHashMap<String, RepositoryStatistics>();
51
52     @Override
53     protected void setUp()
54         throws Exception
55     {
56         super.setUp();
57
58         repositoryStatisticsManager = new DefaultRepositoryStatisticsManager();
59
60         metadataRepositoryControl = MockControl.createControl( MetadataRepository.class );
61         metadataRepository = (MetadataRepository) metadataRepositoryControl.getMock();
62         repositoryStatisticsManager.setMetadataRepository( metadataRepository );
63     }
64
65     public void testGetLatestStats()
66         throws ParseException
67     {
68         Date endTime = new Date( RepositoryStatistics.SCAN_TIMESTAMP.parse( SECOND_TEST_SCAN ).getTime() + 60000 );
69
70         RepositoryStatistics stats = new RepositoryStatistics();
71         stats.setScanStartTime( RepositoryStatistics.SCAN_TIMESTAMP.parse( SECOND_TEST_SCAN ) );
72         stats.setScanEndTime( endTime );
73         stats.setTotalArtifactFileSize( 1314527915L );
74         stats.setNewFileCount( 123 );
75         stats.setTotalArtifactCount( 10386 );
76         stats.setTotalProjectCount( 2031 );
77         stats.setTotalGroupCount( 529 );
78         stats.setTotalFileCount( 56229 );
79
80         metadataRepositoryControl.expectAndReturn(
81             metadataRepository.getMetadataFacets( TEST_REPO_ID, RepositoryStatistics.FACET_ID ),
82             Arrays.asList( FIRST_TEST_SCAN, SECOND_TEST_SCAN ) );
83         metadataRepositoryControl.expectAndReturn(
84             metadataRepository.getMetadataFacet( TEST_REPO_ID, RepositoryStatistics.FACET_ID, SECOND_TEST_SCAN ),
85             stats );
86         metadataRepositoryControl.replay();
87
88         stats = repositoryStatisticsManager.getLastStatistics( TEST_REPO_ID );
89         assertNotNull( stats );
90         assertEquals( 1314527915L, stats.getTotalArtifactFileSize() );
91         assertEquals( 123, stats.getNewFileCount() );
92         assertEquals( 10386, stats.getTotalArtifactCount() );
93         assertEquals( 2031, stats.getTotalProjectCount() );
94         assertEquals( 529, stats.getTotalGroupCount() );
95         assertEquals( 56229, stats.getTotalFileCount() );
96         assertEquals( SECOND_TEST_SCAN, RepositoryStatistics.SCAN_TIMESTAMP.format( stats.getScanStartTime() ) );
97         assertEquals( SECOND_TEST_SCAN, stats.getName() );
98         assertEquals( endTime, stats.getScanEndTime() );
99
100         metadataRepositoryControl.verify();
101     }
102
103     public void testGetLatestStatsWhenEmpty()
104     {
105         metadataRepositoryControl.expectAndReturn(
106             metadataRepository.getMetadataFacets( TEST_REPO_ID, RepositoryStatistics.FACET_ID ),
107             Collections.emptyList() );
108         metadataRepositoryControl.replay();
109
110         RepositoryStatistics stats = repositoryStatisticsManager.getLastStatistics( TEST_REPO_ID );
111         assertNull( stats );
112
113         metadataRepositoryControl.verify();
114     }
115
116     public void testAddNewStats()
117     {
118         Date current = new Date();
119         Date startTime = new Date( current.getTime() - 12345 );
120
121         RepositoryStatistics stats = createTestStats( startTime, current );
122
123         metadataRepository.addMetadataFacet( TEST_REPO_ID, stats );
124         metadataRepositoryControl.expectAndReturn(
125             metadataRepository.getMetadataFacets( TEST_REPO_ID, RepositoryStatistics.FACET_ID ),
126             Arrays.asList( stats.getName() ) );
127         metadataRepositoryControl.expectAndReturn(
128             metadataRepository.getMetadataFacet( TEST_REPO_ID, RepositoryStatistics.FACET_ID, stats.getName() ),
129             stats );
130
131         metadataRepositoryControl.replay();
132
133         repositoryStatisticsManager.addStatisticsAfterScan( TEST_REPO_ID, stats );
134
135         stats = repositoryStatisticsManager.getLastStatistics( TEST_REPO_ID );
136         assertNotNull( stats );
137         assertEquals( 1400032000L, stats.getTotalArtifactFileSize() );
138         assertEquals( 45, stats.getNewFileCount() );
139         assertEquals( 10412, stats.getTotalArtifactCount() );
140         assertEquals( 2036, stats.getTotalProjectCount() );
141         assertEquals( 531, stats.getTotalGroupCount() );
142         assertEquals( 56345, stats.getTotalFileCount() );
143         assertEquals( current.getTime() - 12345, stats.getScanStartTime().getTime() );
144         assertEquals( current, stats.getScanEndTime() );
145
146         metadataRepositoryControl.verify();
147     }
148
149     public void testDeleteStats()
150     {
151         Date current = new Date();
152
153         Date startTime1 = new Date( current.getTime() - 12345 );
154         RepositoryStatistics stats1 = createTestStats( startTime1, new Date( current.getTime() - 6000 ) );
155         metadataRepository.addMetadataFacet( TEST_REPO_ID, stats1 );
156
157         Date startTime2 = new Date( current.getTime() - 3000 );
158         RepositoryStatistics stats2 = createTestStats( startTime2, current );
159         metadataRepository.addMetadataFacet( TEST_REPO_ID, stats2 );
160
161         metadataRepositoryControl.expectAndReturn(
162             metadataRepository.getMetadataFacets( TEST_REPO_ID, RepositoryStatistics.FACET_ID ),
163             Arrays.asList( stats1.getName(), stats2.getName() ) );
164         metadataRepositoryControl.expectAndReturn(
165             metadataRepository.getMetadataFacet( TEST_REPO_ID, RepositoryStatistics.FACET_ID, stats2.getName() ),
166             stats2 );
167
168         metadataRepository.removeMetadataFacets( TEST_REPO_ID, RepositoryStatistics.FACET_ID );
169
170         metadataRepositoryControl.expectAndReturn(
171             metadataRepository.getMetadataFacets( TEST_REPO_ID, RepositoryStatistics.FACET_ID ),
172             Collections.emptyList() );
173
174         metadataRepositoryControl.replay();
175
176         repositoryStatisticsManager.addStatisticsAfterScan( TEST_REPO_ID, stats1 );
177         repositoryStatisticsManager.addStatisticsAfterScan( TEST_REPO_ID, stats2 );
178
179         assertNotNull( repositoryStatisticsManager.getLastStatistics( TEST_REPO_ID ) );
180
181         repositoryStatisticsManager.deleteStatistics( TEST_REPO_ID );
182
183         assertNull( repositoryStatisticsManager.getLastStatistics( TEST_REPO_ID ) );
184
185         metadataRepositoryControl.verify();
186     }
187
188     public void testDeleteStatsWhenEmpty()
189     {
190         metadataRepositoryControl.expectAndReturn(
191             metadataRepository.getMetadataFacets( TEST_REPO_ID, RepositoryStatistics.FACET_ID ),
192             Collections.emptyList(), 2 );
193         metadataRepository.removeMetadataFacets( TEST_REPO_ID, RepositoryStatistics.FACET_ID );
194
195         metadataRepositoryControl.replay();
196
197         assertNull( repositoryStatisticsManager.getLastStatistics( TEST_REPO_ID ) );
198
199         repositoryStatisticsManager.deleteStatistics( TEST_REPO_ID );
200
201         assertNull( repositoryStatisticsManager.getLastStatistics( TEST_REPO_ID ) );
202
203         metadataRepositoryControl.verify();
204     }
205
206     public void testGetStatsRangeInside()
207     {
208         Date current = new Date();
209
210         addStats( new Date( current.getTime() - 12345 ), new Date( current.getTime() - 6000 ) );
211         addStats( new Date( current.getTime() - 3000 ), new Date( current.getTime() - 2000 ) );
212         addStats( new Date( current.getTime() - 1000 ), current );
213
214         ArrayList<String> keys = new ArrayList<String>( statsCreated.keySet() );
215         metadataRepositoryControl.expectAndReturn(
216             metadataRepository.getMetadataFacets( TEST_REPO_ID, RepositoryStatistics.FACET_ID ), keys );
217
218         // only match the middle one
219         String key = keys.get( 1 );
220         metadataRepositoryControl.expectAndReturn(
221             metadataRepository.getMetadataFacet( TEST_REPO_ID, RepositoryStatistics.FACET_ID, key ),
222             statsCreated.get( key ) );
223
224         metadataRepositoryControl.replay();
225
226         for ( RepositoryStatistics stats : statsCreated.values() )
227         {
228             repositoryStatisticsManager.addStatisticsAfterScan( TEST_REPO_ID, stats );
229         }
230
231         List<RepositoryStatistics> list =
232             repositoryStatisticsManager.getStatisticsInRange( TEST_REPO_ID, new Date( current.getTime() - 4000 ),
233                                                               new Date( current.getTime() - 2000 ) );
234
235         assertEquals( 1, list.size() );
236         assertEquals( new Date( current.getTime() - 3000 ), list.get( 0 ).getScanStartTime() );
237
238         metadataRepositoryControl.verify();
239     }
240
241     public void testGetStatsRangeUpperOutside()
242     {
243         Date current = new Date();
244
245         addStats( new Date( current.getTime() - 12345 ), new Date( current.getTime() - 6000 ) );
246         addStats( new Date( current.getTime() - 3000 ), new Date( current.getTime() - 2000 ) );
247         addStats( new Date( current.getTime() - 1000 ), current );
248
249         ArrayList<String> keys = new ArrayList<String>( statsCreated.keySet() );
250         metadataRepositoryControl.expectAndReturn(
251             metadataRepository.getMetadataFacets( TEST_REPO_ID, RepositoryStatistics.FACET_ID ), keys );
252
253         String key = keys.get( 1 );
254         metadataRepositoryControl.expectAndReturn(
255             metadataRepository.getMetadataFacet( TEST_REPO_ID, RepositoryStatistics.FACET_ID, key ),
256             statsCreated.get( key ) );
257         key = keys.get( 2 );
258         metadataRepositoryControl.expectAndReturn(
259             metadataRepository.getMetadataFacet( TEST_REPO_ID, RepositoryStatistics.FACET_ID, key ),
260             statsCreated.get( key ) );
261
262         metadataRepositoryControl.replay();
263
264         for ( RepositoryStatistics stats : statsCreated.values() )
265         {
266             repositoryStatisticsManager.addStatisticsAfterScan( TEST_REPO_ID, stats );
267         }
268
269         List<RepositoryStatistics> list =
270             repositoryStatisticsManager.getStatisticsInRange( TEST_REPO_ID, new Date( current.getTime() - 4000 ),
271                                                               current );
272
273         assertEquals( 2, list.size() );
274         assertEquals( new Date( current.getTime() - 3000 ), list.get( 1 ).getScanStartTime() );
275         assertEquals( new Date( current.getTime() - 1000 ), list.get( 0 ).getScanStartTime() );
276
277         metadataRepositoryControl.verify();
278     }
279
280     public void testGetStatsRangeLowerOutside()
281     {
282         Date current = new Date();
283
284         addStats( new Date( current.getTime() - 12345 ), new Date( current.getTime() - 6000 ) );
285         addStats( new Date( current.getTime() - 3000 ), new Date( current.getTime() - 2000 ) );
286         addStats( new Date( current.getTime() - 1000 ), current );
287
288         ArrayList<String> keys = new ArrayList<String>( statsCreated.keySet() );
289         metadataRepositoryControl.expectAndReturn(
290             metadataRepository.getMetadataFacets( TEST_REPO_ID, RepositoryStatistics.FACET_ID ), keys );
291
292         String key = keys.get( 0 );
293         metadataRepositoryControl.expectAndReturn(
294             metadataRepository.getMetadataFacet( TEST_REPO_ID, RepositoryStatistics.FACET_ID, key ),
295             statsCreated.get( key ) );
296         key = keys.get( 1 );
297         metadataRepositoryControl.expectAndReturn(
298             metadataRepository.getMetadataFacet( TEST_REPO_ID, RepositoryStatistics.FACET_ID, key ),
299             statsCreated.get( key ) );
300
301         metadataRepositoryControl.replay();
302
303         for ( RepositoryStatistics stats : statsCreated.values() )
304         {
305             repositoryStatisticsManager.addStatisticsAfterScan( TEST_REPO_ID, stats );
306         }
307
308         List<RepositoryStatistics> list =
309             repositoryStatisticsManager.getStatisticsInRange( TEST_REPO_ID, new Date( current.getTime() - 20000 ),
310                                                               new Date( current.getTime() - 2000 ) );
311
312         assertEquals( 2, list.size() );
313         assertEquals( new Date( current.getTime() - 12345 ), list.get( 1 ).getScanStartTime() );
314         assertEquals( new Date( current.getTime() - 3000 ), list.get( 0 ).getScanStartTime() );
315
316         metadataRepositoryControl.verify();
317     }
318
319     public void testGetStatsRangeLowerAndUpperOutside()
320     {
321         Date current = new Date();
322
323         addStats( new Date( current.getTime() - 12345 ), new Date( current.getTime() - 6000 ) );
324         addStats( new Date( current.getTime() - 3000 ), new Date( current.getTime() - 2000 ) );
325         addStats( new Date( current.getTime() - 1000 ), current );
326
327         ArrayList<String> keys = new ArrayList<String>( statsCreated.keySet() );
328         metadataRepositoryControl.expectAndReturn(
329             metadataRepository.getMetadataFacets( TEST_REPO_ID, RepositoryStatistics.FACET_ID ), keys );
330
331         String key = keys.get( 0 );
332         metadataRepositoryControl.expectAndReturn(
333             metadataRepository.getMetadataFacet( TEST_REPO_ID, RepositoryStatistics.FACET_ID, key ),
334             statsCreated.get( key ) );
335         key = keys.get( 1 );
336         metadataRepositoryControl.expectAndReturn(
337             metadataRepository.getMetadataFacet( TEST_REPO_ID, RepositoryStatistics.FACET_ID, key ),
338             statsCreated.get( key ) );
339         key = keys.get( 2 );
340         metadataRepositoryControl.expectAndReturn(
341             metadataRepository.getMetadataFacet( TEST_REPO_ID, RepositoryStatistics.FACET_ID, key ),
342             statsCreated.get( key ) );
343
344         metadataRepositoryControl.replay();
345
346         for ( RepositoryStatistics stats : statsCreated.values() )
347         {
348             repositoryStatisticsManager.addStatisticsAfterScan( TEST_REPO_ID, stats );
349         }
350
351         List<RepositoryStatistics> list =
352             repositoryStatisticsManager.getStatisticsInRange( TEST_REPO_ID, new Date( current.getTime() - 20000 ),
353                                                               current );
354
355         assertEquals( 3, list.size() );
356         assertEquals( new Date( current.getTime() - 12345 ), list.get( 2 ).getScanStartTime() );
357         assertEquals( new Date( current.getTime() - 3000 ), list.get( 1 ).getScanStartTime() );
358         assertEquals( new Date( current.getTime() - 1000 ), list.get( 0 ).getScanStartTime() );
359
360         metadataRepositoryControl.verify();
361     }
362
363     public void testGetStatsRangeNotInside()
364     {
365         Date current = new Date();
366
367         addStats( new Date( current.getTime() - 12345 ), new Date( current.getTime() - 6000 ) );
368         addStats( new Date( current.getTime() - 3000 ), new Date( current.getTime() - 2000 ) );
369         addStats( new Date( current.getTime() - 1000 ), current );
370
371         ArrayList<String> keys = new ArrayList<String>( statsCreated.keySet() );
372         metadataRepositoryControl.expectAndReturn(
373             metadataRepository.getMetadataFacets( TEST_REPO_ID, RepositoryStatistics.FACET_ID ), keys );
374
375         metadataRepositoryControl.replay();
376
377         for ( RepositoryStatistics stats : statsCreated.values() )
378         {
379             repositoryStatisticsManager.addStatisticsAfterScan( TEST_REPO_ID, stats );
380         }
381
382         List<RepositoryStatistics> list =
383             repositoryStatisticsManager.getStatisticsInRange( TEST_REPO_ID, new Date( current.getTime() - 20000 ),
384                                                               new Date( current.getTime() - 16000 ) );
385
386         assertEquals( 0, list.size() );
387
388         metadataRepositoryControl.verify();
389     }
390
391     private void addStats( Date startTime, Date endTime )
392     {
393         RepositoryStatistics stats = createTestStats( startTime, endTime );
394         metadataRepository.addMetadataFacet( TEST_REPO_ID, stats );
395         statsCreated.put( stats.getName(), stats );
396     }
397
398     private RepositoryStatistics createTestStats( Date startTime, Date endTime )
399     {
400         RepositoryStatistics stats = new RepositoryStatistics();
401         stats.setScanStartTime( startTime );
402         stats.setScanEndTime( endTime );
403         stats.setTotalArtifactFileSize( 1400032000L );
404         stats.setNewFileCount( 45 );
405         stats.setTotalArtifactCount( 10412 );
406         stats.setTotalProjectCount( 2036 );
407         stats.setTotalGroupCount( 531 );
408         stats.setTotalFileCount( 56345 );
409         return stats;
410     }
411 }