This project has retired. For details please refer to its Attic page.
AbstractUserManagerTestCase xref
View Javadoc

1   package org.apache.archiva.redback.users.provider.test;
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.redback.policy.UserSecurityPolicy;
24  import org.apache.archiva.redback.users.PermanentUserException;
25  import org.apache.archiva.redback.users.User;
26  import org.apache.archiva.redback.users.UserManager;
27  import org.apache.archiva.redback.users.UserManagerException;
28  import org.apache.archiva.redback.users.UserNotFoundException;
29  import org.apache.archiva.redback.users.UserQuery;
30  import org.junit.Test;
31  import org.junit.runner.RunWith;
32  import org.springframework.test.annotation.DirtiesContext;
33  import org.springframework.test.context.ContextConfiguration;
34  import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
35  
36  import javax.inject.Inject;
37  import java.util.List;
38  
39  /**
40   * AbstractUserManagerTestCase
41   *
42   * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
43   */
44  @RunWith(SpringJUnit4ClassRunner.class)
45  @ContextConfiguration(locations = { "classpath*:/META-INF/spring-context.xml", "classpath*:/spring-context.xml" })
46  @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
47  public class AbstractUserManagerTestCase
48      extends TestCase
49  {
50      /**
51       * This value is set by the sub classes of this test case.
52       * They should override .setUp() and inject this value via
53       * the {@link #setUserManager(UserManager)} method call.
54       */
55      private UserManager userManager;
56  
57      @Inject
58      private UserSecurityPolicy securityPolicy;
59  
60      private UserManagerEventTracker eventTracker;
61  
62  
63      private static final int EVENTTRACKERCOUNT = 2;
64      // assertCleanUserManager
65      // getEventTracker().userManagerInit( true ); is 1
66      // userManager.getUsers() is 2
67      // only on clear context
68  
69      public UserManager getUserManager()
70      {
71          return userManager;
72      }
73  
74      public void setUserManager( UserManager um )
75      {
76          this.userManager = um;
77          if ( this.userManager != null )
78          {
79              this.eventTracker = new UserManagerEventTracker();
80              this.userManager.addUserManagerListener( this.eventTracker );
81          }
82      }
83  
84      public void setUp()
85          throws Exception
86      {
87          super.setUp();
88      }
89  
90      public void tearDown()
91          throws Exception
92      {
93          super.tearDown();
94      }
95  
96      protected void assertCleanUserManager()
97          throws UserManagerException
98      {
99  
100         getUserManager().eraseDatabase();
101         getEventTracker().userManagerInit( true );
102         assertNotNull( getUserManager() );
103 
104         assertEquals( "New UserManager should contain no users. " + userManager.getUsers(), 0,
105                       userManager.getUsers().size() );
106     }
107 
108     @Test
109     public void testFindUserByNullPrincipal()
110         throws UserManagerException
111     {
112         try
113         {
114             Object obj = null;
115             getUserManager().findUser( null );
116             fail( "findUser() with null Object Should have thrown a UserNotFoundException." );
117         }
118         catch ( UserNotFoundException e )
119         {
120             // Expected Path.
121         }
122     }
123 
124     @Test
125     public void testFindUserByEmptyUsername()
126         throws UserManagerException
127     {
128         try
129         {
130             String username = null;
131             getUserManager().findUser( username );
132             fail( "findUser() with null username Should have thrown a UserNotFoundException." );
133         }
134         catch ( UserNotFoundException e )
135         {
136             // Expected Path.
137         }
138 
139         try
140         {
141             String username = "";
142             getUserManager().findUser( username );
143             fail( "findUser() with empty username Should have thrown a UserNotFoundException." );
144         }
145         catch ( UserNotFoundException e )
146         {
147             // Expected Path.
148         }
149 
150         try
151         {
152             String username = "   ";
153             getUserManager().findUser( username );
154             fail( "findUser() with all whitespace username Should have thrown a UserNotFoundException." );
155         }
156         catch ( UserNotFoundException e )
157         {
158             // Expected Path.
159         }
160     }
161 
162     @Test
163     public void testAddFindUserByPrincipal()
164         throws UserNotFoundException, UserManagerException
165     {
166         assertCleanUserManager();
167         securityPolicy.setEnabled( false );
168 
169         User smcqueen = getUserManager().createUser( "smcqueen", "Steve McQueen", "the cooler king" );
170 
171         /* Keep a reference to the object that was added.
172          * Since it has the actual principal that was managed by jpox/jdo.
173          */
174         User added = userManager.addUser( smcqueen );
175 
176         assertEquals( 1, userManager.getUsers().size() );
177 
178         /* Fetch user from userManager using principal returned earlier */
179         User actual = userManager.findUser( added.getUsername() );
180         assertEquals( added, actual );
181         
182         /* Check into the event tracker. */
183         assertEquals( EVENTTRACKERCOUNT, getEventTracker().countInit );
184         assertNotNull( getEventTracker().lastDbFreshness );
185         assertTrue( getEventTracker().lastDbFreshness.booleanValue() );
186 
187         assertEquals( 1, getEventTracker().addedUsernames.size() );
188         assertEquals( 0, getEventTracker().removedUsernames.size() );
189         assertEquals( 0, getEventTracker().updatedUsernames.size() );
190     }
191 
192     @Test
193     public void testAddFindUserLockedStatus()
194         throws UserNotFoundException, UserManagerException
195     {
196         assertCleanUserManager();
197         securityPolicy.setEnabled( false );
198 
199         User smcqueen = getUserManager().createUser( "smcqueen", "Steve McQueen", "the cooler king" );
200 
201         smcqueen.setLocked( true );
202 
203 		/*
204          * Keep a reference to the object that was added. Since it has the
205 		 * actual principal that was managed by jpox/jdo.
206 		 */
207         User added = userManager.addUser( smcqueen );
208 
209         assertTrue( added.isLocked() );
210 
211         assertEquals( 1, userManager.getUsers().size() );
212 
213 		/* Fetch user from userManager using principal returned earlier */
214         User actual = userManager.findUser( added.getUsername() );
215         assertEquals( added, actual );
216 
217         assertTrue( actual.isLocked() );
218 		
219 		/* Check into the event tracker. */
220         assertEquals( EVENTTRACKERCOUNT, getEventTracker().countInit );
221         assertNotNull( getEventTracker().lastDbFreshness );
222         assertTrue( getEventTracker().lastDbFreshness.booleanValue() );
223 
224         assertEquals( 1, getEventTracker().addedUsernames.size() );
225         assertEquals( 0, getEventTracker().removedUsernames.size() );
226         assertEquals( 0, getEventTracker().updatedUsernames.size() );
227     }
228 
229     @Test
230     public void testAddFindUserByUsername()
231         throws UserNotFoundException, UserManagerException
232     {
233         assertCleanUserManager();
234         securityPolicy.setEnabled( false );
235 
236         User smcqueen = getUserManager().createUser( "smcqueen", "Steve McQueen", "the cooler king" );
237 
238         User added = userManager.addUser( smcqueen );
239 
240         assertEquals( 1, userManager.getUsers().size() );
241 
242         User actual = userManager.findUser( "smcqueen" );
243         assertEquals( added, actual );
244         
245         /* Check into the event tracker. */
246         assertEquals( EVENTTRACKERCOUNT, getEventTracker().countInit );
247         assertNotNull( getEventTracker().lastDbFreshness );
248         assertTrue( getEventTracker().lastDbFreshness.booleanValue() );
249 
250         assertEquals( 1, getEventTracker().addedUsernames.size() );
251         assertEquals( 0, getEventTracker().removedUsernames.size() );
252         assertEquals( 0, getEventTracker().updatedUsernames.size() );
253     }
254 
255     @Test
256     public void testCreateUser()
257         throws Exception
258     {
259         assertCleanUserManager();
260         securityPolicy.setEnabled( false );
261 
262         UserManager um = getUserManager();
263         User user = um.createUser( "admin", "Administrator", "admin@somedomain.com" );
264         user.setPassword( "adminpass" );
265         um.addUser( user );
266 
267         assertEquals( 1, um.getUsers().size() );
268         
269         /* Check into the event tracker. */
270         assertEquals( EVENTTRACKERCOUNT, getEventTracker().countInit );
271         assertNotNull( getEventTracker().lastDbFreshness );
272         assertTrue( getEventTracker().lastDbFreshness.booleanValue() );
273 
274         assertEquals( 1, getEventTracker().addedUsernames.size() );
275         assertEquals( 0, getEventTracker().removedUsernames.size() );
276         assertEquals( 0, getEventTracker().updatedUsernames.size() );
277     }
278 
279     @Test
280     public void testAddUser()
281         throws Exception
282     {
283         assertCleanUserManager();
284         securityPolicy.setEnabled( false );
285 
286         UserManager um = getUserManager();
287         assertNotNull( um.getUsers() );
288         assertEquals( 0, um.getUsers().size() );
289 
290         User user = um.createUser( "tommy123", "Tommy Traddles", "tommy.traddles@somedomain.com" );
291         user.setPassword( "hillybilly" );
292         um.addUser( user );
293 
294         assertNotNull( um.getUsers() );
295         assertEquals( 1, um.getUsers().size() );
296         
297         /* Check into the event tracker. */
298         assertEquals( EVENTTRACKERCOUNT, getEventTracker().countInit );
299         assertNotNull( getEventTracker().lastDbFreshness );
300         assertTrue( getEventTracker().lastDbFreshness.booleanValue() );
301 
302         assertEquals( 1, getEventTracker().addedUsernames.size() );
303         assertEquals( 0, getEventTracker().removedUsernames.size() );
304         assertEquals( 0, getEventTracker().updatedUsernames.size() );
305     }
306 
307     @Test
308     public void testDeleteUser()
309         throws Exception
310     {
311         assertCleanUserManager();
312         securityPolicy.setEnabled( false );
313 
314         UserManager um = getUserManager();
315         User user = um.createUser( "admin", "Administrator", "admin@somedomain.com" );
316         user.setPassword( "adminpass" );
317         um.addUser( user );
318 
319         assertEquals( 1, um.getUsers().size() );
320 
321         um.deleteUser( user.getUsername() );
322         assertEquals( 0, um.getUsers().size() );
323 
324         // attempt finding a non-existent user
325         try
326         {
327             um.findUser( "admin" );
328             fail( "Expected UserNotFoundException!" );
329         }
330         catch ( UserNotFoundException e )
331         {
332             // do nothing, expected!
333         }
334         
335         /* Check into the event tracker. */
336         assertEquals( EVENTTRACKERCOUNT, getEventTracker().countInit );
337         assertNotNull( getEventTracker().lastDbFreshness );
338         assertTrue( getEventTracker().lastDbFreshness.booleanValue() );
339 
340         assertEquals( 1, getEventTracker().addedUsernames.size() );
341         assertEquals( 1, getEventTracker().removedUsernames.size() );
342         assertEquals( 0, getEventTracker().updatedUsernames.size() );
343     }
344 
345     @Test
346     public void testFindUser()
347         throws Exception
348     {
349         assertCleanUserManager();
350         securityPolicy.setEnabled( false );
351 
352         UserManager um = getUserManager();
353 
354         // create and add a few users
355         User u1 = um.createUser( "admin", "Administrator", "admin@somedomain.com" );
356         u1.setPassword( "adminpass" );
357         um.addUser( u1 );
358 
359         u1 = um.createUser( "administrator", "Administrator User", "administrator@somedomain.com" );
360         u1.setPassword( "password" );
361         um.addUser( u1 );
362 
363         u1 = um.createUser( "root", "Root User", "root@somedomain.com" );
364         u1.setPassword( "rootpass" );
365         um.addUser( u1 );
366 
367         assertEquals( 3, um.getUsers().size() );
368 
369         // find an existing user
370         User user = um.findUser( "root" );
371         assertNotNull( user );
372         assertEquals( "root@somedomain.com", user.getEmail() );
373         assertEquals( "root", user.getUsername() );
374         assertEquals( "Root User", user.getFullName() );
375         // test if the plain string password is encoded and NULL'ified
376         assertNull( user.getPassword() );
377         // test if encoded password was as expected 
378         assertTrue( securityPolicy.getPasswordEncoder().isPasswordValid( user.getEncodedPassword(), "rootpass" ) );
379 
380         // attempt finding a non-existent user
381         try
382         {
383             um.findUser( "non-existent" );
384             fail( "Expected UserNotFoundException!" );
385         }
386         catch ( UserNotFoundException e )
387         {
388             // do nothing, expected!
389         }
390         
391         /* Check into the event tracker. */
392         assertEquals( EVENTTRACKERCOUNT, getEventTracker().countInit );
393         assertNotNull( getEventTracker().lastDbFreshness );
394         assertTrue( getEventTracker().lastDbFreshness.booleanValue() );
395 
396         assertEquals( 3, getEventTracker().addedUsernames.size() );
397         assertEquals( 0, getEventTracker().removedUsernames.size() );
398         assertEquals( 0, getEventTracker().updatedUsernames.size() );
399     }
400 
401     @Test
402     public void testFindUsersByQuery()
403         throws UserManagerException
404     {
405         assertCleanUserManager();
406         securityPolicy.setEnabled( false );
407 
408         UserManager um = getUserManager();
409 
410         // create and add a few users
411         User u1 = um.createUser( "admin", "Administrator", "admin@somedomain.com" );
412         u1.setPassword( "adminpass" );
413         um.addUser( u1 );
414 
415         u1 = um.createUser( "administrator", "Administrator User", "administrator@somedomain.com" );
416         u1.setPassword( "password" );
417         um.addUser( u1 );
418 
419         u1 = um.createUser( "root", "Root User", "root@somedomain.com" );
420         u1.setPassword( "rootpass" );
421         um.addUser( u1 );
422 
423         assertEquals( 3, um.getUsers().size() );
424 
425         // Query by username
426         UserQuery query = um.createUserQuery();
427         query.setUsername( "Admin" );
428         assertEquals( 2, um.findUsersByQuery( query ).size() );
429 
430         // Query by full name
431         query = um.createUserQuery();
432         query.setFullName( "Admin" );
433         assertEquals( 2, um.findUsersByQuery( query ).size() );
434 
435         query = um.createUserQuery();
436         query.setFullName( "Administrator" );
437         assertEquals( 2, um.findUsersByQuery( query ).size() );
438 
439         query = um.createUserQuery();
440         query.setFullName( "r User" );
441         assertEquals( 1, um.findUsersByQuery( query ).size() );
442 
443         // Query by user name
444         query = um.createUserQuery();
445         query.setEmail( "somedomain" );
446         assertEquals( 3, um.findUsersByQuery( query ).size() );
447 
448         // Query by email
449         query = um.createUserQuery();
450         query.setEmail( "root@" );
451         assertEquals( 1, um.findUsersByQuery( query ).size() );
452 
453         // Query by illegal property
454         query = um.createUserQuery();
455         try
456         {
457             query.setOrderBy( "unknownString" );
458             fail( "Expected IllegalArgumentException" );
459         }
460         catch ( IllegalArgumentException e )
461         {
462 
463         }
464 
465         // Query with default ordering ascending
466         query = um.createUserQuery();
467         query.setOrderBy( UserQuery.ORDER_BY_EMAIL );
468         List<User> users = um.findUsersByQuery( query );
469         assertEquals( 3, users.size() );
470         assertEquals( "admin@somedomain.com", ( (User) users.get( 0 ) ).getEmail() );
471 
472         // Query with ordering ascending
473         query = um.createUserQuery();
474         query.setOrderBy( UserQuery.ORDER_BY_EMAIL );
475         query.setAscending( false );
476         users = um.findUsersByQuery( query );
477         assertEquals( 3, users.size() );
478         assertEquals( "root@somedomain.com", ( (User) users.get( 0 ) ).getEmail() );
479 
480         // Query with ordering descending, max 2 results
481         query = um.createUserQuery();
482         query.setOrderBy( UserQuery.ORDER_BY_EMAIL );
483         query.setAscending( false );
484         query.setMaxResults( 2 );
485         users = um.findUsersByQuery( query );
486         assertEquals( 2, users.size() );
487         assertEquals( "root@somedomain.com", ( (User) users.get( 0 ) ).getEmail() );
488 
489         // Query with ordering ascending, max 2 results, first result = 2 so only one result
490         query = um.createUserQuery();
491         query.setOrderBy( UserQuery.ORDER_BY_EMAIL );
492         query.setAscending( false );
493         query.setMaxResults( 2 );
494         query.setFirstResult( 2 );
495         users = um.findUsersByQuery( query );
496         assertEquals( 1, users.size() );
497         assertEquals( "admin@somedomain.com", ( (User) users.get( 0 ) ).getEmail() );
498 
499         // Query on more than one field
500         query = um.createUserQuery();
501         query.setOrderBy( UserQuery.ORDER_BY_EMAIL );
502         query.setFullName( "admin" );
503         query.setEmail( "admin@" );
504         users = um.findUsersByQuery( query );
505         assertEquals( 1, users.size() );
506         assertEquals( "admin@somedomain.com", ( (User) users.get( 0 ) ).getEmail() );
507     }
508 
509     @Test
510     public void testUserExists()
511         throws Exception
512     {
513         assertCleanUserManager();
514         securityPolicy.setEnabled( false );
515 
516         UserManager um = getUserManager();
517 
518         // create and add a few users
519         User u1 = um.createUser( "admin", "Administrator", "admin@somedomain.com" );
520         u1.setPassword( "adminpass" );
521         um.addUser( u1 );
522 
523         assertTrue( um.userExists( "admin" ) );
524         assertFalse( um.userExists( "voodoohatrack" ) );
525 
526         /* Check into the event tracker. */
527         assertEquals( EVENTTRACKERCOUNT, getEventTracker().countInit );
528         assertNotNull( getEventTracker().lastDbFreshness );
529         assertTrue( getEventTracker().lastDbFreshness.booleanValue() );
530 
531         assertEquals( 1, getEventTracker().addedUsernames.size() );
532         assertEquals( 0, getEventTracker().removedUsernames.size() );
533         assertEquals( 0, getEventTracker().updatedUsernames.size() );
534     }
535 
536     @Test
537     public void testUpdateUser()
538         throws Exception
539     {
540         assertCleanUserManager();
541         securityPolicy.setEnabled( false );
542 
543         UserManager um = getUserManager();
544 
545         // create and add a user
546         User u1 = um.createUser( "root", "Root User", "root@somedomain.com" );
547         u1.setPassword( "rootpass" );
548         u1 = um.addUser( u1 );
549 
550         // find user
551         User user = um.findUser( "root" );
552         assertNotNull( user );
553         assertEquals( u1, user );
554 
555         user.setEmail( "superuser@somedomain.com" );
556         user.setPassword( "superpass" );
557         user.setFullName( "Super User" );
558 
559         um.updateUser( user );
560 
561         // find updated user
562         user = um.findUser( "root" );
563         assertNotNull( user );
564         assertEquals( "superuser@somedomain.com", user.getEmail() );
565         assertEquals( "Super User", user.getFullName() );
566         assertTrue( securityPolicy.getPasswordEncoder().isPasswordValid( user.getEncodedPassword(), "superpass" ) );
567         
568         /* Check into the event tracker. */
569         assertEquals( EVENTTRACKERCOUNT, getEventTracker().countInit );
570         assertNotNull( getEventTracker().lastDbFreshness );
571         assertTrue( getEventTracker().lastDbFreshness.booleanValue() );
572 
573         assertEquals( 1, getEventTracker().addedUsernames.size() );
574         assertEquals( 0, getEventTracker().removedUsernames.size() );
575         assertEquals( 1, getEventTracker().updatedUsernames.size() );
576     }
577 
578     @Test
579     public void testDeletePermanentUser()
580         throws UserNotFoundException, UserManagerException
581     {
582         assertCleanUserManager();
583         securityPolicy.setEnabled( false );
584 
585         UserManager um = getUserManager();
586         User user = um.createUser( "admin", "Administrator", "admin@somedomain.com" );
587         user.setPassword( "adminpass" );
588         user.setPermanent( true );
589         user = um.addUser( user );
590 
591         assertEquals( 1, um.getUsers().size() );
592 
593         try
594         {
595             um.deleteUser( user.getUsername() );
596             fail( "Deleting permanent user shold throw PermanentUserException." );
597         }
598         catch ( PermanentUserException e )
599         {
600             // do nothing, expected route.
601         }
602 
603         assertEquals( 1, um.getUsers().size() );
604 
605         // attempt to finding user
606         User admin = um.findUser( "admin" );
607         assertNotNull( admin );
608         assertEquals( user.getEmail(), admin.getEmail() );
609         assertEquals( user.getFullName(), admin.getFullName() );
610         
611         /* Check into the event tracker. */
612         assertEquals( EVENTTRACKERCOUNT, getEventTracker().countInit );
613         assertNotNull( getEventTracker().lastDbFreshness );
614         assertTrue( getEventTracker().lastDbFreshness.booleanValue() );
615 
616         assertEquals( 1, getEventTracker().addedUsernames.size() );
617         assertEquals( 0, getEventTracker().removedUsernames.size() );
618         assertEquals( 0, getEventTracker().updatedUsernames.size() );
619     }
620 
621     public UserManagerEventTracker getEventTracker()
622     {
623         return eventTracker;
624     }
625 
626     public void setEventTracker( UserManagerEventTracker eventTracker )
627     {
628         this.eventTracker = eventTracker;
629     }
630 }