/*
* Copyright (c) 2011-2013 Eike Stepper (Berlin, 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:
* Pascal Lehmann - initial API and implementation
*/
package org.eclipse.emf.cdo.tests.offline;
import org.eclipse.emf.cdo.common.CDOCommonSession.Options.PassiveUpdateMode;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.session.CDOSession;
import org.eclipse.emf.cdo.spi.server.InternalRepository;
import org.eclipse.emf.cdo.tests.AbstractSyncingTest;
import org.eclipse.emf.cdo.tests.config.IRepositoryConfig;
import org.eclipse.emf.cdo.tests.model1.Company;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.util.CDOUtil;
/**
* LastUpdateTimestamp of ReplicatorSession not set on local commits.
* <p>
* See bug 329014
*
* @author Pascal Lehmann
* @since 4.0
*/
public class Bugzilla_329014_Test extends AbstractSyncingTest
{
private static final String RESOURCE_NAME = "/my/resource";
private CDOID id;
private InternalRepository master;
private InternalRepository clone;
private CDOSession masterSession;
private CDOSession cloneSession;
@Override
protected void doSetUp() throws Exception
{
super.doSetUp();
clone = getRepository();
cloneSession = openSession();
cloneSession.options().setPassiveUpdateMode(PassiveUpdateMode.CHANGES);
waitForOnline(clone);
master = getRepository("master");
masterSession = openSession(master.getName());
masterSession.options().setPassiveUpdateMode(PassiveUpdateMode.CHANGES);
// initial model.
CDOTransaction transaction = masterSession.openTransaction();
CDOResource resource = transaction.createResource(getResourcePath(RESOURCE_NAME));
Company company = getModel1Factory().createCompany();
company.setName("Company1");
resource.getContents().add(company);
transaction.commit();
id = CDOUtil.getCDOObject(company).cdoID();
transaction.close();
}
@Override
protected void doTearDown() throws Exception
{
if (cloneSession != null)
{
cloneSession.close();
cloneSession = null;
}
if (masterSession != null)
{
masterSession.close();
masterSession = null;
}
super.doTearDown();
}
@Requires(IRepositoryConfig.CAPABILITY_OFFLINE)
public void testSynchronizationMasterCloneWithoutReplication() throws Exception
{
// open transactions.
CDOTransaction masterTransaction = masterSession.openTransaction();
CDOTransaction cloneTransaction = cloneSession.openTransaction();
sleep(1000);
// grab and touch the company on master.
Company masterCompany = (Company)masterTransaction.getObject(id);
assertNotNull(masterCompany);
masterCompany.getName();
// grab and touch the company on clone.
Company cloneCompany = (Company)cloneTransaction.getObject(id);
assertNotNull(cloneCompany);
cloneCompany.getName();
// do changes: master / clone / master
masterCompany.setName("Company2");
masterTransaction.commit();
masterCompany.setName("Company3");
masterTransaction.commit();
cloneTransaction.waitForUpdate(masterTransaction.getLastCommitTime(), DEFAULT_TIMEOUT);
cloneCompany.setName("Company4");
cloneTransaction.commit();
cloneCompany.setName("Company5");
cloneTransaction.commit();
masterTransaction.waitForUpdate(cloneTransaction.getLastCommitTime(), DEFAULT_TIMEOUT);
masterCompany.setName("Company6");
masterTransaction.commit();
masterCompany.setName("Company7");
masterTransaction.commit();
cloneTransaction.waitForUpdate(masterTransaction.getLastCommitTime(), DEFAULT_TIMEOUT);
// check.
assertEquals(masterCompany.getName(), cloneCompany.getName());
}
@Requires(IRepositoryConfig.CAPABILITY_OFFLINE)
public void testSynchronizationCloneMasterWithoutReplication() throws Exception
{
// open transactions.
CDOTransaction masterTransaction = masterSession.openTransaction();
CDOTransaction cloneTransaction = cloneSession.openTransaction();
sleep(1000);
// grab and touch the company on master.
Company masterCompany = (Company)masterTransaction.getObject(id);
assertNotNull(masterCompany);
masterCompany.getName();
// grab and touch the company on clone.
Company cloneCompany = (Company)cloneTransaction.getObject(id);
assertNotNull(cloneCompany);
cloneCompany.getName();
// do changes: clone / master / clone
cloneCompany.setName("Company2");
cloneTransaction.commit();
cloneCompany.setName("Company3");
cloneTransaction.commit();
masterTransaction.waitForUpdate(cloneTransaction.getLastCommitTime(), DEFAULT_TIMEOUT);
masterCompany.setName("Company4");
masterTransaction.commit();
masterCompany.setName("Company5");
masterTransaction.commit();
cloneTransaction.waitForUpdate(masterTransaction.getLastCommitTime(), DEFAULT_TIMEOUT);
cloneCompany.setName("Company6");
cloneTransaction.commit();
cloneCompany.setName("Company7");
cloneTransaction.commit();
masterTransaction.waitForUpdate(cloneTransaction.getLastCommitTime(), DEFAULT_TIMEOUT);
// check.
assertEquals(cloneCompany.getName(), masterCompany.getName());
}
@Requires(IRepositoryConfig.CAPABILITY_OFFLINE)
public void testSynchronizationMasterCloneWithReplication() throws Exception
{
// open transactions.
CDOTransaction masterTransaction = masterSession.openTransaction();
CDOTransaction cloneTransaction = cloneSession.openTransaction();
sleep(1000);
// grab and touch the company on master.
Company masterCompany = (Company)masterTransaction.getObject(id);
assertNotNull(masterCompany);
masterCompany.getName();
// grab and touch the company on clone.
Company cloneCompany = (Company)cloneTransaction.getObject(id);
assertNotNull(cloneCompany);
cloneCompany.getName();
// do changes: master / clone / master
// go offline.
getOfflineConfig().stopMasterTransport();
waitForOffline(clone);
masterCompany.setName("Company2");
masterTransaction.commit();
masterCompany.setName("Company3");
masterTransaction.commit();
msg(CDOUtil.getCDOObject(masterCompany).cdoRevision().getVersion());
// go online.
getOfflineConfig().startMasterTransport();
waitForOnline(clone);
cloneTransaction.waitForUpdate(masterTransaction.getLastCommitTime(), DEFAULT_TIMEOUT);
cloneCompany.getName();
msg(CDOUtil.getCDOObject(cloneCompany).cdoRevision().getVersion());
cloneCompany.setName("Company4");
cloneTransaction.commit();
cloneCompany.setName("Company5");
cloneTransaction.commit();
masterTransaction.waitForUpdate(cloneTransaction.getLastCommitTime(), DEFAULT_TIMEOUT);
masterCompany.setName("Company6");
masterTransaction.commit();
masterCompany.setName("Company7");
masterTransaction.commit();
cloneTransaction.waitForUpdate(masterTransaction.getLastCommitTime(), DEFAULT_TIMEOUT);
// check.
assertEquals(masterCompany.getName(), cloneCompany.getName());
}
@Requires(IRepositoryConfig.CAPABILITY_OFFLINE)
public void testSynchronizationCloneMasterWithReplication() throws Exception
{
// open transactions.
CDOTransaction masterTransaction = masterSession.openTransaction();
CDOTransaction cloneTransaction = cloneSession.openTransaction();
sleep(1000);
// grab and touch the company on master.
Company masterCompany = (Company)masterTransaction.getObject(id);
assertNotNull(masterCompany);
masterCompany.getName();
// grab and touch the company on clone.
Company cloneCompany = (Company)cloneTransaction.getObject(id);
assertNotNull(cloneCompany);
cloneCompany.getName();
// do changes: clone / master / clone
cloneCompany.setName("Company2");
cloneTransaction.commit();
cloneCompany.setName("Company3");
cloneTransaction.commit();
masterTransaction.waitForUpdate(cloneTransaction.getLastCommitTime(), DEFAULT_TIMEOUT);
// go offline.
getOfflineConfig().stopMasterTransport();
waitForOffline(clone);
masterCompany.setName("Company4");
masterTransaction.commit();
masterCompany.setName("Company5");
masterTransaction.commit();
// go online.
getOfflineConfig().startMasterTransport();
waitForOnline(clone);
cloneTransaction.waitForUpdate(masterTransaction.getLastCommitTime(), DEFAULT_TIMEOUT);
cloneCompany.setName("Company6");
cloneTransaction.commit();
cloneCompany.setName("Company7");
cloneTransaction.commit();
masterTransaction.waitForUpdate(cloneTransaction.getLastCommitTime(), DEFAULT_TIMEOUT);
// check.
assertEquals(cloneCompany.getName(), masterCompany.getName());
}
}