/* Copyright (C) SYSTAP, LLC DBA Blazegraph 2006-2016. All rights reserved. Contact: SYSTAP, LLC DBA Blazegraph 2501 Calvert ST NW #106 Washington, DC 20008 licenses@blazegraph.com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * Created on Jun 19, 2008 */ package com.bigdata.rdf.sail.tck; import java.io.File; import java.util.Properties; import junit.framework.Test; import junit.framework.TestSuite; import org.apache.log4j.Logger; import org.openrdf.query.Dataset; import org.openrdf.query.parser.sparql.manifest.ManifestTest; import org.openrdf.query.parser.sparql.manifest.SPARQL11ManifestTest; import org.openrdf.query.parser.sparql.manifest.SPARQLQueryTest; import org.openrdf.repository.Repository; import org.openrdf.repository.RepositoryException; import com.bigdata.btree.keys.CollatorEnum; import com.bigdata.btree.keys.StrengthEnum; import com.bigdata.journal.IIndexManager; import com.bigdata.journal.ITx; import com.bigdata.rdf.sail.BigdataSail; import com.bigdata.rdf.sail.BigdataSail.Options; import com.bigdata.rdf.sail.BigdataSailRepository; import com.bigdata.rdf.store.AbstractTripleStore; import com.bigdata.rdf.store.ScaleOutTripleStore; import com.bigdata.resources.ResourceManager; import com.bigdata.service.AbstractClient; import com.bigdata.service.DistributedTransactionService; import com.bigdata.service.EmbeddedClient; import com.bigdata.service.EmbeddedFederation; import com.bigdata.service.IBigdataClient; import com.bigdata.service.IBigdataFederation; /** * Test harness for running the SPARQL test suites against an * {@link EmbeddedFederation}. * * @author <a href="mailto:thompsonbry@users.sourceforge.net">Bryan Thompson</a> */ public class BigdataEmbeddedFederationSparqlTest extends BigdataSparqlTest { private static final Logger log = Logger .getLogger(BigdataEmbeddedFederationSparqlTest.class); public BigdataEmbeddedFederationSparqlTest(String testURI, String name, String queryFileURL, String resultFileURL, Dataset dataSet, boolean laxCardinality, boolean checkOrder) { super(testURI, name, queryFileURL, resultFileURL, dataSet, laxCardinality, checkOrder); } /** * Skip the dataset tests for now until we can figure out what is wrong with * them. * * FIXME Fix the dataset tests. There is some problem in how the data to be * loaded into the fixture is being resolved in these tests. */ public static Test suite() throws Exception { return suite(true /*hideDatasetTests*/); } public static Test suite(final boolean hideDatasetTests) throws Exception { TestSuite suite1 = suiteEmbeddedFederation(); // Only run the specified tests? if (!testURIs.isEmpty()) { final TestSuite suite = new TestSuite(); for (String s : testURIs) { suite.addTest(getSingleTest(suite1, s)); } return suite; } if(hideDatasetTests) suite1 = filterOutTests(suite1,"dataset"); // suite1 = filterOutTests(suite1, "property-paths"); /** * BSBM BI use case query 5 * * bsbm-bi-q5 * * We were having a problem with this query which I finally tracked this * down to an error in the logic to decide on a merge join. The story is * documented at the trac issue below. However, even after all that the * predicted result for openrdf differs at the 4th decimal place. I have * therefore filtered out this test from the openrdf TCK. * * <pre> * Missing bindings: * [product=http://www4.wiwiss.fu-berlin.de/bizer/bsbm/v01/instances/dataFromProducer2/Product63; * nrOfReviews="3"^^<http://www.w3.org/2001/XMLSchema#integer>; * avgPrice="4207.426"^^<http://www.w3.org/2001/XMLSchema#float>; * country=http://downlode.org/rdf/iso-3166/countries#RU] * ==================================================== * Unexpected bindings: * [country=http://downlode.org/rdf/iso-3166/countries#RU; * product=http://www4.wiwiss.fu-berlin.de/bizer/bsbm/v01/instances/dataFromProducer2/Product63; * nrOfReviews="3"^^<http://www.w3.org/2001/XMLSchema#integer>; * avgPrice="4207.4263"^^<http://www.w3.org/2001/XMLSchema#float>] * </pre> * * @see <a * href="https://sourceforge.net/apps/trac/bigdata/ticket/534#comment:2"> * BSBM BI Q5 Error when using MERGE JOIN </a> */ suite1 = BigdataSparqlTest.filterOutTests( suite1, "bsbm" ); return suite1; } /** * Return the test suite. */ public static TestSuite suiteEmbeddedFederation() throws Exception { final SPARQLQueryTest.Factory factory = new SPARQLQueryTest.Factory() { @Override public SPARQLQueryTest createSPARQLQueryTest(String testURI, String name, String queryFileURL, String resultFileURL, Dataset dataSet, boolean laxCardinality) { return createSPARQLQueryTest(testURI, name, queryFileURL, resultFileURL, dataSet, laxCardinality, true/* checkOrder */); } @Override public SPARQLQueryTest createSPARQLQueryTest(String testURI, String name, String queryFileURL, String resultFileURL, Dataset dataSet, boolean laxCardinality, boolean checkOrder) { return new BigdataEmbeddedFederationSparqlTest(testURI, name, queryFileURL, resultFileURL, dataSet, laxCardinality, checkOrder) { @Override protected Properties getProperties() { final Properties p = new Properties(super .getProperties()); // p.setProperty(AbstractResource.Options.NESTED_SUBQUERY, // "false"); return p; } }; } }; final TestSuite suite = new TestSuite(); // SPARQL 1.0 suite.addTest(ManifestTest.suite(factory)); // SPARQL 1.1 suite.addTest(SPARQL11ManifestTest.suite(factory, true, true, false)); return suite; } private final String NAMESPACE = getName(); @Override protected Properties getProperties() { final Properties properties = super.getProperties(); /* * Properties which are specific to the (embedded) federation. */ /* * Only one data service. The EmbeddedFederation can not support more * than one FederatedQueryEngine peer because the EmbeddedClient gets * only a single ServiceID assigned. */ properties.setProperty(EmbeddedClient.Options.NDATA_SERVICES, "1"); // when the data are persistent use the test to name the data directory. properties.setProperty(EmbeddedClient.Options.DATA_DIR, NAMESPACE); // when the data are persistent use the test to name the data directory. properties.setProperty(DistributedTransactionService.Options.DATA_DIR, new File(NAMESPACE, "txService").toString()); /* * Disable the o/s specific statistics collection for the test run. * * Note: You only need to enable this if you are trying to track the * statistics or if you are testing index partition moves, since moves * rely on the per-host counters collected from the o/s. */ properties.setProperty( AbstractClient.Options.COLLECT_PLATFORM_STATISTICS, "false"); // disable moves. properties.setProperty( ResourceManager.Options.MAXIMUM_MOVES_PER_TARGET, "0"); // disable read/write transactions (not supported in scale-out). properties.setProperty(Options.ISOLATABLE_INDICES, "false"); return properties; } @Override protected Repository newRepository() throws RepositoryException { /* * Data files are placed into a directory named by the test. If the * directory exists, then it is removed before the federation is set up. */ final File dataDir = new File(NAMESPACE); if (dataDir.exists() && dataDir.isDirectory()) { recursiveDelete(dataDir); } final Properties properties = getProperties(); if (cannotInlineTests.contains(testURI)) { properties.setProperty(Options.INLINE_XSD_DATATYPE_LITERALS, "false"); properties.setProperty(Options.INLINE_DATE_TIMES, "false"); } if(unicodeStrengthIdentical.contains(testURI)) { // Force identical Unicode comparisons. properties.setProperty(Options.COLLATOR, CollatorEnum.JDK.toString()); properties.setProperty(Options.STRENGTH, StrengthEnum.Identical.toString()); } client = new EmbeddedClient(properties); fed = client.connect(); final BigdataSail sail; sail = new BigdataSail(openTripleStore(NAMESPACE, properties)); // See #1196 (Enable BigdataEmbeddedFederationSparqlTest tests in CI) // return new DatasetRepository(new BigdataSailRepository(sail)); return new BigdataSailRepository(sail); } @Override protected void tearDownBackend(final IIndexManager backend) { backend.destroy(); if (client != null) { client.disconnect(true/* immediateShutdown */); client = null; } fed = null; } /* * Embedded Federation Setup. */ private IBigdataClient<?> client; private IBigdataFederation<?> fed; /** * Recursively removes any files and subdirectories and then removes the * file (or directory) itself. * * @param f A file or directory. */ private void recursiveDelete(final File f) { if(f.isDirectory()) { final File[] children = f.listFiles(); for(int i=0; i<children.length; i++) { recursiveDelete( children[i] ); } } if(log.isInfoEnabled()) log.info("Removing: "+f); if (!f.delete()) throw new RuntimeException("Could not remove: " + f); } /* * KB Setup. */ /** * Create/re-open the repository. */ private AbstractTripleStore openTripleStore(final String namespace, final Properties properties) { // locate the resource declaration (aka "open"). AbstractTripleStore tripleStore = (AbstractTripleStore) fed .getResourceLocator().locate(namespace, ITx.UNISOLATED); if (tripleStore == null) { /* * Does not exist, so create it now. */ tripleStore = new ScaleOutTripleStore(fed, namespace, ITx.UNISOLATED, properties); // create the triple store. tripleStore.create(); } return tripleStore; } }