| /* |
| * 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(); |
| } |
| |
| } |