blob: b09ad36ad15734632d856897cb99222cc13501e7 [file] [log] [blame]
/*
* Copyright (c) 2008-2013, 2015, 2016, 2018-2020 Eike Stepper (Loehne, Germany) and others.
* 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
*
* Contributors:
* Eike Stepper - initial API and implementation
* Christian W. Damus (CEA LIST) - bgu 418454
*/
package org.eclipse.emf.cdo.tests;
import org.eclipse.emf.cdo.common.revision.CDORevisionUtil;
import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.server.IRepository;
import org.eclipse.emf.cdo.server.ISession;
import org.eclipse.emf.cdo.session.CDOSession;
import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionCache;
import org.eclipse.emf.cdo.spi.server.ISessionProtocol;
import org.eclipse.emf.cdo.tests.config.ISessionConfig;
import org.eclipse.emf.cdo.tests.config.impl.RepositoryConfig;
import org.eclipse.emf.cdo.tests.config.impl.SessionConfig;
import org.eclipse.emf.cdo.tests.config.impl.SessionConfig.Net4j;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.util.CommitException;
import org.eclipse.emf.cdo.view.CDOView;
import org.eclipse.net4j.acceptor.IAcceptor;
import org.eclipse.net4j.channel.IChannel;
import org.eclipse.net4j.connector.IConnector;
import org.eclipse.net4j.signal.ISignalProtocol;
import org.eclipse.net4j.signal.SignalProtocol.TimeoutChangedEvent;
import org.eclipse.net4j.util.WrappedException;
import org.eclipse.net4j.util.container.ContainerEventAdapter;
import org.eclipse.net4j.util.container.IContainer;
import org.eclipse.net4j.util.event.IEvent;
import org.eclipse.net4j.util.event.IListener;
import org.eclipse.net4j.util.om.OMPlatform;
import org.eclipse.net4j.util.om.log.OMLogHandler;
import org.eclipse.net4j.util.om.log.OMLogger;
import org.eclipse.net4j.util.security.NotAuthenticatedException;
import org.eclipse.net4j.util.security.PasswordCredentials;
import org.eclipse.net4j.util.security.PasswordCredentialsProvider;
import org.eclipse.net4j.util.security.UserManager;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.util.EContentAdapter;
import org.eclipse.emf.spi.cdo.InternalCDOSession;
import java.util.Collection;
import java.util.concurrent.CountDownLatch;
/**
* @author Eike Stepper
*/
public class SessionTest extends AbstractCDOTest
{
private static final String USER_ID = "stepper"; //$NON-NLS-1$
private static final char[] PASSWORD1 = "eike2007".toCharArray(); //$NON-NLS-1$
private static final char[] PASSWORD2 = "invalid".toCharArray(); //$NON-NLS-1$
@Override
public void setUp() throws Exception
{
super.setUp();
enableConsole();
}
public void testIsSupportingAudits() throws Exception
{
CDOSession session = openSession();
boolean serverAudits = getRepository().isSupportingAudits();
boolean clientAudits = session.getRepositoryInfo().isSupportingAudits();
assertEquals(serverAudits, clientAudits);
session.close();
}
public void testRefresh() throws CommitException
{
CDOSession session1 = openSession();
session1.options().setPassiveUpdateEnabled(false);
CDOTransaction transaction = session1.openTransaction();
CDOResource resource1 = transaction.createResource(getResourcePath("ttt"));
resource1.getContents().add(getModel1Factory().createCategory());
transaction.commit();
CDOSession session2 = openSession();
session2.options().setPassiveUpdateEnabled(false);
CDOView view = session2.openView();
CDOResource resource2 = view.getResource(getResourcePath("ttt"));
assertEquals(1, resource2.getContents().size());
resource1.getContents().add(getModel1Factory().createCategory());
transaction.commit();
dump(session1);
dump(session2);
assertEquals(1, resource2.getContents().size());
session2.refresh();
dump(session2);
assertEquals(2, resource2.getContents().size());
}
public void testRefreshWithPackages() throws CommitException
{
CDOSession session1 = openSession();
session1.options().setPassiveUpdateEnabled(false);
CDOTransaction transaction = session1.openTransaction();
CDOResource resource1 = transaction.createResource(getResourcePath("ttt"));
transaction.commit();
CDOSession session2 = openSession();
session2.options().setPassiveUpdateEnabled(false);
CDOView view = session2.openView();
CDOResource resource2 = view.getResource(getResourcePath("ttt"));
assertEquals(0, resource2.getContents().size());
resource1.getContents().add(getModel1Factory().createCategory());
transaction.commit();
dump(session1);
dump(session2);
assertEquals(0, resource2.getContents().size());
session2.refresh();
dump(session2);
assertEquals(1, resource2.getContents().size());
}
private void dump(CDOSession session)
{
InternalCDORevisionCache cache = ((InternalCDOSession)session).getRevisionManager().getCache();
CDORevisionUtil.dumpAllRevisions(cache.getAllRevisions(), System.out);
}
public void testEContentAdapter() throws Exception
{
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.createResource(getResourcePath("ttt"));
resource.getContents().add(getModel1Factory().createCompany());
transaction.commit();
transaction.getResourceSet().eAdapters().add(new EContentAdapter()
{
@Override
public void notifyChanged(Notification notification)
{
super.notifyChanged(notification);
System.out.println(notification);
}
});
OMLogHandler logHandler = new OMLogHandler()
{
@Override
public void logged(OMLogger logger, OMLogger.Level level, String msg, Throwable t)
{
fail("Detaching the resource set adapter should not log inactive transaction exception");
}
};
try
{
OMPlatform.INSTANCE.addLogHandler(logHandler);
session.close();
}
finally
{
OMPlatform.INSTANCE.removeLogHandler(logHandler);
}
}
public void testLastUpdateLocal() throws Exception
{
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
transaction.createResource(getResourcePath("ttt"));
long commitTime = transaction.commit().getTimeStamp();
waitForUpdate(commitTime, session);
session.close();
}
public void testLastUpdateRemote() throws Exception
{
CDOSession session1 = openSession();
final CDOTransaction transaction = session1.openTransaction();
transaction.createResource(getResourcePath("ttt"));
long commitTime1 = transaction.commit().getTimeStamp();
final CDOSession session2 = openSession();
waitForUpdate(commitTime1, session2);
transaction.createResource(getResourcePath("xxx"));
long commitTime2 = transaction.commit().getTimeStamp();
waitForUpdate(commitTime2, session2);
session1.close();
session2.close();
}
private void waitForUpdate(final long commitTime, final CDOSession session) throws InterruptedException
{
new PollingTimeOuter()
{
@Override
protected boolean successful()
{
return commitTime >= session.getLastUpdateTime();
}
}.assertNoTimeOut();
}
public void testWaitForUpdateLocal() throws Exception
{
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
transaction.createResource(getResourcePath("ttt"));
long commitTime = transaction.commit().getTimeStamp();
assertEquals(true, session.waitForUpdate(commitTime, DEFAULT_TIMEOUT));
session.close();
}
public void testWaitForUpdateRemote() throws Exception
{
final CDOTransaction transaction = openSession().openTransaction();
transaction.createResource(getResourcePath("ttt"));
final CountDownLatch startLatch = new CountDownLatch(1);
final CountDownLatch stopLatch = new CountDownLatch(1);
final long[] commitTime = { 0 };
new Thread()
{
@Override
public void run()
{
try
{
await(startLatch);
msg("Committing NOW!");
commitTime[0] = transaction.commit().getTimeStamp();
stopLatch.countDown();
}
catch (Exception ex)
{
throw WrappedException.wrap(ex);
}
}
}.start();
CDOSession session2 = openSession();
startLatch.countDown();
await(stopLatch);
assertEquals(true, session2.waitForUpdate(commitTime[0], DEFAULT_TIMEOUT));
transaction.getSession().close();
session2.close();
}
@CleanRepositoriesAfter(reason = "Repository not used again")
public void testNoAuthentication() throws Exception
{
IRepository repository = getRepository("authrepo1");
getTestProperties().put(SessionConfig.PROP_TEST_CREDENTIALS_PROVIDER, new PasswordCredentialsProvider(new PasswordCredentials(USER_ID, PASSWORD1)));
CDOSession session = openSession("authrepo1");
assertEquals(null, session.getUserID());
assertEquals(null, repository.getSessionManager().getSessions()[0].getUserID());
session.close();
}
@CleanRepositoriesAfter(reason = "Repository not used again")
public void testWithAuthentication() throws Exception
{
UserManager userManager = new UserManager();
userManager.activate();
userManager.addUser(USER_ID, PASSWORD1);
getTestProperties().put(RepositoryConfig.PROP_TEST_AUTHENTICATOR, userManager);
IRepository repository = getRepository("authrepo2");
getTestProperties().put(SessionConfig.PROP_TEST_CREDENTIALS_PROVIDER, new PasswordCredentialsProvider(new PasswordCredentials(USER_ID, PASSWORD1)));
CDOSession session = openSession("authrepo2");
assertEquals(USER_ID, session.getUserID());
ISession serverSession = repository.getSessionManager().getSession(session.getSessionID());
assertEquals(USER_ID, serverSession.getUserID());
session.close();
}
@CleanRepositoriesAfter(reason = "Repository not used again")
public void testWithAuthenticationNoCredentialsProvider() throws Exception
{
UserManager userManager = new UserManager();
userManager.activate();
userManager.addUser(USER_ID, PASSWORD1);
getTestProperties().put(RepositoryConfig.PROP_TEST_AUTHENTICATOR, userManager);
getRepository("authrepo3");
try
{
openSession("authrepo3");
fail("NotAuthenticatedException expected");
}
catch (NotAuthenticatedException expected)
{
// SUCCESS
}
}
@CleanRepositoriesAfter(reason = "Repository not used again")
public void testWithAuthenticationNoCredentials() throws Exception
{
UserManager userManager = new UserManager();
userManager.activate();
userManager.addUser(USER_ID, PASSWORD1);
getTestProperties().put(RepositoryConfig.PROP_TEST_AUTHENTICATOR, userManager);
getRepository("authrepo4");
getTestProperties().put(SessionConfig.PROP_TEST_CREDENTIALS_PROVIDER, new PasswordCredentialsProvider(null));
try
{
openSession("authrepo4");
fail("NotAuthenticatedException expected");
}
catch (NotAuthenticatedException success)
{
// Success
}
}
@CleanRepositoriesAfter(reason = "Repository not used again")
public void testWithAuthenticationWrongCredentials() throws Exception
{
UserManager userManager = new UserManager();
userManager.activate();
userManager.addUser(USER_ID, PASSWORD1);
getTestProperties().put(RepositoryConfig.PROP_TEST_AUTHENTICATOR, userManager);
getRepository("authrepo5");
getTestProperties().put(SessionConfig.PROP_TEST_CREDENTIALS_PROVIDER, new PasswordCredentialsProvider(new PasswordCredentials(USER_ID, PASSWORD2)));
try
{
openSession("authrepo5");
fail("SecurityException expected");
}
catch (SecurityException expected)
{
// SUCCESS
}
}
@CleanRepositoriesAfter(reason = "Repository not used again")
public void testWithAuthenticationNoUserID() throws Exception
{
UserManager userManager = new UserManager();
userManager.activate();
userManager.addUser(USER_ID, PASSWORD1);
getTestProperties().put(RepositoryConfig.PROP_TEST_AUTHENTICATOR, userManager);
getRepository("authrepo6");
getTestProperties().put(SessionConfig.PROP_TEST_CREDENTIALS_PROVIDER, new PasswordCredentialsProvider(new PasswordCredentials(null, PASSWORD2)));
try
{
openSession("authrepo6");
fail("NotAuthenticatedException expected");
}
catch (NotAuthenticatedException expected)
{
// SUCCESS
}
}
@CleanRepositoriesAfter(reason = "Repository not used again")
public void testWithAuthenticationNoPassword() throws Exception
{
UserManager userManager = new UserManager();
userManager.activate();
userManager.addUser(USER_ID, PASSWORD1);
getTestProperties().put(RepositoryConfig.PROP_TEST_AUTHENTICATOR, userManager);
getRepository("authrepo7");
getTestProperties().put(SessionConfig.PROP_TEST_CREDENTIALS_PROVIDER, new PasswordCredentialsProvider(new PasswordCredentials(USER_ID)));
try
{
openSession("authrepo7");
fail("NotAuthenticatedException expected");
}
catch (NotAuthenticatedException expected)
{
// SUCCESS
}
}
public void testProtocolTimeoutChangedEvent() throws Exception
{
final boolean[] eventSent = { false };
org.eclipse.emf.cdo.net4j.CDONet4jSession session = (org.eclipse.emf.cdo.net4j.CDONet4jSession)openSession();
session.options().getNet4jProtocol().addListener(new IListener()
{
@Override
public void notifyEvent(IEvent event)
{
if (event instanceof TimeoutChangedEvent)
{
TimeoutChangedEvent e = (TimeoutChangedEvent)event;
System.out.println(e);
eventSent[0] = true;
}
}
});
session.options().getNet4jProtocol().setTimeout(20L * 1000L);
assertEquals(true, eventSent[0]);
}
public void testSetProtocolTimeout() throws Exception
{
IRepository repository = getRepository();
repository.getSessionManager().addListener(new ContainerEventAdapter<ISession>()
{
@Override
protected void onAdded(IContainer<ISession> container, ISession session)
{
ISessionProtocol protocol = session.getProtocol();
if (protocol instanceof ISignalProtocol)
{
ISignalProtocol<?> signalProtocol = (ISignalProtocol<?>)protocol;
signalProtocol.setTimeout(30L * 1000L);
}
}
});
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
transaction.createResource(getResourcePath("ttt"));
transaction.commit();
}
@Requires(ISessionConfig.CAPABILITY_NET4J)
public void testRepositoryNotFound() throws Exception
{
CDOSession session = null;
try
{
session = openSession("sdkghfaifuzicxuhvnjlksah");
}
catch (Exception ex)
{
}
assertEquals(null, session);
sleep(500);
Net4j sessionConfig = (Net4j)getSessionConfig();
IAcceptor acceptor = sessionConfig.getAcceptor();
for (IConnector connector : acceptor.getAcceptedConnectors())
{
Collection<IChannel> channels = connector.getChannels();
assertEquals(0, channels.size());
}
}
}