package org.ovirt.engine.core.dao;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
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.Date;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.junit.Before;
import org.junit.Test;
import org.ovirt.engine.core.common.businessentities.DbUser;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dal.dbbroker.user_sessions;
public class DbUserDAOTest extends BaseDAOTestCase {
private static final int USER_SESSION_COUNT = 5;
private static final String SESSION_ID = "21098765432109876543210987654321";
private DbUserDAO dao;
private DbUser existingUser;
private DbUser deletableUser;
private DbUser newUser;
private Guid vm;
private user_sessions newSession;
@Override
@Before
public void setUp() throws Exception {
super.setUp();
dao = prepareDAO(dbFacade.getDbUserDAO());
vm = new Guid("77296e00-0cad-4e5a-9299-008a7b6f4354");
existingUser = dao
.get(new Guid("9bf7c640-b620-456f-a550-0348f366544a"));
deletableUser = dao.get(new Guid("9bf7c640-b620-456f-a550-0348f366544b"));
newUser = new DbUser();
newUser.setname("Bob");
newUser.setsurname("Milqtoste");
newUser.setusername("newuser");
newUser.setemail("newuser@redhat.com");
newUser.setdomain("domain");
newUser.setgroups("groups");
newSession = new user_sessions();
newSession.setsession_id(SESSION_ID);
newSession.setuser_id(existingUser.getuser_id());
Date now = new Date();
now.setTime(System.currentTimeMillis());
newSession.setlogin_time(now);
}
/**
* Ensures that trying to get a user using an invalid id fails.
*/
@Test
public void testGetWithInvalidId() {
DbUser result = dao.get(Guid.NewGuid());
assertNull(result);
}
/**
* Ensures that retrieving an object by id works as expected.
*/
@Test
public void testGet() {
DbUser result = dao.get(existingUser.getuser_id());
assertNotNull(result);
assertEquals(existingUser, result);
}
/**
* Ensures that searching for a user by an unused name results in no user.
*/
@Test
public void testGetByUsernameWithInvalidName() {
DbUser result = dao.getByUsername("IdoNoExist");
assertNull(result);
}
/**
* Ensures that retrieving by username works.
*/
@Test
public void testGetByUsername() {
DbUser result = dao.getByUsername(existingUser.getusername());
assertNotNull(result);
assertEquals(existingUser, result);
}
/**
* Ensures that nothing is returned when the VM is invalid.
*/
@Test
public void testGetAllForVmWithInvalidVm() {
List<DbUser> result = dao.getAllForVm(Guid.NewGuid());
// TODO this should return an empty collection
assertTrue(result.isEmpty());
}
/**
* Ensures that retrieving all users for a VM works as expected.
*/
@Test
public void testGetAllForVm() {
List<DbUser> result = dao.getAllForVm(vm);
assertNotNull(result);
assertFalse(result.isEmpty());
}
@Test
public void testGetAllTimeLeasedUsersForVm() {
// TODO this API is broken and cannot be tested
}
@Test
public void testGetAll() {
List<DbUser> result = dao.getAll();
assertNotNull(result);
assertFalse(result.isEmpty());
assertEquals(2, result.size());
}
/**
* Retrieves all that match a specified query.
*/
@Test
public void testGetAllWithQuery() {
List<DbUser> result = dao.getAllWithQuery("select * from users");
assertFalse(result.isEmpty());
}
/**
* Ensures that the right number of sessions are returned.
*/
@Test
public void testGetAllUserSessions() {
List<user_sessions> result = dao.getAllUserSessions();
assertNotNull(result);
assertFalse(result.isEmpty());
assertEquals(USER_SESSION_COUNT, result.size());
}
/**
* Ensures that saving a user works as expected.
*/
@Test
public void testSave() {
dao.save(newUser);
DbUser result = dao.getByUsername(newUser.getusername());
assertEquals(newUser, result);
}
/**
* Ensures that saving a user works as expected.
*/
@Test
public void testSaveUserWithTooManyGroups() {
DbUser tooManyGroupsUser = new DbUser();
tooManyGroupsUser.setname("I");
tooManyGroupsUser.setsurname("Have");
tooManyGroupsUser.setusername("too");
tooManyGroupsUser.setemail("many@redhat.com");
tooManyGroupsUser.setdomain("domain");
tooManyGroupsUser.setgroups("groups");
// Using 2048 because that was the field size before the patch that changed it to text
tooManyGroupsUser.setGroupIds(StringUtils.leftPad("groups", 2048));
dao.save(tooManyGroupsUser);
DbUser result = dao.getByUsername(tooManyGroupsUser.getusername());
assertEquals(tooManyGroupsUser, result);
}
/**
* Ensures that saving a user session works as expected.
*/
@Test
public void testSaveSession() {
List<user_sessions> before = dao.getAllUserSessions();
dao.saveSession(newSession);
List<user_sessions> after = dao.getAllUserSessions();
assertTrue(after.size() > before.size());
boolean itWorked = false;
for (user_sessions session : after) {
itWorked |= newSession.equals(session);
}
assertTrue(itWorked);
}
/**
* Ensures that updating a user works as expected.
*/
@Test
public void testUpdate() {
existingUser.setname("changedname");
existingUser.setsurname("changedsurname");
dao.update(existingUser);
DbUser result = dao.get(existingUser.getuser_id());
assertEquals(existingUser, result);
}
/**
* Ensures that removing users works as expected.
*/
@Test
public void testRemove() {
dao.remove(deletableUser.getuser_id());
DbUser result = dao.get(deletableUser.getuser_id());
assertNull(result);
}
/**
* Ensures that removing a single session works as expected.
*/
@Test
public void testRemoveUserSession() {
List<user_sessions> before = dao.getAllUserSessions();
user_sessions deadSession = before.get(0);
dao.removeUserSession(deadSession.getsession_id(), deadSession.getuser_id());
List<user_sessions> after = dao.getAllUserSessions();
assertTrue(after.size() < before.size());
for (user_sessions session : after) {
if (deadSession.equals(session))
fail("The session should have been deleted.");
}
}
/**
* Ensures that removing all sessions works as expected.
*/
@Test
public void testRemoveAllSessions() {
dao.removeAllSessions();
List<user_sessions> result = dao.getAllUserSessions();
assertNotNull(result);
assertTrue(result.isEmpty());
}
}