/* * Copyright 2013, CMM, University of Queensland. * * This file is part of Eccles. * * Eccles is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Eccles is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Eccles. If not, see <http://www.gnu.org/licenses/>. */ package au.edu.uq.cmm.eccles; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.Collections; import java.util.HashMap; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; import javax.persistence.PersistenceException; import javax.persistence.TypedQuery; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import au.edu.uq.cmm.aclslib.authenticator.AclsLoginDetails; import au.edu.uq.cmm.aclslib.message.Certification; public class UserDetailsManagerTest { private static EntityManagerFactory EMF; private static EcclesFacility[] FACILITIES; private static final Logger LOG = LoggerFactory.getLogger(UserDetailsManagerTest.class); @SuppressWarnings("serial") @BeforeClass public static void setup() { FACILITIES = new EcclesFacility[]{ buildFacility("test0"), buildFacility("test1"), buildFacility("test2")}; EMF = Persistence.createEntityManagerFactory("au.edu.uq.cmm.paul"); EntityManager em = EMF.createEntityManager(); try { em.getTransaction().begin(); TypedQuery<UserDetails> query = em.createQuery("from UserDetails", UserDetails.class); for (UserDetails ud : query.getResultList()) { em.remove(ud); } em.getTransaction().commit(); em.getTransaction().begin(); UserDetails ud = buildUserDetails( "jim", "jim", "jim@nowhere", "Jim Spriggs", "CMMMM"); ud.setCertifications(new HashMap<String, String>(){{ put("test1", Certification.VALID.toString()); put("test2", Certification.NONE.toString()); }}); em.persist(ud); ud = buildUserDetails( "neddy", null, "neddy@nowhere", "Neddy Seagoon", "CMMMM"); ud.setAccounts(Collections.singleton("buy all")); em.persist(ud); em.getTransaction().commit(); } finally { emClose(em); } } private static EcclesFacility buildFacility(String name) { EcclesFacility res = new EcclesFacility(); res.setFacilityName(name); return res; } private static UserDetails buildUserDetails( String userName, String password, String emailAddress, String humanReadable, String organization) { UserDetails ud = new UserDetails(userName); ud.setEmailAddress(emailAddress); ud.setHumanReadableName(humanReadable); ud.setOrgName(organization); if (password != null) { ud.setDigest(EcclesUserDetailsManager.createDigest(password, 42)); ud.setSeed(42); } return ud; } @AfterClass public static void teardown() { LOG.debug("closing EMF"); EMF.close(); } @Test public void testConstructor() { new EcclesUserDetailsManager(EMF, EcclesFallbackMode.NO_FALLBACK); } @Test public void testLookup() throws UserDetailsException { EcclesUserDetailsManager udm = new EcclesUserDetailsManager(EMF, EcclesFallbackMode.NO_FALLBACK); UserDetails ud = udm.lookupUser("jim", true); assertEquals("jim", ud.getUserName()); assertEquals("jim@nowhere", ud.getEmailAddress()); assertEquals("CMMMM", ud.getOrgName()); assertEquals("Jim Spriggs", ud.getHumanReadableName()); assertEquals(Collections.emptySet(), ud.getAccounts()); assertEquals(2, ud.getCertifications().size()); ud = udm.lookupUser("jim", false); assertEquals("jim", ud.getUserName()); assertEquals("jim@nowhere", ud.getEmailAddress()); assertEquals("CMMMM", ud.getOrgName()); assertEquals("Jim Spriggs", ud.getHumanReadableName()); try { ud.getAccounts(); } catch (PersistenceException ex) { // } try { ud.getCertifications(); } catch (PersistenceException ex) { // } try { ud = udm.lookupUser("nobody", true); fail("No exception"); } catch (UserDetailsException ex) { assertEquals("User 'nobody' not found", ex.getMessage()); } } @Test public void testUsersAndNames() throws UserDetailsException { EcclesUserDetailsManager udm = new EcclesUserDetailsManager(EMF, EcclesFallbackMode.NO_FALLBACK); List<String> names = udm.getUserNames(); assertEquals(2, names.size()); assertTrue(names.contains("jim")); assertTrue(names.contains("neddy")); List<UserDetails> users = udm.getUsers(); assertEquals(2, users.size()); } @Test public void testAddAndRemove() throws UserDetailsException { EcclesUserDetailsManager udm = new EcclesUserDetailsManager(EMF, EcclesFallbackMode.NO_FALLBACK); assertEquals(2, udm.getUserNames().size()); udm.addUser(new UserDetails("bert")); assertEquals(3, udm.getUserNames().size()); udm.removeUser("bert"); assertEquals(2, udm.getUserNames().size()); } @Test public void testAuthenticate1() { EcclesUserDetailsManager udm = new EcclesUserDetailsManager(EMF, EcclesFallbackMode.NO_FALLBACK); assertNull(udm.authenticate("jim", "jim", FACILITIES[0])); } @Test public void testAuthenticate2() { EcclesUserDetailsManager udm = new EcclesUserDetailsManager(EMF, EcclesFallbackMode.USER_PASSWORD); assertNull(udm.authenticate("eric", "eric", FACILITIES[0])); assertNull(udm.authenticate("jim", "eric", FACILITIES[0])); assertNull(udm.authenticate("neddy", "eric", FACILITIES[0])); AclsLoginDetails ud = udm.authenticate("jim", "jim", FACILITIES[0]); assertNotNull(ud); assertEquals("jim", ud.getUserName()); assertEquals("Jim Spriggs", ud.getHumanReadableName()); assertEquals(Certification.VALID, ud.getCertification()); ud = udm.authenticate("jim", "jim", FACILITIES[1]); assertEquals(Certification.VALID, ud.getCertification()); ud = udm.authenticate("jim", "jim", FACILITIES[2]); assertEquals(Certification.NONE, ud.getCertification()); assertEquals(Collections.singletonList("unknown account"), ud.getAccounts()); } @Test public void testAuthenticate3() { EcclesUserDetailsManager udm = new EcclesUserDetailsManager(EMF, EcclesFallbackMode.USER_PASSWORD_OPTIONAL); assertNull(udm.authenticate("eric", "eric", FACILITIES[0])); assertNull(udm.authenticate("jim", "eric", FACILITIES[0])); assertNotNull(udm.authenticate("jim", "jim", FACILITIES[0])); AclsLoginDetails ud = udm.authenticate("neddy", "eric", FACILITIES[0]); assertNotNull(ud); assertEquals(Collections.singletonList("buy all"), ud.getAccounts()); } @Test public void testAuthenticate4() { EcclesUserDetailsManager udm = new EcclesUserDetailsManager(EMF, EcclesFallbackMode.USER_ONLY); assertNull(udm.authenticate("eric", "eric", FACILITIES[0])); assertNotNull(udm.authenticate("jim", "eric", FACILITIES[0])); assertNotNull(udm.authenticate("jim", "jim", FACILITIES[0])); assertNotNull(udm.authenticate("neddy", "eric", FACILITIES[0])); } private static void emClose(EntityManager em) { EntityTransaction t = em.getTransaction(); if (t.isActive()) { LOG.error("Rolling back a stale transaction!!"); t.rollback(); } em.close(); } }