/** * Abiquo community edition * cloud management application for hybrid clouds * Copyright (C) 2008-2010 - Abiquo Holdings S.L. * * This application is free software; you can redistribute it and/or * modify it under the terms of the GNU LESSER GENERAL PUBLIC * LICENSE as published by the Free Software Foundation under * version 3 of the License * * This software 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 * LESSER GENERAL PUBLIC LICENSE v.3 for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ package com.abiquo.server.core.enterprise; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.persistence.EntityManager; import org.testng.Assert; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import com.abiquo.model.enumerator.Privileges; import com.abiquo.server.core.cloud.VirtualDatacenter; import com.abiquo.server.core.common.persistence.DefaultDAOTestBase; import com.abiquo.server.core.common.persistence.TestDataAccessManager; import com.softwarementors.bzngine.engines.jpa.test.configuration.EntityManagerFactoryForTesting; import com.softwarementors.bzngine.entities.test.PersistentInstanceTester; import com.softwarementors.commons.testng.AssertEx; public class UserDAOTest extends DefaultDAOTestBase<UserDAO, User> { @Override @BeforeMethod protected void methodSetUp() { super.methodSetUp(); } @Override protected UserDAO createDao(final EntityManager entityManager) { return new UserDAO(entityManager); } @Override protected PersistentInstanceTester<User> createEntityInstanceGenerator() { return new UserGenerator(getSeed()); } @Override protected EntityManagerFactoryForTesting getFactory() { return TestDataAccessManager.getFactory(); } @Override public UserGenerator eg() { return (UserGenerator) super.eg(); } @Test public void findConnected() { User user = eg().createUserWithSession(); User userWithoutSession = eg().createInstance(user.getEnterprise(), user.getRole()); List<Object> entitiesToPersist = new ArrayList<Object>(); for (Privilege privilege : user.getRole().getPrivileges()) { entitiesToPersist.add(privilege); } entitiesToPersist.add(user.getEnterprise()); entitiesToPersist.add(user.getRole()); entitiesToPersist.add(user); entitiesToPersist.add(userWithoutSession); ds().persistAll(entitiesToPersist.toArray()); UserDAO dao = createDaoForRollbackTransaction(); Collection<User> users = dao.find(user.getEnterprise(), null, null, null, false, true, 0, 25); AssertEx.assertSize(users, 1); users = dao.find(null, null, null, null, false, true, 0, 25); AssertEx.assertSize(users, 1); users = dao.find(user.getEnterprise(), null, null, null, false, false, 0, 25); AssertEx.assertSize(users, 2); } @Test public void getAbiquoUserByLogin() { User user1 = eg().createInstance(User.AuthType.ABIQUO); List<Object> entitiesToPersist = new ArrayList<Object>(); entitiesToPersist.add(user1.getEnterprise()); for (Privilege p : user1.getRole().getPrivileges()) { entitiesToPersist.add(p); } entitiesToPersist.add(user1.getRole()); entitiesToPersist.add(user1); ds().persistAll(entitiesToPersist.toArray()); UserDAO dao = createDaoForRollbackTransaction(); User user = dao.getAbiquoUserByLogin(user1.getNick()); Assert.assertNotNull(user); } @Test public void getUserByAuth() { User user1 = eg().createInstance(User.AuthType.ABIQUO); List<Object> entitiesToPersist = new ArrayList<Object>(); entitiesToPersist.add(user1.getEnterprise()); for (Privilege p : user1.getRole().getPrivileges()) { entitiesToPersist.add(p); } entitiesToPersist.add(user1.getRole()); entitiesToPersist.add(user1); ds().persistAll(entitiesToPersist.toArray()); UserDAO dao = createDaoForRollbackTransaction(); User user = dao.getUserByAuth(user1.getNick(), User.AuthType.ABIQUO); Assert.assertNotNull(user); } @Test public void existAnyUserWithNickAndAuth() { User user1 = eg().createInstance(User.AuthType.ABIQUO); List<Object> entitiesToPersist = new ArrayList<Object>(); entitiesToPersist.add(user1.getEnterprise()); for (Privilege p : user1.getRole().getPrivileges()) { entitiesToPersist.add(p); } entitiesToPersist.add(user1.getRole()); entitiesToPersist.add(user1); ds().persistAll(entitiesToPersist.toArray()); UserDAO dao = createDaoForRollbackTransaction(); boolean already = dao.existAnyUserWithNickAndAuth(user1.getNick(), User.AuthType.ABIQUO); Assert.assertTrue(already); } // Virtual Datacenter @Test public void sysadminUserIsAllowedToUseOwnVDC() { Map<String, Object> map = setupSysadminUser(); User user = (User) map.get("sysadmin"); String[] ps = (String[]) map.get("sysadmin.privileges"); VirtualDatacenter vdc = (VirtualDatacenter) map.get("sysadmin.virtualdatacenter"); UserDAO dao = createDaoForRollbackTransaction(); boolean isAllowed = dao.isUserAllowedToUseVirtualDatacenter(user.getNick(), user.getAuthType().name(), ps, vdc.getId()); Assert.assertTrue(isAllowed); } @Test public void infrastructureUserIsAllowedToUseOwnVDC() { Map<String, Object> map = setupInfrastructureUser(); User user = (User) map.get("infUser"); String[] ps = (String[]) map.get("infUser.privileges"); VirtualDatacenter vdc = (VirtualDatacenter) map.get("infUser.virtualdatacenter"); UserDAO dao = createDaoForRollbackTransaction(); boolean isAllowed = dao.isUserAllowedToUseVirtualDatacenter(user.getNick(), user.getAuthType().name(), ps, vdc.getId()); Assert.assertTrue(isAllowed); } @Test public void userIsAllowedToUseOwnVDC() { Map<String, Object> map = setupNormalUser(null); User user = (User) map.get("user"); String[] ps = (String[]) map.get("user.privileges"); VirtualDatacenter vdc = (VirtualDatacenter) map.get("user.virtualdatacenter"); UserDAO dao = createDaoForRollbackTransaction(); boolean isAllowed = dao.isUserAllowedToUseVirtualDatacenter(user.getNick(), user.getAuthType().name(), ps, vdc.getId()); Assert.assertTrue(isAllowed); } @Test public void sysadminIsAllowedToUseOtherEnterpriseVDC() { Map<String, Object> map = setupSysadminUserAndNormalUser(null); User user = (User) map.get("sysadmin"); String[] ps = (String[]) map.get("sysadmin.privileges"); VirtualDatacenter vdc = (VirtualDatacenter) map.get("user.virtualdatacenter"); UserDAO dao = createDaoForRollbackTransaction(); boolean isAllowed = dao.isUserAllowedToUseVirtualDatacenter(user.getNick(), user.getAuthType().name(), ps, vdc.getId()); Assert.assertTrue(isAllowed); } @Test public void infrastructureUserIsAllowedToUseOtherEnterpriseVDC() { Map<String, Object> map = setupSysadminUserAndInfrastructureUser(); User user = (User) map.get("infUser"); String[] ps = (String[]) map.get("infUser.privileges"); VirtualDatacenter vdc = (VirtualDatacenter) map.get("sysadmin.virtualdatacenter"); UserDAO dao = createDaoForRollbackTransaction(); boolean isAllowed = dao.isUserAllowedToUseVirtualDatacenter(user.getNick(), user.getAuthType().name(), ps, vdc.getId()); Assert.assertTrue(isAllowed); } @Test public void userIsNOTAllowedToUserOtherEnterpriseVDC() { Map<String, Object> map = setupSysadminUserAndNormalUser(null); User user = (User) map.get("user"); String[] ps = (String[]) map.get("user.privileges"); VirtualDatacenter vdc = (VirtualDatacenter) map.get("sysadmin.virtualdatacenter"); UserDAO dao = createDaoForRollbackTransaction(); boolean isAllowed = dao.isUserAllowedToUseVirtualDatacenter(user.getNick(), user.getAuthType().name(), ps, vdc.getId()); Assert.assertFalse(isAllowed); } @Test public void userIsNOTAllowedToUserOwnEnterpriseVDCRestricted() { Map<String, Object> map = setupSysadminUserAndNormalUser(true); User user = (User) map.get("user"); String[] ps = (String[]) map.get("user.privileges"); VirtualDatacenter vdc = (VirtualDatacenter) map.get("user.virtualdatacenter"); UserDAO dao = createDaoForRollbackTransaction(); boolean isAllowed = dao.isUserAllowedToUseVirtualDatacenter(user.getNick(), user.getAuthType().name(), ps, vdc.getId()); Assert.assertFalse(isAllowed); } @Test public void userIsAllowedToUserOwnEnterpriseVDCRestricted() { Map<String, Object> map = setupSysadminUserAndNormalUser(false); User user = (User) map.get("user"); String[] ps = (String[]) map.get("user.privileges"); VirtualDatacenter vdc = (VirtualDatacenter) map.get("user.virtualdatacenter"); UserDAO dao = createDaoForRollbackTransaction(); boolean isAllowed = dao.isUserAllowedToUseVirtualDatacenter(user.getNick(), user.getAuthType().name(), ps, vdc.getId()); Assert.assertTrue(isAllowed); } // Enterprise @Test public void sysadminUserIsAllowedToOwnEnterprise() { Map<String, Object> map = setupSysadminUser(); User user = (User) map.get("sysadmin"); String[] ps = (String[]) map.get("sysadmin.privileges"); Enterprise ent = (Enterprise) map.get("sysadmin.enterprise"); UserDAO dao = createDaoForRollbackTransaction(); boolean isAllowed = dao.isUserAllowedToEnterprise(user.getNick(), user.getAuthType().name(), ps, ent.getId()); Assert.assertTrue(isAllowed); } @Test public void userIsAllowedToUseOwnEnterprise() { Map<String, Object> map = setupNormalUser(null); User user = (User) map.get("user"); String[] ps = (String[]) map.get("user.privileges"); Enterprise ent = (Enterprise) map.get("user.enterprise"); UserDAO dao = createDaoForRollbackTransaction(); boolean isAllowed = dao.isUserAllowedToEnterprise(user.getNick(), user.getAuthType().name(), ps, ent.getId()); Assert.assertTrue(isAllowed); } @Test public void infrastructureUserIsAllowedToUseOwnEnteprise() { Map<String, Object> map = setupInfrastructureUser(); User user = (User) map.get("infUser"); String[] ps = (String[]) map.get("infUser.privileges"); Enterprise ent = (Enterprise) map.get("infUser.enterprise"); UserDAO dao = createDaoForRollbackTransaction(); boolean isAllowed = dao.isUserAllowedToEnterprise(user.getNick(), user.getAuthType().name(), ps, ent.getId()); Assert.assertTrue(isAllowed); } @Test public void sysadminIsAllowedToUseOtherEnterprise() { Map<String, Object> map = setupSysadminUserAndNormalUser(null); User user = (User) map.get("sysadmin"); String[] ps = (String[]) map.get("sysadmin.privileges"); Enterprise ent = (Enterprise) map.get("user.enterprise"); UserDAO dao = createDaoForRollbackTransaction(); boolean isAllowed = dao.isUserAllowedToEnterprise(user.getNick(), user.getAuthType().name(), ps, ent.getId()); Assert.assertTrue(isAllowed); } @Test public void userIsNOTAllowedToUseOtherEnterprise() { Map<String, Object> map = setupSysadminUserAndNormalUser(null); User user = (User) map.get("user"); String[] ps = (String[]) map.get("user.privileges"); Enterprise ent = (Enterprise) map.get("sysadmin.enterprise"); UserDAO dao = createDaoForRollbackTransaction(); boolean isAllowed = dao.isUserAllowedToEnterprise(user.getNick(), user.getAuthType().name(), ps, ent.getId()); Assert.assertFalse(isAllowed); } @Test public void infrastructureUserIsAllowedToUseOtherEnteprise() { Map<String, Object> map = setupSysadminUserAndInfrastructureUser(); User user = (User) map.get("infUser"); String[] ps = (String[]) map.get("infUser.privileges"); Enterprise ent = (Enterprise) map.get("sysadmin.enterprise"); UserDAO dao = createDaoForRollbackTransaction(); boolean isAllowed = dao.isUserAllowedToEnterprise(user.getNick(), user.getAuthType().name(), ps, ent.getId()); Assert.assertTrue(isAllowed); } // ----------------------- // // Private usefull methods // // ----------------------- // private Map<String, Object> setupSysadminUser() { Map<String, Object> map = new HashMap<String, Object>(); // sysadmin User sysadmin = eg().createInstance(User.AuthType.ABIQUO); VirtualDatacenter sysadminVdc = eg().virtualDatacenterGenerator.createInstance(sysadmin.getEnterprise()); List<Object> sysadminEntitiesToPersist = new ArrayList<Object>(); List<Privilege> sysadminPrivileges = sysadmin.getRole().getPrivileges(); sysadminEntitiesToPersist.add(sysadmin.getEnterprise()); String[] sysadminPrivs = new String[sysadminPrivileges.size()]; for (int i = 0; i < sysadminPrivileges.size(); i++) { Privilege p = sysadminPrivileges.get(i); sysadminEntitiesToPersist.add(p); sysadminPrivs[i] = p.getName(); } sysadminEntitiesToPersist.add(sysadmin.getRole()); sysadminEntitiesToPersist.add(sysadmin); eg().virtualDatacenterGenerator.addAuxiliaryEntitiesToPersist(sysadminVdc, sysadminEntitiesToPersist); sysadminEntitiesToPersist.add(sysadminVdc); ds().persistAll(sysadminEntitiesToPersist.toArray()); map.put("sysadmin", sysadmin); map.put("sysadmin.virtualdatacenter", sysadminVdc); map.put("sysadmin.privileges", sysadminPrivs); map.put("sysadmin.enterprise", sysadmin.getEnterprise()); return map; } private Map<String, Object> setupNormalUser(final Boolean restrictVdc) { Map<String, Object> map = new HashMap<String, Object>(); // user Role userRole = eg().roleGenerator.createInstance(Privileges.simpleRole()); User user = eg().createInstance(User.AuthType.ABIQUO, userRole); VirtualDatacenter userVdc = eg().virtualDatacenterGenerator.createInstance(user.getEnterprise()); List<Object> userEntitiesToPersist = new ArrayList<Object>(); List<Privilege> userPrivileges = user.getRole().getPrivileges(); userEntitiesToPersist.add(user.getEnterprise()); eg().virtualDatacenterGenerator.addAuxiliaryEntitiesToPersist(userVdc, userEntitiesToPersist); userEntitiesToPersist.add(userVdc); ds().persistAll(userEntitiesToPersist.toArray()); if (restrictVdc != null) { if (restrictVdc) { // not allowed user.setAvailableVirtualDatacenters(userVdc.getId() - 1 + "," + userVdc.getId() + 1); } else { // allowed user.setAvailableVirtualDatacenters(userVdc.getId() - 1 + "," + userVdc.getId()); } } userEntitiesToPersist = new ArrayList<Object>(); String[] userPrivs = new String[userPrivileges.size()]; for (int i = 0; i < userPrivileges.size(); i++) { Privilege p = userPrivileges.get(i); userEntitiesToPersist.add(p); userPrivs[i] = p.getName(); } userEntitiesToPersist.add(user.getRole()); userEntitiesToPersist.add(user); ds().persistAll(userEntitiesToPersist.toArray()); map.put("user", user); map.put("user.virtualdatacenter", userVdc); map.put("user.privileges", userPrivs); map.put("user.enterprise", user.getEnterprise()); return map; } private Map<String, Object> setupInfrastructureUser() { Map<String, Object> map = new HashMap<String, Object>(); // user Role userRole = eg().roleGenerator.createInstance(Privileges.PHYS_DC_RETRIEVE_DETAILS); User user = eg().createInstance(User.AuthType.ABIQUO, userRole); user.setNick("infUser"); VirtualDatacenter userVdc = eg().virtualDatacenterGenerator.createInstance(user.getEnterprise()); List<Object> userEntitiesToPersist = new ArrayList<Object>(); List<Privilege> userPrivileges = user.getRole().getPrivileges(); userEntitiesToPersist.add(user.getEnterprise()); eg().virtualDatacenterGenerator.addAuxiliaryEntitiesToPersist(userVdc, userEntitiesToPersist); userEntitiesToPersist.add(userVdc); ds().persistAll(userEntitiesToPersist.toArray()); userEntitiesToPersist = new ArrayList<Object>(); String[] userPrivs = new String[userPrivileges.size()]; for (int i = 0; i < userPrivileges.size(); i++) { Privilege p = userPrivileges.get(i); userEntitiesToPersist.add(p); userPrivs[i] = p.getName(); } userEntitiesToPersist.add(user.getRole()); userEntitiesToPersist.add(user); ds().persistAll(userEntitiesToPersist.toArray()); map.put("infUser", user); map.put("infUser.virtualdatacenter", userVdc); map.put("infUser.privileges", userPrivs); map.put("infUser.enterprise", user.getEnterprise()); return map; } private Map<String, Object> setupSysadminUserAndNormalUser(final Boolean restrictVdc) { Map<String, Object> map = setupSysadminUser(); map.putAll(setupNormalUser(restrictVdc)); return map; } private Map<String, Object> setupSysadminUserAndInfrastructureUser() { Map<String, Object> map = setupSysadminUser(); map.putAll(setupInfrastructureUser()); return map; } }