blob: ddd4762c23044f9734e8fee32dcf2430386e94e7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018-2019 Aston University.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the Eclipse
* Public License, v. 2.0 are satisfied: GNU General Public License, version 3.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-3.0
*
* Contributors:
* Antonio Garcia-Dominguez - initial API and implementation
******************************************************************************/
package org.eclipse.hawk.timeaware.tests;
import static org.junit.Assert.assertEquals;
import java.io.File;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.hawk.backend.tests.factories.IGraphDatabaseFactory;
import org.eclipse.hawk.git.JGitRepository;
import org.eclipse.hawk.integration.tests.emf.EMFModelSupportFactory;
import org.eclipse.hawk.integration.tests.mm.Tree.Tree;
import org.eclipse.hawk.integration.tests.mm.Tree.TreeFactory;
import org.eclipse.jgit.api.Git;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
/**
* Tests for the time-aware indexing of model element nodes, using Git.
*/
@RunWith(Parameterized.class)
public class GitNodeHistoryTest extends AbstractTimeAwareModelIndexingTest {
@Rule
public TemporaryFolder folder = new TemporaryFolder();
@Parameters(name = "{1}")
public static Iterable<Object[]> params() {
return TimeAwareTestSuite.caseParams();
}
public GitNodeHistoryTest(File baseDir, IGraphDatabaseFactory dbFactory) {
super(baseDir, dbFactory, new EMFModelSupportFactory());
}
@Override
public void setUp() throws Exception {
super.setUp();
Git.init().setDirectory(folder.getRoot()).call();
}
@Override
protected void setUpMetamodels() throws Exception {
indexer.registerMetamodels(new File(baseDir, TREE_MM_PATH));
}
@Test
public void defaultBranch() throws Throwable {
final File fTree = new File(folder.getRoot(), "root.xmi");
final Resource rTree = rsTree.createResource(URI.createFileURI(fTree.getAbsolutePath()));
final Tree tRoot = TreeFactory.eINSTANCE.createTree();
tRoot.setLabel("root");
rTree.getContents().add(tRoot);
rTree.save(null);
try (Git git = Git.open(folder.getRoot())) {
git.add().addFilepattern(fTree.getName()).call();
git.commit().setMessage("first commit").call();
final Tree tChild = TreeFactory.eINSTANCE.createTree();
tChild.setLabel("child");
tRoot.getChildren().add(tChild);
rTree.save(null);
git.commit().setAll(true).setMessage("second commit").call();
}
JGitRepository vcs = new JGitRepository();
vcs.init(folder.getRoot().getAbsolutePath(), indexer);
vcs.run();
indexer.addVCSManager(vcs, true);
scheduleAndWait(() -> {
// 3 versions: beginning of time + 2 commits
assertEquals(3, timeAwareEOL("return Tree.versions.size;"));
assertEquals(2, timeAwareEOL("return Tree.latest.all.size;"));
assertEquals(1, timeAwareEOL("return Tree.latest.prev.all.size;"));
assertEquals(0, timeAwareEOL("return Tree.latest.prev.prev.all.size;"));
return null;
});
}
@Test
public void nonDefaultBranch() throws Throwable {
final File fTree = new File(folder.getRoot(), "root.xmi");
final Resource rTree = rsTree.createResource(URI.createFileURI(fTree.getAbsolutePath()));
final Tree tRoot = TreeFactory.eINSTANCE.createTree();
tRoot.setLabel("root");
rTree.getContents().add(tRoot);
rTree.save(null);
try (Git git = Git.open(folder.getRoot())) {
git.add().addFilepattern(fTree.getName()).call();
git.commit().setMessage("first commit").call();
final Tree tChild = TreeFactory.eINSTANCE.createTree();
tChild.setLabel("child");
tRoot.getChildren().add(tChild);
rTree.save(null);
git.commit().setAll(true).setMessage("second commit").call();
git.checkout().setName("newbranch").setCreateBranch(true).call();
tChild.setLabel("changed");
rTree.save(null);
git.commit().setAll(true).setMessage("third commit in new branch").call();
git.checkout().setName("master").call();
}
JGitRepository vcs = new JGitRepository();
vcs.init(folder.getRoot().toURI().toString() + "?branch=newbranch", indexer);
vcs.run();
indexer.addVCSManager(vcs, true);
scheduleAndWait(() -> {
// 3 versions: beginning of time + 2 commits
assertEquals(1, timeAwareEOL("return Tree.latest.all.select(t|t.label='child').size;"));
assertEquals("changed", timeAwareEOL("return Tree.latest.all.selectOne(t|t.label='child').latest.label;"));
assertEquals(2, timeAwareEOL("return Tree.latest.all.selectOne(t|t.label='child').versions.size;"));
return null;
});
}
}