package org.ovirt.engine.core.itests;
import static org.junit.Assert.assertNotNull;
import java.util.List;
import org.jboss.embedded.Bootstrap;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.ovirt.engine.core.bll.Backend;
import org.ovirt.engine.core.bll.InitBackendServicesOnStartup;
import org.ovirt.engine.core.bll.InitBackendServicesOnStartupBean;
import org.ovirt.engine.core.bll.MultiLevelAdministrationHandler;
import org.ovirt.engine.core.bll.PredefinedRoles;
import org.ovirt.engine.core.bll.interfaces.BackendInternal;
import org.ovirt.engine.core.bll.session.SessionDataContainer;
import org.ovirt.engine.core.common.VdcObjectType;
import org.ovirt.engine.core.common.action.VdcActionParametersBase;
import org.ovirt.engine.core.common.businessentities.DbUser;
import org.ovirt.engine.core.common.businessentities.permissions;
import org.ovirt.engine.core.common.queries.VdcQueryParametersBase;
import org.ovirt.engine.core.common.users.VdcUser;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
import org.ovirt.engine.core.utils.ThreadLocalParamsContainer;
import org.ovirt.engine.core.utils.ejb.EjbUtils;
import org.ovirt.engine.core.utils.ejb.JBossEmbeddedEJBUtilsStrategy;
import org.ovirt.engine.core.utils.timer.SchedulerUtilQuartzImpl;
/**
* A self contained, ready to use JBoss loader to test backend flows, actions, queries etc. This class starts a stripped
* embedded JBoss with a DB data-source and all required EJB's registered. In order to perform a unit test one has to
* extend this class and created add a test method of its own.(simple void method annotated with @Test) The class
* Junit's <code>BeforeClass</code> method will start the embedded JBoss container. Check list for the test to startup:
* 1.make sure your current machine doesn't run JBoss already ("port already in use error...") 2.make sure the test runs
* with JVM flag -Dsun.lang.ClassLoader.allowArraySyntax=true
*
*/
public abstract class AbstractBackendTest {
private static String SESSION;
protected static Bootstrap bootstrap;
protected static BackendInternal backend;
private static BasicTestSetup basicTestSetup;
public static String testSequence;
private static VdcUser user;
private static String sessionId;
@BeforeClass
public static void startJboss() throws Exception {
try {
bootstrap = Bootstrap.getInstance();
if (!bootstrap.isStarted()) {
bootstrap.bootstrap();
EjbUtils.setStrategy(new JBossEmbeddedEJBUtilsStrategy());
bootstrap.deployResourceBase(SchedulerUtilQuartzImpl.class);
SchedulerUtilQuartzImpl.getInstance().create(); // Start is
// called as
// post
// construct is
// not activated
// upon lookup
// replace this resource manager with a test resource manager
// for we wont have real hosts while testing
bootstrap.deployResourceBase(VoidResourceManager.class);
// bootstrap.deployResourceBase(Backend.class);
backend = Backend.getInstance();
assertNotNull(backend);
backend.Initialize(); // Initialize is called as post construct
// is not activated upon lookup
InitBackendServicesOnStartup initBean = new InitBackendServicesOnStartupBean();
initBean.create();
}
} catch (Throwable ex) {
ex.printStackTrace();
throw new Exception(ex);
}
}
@Before
public void setup() throws Exception {
testSequence = "-JUnit-" + System.currentTimeMillis();
System.out.println("\n\tReady to run tests.\n\t your test sequence is " + testSequence);
generateUserSession();
}
@After
public void cleanup() {
if (basicTestSetup != null) {
runAsSuperAdmin();
basicTestSetup.cleanSetup();
basicTestSetup = null;
} else {
removeSessionUser();
}
}
/**
*
* Creates a user and put it on the session.Mainly needed for different permissions tests.
*
* This method is being called automatically by the JUnit framework using {@link #createSessionAndRandomUser()}
*/
private static void generateUserSession() {
sessionId = "SESSIONID" + testSequence;
String domain = "example.com";
String groupName = "JUnitTester";
// add user to db
VdcUser vdcUser = new VdcUser();
vdcUser.setUserId(Guid.NewGuid());
vdcUser.setDomainControler(domain);
vdcUser.setUserName(groupName);
vdcUser.setGroupNames(groupName);
DbUser dbUser = new DbUser();
dbUser.setuser_id(vdcUser.getUserId());
dbUser.setusername(vdcUser.getUserName());
dbUser.setdomain(vdcUser.getDomainControler());
dbUser.setgroups(vdcUser.getGroupNames());
DbFacade.getInstance().getDbUserDAO().save(dbUser);
SessionDataContainer.getInstance().SetData(getSessionId(), "VdcUser", vdcUser);
ThreadLocalParamsContainer.setHttpSessionId(getSessionId());
ThreadLocalParamsContainer.setVdcUser(vdcUser);
user = vdcUser;
}
/**
* make the current user SuperAdmin by adding him permissions of SuperUser role on SYSTEM object
*/
public static void runAsSuperAdmin() {
if (sessionId == null) {
generateUserSession();
}
permissions perms = new permissions();
perms.setad_element_id(user.getUserId());
perms.setObjectId(MultiLevelAdministrationHandler.SYSTEM_OBJECT_ID);
perms.setObjectType(VdcObjectType.System);
perms.setrole_id(PredefinedRoles.SUPER_USER.getId());
try {
DbFacade.getInstance().getPermissionDAO().save(perms);
} catch (Exception e) {
System.out.println("User is already super user.");
}
}
/**
* @return {@link BasicTestSetup} instance(one per test run) with entities ready to perform action on
*/
protected BasicTestSetup getBasicSetup() {
if (basicTestSetup == null) {
basicTestSetup = new BasicTestSetup(backend);
}
return basicTestSetup;
}
public static String getSessionId() {
return sessionId;
}
public static VdcActionParametersBase sessionize(VdcActionParametersBase params) {
params.setSessionId(getSessionId());
return params;
}
public static VdcQueryParametersBase sessionize(VdcQueryParametersBase params) {
params.setSessionId(getSessionId());
return params;
}
public static VdcUser getUser() {
return user;
}
protected static void removeSessionUser() {
if (getUser() != null) {
List<permissions> perms =
DbFacade.getInstance().getPermissionDAO().getAllForAdElement(getUser().getUserId());
for (permissions perm : perms) {
DbFacade.getInstance().getPermissionDAO().remove(perm.getId());
}
DbFacade.getInstance().getDbUserDAO().remove(getUser().getUserId());
}
}
}