/**
* <copyright> Copyright (c) 2008-2009 Jonas Helming, Maximilian Koegel. All rights reserved. This program and the
* accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this
* distribution, and is available at http://www.eclipse.org/legal/epl-v10.html </copyright>
*/
package org.eclipse.emf.emfstore.client.test.server;
import java.io.IOException;
import java.util.HashMap;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.emfstore.client.model.Configuration;
import org.eclipse.emf.emfstore.client.model.ServerInfo;
import org.eclipse.emf.emfstore.client.model.Usersession;
import org.eclipse.emf.emfstore.client.model.WorkspaceManager;
import org.eclipse.emf.emfstore.client.model.connectionmanager.ConnectionManager;
import org.eclipse.emf.emfstore.client.model.connectionmanager.KeyStoreManager;
import org.eclipse.emf.emfstore.client.model.util.EMFStoreCommand;
import org.eclipse.emf.emfstore.client.test.SetupHelper;
import org.eclipse.emf.emfstore.client.test.WorkspaceTest;
import org.eclipse.emf.emfstore.common.model.ModelFactory;
import org.eclipse.emf.emfstore.common.model.Project;
import org.eclipse.emf.emfstore.common.model.util.ModelUtil;
import org.eclipse.emf.emfstore.common.model.util.SerializationException;
import org.eclipse.emf.emfstore.server.ServerConfiguration;
import org.eclipse.emf.emfstore.server.accesscontrol.simple.SimplePermissionProvider;
import org.eclipse.emf.emfstore.server.exceptions.EmfStoreException;
import org.eclipse.emf.emfstore.server.model.ProjectId;
import org.eclipse.emf.emfstore.server.model.ProjectInfo;
import org.eclipse.emf.emfstore.server.model.SessionId;
import org.eclipse.emf.emfstore.server.model.accesscontrol.ACOrgUnitId;
import org.eclipse.emf.emfstore.server.model.accesscontrol.AccesscontrolFactory;
import org.eclipse.emf.emfstore.server.model.accesscontrol.PermissionSet;
import org.eclipse.emf.emfstore.server.model.versioning.ChangePackage;
import org.eclipse.emf.emfstore.server.model.versioning.HistoryQuery;
import org.eclipse.emf.emfstore.server.model.versioning.LogMessage;
import org.eclipse.emf.emfstore.server.model.versioning.PrimaryVersionSpec;
import org.eclipse.emf.emfstore.server.model.versioning.TagVersionSpec;
import org.eclipse.emf.emfstore.server.model.versioning.VersionSpec;
import org.eclipse.emf.emfstore.server.model.versioning.VersioningFactory;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
/**
* Superclass for server tests.
*
* @author wesendon
*/
public class ServerTests extends WorkspaceTest {
private static SessionId sessionId;
private static ConnectionManager connectionManager;
private int projectsOnServerBeforeTest;
private String writerRoleId;
private String readerRoleId;
private String adminRoleId;
private static HashMap<Class<?>, Object> arguments;
private static ServerInfo serverInfo;
public static void setServerInfo(ServerInfo server_Info) {
serverInfo = server_Info;
}
public static ServerInfo getServerInfo() {
return serverInfo;
}
/**
* @return the sessionId
*/
public static SessionId getSessionId() {
return sessionId;
}
public static void setSessionId(SessionId session_id) {
sessionId = session_id;
}
/**
* @return the connectionManager
*/
public static ConnectionManager getConnectionManager() {
return connectionManager;
}
public ProjectInfo getProjectInfo() {
return getProjectSpace().getProjectInfo();
}
public ProjectId getProjectId() {
return getProjectSpace().getProjectId();
}
public PrimaryVersionSpec getProjectVersion() {
return getProjectInfo().getVersion();
}
/**
* @return the projectsOnServerBeforeTest
*/
public int getProjectsOnServerBeforeTest() {
return projectsOnServerBeforeTest;
}
/**
* Start server and gain sessionid.
*
* @throws EmfStoreException in case of failure
* @throws IOException
*/
@BeforeClass
public static void setUpBeforeClass() throws EmfStoreException, IOException {
ServerConfiguration.setTesting(true);
Configuration.setTesting(true);
// delete all data before test start
SetupHelper.removeServerTestProfile();
SetupHelper.addUserFileToServer(false);
SetupHelper.startSever();
setConnectionManager(WorkspaceManager.getInstance().getConnectionManager());
setServerInfo(SetupHelper.getServerInfo());
// login();
initArguments();
}
/**
* sets users on server.
*
* @throws EmfStoreException in case of failure
*/
public void setupUsersAndRoles() throws EmfStoreException {
PermissionSet set = SetupHelper.updatePermissionSet(getSessionId());
if (set.getRole("Project Reader") == null) {
writerRoleId = SetupHelper.addRole(getSessionId(), set, "Project Writer",
SimplePermissionProvider.PROJECT_WRITER_PERMISSION, SimplePermissionProvider.PROJECT_READER_PERMISSION);
readerRoleId = SetupHelper.addRole(getSessionId(), set, "Project Reader",
SimplePermissionProvider.PROJECT_READER_PERMISSION);
adminRoleId = SetupHelper.addRole(getSessionId(), set, "Project Admin",
SimplePermissionProvider.PROJECT_WRITER_PERMISSION, SimplePermissionProvider.PROJECT_READER_PERMISSION,
SimplePermissionProvider.PROJECT_ADMIN_PERMISSION);
ACOrgUnitId orgUnitId = SetupHelper.createUserOnServer(getSessionId(), "reader").getId();
SetupHelper.addUsersRole(getSessionId(), orgUnitId.getId(), readerRoleId, getProjectId());
orgUnitId = SetupHelper.createUserOnServer(getSessionId(), "writer1").getId();
SetupHelper.addUsersRole(getSessionId(), orgUnitId.getId(), writerRoleId, getProjectId());
orgUnitId = SetupHelper.createUserOnServer(getSessionId(), "writer2").getId();
SetupHelper.addUsersRole(getSessionId(), orgUnitId.getId(), writerRoleId, getProjectId());
orgUnitId = SetupHelper.createUserOnServer(getSessionId(), "projectadmin").getId();
SetupHelper.addUsersRole(getSessionId(), orgUnitId.getId(), adminRoleId, getProjectId());
}
}
/**
* Sets the connection manager.
*
* @param cm connection manager
*/
protected static void setConnectionManager(ConnectionManager cm) {
connectionManager = cm;
}
/**
* @param serverInfo serverinfo
* @throws EmfStoreException in case of failure
*/
protected static void login() throws EmfStoreException {
SessionId sessionId = login(getServerInfo(), "super", "super");
setSessionId(sessionId);
}
/**
* @param serverInfo serverinfo
* @param username username
* @param password password
* @return sessionId
* @throws EmfStoreException in case of failure
*/
protected static SessionId login(ServerInfo serverInfo, String username, String password) throws EmfStoreException {
return getConnectionManager().logIn(username, KeyStoreManager.getInstance().encrypt(password, serverInfo),
serverInfo, Configuration.getClientVersion());
}
private static void initArguments() {
arguments = new HashMap<Class<?>, Object>();
arguments.put(boolean.class, false);
arguments.put(String.class, new String());
arguments.put(SessionId.class, EcoreUtil.copy(getSessionId()));
arguments.put(ProjectId.class, org.eclipse.emf.emfstore.server.model.ModelFactory.eINSTANCE.createProjectId());
arguments.put(PrimaryVersionSpec.class, VersioningFactory.eINSTANCE.createPrimaryVersionSpec());
arguments.put(VersionSpec.class, VersioningFactory.eINSTANCE.createPrimaryVersionSpec());
arguments.put(TagVersionSpec.class, VersioningFactory.eINSTANCE.createTagVersionSpec());
arguments.put(LogMessage.class, VersioningFactory.eINSTANCE.createLogMessage());
arguments.put(Project.class, ModelFactory.eINSTANCE.createProject());
arguments.put(ChangePackage.class, VersioningFactory.eINSTANCE.createChangePackage());
arguments.put(HistoryQuery.class, VersioningFactory.eINSTANCE.createHistoryQuery());
arguments.put(ChangePackage.class, VersioningFactory.eINSTANCE.createChangePackage());
arguments.put(ACOrgUnitId.class, AccesscontrolFactory.eINSTANCE.createACOrgUnitId());
}
/**
* Shuts down server after testing.
*/
@AfterClass
public static void tearDownAfterClass() {
SetupHelper.stopServer();
}
/**
* Adds a project to the server before test.
*
* @throws EmfStoreException in case of failure
*/
@Before
public void beforeTest() throws EmfStoreException {
new EMFStoreCommand() {
@Override
protected void doRun() {
try {
getProjectSpace().shareProject(TestSessionProvider.getInstance().getDefaultUsersession(), null);
// setupUsersAndRoles();
} catch (EmfStoreException e) {
Assert.fail(e.getMessage());
}
}
}.run(false);
// setProjectInfo(getConnectionManager().createProject(getSessionId(), "initialProject", "TestProject",
// SetupHelper.createLogMessage("super", "a logmessage"), getProject()));
this.projectsOnServerBeforeTest = 1;
}
/**
* Removes all projects from server after test.
*
* @throws EmfStoreException in case of failure
*/
@After
public void afterTest() throws EmfStoreException {
for (ProjectInfo info : WorkspaceManager.getInstance().getCurrentWorkspace()
.getRemoteProjectList(getServerInfo())) {
WorkspaceManager.getInstance().getCurrentWorkspace()
.deleteRemoteProject(getServerInfo(), info.getProjectId(), true);
}
SetupHelper.cleanupServer();
}
/**
* Sets up user on server.
*
* @param name name of the user (must be specified in users.properties)
* @param role of type RolesPackage.eINSTANCE.getWriterRole() or RolesPackage.eINSTANCE.getReaderRole() ....
* @throws EmfStoreException in case of failure
*/
/**
* Sets up usersession.
*
* @param name of the user (must be specified in users.properties)
* @param password of the user (must be specified in users.properties)
* @return established usersession
*/
public Usersession setUpUsersession(String username, String password) {
Usersession usersession = org.eclipse.emf.emfstore.client.model.ModelFactory.eINSTANCE.createUsersession();
usersession.setServerInfo(getServerInfo());
usersession.setUsername(username);
usersession.setPassword(password);
return usersession;
}
/**
* Compares two projects.
*
* @param expected expected
* @param compare to be compared
*/
public static void assertEqual(Project expected, Project compare) {
try {
if (!ModelUtil.eObjectToString(expected).equals(ModelUtil.eObjectToString(compare))) {
throw new AssertionError("Projects are not equal.");
}
} catch (SerializationException e) {
throw new AssertionError("Couldn't compare projects.");
}
}
/**
* Creates a historyquery.
*
* @param ver1 source
* @param ver2 target
* @return historyquery
*/
public static HistoryQuery createHistoryQuery(PrimaryVersionSpec ver1, PrimaryVersionSpec ver2) {
HistoryQuery historyQuery = VersioningFactory.eINSTANCE.createHistoryQuery();
historyQuery.setSource(EcoreUtil.copy(ver1));
historyQuery.setTarget(EcoreUtil.copy(ver2));
return historyQuery;
}
/**
* Get a default Parameter.
*
* @param clazz parameter type
* @param b if false, null is returned
* @return parameter
*/
protected static Object getParameter(Class<?> clazz, boolean b) {
if (clazz.equals(boolean.class)) {
return false;
}
return (b) ? arguments.get(clazz) : null;
}
public String getReaderRoleId() {
return readerRoleId;
}
public String getWriterRoleId() {
return writerRoleId;
}
public String getAdminRoleId() {
return adminRoleId;
}
}