/* * Copyright (c) 2008-2012, 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: * Eike Stepper - initial API and implementation */ package org.eclipse.emf.cdo.tests; import org.eclipse.emf.cdo.eresource.CDOResource; import org.eclipse.emf.cdo.session.CDOSession; import org.eclipse.emf.cdo.tests.config.IRepositoryConfig; import org.eclipse.emf.cdo.tests.config.impl.ConfigTest.Requires; import org.eclipse.emf.cdo.tests.model1.Company; import org.eclipse.emf.cdo.tests.model5.GenListOfInt; import org.eclipse.emf.cdo.tests.model5.Model5Factory; import org.eclipse.emf.cdo.transaction.CDOTransaction; import org.eclipse.emf.cdo.util.CDOURIUtil; import org.eclipse.emf.cdo.view.CDOView; import org.eclipse.net4j.util.lifecycle.LifecycleUtil; import org.eclipse.emf.common.util.URI; import java.util.ArrayList; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.List; /** * @author Eike Stepper */ @Requires(IRepositoryConfig.CAPABILITY_AUDITING) public class AuditTest extends AbstractCDOTest { protected CDOSession session1; @Override protected void doTearDown() throws Exception { LifecycleUtil.deactivate(session1); session1 = null; super.doTearDown(); } protected CDOSession openSession1() { session1 = openSession(); return session1; } protected void closeSession1() { session1.close(); } protected CDOSession openSession2() { return openSession(); } public void testNewAudit() throws Exception { CDOSession session = openSession1(); CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource(getResourcePath("/res1")); Company company = getModel1Factory().createCompany(); company.setName("ESC"); resource.getContents().add(company); long commitTime1 = transaction.commit().getTimeStamp(); assertEquals(true, session.getRepositoryInfo().getCreationTime() < commitTime1); assertEquals("ESC", company.getName()); company.setName("Sympedia"); long commitTime2 = transaction.commit().getTimeStamp(); assertEquals(true, commitTime1 < commitTime2); assertEquals(true, session.getRepositoryInfo().getCreationTime() < commitTime2); assertEquals("Sympedia", company.getName()); company.setName("Eclipse"); long commitTime3 = transaction.commit().getTimeStamp(); assertEquals(true, commitTime2 < commitTime3); assertEquals(true, session.getRepositoryInfo().getCreationTime() < commitTime2); assertEquals("Eclipse", company.getName()); closeSession1(); session = openSession2(); CDOView audit = session.openView(commitTime1); CDOResource auditResource = audit.getResource(getResourcePath("/res1")); Company auditCompany = (Company)auditResource.getContents().get(0); assertEquals("ESC", auditCompany.getName()); CDOView audit2 = session.openView(commitTime2); CDOResource auditResource2 = audit2.getResource(getResourcePath("/res1")); Company auditCompany2 = (Company)auditResource2.getContents().get(0); assertEquals("Sympedia", auditCompany2.getName()); session.close(); } public void testChangedAudit() throws Exception { CDOSession session = openSession1(); CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource(getResourcePath("/res1")); Company company = getModel1Factory().createCompany(); company.setName("ESC"); resource.getContents().add(company); long commitTime1 = transaction.commit().getTimeStamp(); assertEquals(true, session.getRepositoryInfo().getCreationTime() < commitTime1); assertEquals("ESC", company.getName()); company.setName("Sympedia"); long commitTime2 = transaction.commit().getTimeStamp(); assertEquals(true, commitTime1 < commitTime2); assertEquals(true, session.getRepositoryInfo().getCreationTime() < commitTime2); assertEquals("Sympedia", company.getName()); company.setName("Eclipse"); long commitTime3 = transaction.commit().getTimeStamp(); assertEquals(true, commitTime2 < commitTime3); assertEquals(true, session.getRepositoryInfo().getCreationTime() < commitTime2); assertEquals("Eclipse", company.getName()); closeSession1(); session = openSession2(); CDOView audit = session.openView(commitTime1); { CDOResource auditResource = audit.getResource(getResourcePath("/res1")); Company auditCompany = (Company)auditResource.getContents().get(0); assertEquals("ESC", auditCompany.getName()); } audit.setTimeStamp(commitTime2); { CDOResource auditResource = audit.getResource(getResourcePath("/res1")); Company auditCompany = (Company)auditResource.getContents().get(0); assertEquals("Sympedia", auditCompany.getName()); } audit.setTimeStamp(commitTime3); { CDOResource auditResource = audit.getResource(getResourcePath("/res1")); Company auditCompany = (Company)auditResource.getContents().get(0); assertEquals("Eclipse", auditCompany.getName()); } session.close(); } public void testKeepHandle() throws Exception { CDOSession session = openSession1(); CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource(getResourcePath("/res1")); Company company = getModel1Factory().createCompany(); company.setName("ESC"); resource.getContents().add(company); long commitTime1 = transaction.commit().getTimeStamp(); assertEquals(true, session.getRepositoryInfo().getCreationTime() < commitTime1); assertEquals("ESC", company.getName()); company.setName("Sympedia"); long commitTime2 = transaction.commit().getTimeStamp(); assertEquals(true, commitTime1 < commitTime2); assertEquals(true, session.getRepositoryInfo().getCreationTime() < commitTime2); assertEquals("Sympedia", company.getName()); company.setName("Eclipse"); long commitTime3 = transaction.commit().getTimeStamp(); assertEquals(true, commitTime2 < commitTime3); assertEquals(true, session.getRepositoryInfo().getCreationTime() < commitTime2); assertEquals("Eclipse", company.getName()); closeSession1(); session = openSession2(); CDOView audit = session.openView(commitTime1); CDOResource auditResource = audit.getResource(getResourcePath("/res1")); Company auditCompany = (Company)auditResource.getContents().get(0); assertEquals("ESC", auditCompany.getName()); audit.setTimeStamp(commitTime2); assertEquals("Sympedia", auditCompany.getName()); audit.setTimeStamp(commitTime3); assertEquals("Eclipse", auditCompany.getName()); session.close(); } public void testAddingContents() throws Exception { CDOSession session = openSession1(); CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource(getResourcePath("/res1")); resource.getContents().add(getModel1Factory().createCompany()); long commitTime1 = transaction.commit().getTimeStamp(); resource.getContents().add(getModel1Factory().createCompany()); long commitTime2 = transaction.commit().getTimeStamp(); resource.getContents().add(getModel1Factory().createCompany()); long commitTime3 = transaction.commit().getTimeStamp(); closeSession1(); session = openSession2(); CDOView audit = session.openView(commitTime1); CDOResource auditResource = audit.getResource(getResourcePath("/res1")); assertEquals(1, auditResource.getContents().size()); audit.setTimeStamp(commitTime2); assertEquals(2, auditResource.getContents().size()); audit.setTimeStamp(commitTime3); assertEquals(3, auditResource.getContents().size()); session.close(); } public void testRemovingContents() throws Exception { CDOSession session = openSession1(); CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource(getResourcePath("/res1")); resource.getContents().add(getModel1Factory().createCompany()); resource.getContents().add(getModel1Factory().createCompany()); resource.getContents().add(getModel1Factory().createCompany()); resource.getContents().add(getModel1Factory().createCompany()); resource.getContents().add(getModel1Factory().createCompany()); long commitTime1 = transaction.commit().getTimeStamp(); resource.getContents().remove(2); long commitTime2 = transaction.commit().getTimeStamp(); resource.getContents().remove(2); long commitTime3 = transaction.commit().getTimeStamp(); closeSession1(); session = openSession2(); CDOView audit = session.openView(commitTime1); CDOResource auditResource = audit.getResource(getResourcePath("/res1")); assertEquals(5, auditResource.getContents().size()); audit.setTimeStamp(commitTime2); assertEquals(4, auditResource.getContents().size()); audit.setTimeStamp(commitTime3); assertEquals(3, auditResource.getContents().size()); session.close(); } public void testRemovingContentsKeepHandle() throws Exception { CDOSession session = openSession1(); CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource(getResourcePath("/res1")); Company company = getModel1Factory().createCompany(); company.setName("ESC"); resource.getContents().add(getModel1Factory().createCompany()); resource.getContents().add(getModel1Factory().createCompany()); resource.getContents().add(company); resource.getContents().add(getModel1Factory().createCompany()); resource.getContents().add(getModel1Factory().createCompany()); long commitTime1 = transaction.commit().getTimeStamp(); resource.getContents().remove(2); long commitTime2 = transaction.commit().getTimeStamp(); closeSession1(); session = openSession2(); CDOView audit = session.openView(commitTime1); CDOResource auditResource = audit.getResource(getResourcePath("/res1")); assertEquals(5, auditResource.getContents().size()); Company auditCompany = (Company)auditResource.getContents().get(2); assertEquals("ESC", auditCompany.getName()); assertClean(auditCompany, audit); audit.setTimeStamp(commitTime2); assertEquals(4, auditResource.getContents().size()); assertInvalid(auditCompany); audit.setTimeStamp(commitTime1); assertInvalid(auditCompany); assertEquals(5, auditResource.getContents().size()); session.close(); } @Requires(IRepositoryConfig.CAPABILITY_RESTARTABLE) public void testConsistentHistoryForIsMany() throws Exception { ArrayList<List<Integer>> history = new ArrayList<List<Integer>>(); ArrayList<Long> timestamps = new ArrayList<Long>(); { CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource(getResourcePath("/res1")); GenListOfInt persistentList = Model5Factory.eINSTANCE.createGenListOfInt(); resource.getContents().add(persistentList); timestamps.add(transaction.commit().getTimeStamp()); history.add(new ArrayList<Integer>(persistentList.getElements())); persistentList.getElements().add(1); persistentList.getElements().add(2); persistentList.getElements().add(3); timestamps.add(transaction.commit().getTimeStamp()); history.add(new ArrayList<Integer>(persistentList.getElements())); persistentList.getElements().add(1, 4); timestamps.add(transaction.commit().getTimeStamp()); history.add(new ArrayList<Integer>(persistentList.getElements())); persistentList.getElements().add(0, 5); timestamps.add(transaction.commit().getTimeStamp()); history.add(new ArrayList<Integer>(persistentList.getElements())); persistentList.getElements().move(1, 3); timestamps.add(transaction.commit().getTimeStamp()); history.add(new ArrayList<Integer>(persistentList.getElements())); persistentList.getElements().move(4, 2); persistentList.getElements().move(1, 3); timestamps.add(transaction.commit().getTimeStamp()); history.add(new ArrayList<Integer>(persistentList.getElements())); persistentList.getElements().remove(2); timestamps.add(transaction.commit().getTimeStamp()); history.add(new ArrayList<Integer>(persistentList.getElements())); persistentList.getElements().add(1, 2); persistentList.getElements().remove(2); timestamps.add(transaction.commit().getTimeStamp()); history.add(new ArrayList<Integer>(persistentList.getElements())); persistentList.getElements().clear(); persistentList.getElements().add(6); persistentList.getElements().add(7); persistentList.getElements().add(8); timestamps.add(transaction.commit().getTimeStamp()); history.add(new ArrayList<Integer>(persistentList.getElements())); resource.getContents().clear(); transaction.commit(); transaction.close(); session.close(); clearCache(getRepository().getRevisionManager()); } { CDOSession session = openSession(); for (int i = 0; i < timestamps.size(); i++) { msg("Checking timestamp " + i + " of " + timestamps.size() + ": " + timestamps.get(i)); CDOView audit = session.openView(timestamps.get(i)); CDOResource res = audit.getResource(getResourcePath("/res1")); GenListOfInt persistentList = (GenListOfInt)res.getContents().get(0); assertEquals(joinList(history.get(i)), joinList(persistentList.getElements())); audit.close(); } CDOView view = session.openView(); CDOResource res = view.getResource(getResourcePath("/res1")); assertEquals(true, res.getContents().isEmpty()); } } private String joinList(List<Integer> list) { String result = ""; for (Integer i : list) { result += " " + i; } return result; } public void testCanCreateAuditAtRepoCreationTime() throws Exception { CDOSession session = openSession1(); CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource(getResourcePath("/res1")); Company company = getModel1Factory().createCompany(); resource.getContents().add(company); transaction.commit(); closeSession1(); session = openSession2(); session.openView(session.getRepositoryInfo().getCreationTime()); session.close(); } public void testCannotCreateAuditWithTimestampPriorToRepo() throws Exception { Calendar calendar = GregorianCalendar.getInstance(); calendar.set(Calendar.YEAR, 19); calendar.set(Calendar.MONTH, 11); calendar.set(Calendar.DAY_OF_MONTH, 11); long timeStampPriorToRepoCreation = calendar.getTime().getTime(); CDOSession session = openSession1(); try { CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource(getResourcePath("/res1")); Company company = getModel1Factory().createCompany(); resource.getContents().add(company); transaction.commit(); closeSession1(); session = openSession2(); session.openView(timeStampPriorToRepoCreation); fail("IllegalArgumentException expected"); } catch (IllegalArgumentException expected) { // Success } finally { session.close(); } } public void testCannotSetAuditTimestampPriorToRepo() throws Exception { Calendar calendar = GregorianCalendar.getInstance(); calendar.set(Calendar.YEAR, 19); calendar.set(Calendar.MONTH, 11); calendar.set(Calendar.DAY_OF_MONTH, 11); long timeStampPriorToRepoCreation = calendar.getTime().getTime(); CDOSession session = openSession1(); try { CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource(getResourcePath("/res1")); Company company = getModel1Factory().createCompany(); resource.getContents().add(company); long commitTime1 = transaction.commit().getTimeStamp(); closeSession1(); session = openSession2(); CDOView audit = session.openView(commitTime1); audit.setTimeStamp(timeStampPriorToRepoCreation); fail("Exception expected"); } catch (Exception expected) { // Success } finally { session.close(); } } public void testChangePath() throws Exception { long commitTime1; long commitTime2; { CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource(getResourcePath("/my/resource")); commitTime1 = transaction.commit().getTimeStamp(); resource.setPath(getResourcePath("/renamed")); commitTime2 = transaction.commit().getTimeStamp(); session.close(); } CDOSession session = openSession(); CDOView audit1 = session.openView(commitTime1); assertEquals(true, audit1.hasResource(getResourcePath("/my/resource"))); assertEquals(false, audit1.hasResource(getResourcePath("/renamed"))); CDOView audit2 = session.openView(commitTime2); assertEquals(false, audit2.hasResource(getResourcePath("/my/resource"))); assertEquals(true, audit2.hasResource(getResourcePath("/renamed"))); session.close(); } @SuppressWarnings("deprecation") public void testChangeURI() throws Exception { long commitTime1; long commitTime2; { CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource(getResourcePath("/my/resource")); commitTime1 = transaction.commit().getTimeStamp(); URI uri = URI.createURI("cdo://repo1" + getResourcePath("/renamed")); assertEquals(CDOURIUtil.createResourceURI(session, getResourcePath("/renamed")), uri); resource.setURI(uri); commitTime2 = transaction.commit().getTimeStamp(); session.close(); } CDOSession session = openSession(); CDOView audit1 = session.openView(commitTime1); assertEquals(true, audit1.hasResource(getResourcePath("/my/resource"))); assertEquals(false, audit1.hasResource(getResourcePath("/renamed"))); CDOView audit2 = session.openView(commitTime2); assertEquals(false, audit2.hasResource(getResourcePath("/my/resource"))); assertEquals(true, audit2.hasResource(getResourcePath("/renamed"))); session.close(); } }