blob: 653e8d3dac04b16c02e8b5ed9ca138fc50b37c4d [file] [log] [blame]
/*
* Copyright (c) 2010-2012 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:
* Ibrahim Sallam - initial API and implementation
*/
package org.eclipse.emf.cdo.tests.objectivity;
import static org.junit.Assert.assertEquals;
import org.eclipse.emf.cdo.server.internal.objectivity.db.FdManager;
import org.eclipse.emf.cdo.server.internal.objectivity.db.ObjyConnection;
import org.eclipse.emf.cdo.server.internal.objectivity.db.ObjySession;
import org.eclipse.emf.cdo.server.internal.objectivity.schema.ObjyBranch;
import org.eclipse.emf.cdo.server.internal.objectivity.schema.ObjyBranchManager;
import org.eclipse.emf.cdo.server.internal.objectivity.utils.ObjyDb;
import org.eclipse.emf.cdo.spi.common.branch.InternalCDOBranchManager.BranchLoader.BranchInfo;
import com.objy.db.app.oo;
import com.objy.db.app.ooObj;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
class Temp extends ooObj
{
protected long lValue = 0;
protected int revision = 0;
private int branchId = 0;
public Temp(long value)
{
lValue = value;
revision = 1;
}
public void revisionIt()
{
markModified();
revision++;
}
public void setBranch(int id)
{
markModified();
branchId = id;
}
public int getRevision()
{
fetch();
return revision;
}
public int getBranchId()
{
fetch();
return branchId;
}
public long getValue()
{
fetch();
return lValue;
}
}
/**
* This class will hide access to Objectivity/Db
*
* @author Ibrahim Sallam
*/
class ObjyDbStore
{
// private final String fdName = "c:\\data\\objyBranchTest.boot"; // TODO - this is windows path style, generalise it.
private final String repoName = "TestRepo";
private FdManager fdManager;
private ObjyConnection objyConnection;
private ObjySession objySession;
public ObjyDbStore()
{
fdManager = new FdManager();
objyConnection = ObjyConnection.INSTANCE;
}
public void startup()
{
fdManager.setFdDirPath("\\temp");
fdManager.configure("objyBrnachTest");
objyConnection.connect(fdManager.getFd(), oo.LogNone);
objySession = objyConnection.getWriteSessionFromPool("TestSession");
}
public void shutdown()
{
fdManager.removeData();
objyConnection.disconnect();
}
public ObjyBranchManager getBranchManager()
{
return ObjyDb.getOrCreateBranchManager(repoName);
}
public void begin()
{
objySession.begin();
}
public void commit()
{
objySession.commit();
}
public Temp newObject()
{
return new Temp(System.currentTimeMillis());
}
}
/**
* @author Ibrahim Sallam
*/
public class ObjyBranchManagementTest
{
private static final String BRANCH_NAME_A = "MyBranchA";
private static final String BRANCH_NAME_B = "MyBranchB";
private final int baseBranchId = 0;
private final long baseBranchTimeStamp = System.currentTimeMillis();
ObjyDbStore dbStore = null;
BranchInfo branchInfoA = null;
BranchInfo branchInfoB = null;
public static final int NEW_BRANCH = Integer.MAX_VALUE;
public static final int NEW_LOCAL_BRANCH = Integer.MIN_VALUE;
@Before
public void setUp()
{
dbStore = new ObjyDbStore();
branchInfoA = new BranchInfo(BRANCH_NAME_A, baseBranchId, baseBranchTimeStamp);
branchInfoB = new BranchInfo(BRANCH_NAME_B, baseBranchId, baseBranchTimeStamp);
dbStore.startup();
}
@Test
public void getNextBranchId()
{
dbStore.begin();
int branchId = dbStore.getBranchManager().nextBranchId();
dbStore.commit();
assertEquals(true, branchId > 0);
}
@Test
public void createBranch()
{
dbStore.begin();
int nextBranchId = dbStore.getBranchManager().getLastBranchId() + 1;
dbStore.commit();
dbStore.begin();
int branchId = dbStore.getBranchManager().createBranch(NEW_BRANCH, branchInfoA).getElement1();
dbStore.commit();
assertEquals(branchId, nextBranchId);
}
@Test
public void getUnavailableBranch()
{
dbStore.begin();
ObjyBranch objyBranch = dbStore.getBranchManager().getBranch(1);
dbStore.commit();
assertEquals(true, objyBranch == null);
}
@Test
public void getBranch()
{
dbStore.begin();
int branchId = dbStore.getBranchManager().createBranch(NEW_LOCAL_BRANCH, branchInfoB).getElement1();
dbStore.commit();
// using the branchId we'll get it from the dbStore.
dbStore.begin();
BranchInfo branchInfo = dbStore.getBranchManager().getBranch(branchId).getBranchInfo();
dbStore.commit();
assertEquals(baseBranchId, branchInfo.getBaseBranchID());
assertEquals(baseBranchTimeStamp, branchInfo.getBaseTimeStamp());
assertEquals(BRANCH_NAME_B, branchInfo.getName());
}
@Test
public void createBranches()
{
// Create a group of branches (no sub-branches)
dbStore.begin();
int branchIdA = dbStore.getBranchManager().createBranch(NEW_BRANCH, branchInfoA).getElement1();
int branchIdB = dbStore.getBranchManager().createBranch(NEW_BRANCH, branchInfoB).getElement1();
dbStore.commit();
dbStore.begin();
int nextBranchId = dbStore.getBranchManager().nextBranchId();
dbStore.commit();
assertEquals(true, branchIdA < nextBranchId);
assertEquals(true, branchIdB < nextBranchId);
}
@Test
public void getBranches()
{
// Get all branches from a created group.
// Create a group of branches (no sub-branches)
dbStore.begin();
int branchIdA = dbStore.getBranchManager().createBranch(NEW_BRANCH, branchInfoA).getElement1();
int branchIdB = dbStore.getBranchManager().createBranch(NEW_BRANCH, branchInfoB).getElement1();
dbStore.commit();
// using the branchId we'll get it from the dbStore.
dbStore.begin();
BranchInfo branchInfoB = dbStore.getBranchManager().getBranch(branchIdB).getBranchInfo();
dbStore.commit();
assertEquals(baseBranchId, branchInfoB.getBaseBranchID());
assertEquals(baseBranchTimeStamp, branchInfoB.getBaseTimeStamp());
assertEquals(BRANCH_NAME_B, branchInfoB.getName());
// using the branchId we'll get it from the dbStore.
dbStore.begin();
BranchInfo branchInfoA = dbStore.getBranchManager().getBranch(branchIdA).getBranchInfo();
dbStore.commit();
assertEquals(baseBranchId, branchInfoA.getBaseBranchID());
assertEquals(baseBranchTimeStamp, branchInfoA.getBaseTimeStamp());
assertEquals(BRANCH_NAME_A, branchInfoA.getName());
}
@Test
public void getBrancheRange()
{
// Get a range of branches from a created group.
int thisBaseBranchId = 0;
long thisBaseBranchTimeStamp = System.currentTimeMillis();
// Create a group of branches (no sub-branches)
dbStore.begin();
String prefixString = "Branch_";
List<Integer> branchList = new ArrayList<Integer>();
for (int i = 0; i < 20; i++)
{
dbStore.begin();
BranchInfo branchInfo = new BranchInfo(prefixString + i, thisBaseBranchId, thisBaseBranchTimeStamp);
int id = dbStore.getBranchManager().createBranch(NEW_BRANCH, branchInfo).getElement1();
branchList.add(id);
dbStore.commit();
}
dbStore.commit();
// Get range from 5 to 10.
{
dbStore.begin();
List<ObjyBranch> branchRangeList = dbStore.getBranchManager().getBranches(branchList.get(5), branchList.get(10));
int index = 5;
for (ObjyBranch objyBranch : branchRangeList)
{
int expectedId = branchList.get(index);
assertEquals(expectedId, objyBranch.getBranchId());
assertEquals(thisBaseBranchId, objyBranch.getBaseBranchId());
assertEquals(thisBaseBranchTimeStamp, objyBranch.getBaseBranchTimeStamp());
assertEquals("Branch_" + index, objyBranch.getBranchName());
index++;
}
dbStore.commit();
}
// Get range from 7 to end.
{
dbStore.begin();
List<ObjyBranch> branchRangeList = dbStore.getBranchManager().getBranches(branchList.get(7), 0);
assertEquals(13, branchRangeList.size());
int index = 7;
for (ObjyBranch objyBranch : branchRangeList)
{
int expectedId = branchList.get(index);
assertEquals(expectedId, objyBranch.getBranchId());
assertEquals(thisBaseBranchId, objyBranch.getBaseBranchId());
assertEquals(thisBaseBranchTimeStamp, objyBranch.getBaseBranchTimeStamp());
assertEquals("Branch_" + index, objyBranch.getBranchName());
index++;
}
dbStore.commit();
}
}
@Test
public void deleteBranch()
{
dbStore.begin();
int branchId = dbStore.getBranchManager().createBranch(NEW_BRANCH, branchInfoA).getElement1();
dbStore.commit();
// delete it.
dbStore.begin();
assertEquals(true, dbStore.getBranchManager().deleteBranch(branchId));
dbStore.commit();
}
@Test
public void createSubBranches()
{
dbStore.begin();
int thisBaseBranchId = dbStore.getBranchManager().createBranch(NEW_BRANCH, branchInfoA).getElement1();
dbStore.getBranchManager().createBranch(NEW_BRANCH, branchInfoB);
long thisBaseBranchTimeStamp = System.currentTimeMillis();
// using the created branch we'll create subBranches.
dbStore.commit();
String prefixString = "SubBranch_";
List<Integer> subBranchList = new ArrayList<Integer>();
for (int i = 0; i < 10; i++)
{
dbStore.begin();
BranchInfo branchInfo = new BranchInfo(prefixString + i, thisBaseBranchId, thisBaseBranchTimeStamp);
int id = dbStore.getBranchManager().createBranch(NEW_BRANCH, branchInfo).getElement1();
subBranchList.add(id);
dbStore.commit();
}
// get sub-branches for 0.
List<ObjyBranch> objyBranchList = new ArrayList<ObjyBranch>();
dbStore.begin();
objyBranchList = dbStore.getBranchManager().getSubBranches(0);
assertEquals(2, objyBranchList.size());
dbStore.commit();
dbStore.begin();
objyBranchList = dbStore.getBranchManager().getSubBranches(thisBaseBranchId);
assertEquals(10, objyBranchList.size());
dbStore.commit();
}
@Test
public void getSubBranches()
{
dbStore.begin();
int thisBaseBranchId = dbStore.getBranchManager().createBranch(NEW_LOCAL_BRANCH, branchInfoA).getElement1();
long thisBaseBranchTimeStamp = System.currentTimeMillis();
// using the created branch we'll create subBranches.
dbStore.commit();
String prefixString = "SubBranch_";
List<Integer> subBranchList = new ArrayList<Integer>();
for (int i = 0; i < 10; i++)
{
dbStore.begin();
BranchInfo branchInfo = new BranchInfo(prefixString + i, thisBaseBranchId, thisBaseBranchTimeStamp);
int id = dbStore.getBranchManager().createBranch(NEW_LOCAL_BRANCH, branchInfo).getElement1();
subBranchList.add(id);
dbStore.commit();
}
// verify that we have sub-branches.
dbStore.begin();
int i = 0;
for (Integer iValue : subBranchList)
{
BranchInfo branchInfo = dbStore.getBranchManager().getBranch(iValue).getBranchInfo();
assertEquals(thisBaseBranchId, branchInfo.getBaseBranchID());
assertEquals(thisBaseBranchTimeStamp, branchInfo.getBaseTimeStamp());
assertEquals(prefixString + i++, branchInfo.getName());
}
dbStore.commit();
}
@Test
public void addRevisionsToBranch()
{
List<Temp> objectList = new ArrayList<Temp>();
// create 100 objects in Objy (Main Branch).
dbStore.begin();
for (int i = 0; i < 100; i++)
{
Temp tempObject = dbStore.newObject();
if (i % 2 == 0)
{
objectList.add(tempObject);
}
}
dbStore.commit();
// create a branch.
dbStore.begin();
int branchId = dbStore.getBranchManager().createBranch(NEW_BRANCH, branchInfoA).getElement1();
dbStore.commit();
// version what we collected in the array, and put them into a new branch.
{
dbStore.begin();
ObjyBranch objyBranch = dbStore.getBranchManager().getBranch(branchId);
for (Temp tempObj : objectList)
{
tempObj.setBranch(branchId);
tempObj.revisionIt();
objyBranch.addRevision(tempObj);
}
dbStore.commit();
}
// verify that the number of revisions in a branch is the same as what
// we added.
{
dbStore.begin();
ObjyBranch objyBranch = dbStore.getBranchManager().getBranch(branchId);
assertEquals(objectList.size(), objyBranch.numberOfRevisions());
dbStore.commit();
}
}
@Test
public void getRevisionsFromBranch()
{
List<Temp> objectList = new ArrayList<Temp>();
// create 100 objects in Objy (Main Branch).
dbStore.begin();
for (int i = 0; i < 200; i++)
{
Temp tempObject = dbStore.newObject();
if (i % 2 == 0)
{
objectList.add(tempObject);
}
}
dbStore.commit();
// create a branch.
dbStore.begin();
int branchId = dbStore.getBranchManager().createBranch(NEW_BRANCH, branchInfoA).getElement1();
dbStore.commit();
// version what we collected in the array, and put them into a new branch.
{
dbStore.begin();
ObjyBranch objyBranch = dbStore.getBranchManager().getBranch(branchId);
for (Temp tempObj : objectList)
{
tempObj.setBranch(branchId);
tempObj.revisionIt();
objyBranch.addRevision(tempObj);
}
dbStore.commit();
}
// Get the objects from the branch.
{
dbStore.begin();
ObjyBranch objyBranch = dbStore.getBranchManager().getBranch(branchId);
Iterator<?> itr = objyBranch.getRevisions().iterator();
List<Temp> actualList = new ArrayList<Temp>();
while (itr.hasNext())
{
Temp tempObj = (Temp)itr.next();
assertEquals(tempObj.getBranchId(), branchId);
assertEquals(true, tempObj.getRevision() > 1);
actualList.add(tempObj);
}
assertEquals(objectList.size(), actualList.size());
dbStore.commit();
}
}
@Test
public void deleteRevisionsFromBranch()
{
List<Temp> objectList = new ArrayList<Temp>();
// create 100 objects in Objy (Main Branch).
dbStore.begin();
for (int i = 0; i < 100; i++)
{
Temp tempObject = dbStore.newObject();
if (i % 2 == 0)
{
objectList.add(tempObject);
}
}
dbStore.commit();
// create a branch.
dbStore.begin();
int branchId = dbStore.getBranchManager().createBranch(NEW_BRANCH, branchInfoA).getElement1();
dbStore.commit();
// version what we collected in the array, and put them into a new branch.
{
dbStore.begin();
ObjyBranch objyBranch = dbStore.getBranchManager().getBranch(branchId);
for (Temp tempObj : objectList)
{
tempObj.setBranch(branchId);
tempObj.revisionIt();
objyBranch.addRevision(tempObj);
}
dbStore.commit();
}
// verify that the number of revisions in a branch is the same as what
// we added.
{
dbStore.begin();
ObjyBranch objyBranch = dbStore.getBranchManager().getBranch(branchId);
assertEquals(objectList.size(), objyBranch.numberOfRevisions());
dbStore.commit();
}
// delete revisions
{
dbStore.begin();
ObjyBranch objyBranch = dbStore.getBranchManager().getBranch(branchId);
for (Temp tempObj : objectList)
{
assertEquals(true, objyBranch.deleteRevision(tempObj));
}
dbStore.commit();
}
// verify that the number of revisions are 0
{
dbStore.begin();
ObjyBranch objyBranch = dbStore.getBranchManager().getBranch(branchId);
assertEquals(0, objyBranch.numberOfRevisions());
dbStore.commit();
}
}
@Test(expected = IndexOutOfBoundsException.class)
public void empty()
{
new ArrayList<Object>().get(0);
}
@After
public void tearDown()
{
dbStore.shutdown();
}
}