ShaclSailFactoryTest.java

/*******************************************************************************
 * Copyright (c) 2019 Eclipse RDF4J contributors.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Distribution License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 *******************************************************************************/
package org.eclipse.rdf4j.sail.shacl.config;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.util.List;

import org.eclipse.rdf4j.common.transaction.IsolationLevel;
import org.eclipse.rdf4j.common.transaction.IsolationLevels;
import org.eclipse.rdf4j.model.ValueFactory;
import org.eclipse.rdf4j.sail.NotifyingSailConnection;
import org.eclipse.rdf4j.sail.SailException;
import org.eclipse.rdf4j.sail.helpers.AbstractNotifyingSail;
import org.eclipse.rdf4j.sail.memory.MemoryStore;
import org.eclipse.rdf4j.sail.shacl.ShaclSail;
import org.junit.jupiter.api.Test;

/**
 * Unit tests for {@link ShaclSailFactory}
 *
 * @author Jeen Broekstra
 */
public class ShaclSailFactoryTest {

	@Test
	public void getSailTypeReturnsCorrectValue() {
		ShaclSailFactory subject = new ShaclSailFactory();
		assertThat(subject.getSailType()).isEqualTo(ShaclSailFactory.SAIL_TYPE);
	}

	/**
	 * Verify that the created sail is configured according to the supplied default configuration.
	 */
	@Test
	public void getSailWithDefaultConfigSetsConfigurationCorrectly() {
		ShaclSailFactory subject = new ShaclSailFactory();

		ShaclSailConfig config = new ShaclSailConfig();

		ShaclSail sail = (ShaclSail) subject.getSail(config);
		sail.setBaseSail(new MemoryStore());

		assertMatchesConfig(sail, config);

		sail.shutDown();
	}

	/**
	 * Verify that the created sail is configured according to the supplied default configuration.
	 */
	@Test
	public void serializableValidationLimitedBySupportIsolationLevelsTest() {
		ShaclSailFactory subject = new ShaclSailFactory();

		ShaclSailConfig config = new ShaclSailConfig();
		config.setSerializableValidation(true);

		ShaclSail sail = (ShaclSail) subject.getSail(config);

		assertFalse(sail.isSerializableValidation());

		AbstractNotifyingSail sailThatDoesntSupportSnapshotIsolation = new AbstractNotifyingSail() {
			@Override
			protected void shutDownInternal() throws SailException {

			}

			@Override
			protected NotifyingSailConnection getConnectionInternal() throws SailException {
				return null;
			}

			@Override
			public boolean isWritable() throws SailException {
				return false;
			}

			@Override
			public ValueFactory getValueFactory() {
				return null;
			}

			@Override
			public List<IsolationLevel> getSupportedIsolationLevels() {
				return List.of(IsolationLevels.NONE, IsolationLevels.READ_COMMITTED, IsolationLevels.SNAPSHOT_READ,
						IsolationLevels.SERIALIZABLE);
			}
		};

		sail.setBaseSail(sailThatDoesntSupportSnapshotIsolation);
		assertFalse(sail.isSerializableValidation());

		sail.setBaseSail(new MemoryStore());
		assertTrue(sail.isSerializableValidation());

		sail.shutDown();

	}

	/**
	 * Verify that the created sail is configured according to the supplied customized configuration.
	 */
	@Test
	public void getSailWithCustomConfigSetsConfigurationCorrectly() {
		ShaclSailFactory subject = new ShaclSailFactory();

		ShaclSailConfig config = new ShaclSailConfig();

		// set everything to the opposite of its default
		config.setCacheSelectNodes(!config.isCacheSelectNodes());
		config.setGlobalLogValidationExecution(!config.isGlobalLogValidationExecution());
		config.setLogValidationPlans(!config.isLogValidationPlans());
		config.setLogValidationViolations(!config.isLogValidationViolations());
		config.setParallelValidation(!config.isParallelValidation());
		config.setValidationEnabled(!config.isValidationEnabled());
		config.setPerformanceLogging(!config.isPerformanceLogging());
		config.setSerializableValidation(!config.isSerializableValidation());
		config.setRdfsSubClassReasoning(!config.isRdfsSubClassReasoning());
		config.setEclipseRdf4jShaclExtensions(!config.isEclipseRdf4jShaclExtensions());
		config.setDashDataShapes(!config.isDashDataShapes());

		config.setValidationResultsLimitTotal(100);
		config.setValidationResultsLimitPerConstraint(3);

		ShaclSail sail = (ShaclSail) subject.getSail(config);
		assertMatchesConfig(sail, config);

	}

	private void assertMatchesConfig(ShaclSail sail, ShaclSailConfig config) {
		assertThat(sail.isCacheSelectNodes()).isEqualTo(config.isCacheSelectNodes());
		assertThat(sail.isGlobalLogValidationExecution()).isEqualTo(config.isGlobalLogValidationExecution());
		assertThat(sail.isLogValidationPlans()).isEqualTo(config.isLogValidationPlans());
		assertThat(sail.isLogValidationViolations()).isEqualTo(config.isLogValidationViolations());
		assertThat(sail.isParallelValidation()).isEqualTo(config.isParallelValidation());
		assertThat(sail.isValidationEnabled()).isEqualTo(config.isValidationEnabled());
		assertThat(sail.isPerformanceLogging()).isEqualTo(config.isPerformanceLogging());
		assertThat(sail.isSerializableValidation()).isEqualTo(config.isSerializableValidation());
		assertThat(sail.isRdfsSubClassReasoning()).isEqualTo(config.isRdfsSubClassReasoning());
		assertThat(sail.isEclipseRdf4jShaclExtensions()).isEqualTo(config.isEclipseRdf4jShaclExtensions());
		assertThat(sail.isDashDataShapes()).isEqualTo(config.isDashDataShapes());
		assertThat(sail.getValidationResultsLimitTotal()).isEqualTo(config.getValidationResultsLimitTotal());
		assertThat(sail.getValidationResultsLimitPerConstraint())
				.isEqualTo(config.getValidationResultsLimitPerConstraint());
	}

}