blob: 7026a4b26fff258abee4bd42f0dfe143f03a5b68 [file] [log] [blame]
/*
* Copyright (c) 2010-2012 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:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.emf.cdo.tests.bugzilla;
import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.session.CDOSession;
import org.eclipse.emf.cdo.tests.AbstractCDOTest;
import org.eclipse.emf.cdo.tests.model1.Category;
import org.eclipse.emf.cdo.tests.model1.Company;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.view.CDOAdapterPolicy;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
/**
* IndexOutOfBoundsException in buildNotification.
* <p>
* See bug 306710
*/
public class Bugzilla_306710_Test extends AbstractCDOTest
{
public void testBugzilla_306710_remove() throws Exception
{
final NotifyCounter counter = new NotifyCounter();
// setup connection1.
CDOSession session1 = openSession();
CDOTransaction transaction1 = session1.openTransaction();
CDOResource resource1 = transaction1.createResource(getResourcePath("/test1"));
// add initial model.
Company company1 = getModel1Factory().createCompany();
resource1.getContents().add(company1);
Category category1a = getModel1Factory().createCategory();
company1.getCategories().add(category1a);
transaction1.commit();
// sleep(100);
// setup connection2.
CDOSession session2 = openSession();
CDOTransaction transaction2 = session2.openTransaction();
transaction2.options().addChangeSubscriptionPolicy(CDOAdapterPolicy.ALL);
CDOResource resource2 = transaction2.getOrCreateResource(getResourcePath("/test1"));
// add adapter to company2 to have sendDeltaNotification being called.
Company company2 = (Company)resource2.getContents().get(0);
company2.eAdapters().add(new AdapterImpl()
{
@Override
public void notifyChanged(Notification msg)
{
if (msg.getEventType() == Notification.ADD)
{
counter.incAdds();
}
else if (msg.getEventType() == Notification.REMOVE)
{
counter.incRemoves();
}
}
});
// add and remove an object from category list of company to have the CDONotificationBuilder call remove with an
// index not known to the oldRevision.
Category category1b = getModel1Factory().createCategory();
company1.getCategories().add(0, category1b);
company1.getCategories().remove(1);
// commit the changes.
transaction1.commit();
// wait for the invalidation to arrive on transaction2.
transaction2.waitForUpdate(transaction1.getLastCommitTime(), DEFAULT_TIMEOUT);
// cleanup.
session1.close();
session2.close();
// check if the notifications arrived (which is not the case because of the exception).
assertEquals(1, counter.getAdds());
assertEquals(1, counter.getRemoves());
}
/**
* @since 4.0
*/
public void testBugzilla_306710_addRemove() throws Exception
{
final NotifyCounter counter = new NotifyCounter();
// setup connection1.
CDOSession session1 = openSession();
CDOTransaction transaction1 = session1.openTransaction();
CDOResource resource1 = transaction1.createResource(getResourcePath("/test1"));
// add initial model.
Company company1 = getModel1Factory().createCompany();
resource1.getContents().add(company1);
transaction1.commit();
// sleep(100);
// setup connection2.
CDOSession session2 = openSession();
CDOTransaction transaction2 = session2.openTransaction();
transaction2.options().addChangeSubscriptionPolicy(CDOAdapterPolicy.ALL);
CDOResource resource2 = transaction2.getOrCreateResource(getResourcePath("/test1"));
// add adapter to company2 to have sendDeltaNotification being called.
Company company2 = (Company)resource2.getContents().get(0);
company2.eAdapters().add(new AdapterImpl()
{
@Override
public void notifyChanged(Notification msg)
{
if (msg.getEventType() == Notification.ADD)
{
counter.incAdds();
}
else if (msg.getEventType() == Notification.REMOVE)
{
counter.incRemoves();
}
}
});
// add and remove an object from category list of company to have the CDONotificationBuilder call remove with an
// index not known to the oldRevision.
Category category1a = getModel1Factory().createCategory();
company1.getCategories().add(0, category1a);
company1.getCategories().remove(0);
// commit the changes.
transaction1.commit();
// wait for the invalidation to arrive on transaction2.
transaction2.waitForUpdate(transaction1.getLastCommitTime(), DEFAULT_TIMEOUT);
// cleanup.
session1.close();
session2.close();
// check if the notifications arrived (which is not the case because of the exception).
assertEquals(0, counter.getAdds());
assertEquals(0, counter.getRemoves());
}
/**
* Helper class to count the notifications.
*/
public static class NotifyCounter
{
int adds;
int removes;
public int getAdds()
{
return adds;
}
public int getRemoves()
{
return removes;
}
public void incAdds()
{
adds++;
}
public void incRemoves()
{
removes++;
}
}
}