blob: 22e66add38ac79f579f96e5a7c5874d6fb974875 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 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.integration.tests.emf.EMFModelSupportFactory;
import org.eclipse.hawk.integration.tests.mm.Tree.Tree;
import org.eclipse.hawk.svn.tests.rules.TemporarySVNRepository;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
/**
* Tests for time-aware queries that use additional context parameters, e.g.
* repository/file paths.
*/
@RunWith(Parameterized.class)
public class FileContextTimeAwareEOLQueryEngineTest extends AbstractTimeAwareModelIndexingTest {
@Rule
public TemporarySVNRepository svnRepositoryA = new TemporarySVNRepository();
@Rule
public TemporarySVNRepository svnRepositoryB = new TemporarySVNRepository();
@Parameters(name = "{1}")
public static Iterable<Object[]> params() {
return TimeAwareTestSuite.caseParams();
}
public FileContextTimeAwareEOLQueryEngineTest(File baseDir, IGraphDatabaseFactory dbFactory) {
super(baseDir, dbFactory, new EMFModelSupportFactory());
}
@Override
protected void setUpMetamodels() throws Exception {
indexer.registerMetamodels(new File(baseDir, TREE_MM_PATH));
}
@Test
public void testCounts() throws Throwable {
final File fTreeA = new File(svnRepositoryA.getCheckoutDirectory(), "root.xmi");
Resource rTreeA = rsTree.createResource(URI.createFileURI(fTreeA.getAbsolutePath()));
// Do first the creation of a tree in the first SVN repository
Tree a1 = treeFactory.createTree();
a1.setLabel("A1");
rTreeA.getContents().add(a1);
rTreeA.save(null);
svnRepositoryA.add(fTreeA);
svnRepositoryA.commit("first in A");
// Now do the same at least one second later, in the second SVN repository
final long startMillis = System.currentTimeMillis();
final File fTreeB = new File(svnRepositoryB.getCheckoutDirectory(), "main.xmi");
Resource rTreeB = rsTree.createResource(URI.createFileURI(fTreeB.getAbsolutePath()));
final long elapsed = System.currentTimeMillis() - startMillis;
Thread.sleep(Math.max(0, 1000 - elapsed));
Tree b1 = treeFactory.createTree();
b1.setLabel("B1");
rTreeB.getContents().add(b1);
rTreeB.save(null);
svnRepositoryB.add(fTreeB);
svnRepositoryB.commit("first in B");
// Run the SVN indexing now
requestSVNIndex();
// Sanity check: last version should include both trees
assertEquals(2, timeAwareEOL("return Tree.latest.all.size;"));
// Try asking only for one repository
assertEquals(1, timeAwareEOLInRepository("return Tree.latest.all.size;", svnRepositoryA));
assertEquals("A1", timeAwareEOLInRepository("return Tree.latest.all.first.label;", svnRepositoryA));
assertEquals(1, timeAwareEOLInRepository("return Tree.latest.all.size;", svnRepositoryB));
assertEquals("B1", timeAwareEOLInRepository("return Tree.latest.all.first.label;", svnRepositoryB));
// TODO: add a context attribute for starting timepoint?
}
private void requestSVNIndex() throws Throwable {
requestSVNIndex(svnRepositoryA);
scheduleAndWait();
requestSVNIndex(svnRepositoryB);
scheduleAndWait();
}
}