View Javadoc
1   package org.apache.archiva.audit;
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 junit.framework.TestCase;
23  import org.apache.archiva.configuration.ManagedRepositoryConfiguration;
24  import org.apache.archiva.metadata.model.facets.AuditEvent;
25  import org.apache.archiva.metadata.repository.MetadataRepository;
26  import org.apache.archiva.test.utils.ArchivaBlockJUnit4ClassRunner;
27  import org.easymock.EasyMock;
28  import org.easymock.IMocksControl;
29  import org.junit.Before;
30  import org.junit.Test;
31  import org.junit.runner.RunWith;
32  
33  import java.text.DecimalFormat;
34  import java.text.ParseException;
35  import java.text.SimpleDateFormat;
36  import java.util.ArrayList;
37  import java.util.Arrays;
38  import java.util.Collections;
39  import java.util.Date;
40  import java.util.LinkedHashMap;
41  import java.util.List;
42  import java.util.Map;
43  import java.util.TimeZone;
44  
45  @RunWith(ArchivaBlockJUnit4ClassRunner.class)
46  public class AuditManagerTest
47      extends TestCase
48  {
49      private DefaultAuditManager auditManager;
50  
51      private IMocksControl metadataRepositoryControl;
52  
53      private MetadataRepository metadataRepository;
54  
55      private static final String AUDIT_EVENT_BASE = "2010/01/18/123456.";
56  
57      private static final String TEST_REPO_ID = "test-repo";
58  
59      private static final String TEST_REPO_ID_2 = "repo2";
60  
61      private static final String TEST_USER = "test_user";
62  
63      private static final String TEST_RESOURCE_BASE = "test/resource";
64  
65      private static final String TEST_IP_ADDRESS = "127.0.0.1";
66  
67      private static final SimpleDateFormat TIMESTAMP_FORMAT = createTimestampFormat();
68  
69      private static final DecimalFormat MILLIS_FORMAT = new DecimalFormat( "000" );
70  
71      private static SimpleDateFormat createTimestampFormat()
72      {
73          SimpleDateFormat fmt = new SimpleDateFormat( AuditEvent.TIMESTAMP_FORMAT );
74          fmt.setTimeZone( TimeZone.getTimeZone( "UTC" ) );
75          return fmt;
76      }
77  
78      @Override
79      @Before
80      public void setUp()
81          throws Exception
82      {
83          super.setUp();
84  
85          auditManager = new DefaultAuditManager();
86  
87          metadataRepositoryControl = EasyMock.createControl();
88          metadataRepository = metadataRepositoryControl.createMock( MetadataRepository.class );
89  
90          ManagedRepositoryConfiguration repository = new ManagedRepositoryConfiguration();
91          repository.setId( TEST_REPO_ID );
92          repository.setLocation( "" );
93      }
94  
95      @Test
96      public void testGetMostRecentEvents()
97          throws Exception
98      {
99          int numEvents = 11;
100         List<AuditEvent> expectedEvents = new ArrayList<>( numEvents );
101         for ( int i = 0; i < numEvents; i++ )
102         {
103             AuditEvent event = createEvent( AUDIT_EVENT_BASE + MILLIS_FORMAT.format( i ) );
104             expectedEvents.add( event );
105         }
106 
107         EasyMock.expect( metadataRepository.getMetadataFacets( TEST_REPO_ID, AuditEvent.FACET_ID ) ).andReturn(
108             getEventNames( expectedEvents ) );
109 
110         for ( AuditEvent event : expectedEvents.subList( 1, expectedEvents.size() ) )
111         {
112             EasyMock.expect(
113                 metadataRepository.getMetadataFacet( TEST_REPO_ID, AuditEvent.FACET_ID, event.getName() ) ).andReturn(
114                 event );
115         }
116         metadataRepositoryControl.replay();
117 
118         List<AuditEvent> events =
119             auditManager.getMostRecentAuditEvents( metadataRepository, Collections.singletonList( TEST_REPO_ID ) );
120         assertNotNull( events );
121         assertEquals( numEvents - 1, events.size() );
122         int expectedTimestampCounter = numEvents - 1;
123         for ( AuditEvent event : events )
124         {
125             String num = MILLIS_FORMAT.format( expectedTimestampCounter );
126             assertTestEvent( event, AUDIT_EVENT_BASE + num, getDefaultTestResourceName( num ) );
127             expectedTimestampCounter--;
128         }
129 
130         metadataRepositoryControl.verify();
131     }
132 
133     @Test
134     public void testGetMostRecentEventsLessThan10()
135         throws Exception
136     {
137         int numEvents = 5;
138         List<AuditEvent> expectedEvents = new ArrayList<>( numEvents );
139         for ( int i = 0; i < numEvents; i++ )
140         {
141             expectedEvents.add( createEvent( AUDIT_EVENT_BASE + MILLIS_FORMAT.format( i ) ) );
142         }
143 
144         EasyMock.expect( metadataRepository.getMetadataFacets( TEST_REPO_ID, AuditEvent.FACET_ID ) ).andReturn(
145             getEventNames( expectedEvents ) );
146         for ( AuditEvent event : expectedEvents )
147         {
148             EasyMock.expect(
149                 metadataRepository.getMetadataFacet( TEST_REPO_ID, AuditEvent.FACET_ID, event.getName() ) ).andReturn(
150                 event );
151         }
152         metadataRepositoryControl.replay();
153 
154         List<AuditEvent> events =
155             auditManager.getMostRecentAuditEvents( metadataRepository, Collections.singletonList( TEST_REPO_ID ) );
156         assertNotNull( events );
157         assertEquals( numEvents, events.size() );
158         int expectedTimestampCounter = numEvents - 1;
159         for ( AuditEvent event : events )
160         {
161             String num = MILLIS_FORMAT.format( expectedTimestampCounter );
162             assertTestEvent( event, AUDIT_EVENT_BASE + num, getDefaultTestResourceName( num ) );
163             expectedTimestampCounter--;
164         }
165 
166         metadataRepositoryControl.verify();
167     }
168 
169     @Test
170     public void testGetMostRecentEventsInterleavedRepositories()
171         throws Exception
172     {
173         int numEvents = 11;
174         Map<String, List<String>> eventNames = new LinkedHashMap<String, List<String>>();
175         List<AuditEvent> events = new ArrayList<>();
176         eventNames.put( TEST_REPO_ID, new ArrayList<String>() );
177         eventNames.put( TEST_REPO_ID_2, new ArrayList<String>() );
178         for ( int i = 0; i < numEvents; i++ )
179         {
180             String repositoryId = i % 2 == 0 ? TEST_REPO_ID : TEST_REPO_ID_2;
181             String num = MILLIS_FORMAT.format( i );
182             AuditEvent event = createEvent( repositoryId, AUDIT_EVENT_BASE + num, getDefaultTestResourceName( num ) );
183             events.add( event );
184             eventNames.get( repositoryId ).add( event.getName() );
185         }
186 
187         EasyMock.expect( metadataRepository.getMetadataFacets( TEST_REPO_ID, AuditEvent.FACET_ID ) ).andReturn(
188             eventNames.get( TEST_REPO_ID ) );
189         EasyMock.expect( metadataRepository.getMetadataFacets( TEST_REPO_ID_2, AuditEvent.FACET_ID ) ).andReturn(
190             eventNames.get( TEST_REPO_ID_2 ) );
191 
192         for ( AuditEvent event : events.subList( 1, events.size() ) )
193         {
194             EasyMock.expect( metadataRepository.getMetadataFacet( event.getRepositoryId(), AuditEvent.FACET_ID,
195                                                                   event.getName() ) ).andReturn( event );
196         }
197         metadataRepositoryControl.replay();
198 
199         events =
200             auditManager.getMostRecentAuditEvents( metadataRepository, Arrays.asList( TEST_REPO_ID, TEST_REPO_ID_2 ) );
201         assertNotNull( events );
202         assertEquals( numEvents - 1, events.size() );
203         int expectedTimestampCounter = numEvents - 1;
204         for ( AuditEvent event : events )
205         {
206             String num = MILLIS_FORMAT.format( expectedTimestampCounter );
207             String expectedRepoId = expectedTimestampCounter % 2 == 0 ? TEST_REPO_ID : TEST_REPO_ID_2;
208             assertTestEvent( event, expectedRepoId, AUDIT_EVENT_BASE + num, getDefaultTestResourceName( num ) );
209             expectedTimestampCounter--;
210         }
211 
212         metadataRepositoryControl.verify();
213     }
214 
215     @Test
216     public void testGetMostRecentEventsWhenEmpty()
217         throws Exception
218 
219     {
220 
221         EasyMock.expect( metadataRepository.getMetadataFacets( TEST_REPO_ID, AuditEvent.FACET_ID ) ).andReturn(
222             Collections.<String>emptyList() );
223         metadataRepositoryControl.replay();
224 
225         assertTrue( auditManager.getMostRecentAuditEvents( metadataRepository,
226                                                            Collections.singletonList( TEST_REPO_ID ) ).isEmpty() );
227 
228         metadataRepositoryControl.verify();
229     }
230 
231     @Test
232     public void testAddAuditEvent()
233         throws Exception
234 
235     {
236         AuditEvent event = createEvent( new Date() );
237 
238         metadataRepository.addMetadataFacet( TEST_REPO_ID, event );
239 
240         metadataRepositoryControl.replay();
241 
242         auditManager.addAuditEvent( metadataRepository, event );
243 
244         metadataRepositoryControl.verify();
245     }
246 
247     @Test
248     public void testAddAuditEventNoRepositoryId()
249         throws Exception
250     {
251         AuditEvent event = createEvent( new Date() );
252         event.setRepositoryId( null );
253 
254         // should just be ignored
255 
256         metadataRepositoryControl.replay();
257 
258         auditManager.addAuditEvent( metadataRepository, event );
259 
260         metadataRepositoryControl.verify();
261     }
262 
263     @Test
264     public void testDeleteStats()
265         throws Exception
266 
267     {
268         metadataRepository.removeMetadataFacets( TEST_REPO_ID, AuditEvent.FACET_ID );
269 
270         metadataRepositoryControl.replay();
271 
272         auditManager.deleteAuditEvents( metadataRepository, TEST_REPO_ID );
273 
274         metadataRepositoryControl.verify();
275     }
276 
277     @Test
278     public void testGetEventsRangeInside()
279         throws Exception
280 
281     {
282         Date current = new Date();
283 
284         AuditEvent event1 = createEvent( new Date( current.getTime() - 12345 ) );
285         Date expectedTimestamp = new Date( current.getTime() - 3000 );
286         AuditEvent expectedEvent = createEvent( expectedTimestamp );
287         AuditEvent event3 = createEvent( new Date( current.getTime() - 1000 ) );
288 
289         EasyMock.expect( metadataRepository.getMetadataFacets( TEST_REPO_ID, AuditEvent.FACET_ID ) ).andReturn(
290             Arrays.asList( event1.getName(), expectedEvent.getName(), event3.getName() ) );
291 
292         // only match the middle one
293         EasyMock.expect( metadataRepository.getMetadataFacet( TEST_REPO_ID, AuditEvent.FACET_ID,
294                                                               expectedEvent.getName() ) ).andReturn( expectedEvent );
295 
296         metadataRepositoryControl.replay();
297 
298         List<AuditEvent> events =
299             auditManager.getAuditEventsInRange( metadataRepository, Collections.singletonList( TEST_REPO_ID ),
300                                                 new Date( current.getTime() - 4000 ),
301                                                 new Date( current.getTime() - 2000 ) );
302 
303         assertEquals( 1, events.size() );
304         assertTestEvent( events.get( 0 ), TIMESTAMP_FORMAT.format( expectedTimestamp ), expectedEvent.getResource() );
305 
306         metadataRepositoryControl.verify();
307     }
308 
309     @Test
310     public void testGetEventsRangeUpperOutside()
311         throws Exception
312     {
313         Date current = new Date();
314 
315         AuditEvent event1 = createEvent( new Date( current.getTime() - 12345 ) );
316         Date expectedTimestamp = new Date( current.getTime() - 3000 );
317         AuditEvent expectedEvent2 = createEvent( expectedTimestamp );
318         Date ts3 = new Date( current.getTime() - 1000 );
319         AuditEvent expectedEvent3 = createEvent( ts3 );
320 
321         EasyMock.expect( metadataRepository.getMetadataFacets( TEST_REPO_ID, AuditEvent.FACET_ID ) ).andReturn(
322             Arrays.asList( event1.getName(), expectedEvent2.getName(), expectedEvent3.getName() ) );
323 
324         EasyMock.expect( metadataRepository.getMetadataFacet( TEST_REPO_ID, AuditEvent.FACET_ID,
325                                                               expectedEvent2.getName() ) ).andReturn( expectedEvent2 );
326         EasyMock.expect( metadataRepository.getMetadataFacet( TEST_REPO_ID, AuditEvent.FACET_ID,
327                                                               expectedEvent3.getName() ) ).andReturn( expectedEvent3 );
328         metadataRepositoryControl.replay();
329 
330         List<AuditEvent> events =
331             auditManager.getAuditEventsInRange( metadataRepository, Collections.singletonList( TEST_REPO_ID ),
332                                                 new Date( current.getTime() - 4000 ), current );
333 
334         assertEquals( 2, events.size() );
335         assertTestEvent( events.get( 0 ), TIMESTAMP_FORMAT.format( ts3 ), expectedEvent3.getResource() );
336         assertTestEvent( events.get( 1 ), TIMESTAMP_FORMAT.format( expectedTimestamp ), expectedEvent2.getResource() );
337 
338         metadataRepositoryControl.verify();
339     }
340 
341     @Test
342     public void testGetEventsRangeLowerOutside()
343         throws Exception
344     {
345         Date current = new Date();
346 
347         Date ts1 = new Date( current.getTime() - 12345 );
348         AuditEvent expectedEvent1 = createEvent( ts1 );
349         Date expectedTimestamp = new Date( current.getTime() - 3000 );
350         AuditEvent expectedEvent2 = createEvent( expectedTimestamp );
351         AuditEvent event3 = createEvent( new Date( current.getTime() - 1000 ) );
352 
353         EasyMock.expect( metadataRepository.getMetadataFacets( TEST_REPO_ID, AuditEvent.FACET_ID ) ).andReturn(
354             Arrays.asList( expectedEvent1.getName(), expectedEvent2.getName(), event3.getName() ) );
355 
356         EasyMock.expect( metadataRepository.getMetadataFacet( TEST_REPO_ID, AuditEvent.FACET_ID,
357                                                               expectedEvent1.getName() ) ).andReturn( expectedEvent1 );
358 
359         EasyMock.expect( metadataRepository.getMetadataFacet( TEST_REPO_ID, AuditEvent.FACET_ID,
360                                                               expectedEvent2.getName() ) ).andReturn( expectedEvent2 );
361 
362         metadataRepositoryControl.replay();
363 
364         List<AuditEvent> events =
365             auditManager.getAuditEventsInRange( metadataRepository, Collections.singletonList( TEST_REPO_ID ),
366                                                 new Date( current.getTime() - 20000 ),
367                                                 new Date( current.getTime() - 2000 ) );
368 
369         assertEquals( 2, events.size() );
370         assertTestEvent( events.get( 0 ), TIMESTAMP_FORMAT.format( expectedTimestamp ), expectedEvent2.getResource() );
371         assertTestEvent( events.get( 1 ), TIMESTAMP_FORMAT.format( ts1 ), expectedEvent1.getResource() );
372 
373         metadataRepositoryControl.verify();
374     }
375 
376     @Test
377     public void testGetEventsRangeLowerAndUpperOutside()
378         throws Exception
379     {
380         Date current = new Date();
381 
382         Date ts1 = new Date( current.getTime() - 12345 );
383         AuditEvent expectedEvent1 = createEvent( ts1 );
384         Date expectedTimestamp = new Date( current.getTime() - 3000 );
385         AuditEvent expectedEvent2 = createEvent( expectedTimestamp );
386         Date ts3 = new Date( current.getTime() - 1000 );
387         AuditEvent expectedEvent3 = createEvent( ts3 );
388 
389         EasyMock.expect( metadataRepository.getMetadataFacets( TEST_REPO_ID, AuditEvent.FACET_ID ) ).andReturn(
390             Arrays.asList( expectedEvent1.getName(), expectedEvent2.getName(), expectedEvent3.getName() ) );
391 
392         EasyMock.expect( metadataRepository.getMetadataFacet( TEST_REPO_ID, AuditEvent.FACET_ID,
393                                                               expectedEvent1.getName() ) ).andReturn( expectedEvent1 );
394 
395         EasyMock.expect( metadataRepository.getMetadataFacet( TEST_REPO_ID, AuditEvent.FACET_ID,
396                                                               expectedEvent2.getName() ) ).andReturn( expectedEvent2 );
397 
398         EasyMock.expect( metadataRepository.getMetadataFacet( TEST_REPO_ID, AuditEvent.FACET_ID,
399                                                               expectedEvent3.getName() ) ).andReturn( expectedEvent3 );
400         metadataRepositoryControl.replay();
401 
402         List<AuditEvent> events =
403             auditManager.getAuditEventsInRange( metadataRepository, Collections.singletonList( TEST_REPO_ID ),
404                                                 new Date( current.getTime() - 20000 ), current );
405 
406         assertEquals( 3, events.size() );
407         assertTestEvent( events.get( 0 ), TIMESTAMP_FORMAT.format( ts3 ), expectedEvent3.getResource() );
408         assertTestEvent( events.get( 1 ), TIMESTAMP_FORMAT.format( expectedTimestamp ), expectedEvent2.getResource() );
409         assertTestEvent( events.get( 2 ), TIMESTAMP_FORMAT.format( ts1 ), expectedEvent1.getResource() );
410 
411         metadataRepositoryControl.verify();
412     }
413 
414     @Test
415     public void testGetEventsWithResource()
416         throws Exception
417     {
418         Date current = new Date();
419 
420         Date ts1 = new Date( current.getTime() - 12345 );
421         AuditEvent expectedEvent1 = createEvent( ts1 );
422         Date expectedTimestamp = new Date( current.getTime() - 3000 );
423         AuditEvent expectedEvent2 = createEvent( expectedTimestamp );
424         expectedEvent2.setResource( "different-resource" );
425         Date ts3 = new Date( current.getTime() - 1000 );
426         AuditEvent expectedEvent3 = createEvent( ts3 );
427 
428 
429         EasyMock.expect( metadataRepository.getMetadataFacets( TEST_REPO_ID, AuditEvent.FACET_ID ) ).andReturn(
430             Arrays.asList( expectedEvent1.getName(), expectedEvent2.getName(), expectedEvent3.getName() ) );
431 
432 
433         EasyMock.expect( metadataRepository.getMetadataFacet( TEST_REPO_ID, AuditEvent.FACET_ID,
434                                                               expectedEvent1.getName() ) ).andReturn( expectedEvent1 );
435 
436         EasyMock.expect( metadataRepository.getMetadataFacet( TEST_REPO_ID, AuditEvent.FACET_ID,
437                                                               expectedEvent2.getName() ) ).andReturn( expectedEvent2 );
438 
439         EasyMock.expect( metadataRepository.getMetadataFacet( TEST_REPO_ID, AuditEvent.FACET_ID,
440                                                               expectedEvent3.getName() ) ).andReturn( expectedEvent3 );
441         metadataRepositoryControl.replay();
442 
443         List<AuditEvent> events =
444             auditManager.getAuditEventsInRange( metadataRepository, Collections.singletonList( TEST_REPO_ID ),
445                                                 TEST_RESOURCE_BASE, new Date( current.getTime() - 20000 ), current );
446 
447         assertEquals( 2, events.size() );
448         assertTestEvent( events.get( 0 ), TIMESTAMP_FORMAT.format( ts3 ), expectedEvent3.getResource() );
449         assertTestEvent( events.get( 1 ), TIMESTAMP_FORMAT.format( ts1 ), expectedEvent1.getResource() );
450 
451         metadataRepositoryControl.verify();
452     }
453 
454     @Test
455     public void testGetEventsWithNonExistantResource()
456         throws Exception
457     {
458         Date current = new Date();
459 
460         AuditEvent expectedEvent1 = createEvent( new Date( current.getTime() - 12345 ) );
461         Date expectedTimestamp = new Date( current.getTime() - 3000 );
462         AuditEvent expectedEvent2 = createEvent( expectedTimestamp );
463         expectedEvent2.setResource( "different-resource" );
464         AuditEvent expectedEvent3 = createEvent( new Date( current.getTime() - 1000 ) );
465 
466 
467         EasyMock.expect( metadataRepository.getMetadataFacets( TEST_REPO_ID, AuditEvent.FACET_ID ) ).andReturn(
468             Arrays.asList( expectedEvent1.getName(), expectedEvent2.getName(), expectedEvent3.getName() ) );
469 
470 
471         EasyMock.expect( metadataRepository.getMetadataFacet( TEST_REPO_ID, AuditEvent.FACET_ID, expectedEvent1.getName() ) ).andReturn( expectedEvent1 );
472 
473         EasyMock.expect( metadataRepository.getMetadataFacet( TEST_REPO_ID, AuditEvent.FACET_ID, expectedEvent2.getName() ) ).andReturn( expectedEvent2 );
474 
475         EasyMock.expect( metadataRepository.getMetadataFacet( TEST_REPO_ID, AuditEvent.FACET_ID, expectedEvent3.getName() ) ).andReturn( expectedEvent3 );
476 
477         metadataRepositoryControl.replay();
478 
479         List<AuditEvent> events =
480             auditManager.getAuditEventsInRange( metadataRepository, Collections.singletonList( TEST_REPO_ID ), "foo",
481                                                 new Date( current.getTime() - 20000 ), current );
482 
483         assertEquals( 0, events.size() );
484 
485         metadataRepositoryControl.verify();
486     }
487 
488     @Test
489     public void testGetEventsRangeMultipleRepositories()
490         throws Exception
491     {
492         Date current = new Date();
493 
494         Date ts1 = new Date( current.getTime() - 12345 );
495         AuditEvent expectedEvent1 = createEvent( ts1 );
496         Date expectedTimestamp = new Date( current.getTime() - 3000 );
497         AuditEvent expectedEvent2 = createEvent( expectedTimestamp );
498         expectedEvent2.setRepositoryId( TEST_REPO_ID_2 );
499         Date ts3 = new Date( current.getTime() - 1000 );
500         AuditEvent expectedEvent3 = createEvent( ts3 );
501 
502 
503         EasyMock.expect( metadataRepository.getMetadataFacets( TEST_REPO_ID, AuditEvent.FACET_ID ) )
504             .andReturn( Arrays.asList( expectedEvent1.getName(), expectedEvent3.getName() )  );
505 
506         EasyMock.expect( metadataRepository.getMetadataFacets( TEST_REPO_ID_2, AuditEvent.FACET_ID ) )
507             .andReturn( Arrays.asList( expectedEvent2.getName() ) );
508 
509 
510         EasyMock.expect( metadataRepository.getMetadataFacet( TEST_REPO_ID, AuditEvent.FACET_ID, expectedEvent1.getName() ) )
511             .andReturn( expectedEvent1 );
512 
513         EasyMock.expect( metadataRepository.getMetadataFacet( TEST_REPO_ID_2, AuditEvent.FACET_ID, expectedEvent2.getName() ) )
514             .andReturn( expectedEvent2 );
515 
516         EasyMock.expect( metadataRepository.getMetadataFacet( TEST_REPO_ID, AuditEvent.FACET_ID, expectedEvent3.getName() ) )
517             .andReturn( expectedEvent3 );
518 
519         metadataRepositoryControl.replay();
520 
521         List<AuditEvent> events =
522             auditManager.getAuditEventsInRange( metadataRepository, Arrays.asList( TEST_REPO_ID, TEST_REPO_ID_2 ),
523                                                 new Date( current.getTime() - 20000 ), current );
524 
525         assertEquals( 3, events.size() );
526         assertTestEvent( events.get( 0 ), TEST_REPO_ID, TIMESTAMP_FORMAT.format( ts3 ), expectedEvent3.getResource() );
527         assertTestEvent( events.get( 1 ), TEST_REPO_ID_2, TIMESTAMP_FORMAT.format( expectedTimestamp ),
528                          expectedEvent2.getResource() );
529         assertTestEvent( events.get( 2 ), TEST_REPO_ID, TIMESTAMP_FORMAT.format( ts1 ), expectedEvent1.getResource() );
530 
531         metadataRepositoryControl.verify();
532     }
533 
534     @Test
535     public void testGetEventsRangeNotInside()
536         throws Exception
537     {
538         Date current = new Date();
539 
540         String name1 = createEvent( new Date( current.getTime() - 12345 ) ).getName();
541         Date expectedTimestamp = new Date( current.getTime() - 3000 );
542         String name2 = createEvent( expectedTimestamp ).getName();
543         String name3 = createEvent( new Date( current.getTime() - 1000 ) ).getName();
544 
545         EasyMock.expect( metadataRepository.getMetadataFacets( TEST_REPO_ID, AuditEvent.FACET_ID ) )
546             .andReturn( Arrays.asList( name1, name2, name3 ) );
547 
548         metadataRepositoryControl.replay();
549 
550         List<AuditEvent> events =
551             auditManager.getAuditEventsInRange( metadataRepository, Collections.singletonList( TEST_REPO_ID ),
552                                                 new Date( current.getTime() - 20000 ),
553                                                 new Date( current.getTime() - 16000 ) );
554 
555         assertEquals( 0, events.size() );
556 
557         metadataRepositoryControl.verify();
558     }
559 
560     private static String getDefaultTestResourceName( String num )
561     {
562         return TEST_RESOURCE_BASE + "/" + num + ".xml";
563     }
564 
565     private static AuditEvent createEvent( Date timestamp )
566         throws ParseException
567     {
568         return createEvent( TIMESTAMP_FORMAT.format( timestamp ) );
569     }
570 
571     private static AuditEvent createEvent( String ts )
572         throws ParseException
573     {
574         return createEvent( TEST_REPO_ID, ts, getDefaultTestResourceName(
575             ts.substring( AUDIT_EVENT_BASE.length(), AUDIT_EVENT_BASE.length() + 3 ) ) );
576     }
577 
578     private static AuditEvent createEvent( String repositoryId, String timestamp, String resource )
579         throws ParseException
580     {
581         AuditEvent event = new AuditEvent();
582         event.setTimestamp( TIMESTAMP_FORMAT.parse( timestamp ) );
583         event.setAction( AuditEvent.UPLOAD_FILE );
584         event.setRemoteIP( TEST_IP_ADDRESS );
585         event.setRepositoryId( repositoryId );
586         event.setUserId( TEST_USER );
587         event.setResource( resource );
588         return event;
589     }
590 
591     private static void assertTestEvent( AuditEvent event, String timestamp, String resource )
592     {
593         assertTestEvent( event, TEST_REPO_ID, timestamp, resource );
594     }
595 
596     private static void assertTestEvent( AuditEvent event, String repositoryId, String timestamp, String resource )
597     {
598         assertEquals( timestamp, TIMESTAMP_FORMAT.format( event.getTimestamp() ) );
599         assertEquals( AuditEvent.UPLOAD_FILE, event.getAction() );
600         assertEquals( TEST_IP_ADDRESS, event.getRemoteIP() );
601         assertEquals( repositoryId, event.getRepositoryId() );
602         assertEquals( TEST_USER, event.getUserId() );
603         assertEquals( resource, event.getResource() );
604     }
605 
606     private List<String> getEventNames( List<AuditEvent> events )
607     {
608         List<String> names = new ArrayList<>( events.size() );
609         for ( AuditEvent event : events )
610         {
611             names.add( event.getName() );
612         }
613         return names;
614     }
615 }