/* * Copyright (c) 2011, 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: * Martin Fl�gge - initial API and implementation */ package org.eclipse.emf.cdo.tests.offline; import org.eclipse.emf.cdo.common.CDOCommonRepository; import org.eclipse.emf.cdo.common.commit.CDOCommitInfo; import org.eclipse.emf.cdo.eresource.CDOResource; import org.eclipse.emf.cdo.session.CDOSession; import org.eclipse.emf.cdo.spi.server.InternalSynchronizableRepository; import org.eclipse.emf.cdo.tests.AbstractSyncingTest; 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.net4j.acceptor.IAcceptor; import org.eclipse.net4j.util.container.IManagedContainer; import org.eclipse.net4j.util.io.IOUtil; /** * @author Martin Fl�gge */ public class Bugzilla_312879_Test extends AbstractSyncingTest { private IAcceptor backupAcceptor; @Override public void tearDown() throws Exception { super.tearDown(); stopBackupTransport(); } protected void startBackupTransport() { if (backupAcceptor == null) { IOUtil.OUT().println(); IOUtil.OUT().println("startBackupTransport()"); IOUtil.OUT().println(); IManagedContainer container = getServerContainer(); backupAcceptor = (IAcceptor)container.getElement("org.eclipse.net4j.acceptors", "jvm", "backup"); } } protected void stopBackupTransport() { if (backupAcceptor != null) { IOUtil.OUT().println(); IOUtil.OUT().println("stopBackupTransport()"); IOUtil.OUT().println(); backupAcceptor.close(); backupAcceptor = null; } } @Override protected boolean isFailover() { return true; } public void testSwitchMasterAndCommit() throws Exception { InternalSynchronizableRepository repo1_master = (InternalSynchronizableRepository)getRepository("master"); InternalSynchronizableRepository repo1 = getRepository(); InternalSynchronizableRepository master = repo1_master; InternalSynchronizableRepository backup = repo1; CDOSession session = openSession(master.getName()); CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource(getResourcePath("/my/resource")); Company company = getModel1Factory().createCompany(); company.setName("Test"); resource.getContents().add(company); transaction.setCommitComment("Company created"); transaction.commit(); int categoryCount = 10; for (int i = 0; i < categoryCount; i++) { Category category = getModel1Factory().createCategory(); category.setName("cat" + i); company.getCategories().add(category); transaction.setCommitComment("Category added " + i); transaction.commit(); } sleep(1000); checkData(company, categoryCount, "cat", "Test"); startBackupTransport(); repo1.setType(CDOCommonRepository.Type.MASTER); repo1_master.setType(CDOCommonRepository.Type.BACKUP); master = repo1; backup = repo1_master; assertEquals(CDOCommonRepository.Type.MASTER, master.getType()); assertEquals(CDOCommonRepository.Type.BACKUP, backup.getType()); // make sure the backup repository is in sync waitForOnline(backup); session.close(); session = openSession(master.getName()); // make sure we are running the session on the master assertEquals(CDOCommonRepository.Type.MASTER, session.getRepositoryInfo().getType()); transaction = session.openTransaction(); resource = transaction.getResource(getResourcePath("/my/resource")); company = (Company)resource.getContents().get(0); checkData(company, categoryCount, "cat", "Test"); int i = 0; for (i = 0; i < 10; i++) { company.setName("AfterFailover-" + i); transaction.setCommitComment("Name changed after failover"); transaction.commit(); } int c = 0; for (Category category : company.getCategories()) { category.setName("CHANGED" + c++); CDOCommitInfo commitInfo = transaction.commit(); assertEquals(0, commitInfo.getBranch().getID()); } checkData(company, categoryCount, "CHANGED", "AfterFailover-" + (i - 1)); // Switch Master back to master ----------------------------------------- assertEquals(CDOCommonRepository.Type.BACKUP, backup.getType()); stopBackupTransport(); repo1_master.setType(CDOCommonRepository.Type.MASTER); repo1.setType(CDOCommonRepository.Type.BACKUP); master = repo1_master; backup = repo1; assertEquals(CDOCommonRepository.Type.MASTER, master.getType()); assertEquals(CDOCommonRepository.Type.BACKUP, backup.getType()); waitForOnline(backup); session.close(); session = openSession(master.getName()); assertEquals(CDOCommonRepository.Type.MASTER, session.getRepositoryInfo().getType()); transaction = session.openTransaction(); resource = transaction.getResource(getResourcePath("/my/resource")); company = (Company)resource.getContents().get(0); checkData(company, categoryCount, "CHANGED", "AfterFailover-" + (i - 1)); for (i = 0; i < 10; i++) { company.setName("AfterSwitchbackToMaster-" + i); transaction.setCommitComment("Name changed after fallback to master"); transaction.commit(); } c = 0; for (Category category : company.getCategories()) { category.setName("LASTCHANGE" + c++); CDOCommitInfo commitInfo = transaction.commit(); assertEquals(0, commitInfo.getBranch().getID()); } checkData(company, categoryCount, "LASTCHANGE", "AfterSwitchbackToMaster-" + (i - 1)); session.close(); } /** * checks for the correct naming of Company and it's Categories */ private void checkData(Company company, int categoryCount, String categoryNamePrefix, String companyName) { assertEquals(companyName, company.getName()); assertEquals(categoryCount, company.getCategories().size()); int c = 0; for (Category category : company.getCategories()) { assertEquals(categoryNamePrefix + c++, category.getName()); } } }