blob: 07f8dbbaa3f94f3d07283ad28cc7654a17ffb847 [file] [log] [blame]
/*
* Copyright (c) 2015 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:
* Esteban Dugueperoux - initial API and implementation
*/
package org.eclipse.emf.cdo.tests.bugzilla;
import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.internal.net4j.protocol.CommitTransactionRequest;
import org.eclipse.emf.cdo.net4j.CDONet4jSession;
import org.eclipse.emf.cdo.net4j.CDONet4jSession.Options;
import org.eclipse.emf.cdo.server.IRepository;
import org.eclipse.emf.cdo.server.IStoreAccessor.CommitContext;
import org.eclipse.emf.cdo.server.ITransaction;
import org.eclipse.emf.cdo.session.CDOSession;
import org.eclipse.emf.cdo.tests.AbstractCDOTest;
import org.eclipse.emf.cdo.tests.model1.Company;
import org.eclipse.emf.cdo.tests.model1.Customer;
import org.eclipse.emf.cdo.tests.model1.PurchaseOrder;
import org.eclipse.emf.cdo.tests.model1.SalesOrder;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.net4j.util.om.monitor.OMMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.junit.Assert;
/**
* Bug 377173 : test commit progress/cancel.
*
* @author Esteban Dugueperoux
*/
public class Bugzilla_377173_Test extends AbstractCDOTest
{
private static final String RESOURCE_PATH = "/test1";
public void testCancelCommitWithProgressMonitor() throws Exception
{
CDOSession session = openSession();
CDONet4jSession.Options options = (Options)session.options();
options.setCommitTimeout(100000 * CommitTransactionRequest.DEFAULT_MONITOR_TIMEOUT_SECONDS);
CDOTransaction transaction1 = session.openTransaction();
CDOResource resource1 = transaction1.createResource(getResourcePath(RESOURCE_PATH));
// 1. Create a example model
Company customer1 = initializeModel(resource1);
resource1.getContents().add(customer1);
CommitWaiter commitWaiter = new CommitWaiter();
getRepository().addHandler(commitWaiter);
ProgressMonitorAsserter progressMonitorAsserter = new ProgressMonitorAsserter();
try
{
transaction1.commit(progressMonitorAsserter);
fail("An OperationCanceledException should be thrown as the commit has been canceled");
}
catch (Exception ex)
{
Assert.assertTrue(ex instanceof OperationCanceledException);
}
finally
{
getRepository().removeHandler(commitWaiter);
}
}
private static class ProgressMonitorAsserter extends NullProgressMonitor
{
@Override
public void internalWorked(double work)
{
super.internalWorked(work);
setCanceled(true);
}
}
private static class CommitWaiter implements IRepository.WriteAccessHandler
{
public void handleTransactionBeforeCommitting(ITransaction transaction, CommitContext commitContext,
OMMonitor monitor) throws RuntimeException
{
sleep(2000);
}
public void handleTransactionAfterCommitted(ITransaction transaction, CommitContext commitContext, OMMonitor monitor)
{
}
}
private Company initializeModel(CDOResource resource)
{
Company company = getModel1Factory().createCompany();
Customer customer = getModel1Factory().createCustomer();
customer.setName("Martin Fluegge");
customer.setStreet("ABC Street 7");
customer.setCity("Berlin");
SalesOrder salesOrder = getModel1Factory().createSalesOrder();
customer.getSalesOrders().add(salesOrder);
resource.getContents().add(salesOrder);
resource.getContents().add(customer);
for (int i = 0; i < 1000; i++)
{
PurchaseOrder purchaseOrder = getModel1Factory().createPurchaseOrder();
company.getPurchaseOrders().add(purchaseOrder);
}
company.getCustomers().add(customer);
return company;
}
}