/** 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 */ package com.bigdata.gom; import java.io.IOException; import java.net.URL; import java.util.Iterator; import junit.extensions.proxy.IProxyTest; import junit.framework.Test; import junit.framework.TestCase; import org.openrdf.model.URI; import org.openrdf.model.Value; import org.openrdf.model.ValueFactory; import org.openrdf.repository.RepositoryException; import org.openrdf.rio.RDFFormat; import org.openrdf.rio.RDFParseException; import com.bigdata.gom.gpo.IGPO; import com.bigdata.gom.gpo.ILinkSet; import com.bigdata.gom.om.IObjectManager; import com.bigdata.gom.om.ObjectManager; import com.bigdata.rdf.sail.BigdataSail; import com.bigdata.rdf.sail.BigdataSailRepository; public class TestGPO extends ProxyGOMTest { protected void checkLinkSet(final ILinkSet ls, int size) { assertTrue(ls.size() == size); Iterator<IGPO> values = ls.iterator(); int count = 0; while (values.hasNext()) { count++; values.next(); } assertTrue(count == size); } /** * The initial state rdf store is defined in the testgom.n3 file */ protected void doLoadData() { final URL n3 = TestGOM.class.getResource("testgom.n3"); try { ((IGOMProxy) m_delegate).load(n3, RDFFormat.N3); } catch (Exception e) { fail("Unable to load test data"); } } public TestGPO() { } public TestGPO(String testName) { super(testName); } public void testHashCode() { doLoadData(); final ValueFactory vf = om.getValueFactory(); final URI clssuri = vf.createURI("gpo:#1"); IGPO clssgpo = om.getGPO(clssuri); assertTrue(clssgpo.hashCode() == clssgpo.getId().hashCode()); assertTrue(clssgpo.hashCode() == clssuri.hashCode()); } public void testLinkSetsIn() { doLoadData(); final ValueFactory vf = om.getValueFactory(); final URI clssuri = vf.createURI("gpo:#1"); IGPO clssgpo = om.getGPO(clssuri); final URI linkURI = vf.createURI("attr:/type"); ILinkSet ls = clssgpo.getLinksIn(linkURI); assertTrue(ls.getOwner() == clssgpo); assertTrue(ls.isLinkSetIn()); assertTrue(ls.getLinkProperty().equals(linkURI)); checkLinkSet(ls, 2); } /** * Checks consistency with added and removed values */ public void testLinkSetsOut() { doLoadData(); final ValueFactory vf = om.getValueFactory(); final URI workeruri = vf.createURI("gpo:#123"); IGPO workergpo = om.getGPO(workeruri); final URI worksFor = vf.createURI("attr:/employee#worksFor"); ILinkSet ls = workergpo.getLinksOut(worksFor); assertTrue(ls.getOwner() == workergpo); assertFalse(ls.isLinkSetIn()); assertTrue(ls.getLinkProperty().equals(worksFor)); checkLinkSet(ls, 2); final URI gpo678uri = vf.createURI("gpo:#678"); workergpo.addValue(worksFor, gpo678uri); checkLinkSet(ls, 3); workergpo.removeValue(worksFor, gpo678uri); checkLinkSet(ls, 2); workergpo.removeValues(worksFor); checkLinkSet(ls, 0); } /** * Checks linkSet membership */ public void testMembership() { doLoadData(); final ValueFactory vf = om.getValueFactory(); final URI workeruri = vf.createURI("gpo:#123"); IGPO workergpo = om.getGPO(workeruri); final URI worksFor = vf.createURI("attr:/employee#worksFor"); ILinkSet ls = workergpo.getLinksOut(worksFor); checkLinkSet(ls, 2); final URI companyuri = vf.createURI("gpo:#456"); IGPO companygpo = om.getGPO(companyuri); assertTrue(companygpo.isMemberOf(ls)); } public void testValues() { doLoadData(); final ValueFactory vf = om.getValueFactory(); final URI workeruri = vf.createURI("gpo:#123"); IGPO workergpo = om.getGPO(workeruri); final URI worksFor = vf.createURI("attr:/employee#worksFor"); final URI notWorksFor = vf.createURI("attr:/employee#notWorksFor"); assertTrue(workergpo.getValues(worksFor).size() > 0); assertTrue(workergpo.getValues(notWorksFor).isEmpty()); } public void testStatements() { doLoadData(); final ValueFactory vf = om.getValueFactory(); final URI workeruri = vf.createURI("gpo:#123"); IGPO workergpo = om.getGPO(workeruri); assertTrue(workergpo.getStatements().size() == 6); final URI worksFor = vf.createURI("attr:/employee#worksFor"); workergpo.removeValues(worksFor); assertTrue(workergpo.getStatements().size() == 4); } public void testBound() { doLoadData(); final ValueFactory vf = om.getValueFactory(); final URI workeruri = vf.createURI("gpo:#123"); IGPO workergpo = om.getGPO(workeruri); final URI worksFor = vf.createURI("attr:/employee#worksFor"); final URI notWorksFor = vf.createURI("attr:/employee#notWorksFor"); assertTrue(workergpo.isBound(worksFor)); assertFalse(workergpo.isBound(notWorksFor)); } public void testRemoveValues() { doLoadData(); final ValueFactory vf = om.getValueFactory(); final URI workeruri = vf.createURI("gpo:#123"); IGPO workergpo = om.getGPO(workeruri); final URI worksFor = vf.createURI("attr:/employee#worksFor"); assertFalse(workergpo.getLinksOut(worksFor).isEmpty()); assertFalse(workergpo.getValues(worksFor).isEmpty()); workergpo.removeValues(worksFor); assertTrue(workergpo.getValues(worksFor).isEmpty()); assertTrue(workergpo.getLinksOut(worksFor).isEmpty()); } public void testRemoveValue() { doLoadData(); final ValueFactory vf = om.getValueFactory(); final URI workeruri = vf.createURI("gpo:#123"); IGPO workergpo = om.getGPO(workeruri); final URI worksFor = vf.createURI("attr:/employee#worksFor"); assertFalse(workergpo.getValues(worksFor).isEmpty()); Value old = workergpo.getValue(worksFor); while (old != null) { workergpo.removeValue(worksFor, old); old = workergpo.getValue(worksFor); } assertTrue(workergpo.getValues(worksFor).isEmpty()); } public void testRemove() { doLoadData(); final ValueFactory vf = om.getValueFactory(); final URI workeruri = vf.createURI("gpo:#123"); IGPO workergpo = om.getGPO(workeruri); final URI worksFor = vf.createURI("attr:/employee#worksFor"); final ILinkSet ls = workergpo.getLinksOut(worksFor); assertTrue(ls.size() > 0); final IGPO employer = ls.iterator().next(); final int lssize = employer.getLinksIn(worksFor).size(); assertTrue(lssize > 0); workergpo.remove(); checkLinkSet(employer.getLinksIn(worksFor), lssize - 1); try { ls.size(); fail("Expected exception after removing GPO"); } catch (IllegalStateException ise) { // expected } try { workergpo.getLinksOut(worksFor); fail("Expected exception after removing GPO"); } catch (IllegalStateException ise) { // expected } } /** * Checks for reverse linkset referential integrity when property removed */ public void testLinkSetConsistency1() { doLoadData(); final ValueFactory vf = om.getValueFactory(); final URI workeruri = vf.createURI("gpo:#123"); IGPO workergpo = om.getGPO(workeruri); final URI worksFor = vf.createURI("attr:/employee#worksFor"); final ILinkSet ls = workergpo.getLinksOut(worksFor); assertTrue(ls.size() > 0); final IGPO employer = ls.iterator().next(); final ILinkSet employees = employer.getLinksIn(worksFor); assertTrue(employees.contains(workergpo)); workergpo.removeValue(worksFor, employer.getId()); assertFalse(employees.contains(workergpo)); } /** * Checks for reverse linkset referential integrity when property replaced */ public void testLinkSetConsistency2() { doLoadData(); final ValueFactory vf = om.getValueFactory(); final URI workeruri = vf.createURI("gpo:#123"); IGPO workergpo = om.getGPO(workeruri); final URI worksFor = vf.createURI("attr:/employee#worksFor"); final ILinkSet ls = workergpo.getLinksOut(worksFor); assertTrue(ls.size() > 0); final IGPO employer = ls.iterator().next(); final ILinkSet employees = employer.getLinksIn(worksFor); assertTrue(employees.contains(workergpo)); // set property to new URI final URI newuri = vf.createURI("gpo:#999"); workergpo.setValue(worksFor, newuri); assertFalse(employees.contains(workergpo)); assertTrue(om.getGPO(newuri).getLinksIn(worksFor).contains(workergpo)); } /** * Checks for consistency as link set is created and modified * * Dependent: setValue, getValue, removeValue, getLinksIn */ public void testLinkSetConsistency3() { doLoadData(); final ValueFactory vf = om.getValueFactory(); final IGPO worker1 = om.getGPO(vf.createURI("gpo:#1000")); final IGPO worker2 = om.getGPO(vf.createURI("gpo:#1001")); final IGPO worker3 = om.getGPO(vf.createURI("gpo:#1002")); final IGPO employer = om.getGPO(vf.createURI("gpo:#1003")); final URI worksFor = vf.createURI("attr:/employee#worksFor"); final ILinkSet ls = employer.getLinksIn(worksFor); checkLinkSet(ls, 0); worker1.setValue(worksFor, employer.getId()); checkLinkSet(ls, 1); // repeat - should be void worker1.setValue(worksFor, employer.getId()); assertTrue(worker1.getValue(worksFor).equals(employer.getId())); checkLinkSet(ls, 1); worker2.setValue(worksFor, employer.getId()); checkLinkSet(ls, 2); worker3.setValue(worksFor, employer.getId()); checkLinkSet(ls, 3); // now check on removal worker2.removeValue(worksFor, employer.getId()); assertTrue(worker2.getValue(worksFor) == null); checkLinkSet(ls, 2); // assertTrue(om.getDirtyObjectCount() == 3); } }