You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by an...@apache.org on 2007/02/13 10:02:13 UTC

svn commit: r506915 - in /jackrabbit/trunk/contrib/spi/client/src/test: config/ java/org/apache/jackrabbit/jcr2spi/ java/org/apache/jackrabbit/jcr2spi/lock/ java/org/apache/jackrabbit/jcr2spi/nodetype/ java/org/apache/jackrabbit/test/

Author: angela
Date: Tue Feb 13 01:02:11 2007
New Revision: 506915

URL: http://svn.apache.org/viewvc?view=rev&rev=506915
Log:
work in progress

- tests



Added:
    jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/AddNewPropertyTest.java   (with props)
    jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/UpdateTest.java   (with props)
    jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/
    jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/AbstractLockTest.java   (with props)
    jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/DeepLockTest.java   (with props)
    jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/OpenScopedLockTest.java   (with props)
    jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/SessionScopedLockTest.java   (with props)
    jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/nodetype/
    jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/nodetype/AddMixinTest.java   (with props)
    jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/nodetype/RemoveMixinTest.java   (with props)
    jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestGeneralRead.java   (with props)
    jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestGeneralWrite.java   (with props)
    jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestNodeRead.java   (with props)
    jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestNodeWrite.java   (with props)
    jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestPropertyRead.java   (with props)
    jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestPropertyWrite.java   (with props)
Modified:
    jackrabbit/trunk/contrib/spi/client/src/test/config/repositoryStubImpl.properties
    jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/AccessByRelativePathTest.java
    jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/JCR2SPIRepositoryStub.java

Modified: jackrabbit/trunk/contrib/spi/client/src/test/config/repositoryStubImpl.properties
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/client/src/test/config/repositoryStubImpl.properties?view=diff&rev=506915&r1=506914&r2=506915
==============================================================================
--- jackrabbit/trunk/contrib/spi/client/src/test/config/repositoryStubImpl.properties (original)
+++ jackrabbit/trunk/contrib/spi/client/src/test/config/repositoryStubImpl.properties Tue Feb 13 01:02:11 2007
@@ -6,15 +6,15 @@
 javax.jcr.tck.repository_stub_impl=org.apache.jackrabbit.jcr2spi.JCR2SPIRepositoryStub
 
 # repository specific configuration
-org.apache.jackrabbit.jcr2spi.repository.url=http://localhost:8080/jackrabbit-webapp/server/
+org.apache.jackrabbit.jcr2spi.repository.url=http://localhost:5502/jackrabbit/server/
 org.apache.jackrabbit.jcr2spi.workspace.name=default
 
 
 # credential configuration
-javax.jcr.tck.superuser.name=superuser
-javax.jcr.tck.superuser.pwd=
+javax.jcr.tck.superuser.name=admin
+javax.jcr.tck.superuser.pwd=admin
 javax.jcr.tck.readwrite.name=user
-javax.jcr.tck.readwrite.pwd=
+javax.jcr.tck.readwrite.pwd=user
 javax.jcr.tck.readonly.name=anonymous
 javax.jcr.tck.readonly.pwd=
 
@@ -27,7 +27,7 @@
 javax.jcr.tck.nodename4=node4
 javax.jcr.tck.propertyname1=prop1
 javax.jcr.tck.propertyname2=prop2
-javax.jcr.tck.workspacename=test
+javax.jcr.tck.workspacename=second
 
 # namespace configuration
 javax.jcr.tck.namespaces=test
@@ -233,10 +233,10 @@
 javax.jcr.tck.RepositoryLoginTest.testroot=/testdata
 
 # Test class: RootNodeTest
-javax.jcr.tck.RootNodeTest.testroot=/testdata
+javax.jcr.tck.RootNodeTest.testroot=/testroot
 
 # Test class: ReferenceableRootNodesTest
-javax.jcr.tck.ReferenceableRootNodesTest.testroot=/testdata
+javax.jcr.tck.ReferenceableRootNodesTest.testroot=/testroot
 
 # Test class: ExportDocViewTest
 javax.jcr.tck.ExportDocViewTest.testroot=/testdata

Modified: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/AccessByRelativePathTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/AccessByRelativePathTest.java?view=diff&rev=506915&r1=506914&r2=506915
==============================================================================
--- jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/AccessByRelativePathTest.java (original)
+++ jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/AccessByRelativePathTest.java Tue Feb 13 01:02:11 2007
@@ -71,7 +71,7 @@
          try {
              root.getNode(DOTDOT);
              fail("Root does not have a parent node. <root>.getNode(\"..\") must fail.");
-         } catch (PathNotFoundException e) {
+         } catch (RepositoryException e) {
              // ok.
          }
     }

Added: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/AddNewPropertyTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/AddNewPropertyTest.java?view=auto&rev=506915
==============================================================================
--- jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/AddNewPropertyTest.java (added)
+++ jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/AddNewPropertyTest.java Tue Feb 13 01:02:11 2007
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.jcr2spi;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.jackrabbit.test.AbstractJCRTest;
+import org.apache.jackrabbit.test.NotExecutableException;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.Property;
+import javax.jcr.Value;
+import javax.jcr.ItemNotFoundException;
+import javax.jcr.version.VersionException;
+import javax.jcr.nodetype.ConstraintViolationException;
+import javax.jcr.lock.LockException;
+
+/**
+ * <code>AddNewPropertyTest</code>...
+ */
+public class AddNewPropertyTest extends AbstractJCRTest {
+
+    private static Logger log = LoggerFactory.getLogger(AddNewPropertyTest.class);
+
+    private String propname;
+
+    protected void tearDown() throws Exception {
+        testRootNode.refresh(false);
+        super.tearDown();
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        String propName = propertyName1;
+        while (testRootNode.hasProperty(propName)) {
+            propName = propName + "_";
+        }
+        this.propname = propName;
+    }
+
+    public void testPropertyAccessibleAfterSave() throws NotExecutableException, RepositoryException {
+        Property p;
+        try {
+            p = testRootNode.setProperty(propname, "anyValue");
+        } catch (RepositoryException e) {
+            throw new NotExecutableException();
+        }
+
+        // check if p is valid and can be accessed from the parent node.
+        String name = p.getName();
+        assertEquals("Added property must have the original name", name, propname);
+        assertTrue("Accessing the created property again must return the 'same' item.", p.isSame(testRootNode.getProperty(propname)));
+    }
+
+    /**
+     * Implementation specific test: Node.setProperty for non-existing property
+     * with a <code>null</code> value must throw  <code>ItemNotFoundException</code>
+     *
+     * @throws NotExecutableException
+     * @throws RepositoryException
+     * @throws LockException
+     * @throws ConstraintViolationException
+     * @throws VersionException
+     */
+    public void testAddPropertyWithNullValue() throws NotExecutableException, RepositoryException, LockException, ConstraintViolationException, VersionException {
+        try {
+            testRootNode.setProperty(propname, (Value) null);
+        } catch (ItemNotFoundException e) {
+            // OK
+        }
+    }
+
+    /**
+     * Implementation specific test: Node.setProperty for non-existing property
+     * with a <code>null</code> value array must throw  <code>ItemNotFoundException</code>
+     *
+     * @throws NotExecutableException
+     * @throws RepositoryException
+     * @throws LockException
+     * @throws ConstraintViolationException
+     * @throws VersionException
+     */
+    public void testAddPropertyWithNullValues() throws NotExecutableException, RepositoryException, LockException, ConstraintViolationException, VersionException {
+        try {
+            testRootNode.setProperty(propname, (Value[]) null);
+        } catch (ItemNotFoundException e) {
+            // OK
+        }
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/AddNewPropertyTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/AddNewPropertyTest.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision url

Modified: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/JCR2SPIRepositoryStub.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/JCR2SPIRepositoryStub.java?view=diff&rev=506915&r1=506914&r2=506915
==============================================================================
--- jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/JCR2SPIRepositoryStub.java (original)
+++ jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/JCR2SPIRepositoryStub.java Tue Feb 13 01:02:11 2007
@@ -86,11 +86,11 @@
                     }
 
                     public CacheBehaviour getCacheBehaviour() {
-                        return CacheBehaviour.OBSERVATION;
+                        return CacheBehaviour.INVALIDATE;
                     }
 
                     public int getPollingInterval() {
-                        return 3 * 1000;
+                        return 3 * 100000000;
                     }
                 };
 

Added: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/UpdateTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/UpdateTest.java?view=auto&rev=506915
==============================================================================
--- jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/UpdateTest.java (added)
+++ jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/UpdateTest.java Tue Feb 13 01:02:11 2007
@@ -0,0 +1,208 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.jcr2spi;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.jackrabbit.test.AbstractJCRTest;
+import org.apache.jackrabbit.test.NotExecutableException;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.NoSuchWorkspaceException;
+import javax.jcr.InvalidItemStateException;
+import javax.jcr.AccessDeniedException;
+import javax.jcr.Node;
+import javax.jcr.ItemNotFoundException;
+import javax.jcr.ItemExistsException;
+import javax.jcr.Session;
+import javax.jcr.Property;
+import javax.jcr.version.VersionException;
+import javax.jcr.nodetype.ConstraintViolationException;
+import javax.jcr.nodetype.NoSuchNodeTypeException;
+import javax.jcr.lock.LockException;
+import java.util.List;
+import java.util.Arrays;
+
+/**
+ * <code>UpdateTest</code>...
+ */
+public class UpdateTest extends AbstractJCRTest {
+
+    private static Logger log = LoggerFactory.getLogger(UpdateTest.class);
+
+    private String currentWorkspace;
+    private String[] accessibleWorkspaces;
+
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        currentWorkspace = testRootNode.getSession().getWorkspace().getName();
+        accessibleWorkspaces = testRootNode.getSession().getWorkspace().getAccessibleWorkspaceNames();
+    }
+
+    public void testInvalidSrcWorkspace() throws RepositoryException, InvalidItemStateException, AccessDeniedException {
+        String nonExistingWorkspace = "nonExistingWorkspace";
+        List l = Arrays.asList(accessibleWorkspaces);
+        while (l.contains(nonExistingWorkspace)) {
+            nonExistingWorkspace = nonExistingWorkspace + "_";
+        }
+
+        try {
+            testRootNode.update(nonExistingWorkspace);
+        } catch (NoSuchWorkspaceException e) {
+            //  ok
+        }
+    }
+
+    public void testNoCorrespondingNode() throws RepositoryException, InvalidItemStateException, AccessDeniedException, NotExecutableException {
+        Node n = testRootNode.addNode(nodeName2, testNodeType);
+        testRootNode.save();
+
+        String srcWorkspace = null;
+        for (int i = 0; i < accessibleWorkspaces.length; i++) {
+            if (!accessibleWorkspaces.equals(currentWorkspace)) {
+                try {
+                    n.getCorrespondingNodePath(accessibleWorkspaces[i]);
+                } catch (ItemNotFoundException e) {
+                    srcWorkspace = accessibleWorkspaces[i];
+                }
+            }
+        }
+        if (srcWorkspace == null) {
+            throw new NotExecutableException("Cannot run update. No workspace found, that misses the corresponding node.");
+        }
+
+        try {
+            // update without corresponding node must be a nop
+            testRootNode.update(srcWorkspace);
+        } catch (RepositoryException e) {
+            fail("Update with workspace that doesn't contain the corresponding node must work.");
+        }
+    }
+
+    public void testSameWorkspace() throws RepositoryException, InvalidItemStateException, AccessDeniedException, NotExecutableException {
+        try {
+            // update without corresponding node must be a nop
+            testRootNode.update(currentWorkspace);
+        } catch (RepositoryException e) {
+            fail("Update with srcWorkspace == this workspace must return silently.");
+        }
+    }
+
+    public void testPendingChangesSameWorkspace() throws RepositoryException, InvalidItemStateException, AccessDeniedException, NotExecutableException {
+        testRootNode.addNode(nodeName2, testNodeType);
+
+        try {
+            testRootNode.update(currentWorkspace);
+            fail("Update while changes are pending must fail with InvalidItemStateException");
+        } catch (InvalidItemStateException  e) {
+            // ok
+        }
+    }
+
+    public void testPendingChanges() throws RepositoryException, LockException, ConstraintViolationException, NoSuchNodeTypeException, ItemExistsException, VersionException, NotExecutableException {
+        testRootNode.addNode(nodeName2, testNodeType);
+
+        String srcWorkspace = getAnotherWorkspace();
+        try {
+            testRootNode.update(srcWorkspace);
+            fail("Update while changes are pending must fail with InvalidItemStateException");
+        } catch (InvalidItemStateException  e) {
+            // ok
+        }
+    }
+
+    public void testPendingChangesOnOtherNode() throws RepositoryException, LockException, ConstraintViolationException, NoSuchNodeTypeException, ItemExistsException, VersionException, NotExecutableException {
+        try {
+        Node root = testRootNode.getSession().getRootNode();
+            if (root.isSame(testRootNode)) {
+                throw new NotExecutableException();
+            }
+            if (root.canAddMixin("mixLockable")) {
+                root.addMixin("mixLockable");
+            } else {
+                root.setProperty(propertyName1, "anyValue");
+            }
+        } catch (RepositoryException e) {
+            throw new NotExecutableException();
+        }
+
+        String srcWorkspace = getAnotherWorkspace();
+        try {
+            testRootNode.update(srcWorkspace);
+            fail("Update while changes are pending must fail with InvalidItemStateException");
+        } catch (InvalidItemStateException  e) {
+            // ok
+        }
+    }
+
+    public void testUpdateRemovesExtraProperty() throws RepositoryException, NotExecutableException {
+        // create test node in default workspace
+        testRootNode.setProperty(propertyName1, "test");
+        testRootNode.save();
+
+        String srcWorkspace = getAnotherWorkspace();
+        // get the root node in the second workspace
+        Session session2 = helper.getSuperuserSession(srcWorkspace);
+        // make sure the source-session has the corresponding node.
+        Node testRootW2 = (Node) session2.getItem(testRootNode.getCorrespondingNodePath(srcWorkspace));
+
+        // call the update method on test node in default workspace
+        testRootNode.update(srcWorkspace);
+
+        // ok first check if node has no longer propertis
+        assertFalse("Node updated with Node.update() should have property removed", testRootNode.hasProperty(propertyName1));
+    }
+
+    public void testUpdateAddsMissingSubtree() throws RepositoryException, NotExecutableException {
+        String srcWorkspace = getAnotherWorkspace();
+        // get the root node in the second workspace
+        Session session2 = helper.getSuperuserSession(srcWorkspace);
+        // make sure the source-session has the corresponding node.
+        Node testRootW2 = (Node) session2.getItem(testRootNode.getCorrespondingNodePath(srcWorkspace));
+
+        // create test node in second workspace
+        Node aNode2 = testRootW2.addNode(nodeName1, testNodeType);
+        aNode2.addNode(nodeName2, testNodeType);
+        aNode2.setProperty(propertyName2, "test");
+        Property p2 = testRootW2.setProperty(propertyName1, "test");
+        testRootW2.save();
+
+        // call the update method on test node in default workspace
+        testRootNode.update(srcWorkspace);
+
+        // ok check if the child has been added
+        boolean allPresent = testRootNode.hasNode(nodeName1) &&
+                             testRootNode.hasNode(nodeName1+"/"+nodeName2) &&
+                             testRootNode.hasProperty(nodeName1+"/"+propertyName2) &&
+                             testRootNode.hasProperty(propertyName1);
+        assertTrue("Node updated with Node.update() should have received childrens", allPresent);
+    }
+
+    private String getAnotherWorkspace() throws NotExecutableException {
+        String srcWorkspace = null;
+        for (int i = 0; i < accessibleWorkspaces.length; i++) {
+            if (!accessibleWorkspaces.equals(currentWorkspace)) {
+                srcWorkspace = accessibleWorkspaces[i];
+            }
+        }
+        if (srcWorkspace == null) {
+            throw new NotExecutableException("Cannot run update. No workspace found, that misses the corresponding node.");
+        }
+        return srcWorkspace;
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/UpdateTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/UpdateTest.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision url

Added: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/AbstractLockTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/AbstractLockTest.java?view=auto&rev=506915
==============================================================================
--- jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/AbstractLockTest.java (added)
+++ jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/AbstractLockTest.java Tue Feb 13 01:02:11 2007
@@ -0,0 +1,261 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.jcr2spi.lock;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.jackrabbit.test.AbstractJCRTest;
+import org.apache.jackrabbit.test.NotExecutableException;
+
+import javax.jcr.Session;
+import javax.jcr.RepositoryException;
+import javax.jcr.Node;
+import javax.jcr.Repository;
+import javax.jcr.lock.Lock;
+import javax.jcr.lock.LockException;
+
+/**
+ * <code>AbstractLockTest</code>...
+ */
+public abstract class AbstractLockTest extends AbstractJCRTest {
+
+    private static Logger log = LoggerFactory.getLogger(AbstractLockTest.class);
+
+    Node lockedNode;
+    Node childNode;
+    Lock lock;
+
+    abstract boolean isSessionScoped();
+
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        lockedNode = testRootNode.addNode(nodeName1, testNodeType);
+        lockedNode.addMixin(mixLockable);
+        childNode = lockedNode.addNode(nodeName2, testNodeType);
+        testRootNode.save();
+
+        lock = lockedNode.lock(false, isSessionScoped());
+    }
+
+    protected void tearDown() throws Exception {
+        try {
+            // make sure all locks are removed
+            lockedNode.unlock();
+        } catch (RepositoryException e) {
+            // ignore
+        }
+        super.tearDown();
+    }
+
+    public void testParentChildLock() throws Exception {
+        childNode.addMixin(mixLockable);
+        testRootNode.save();
+
+        // lock child node
+        try {
+            childNode.lock(false, isSessionScoped());
+            // unlock parent node
+            lockedNode.unlock();
+            // child node must still hold lock
+            assertTrue("child node must still hold lock", childNode.isLocked() && childNode.holdsLock());
+        } finally {
+            childNode.unlock();
+        }
+    }
+
+    public void testParentChildLock2() throws Exception {
+        childNode.addMixin(mixLockable);
+        testRootNode.save();
+        try {
+            Lock l = childNode.lock(false, isSessionScoped());
+            assertTrue("child node must still hold lock", l.getNode().isSame(childNode));
+        } finally {
+            childNode.unlock();
+        }
+    }
+
+    /**
+     * Test Lock.isDeep()
+     */
+    public void testNotIsDeep() throws RepositoryException {
+        assertFalse("Lock.isDeep() must be false if the lock has not been set as not deep", lock.isDeep());
+    }
+
+    /**
+     * Test Lock.isSessionScoped()
+     */
+    public void testIsSessionScoped() throws RepositoryException {
+        if (isSessionScoped()) {
+            assertTrue("Lock.isSessionScoped() must be true.", lock.isSessionScoped());
+        } else {
+            assertFalse("Lock.isSessionScoped() must be false. ", lock.isSessionScoped());
+        }
+    }
+
+    public void testLockIsLive() throws RepositoryException {
+        // assert: lock must be alive
+        assertTrue("lock must be alive", lock.isLive());
+    }
+
+    public void testRefresh() throws RepositoryException {
+        // assert: refresh must succeed
+        lock.refresh();
+    }
+
+    public void testUnlock() throws RepositoryException {
+        // unlock node
+        lockedNode.unlock();
+        // assert: lock must not be alive
+        assertFalse("lock must not be alive", lock.isLive());
+    }
+
+    public void testRefreshNotLive() throws Exception {
+        // unlock node
+        lockedNode.unlock();
+        // refresh
+        try {
+            lock.refresh();
+            fail("Refresh on a lock that is not alive must fail");
+        } catch (LockException e) {
+            // success
+        }
+    }
+
+    /**
+     * Tests if a locked, checked-in node can be unlocked
+     */
+    public void testCheckedInUnlock() throws Exception {
+        if (!isSupported(Repository.OPTION_VERSIONING_SUPPORTED)) {
+            throw new NotExecutableException("Repository does not support versioning.");
+        }
+
+        lockedNode.addMixin(mixVersionable);
+        lockedNode.save();
+
+        // lock and check-in
+        lockedNode.checkin();
+
+        // do the unlock
+        lockedNode.unlock();
+        assertFalse("Could not unlock a locked, checked-in node", lockedNode.holdsLock());
+    }
+
+    public void testReorder() throws Exception {
+        testRootNode.addNode(nodeName2);
+        testRootNode.addNode(nodeName3);
+        testRootNode.save();
+
+        // move last node in front of first
+        testRootNode.orderBefore(lockedNode.getName(), nodeName3);
+        testRootNode.save();
+
+        assertTrue("Node must remain locked upon reordering", testRootNode.getNode(lockedNode.getName()).isLocked());
+    }
+
+    public void testReorderSNS() throws Exception {
+        // create 2 additional nodes with same name
+        testRootNode.addNode(nodeName1);
+        testRootNode.addNode(nodeName1);
+        testRootNode.save();
+
+        // assert: first node locked
+        assertTrue("First child node locked", testRootNode.getNode(nodeName1 + "[1]").isLocked());
+
+        // move first node to last
+        testRootNode.orderBefore(nodeName1 + "[1]", null);
+        testRootNode.save();
+
+        // assert: third node locked
+        assertTrue("Third child node locked", testRootNode.getNode(nodeName1 + "[3]").isLocked());
+    }
+
+    /**
+     * Tests if move preserves lock state (JIRA issue JCR-207). A node that has
+     * been locked must still appear locked when it has been moved or renamed,
+     * regardless whether the changes have already been made persistent.
+     */
+    public void testMoveLocked() throws Exception {
+
+        Session session = testRootNode.getSession();
+
+        childNode.addMixin(mixLockable);
+        childNode.save();
+
+        try {
+            // lock child node
+            childNode.lock(false, isSessionScoped());
+
+            // assert: child node locked
+            assertTrue("Child node locked", childNode.isLocked());
+
+            // move child node up
+            String newPath = testRootNode.getPath() + "/" + childNode.getName();
+            session.move(childNode.getPath(), newPath);
+
+            // assert: child node locked, before save
+            assertTrue("Child node locked before save", childNode.isLocked());
+            session.save();
+
+            // assert: child node locked, after save
+            assertTrue("Child node locked after save", childNode.isLocked());
+
+        } finally {
+            childNode.unlock();
+        }
+    }
+
+    /**
+     * Tests if unlocking the first of two locked same-name sibling nodes does
+     * not unlock the second (JIRA issue JCR-284).
+     */
+    public void testUnlockSameNameSibling() throws RepositoryException {
+        Session session = testRootNode.getSession();
+
+        // create two same-name sibling nodes
+        Node lockedNode2 = testRootNode.addNode(nodeName1);
+        lockedNode2.addMixin("mix:lockable");
+        session.save();
+
+        // lock both nodes
+        lockedNode2.lock(false, isSessionScoped());
+
+        try {
+            // assert: both nodes are locked
+            assertTrue("First node locked: ", lockedNode.isLocked());
+            assertTrue("Second node locked: ", lockedNode2.isLocked());
+        } catch (RepositoryException e) {
+            // mk sure all locks are release again
+            lockedNode.unlock();
+            lockedNode2.unlock();
+            throw new RepositoryException(e);
+        }
+
+        try {
+            // unlock first sibling
+            lockedNode.unlock();
+
+            // assert: first node unlocked, second node still locked
+            assertFalse("First node unlocked: ", lockedNode.isLocked());
+            assertTrue("Second node locked: ", lockedNode2.isLocked());
+
+        } finally {
+            // mk sure all locks are release again
+            lockedNode2.unlock();
+        }
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/AbstractLockTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/AbstractLockTest.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision url

Added: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/DeepLockTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/DeepLockTest.java?view=auto&rev=506915
==============================================================================
--- jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/DeepLockTest.java (added)
+++ jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/DeepLockTest.java Tue Feb 13 01:02:11 2007
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.jcr2spi.lock;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.jackrabbit.test.AbstractJCRTest;
+import org.apache.jackrabbit.test.NotExecutableException;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.lock.Lock;
+import javax.jcr.lock.LockException;
+
+/**
+ * <code>DeepLockTest</code>...
+ */
+public class DeepLockTest extends AbstractJCRTest {
+
+    private static Logger log = LoggerFactory.getLogger(DeepLockTest.class);
+
+    private boolean isSessionScoped = true;
+    private boolean isDeep = true;
+
+    private Node lockedNode;
+    private Node childNode;
+    private Lock lock;
+
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        lockedNode = testRootNode.addNode(nodeName1, testNodeType);
+        lockedNode.addMixin(mixLockable);
+        childNode = lockedNode.addNode(nodeName2, testNodeType);
+        testRootNode.save();
+
+        lock = lockedNode.lock(isDeep, isSessionScoped);
+    }
+
+    public void testLockHoldingNode() throws RepositoryException {
+        assertTrue("Lock.getNode() must be lockholding node.", lock.getNode().isSame(lockedNode));
+    }
+
+    public void testLockIsDeep() throws RepositoryException {
+        assertTrue("Lock.isDeep() if lock has been created deeply.", lock.isDeep());
+    }
+
+    public void testIsLockedChild() throws RepositoryException {
+        assertTrue("Child node below deep lock must be locked", childNode.isLocked());
+    }
+
+    public void testNotHoldsLockChild() throws RepositoryException {
+        assertFalse("Child node below deep lock must not be lock holder", childNode.holdsLock());
+    }
+
+    public void testGetLockOnChild() throws RepositoryException {
+        // get lock must succeed even if child is not lockable.
+        Lock lock = childNode.getLock();
+    }
+
+    public void testGetNodeOnLockObtainedFromChild() throws RepositoryException {
+        Lock lock = childNode.getLock();
+        assertTrue("Lock.getNode() must return the lock holding node even if lock is obtained from child node.", lock.getNode().isSame(lockedNode));
+    }
+
+    public void testParentChildDeepLock() throws RepositoryException {
+        childNode.addMixin(mixLockable);
+        testRootNode.save();
+
+        // try to lock child node
+        try {
+            childNode.lock(false, isSessionScoped);
+            fail("child node is already locked by deep lock on parent.");
+        } catch (LockException e) {
+            // ok
+        }
+    }
+
+    public void testDeepLockAboveLockedChild() throws RepositoryException, NotExecutableException {
+        try {
+            Node parent = lockedNode.getParent();
+            if (!parent.isNodeType(mixLockable)) {
+                try {
+                    parent.addMixin(mixLockable);
+                    parent.save();
+                } catch (RepositoryException e) {
+                    throw new NotExecutableException();
+                }
+            }
+
+            parent.lock(true, isSessionScoped);
+            fail("Creating a deep lock on a parent of a locked node must fail.");
+        } catch (LockException e) {
+            // expected
+        }
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/DeepLockTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/DeepLockTest.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision url

Added: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/OpenScopedLockTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/OpenScopedLockTest.java?view=auto&rev=506915
==============================================================================
--- jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/OpenScopedLockTest.java (added)
+++ jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/OpenScopedLockTest.java Tue Feb 13 01:02:11 2007
@@ -0,0 +1,154 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.jcr2spi.lock;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.jcr.Node;
+import javax.jcr.Session;
+import javax.jcr.lock.LockException;
+import javax.jcr.lock.Lock;
+
+/**
+ * <code>OpenScopedLockTest</code>...
+ */
+public class OpenScopedLockTest extends AbstractLockTest {
+
+    private static Logger log = LoggerFactory.getLogger(OpenScopedLockTest.class);
+
+    boolean isSessionScoped() {
+        return false;
+    }
+
+    public void testLogoutHasNoEffect() throws Exception {
+        // create a second session session. since loggin-out the 'superuser'
+        // will cause all inhertied tear-down to fail
+        Session otherSession = helper.getSuperuserSession();
+        Node testRoot2 = (Node) otherSession.getItem(testRootNode.getPath());
+
+        Node lockedNode2 = testRoot2.addNode(nodeName2, testNodeType);
+        lockedNode2.addMixin(mixLockable);
+        testRoot2.save();
+
+        Lock lock2 = lockedNode2.lock(false, isSessionScoped());
+        Node n2 = (Node) superuser.getItem(lockedNode2.getPath());
+        try {
+            String lockToken = lock2.getLockToken();
+            otherSession.removeLockToken(lockToken);
+            superuser.addLockToken(lockToken);
+            otherSession.logout();
+
+            assertTrue("After logout a open-scoped node must still be locked.", lock2.isLive());
+            assertTrue("After logout a open-scoped node must still be locked.", n2.isLocked());
+        } finally {
+            n2.unlock();
+        }
+    }
+
+    public void testTokenTransfer() throws Exception {
+        String lockToken = lock.getLockToken();
+        try {
+            superuser.removeLockToken(lockToken);
+            assertNull("After token transfer lock-token must not be visible", lock.getLockToken());
+        } finally {
+            // move lock token back in order to have lock removed properly
+            superuser.addLockToken(lockToken);
+        }
+    }
+
+    public void testRefreshAfterTokenTransfer() throws Exception {
+        String lockToken = lock.getLockToken();
+        try {
+            superuser.removeLockToken(lockToken);
+            lock.refresh();
+            fail("After transfering lock token the original lock object cannot be refresh by session, that does hold lock any more.");
+        } catch (LockException e) {
+            // oK
+        } finally {
+            // move lock token back in order to have lock removed properly
+            superuser.addLockToken(lockToken);
+        }
+    }
+
+public void testRefreshAfterTokenTransfer2() throws Exception {
+        String lockToken = lock.getLockToken();
+
+        Session otherSession = helper.getSuperuserSession();
+        Node n2 = (Node) otherSession.getItem(lockedNode.getPath());
+        try {
+            superuser.removeLockToken(lockToken);
+            otherSession.addLockToken(lockToken);
+
+            n2.getLock().refresh();
+        } finally {
+            // move lock token back in order to have lock removed properly
+            otherSession.removeLockToken(lockToken);
+            superuser.addLockToken(lockToken);
+        }
+    }
+
+    public void testLockHolderAfterTokenTransfer() throws Exception {
+        String lockToken = lock.getLockToken();
+        Session otherSession = helper.getSuperuserSession();
+        Node n2 = (Node) otherSession.getItem(lockedNode.getPath());
+        try {
+            superuser.removeLockToken(lockToken);
+            otherSession.addLockToken(lockToken);
+
+            assertTrue("After lockToken transfer, the new lockHolder must get a non-null token", n2.getLock().getLockToken() != null);
+            assertTrue("After lockToken transfer, the new lockHolder must get the same token.", n2.getLock().getLockToken().equals(lockToken));
+        } finally {
+            // move lock token back in order to have lock removed properly
+            otherSession.removeLockToken(lockToken);
+            superuser.addLockToken(lockToken);
+        }
+    }
+
+    public void testUnlockAfterTokenTransfer() throws Exception {
+        String lockToken = lock.getLockToken();
+        try {
+            superuser.removeLockToken(lockToken);
+            lockedNode.unlock();
+            fail("After transfering lock token the original lock object cannot be unlocked by session, that does hold lock any more.");
+        } catch (LockException e) {
+            // oK
+        } finally {
+            // move lock token back in order to have lock removed properly
+            superuser.addLockToken(lockToken);
+        }
+    }
+
+    public void testUnlockAfterTokenTransfer2() throws Exception {
+        String lockToken = lock.getLockToken();
+        Session otherSession = helper.getSuperuserSession();
+        try {
+            superuser.removeLockToken(lockToken);
+            otherSession.addLockToken(lockToken);
+
+            // otherSession is now lockHolder -> unlock must succeed.
+            Node n2 = (Node) otherSession.getItem(lockedNode.getPath());
+            n2.unlock();
+        } finally {
+            // only in case of failure:
+            // move lock token back in order to have lock removed properly
+            // if test succeeds, moving back tokens is not necessary.
+            otherSession.removeLockToken(lockToken);
+            superuser.addLockToken(lockToken);
+        }
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/OpenScopedLockTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/OpenScopedLockTest.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision url

Added: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/SessionScopedLockTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/SessionScopedLockTest.java?view=auto&rev=506915
==============================================================================
--- jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/SessionScopedLockTest.java (added)
+++ jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/SessionScopedLockTest.java Tue Feb 13 01:02:11 2007
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.jcr2spi.lock;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.jcr.Node;
+import javax.jcr.Session;
+import javax.jcr.RepositoryException;
+import javax.jcr.lock.LockException;
+import javax.jcr.lock.Lock;
+
+/**
+ * <code>SessionScopedLockTest</code>...
+ */
+public class SessionScopedLockTest extends AbstractLockTest {
+
+    private static Logger log = LoggerFactory.getLogger(SessionScopedLockTest.class);
+
+    boolean isSessionScoped() {
+        return true;
+    }
+
+    /**
+     * Test locks are released when session logs out
+     */
+    public void testLockNotLiveAfterLogout() throws RepositoryException {
+        Session otherSession = helper.getSuperuserSession();
+        Node testRoot2 = (Node) otherSession.getItem(testRootNode.getPath());
+
+        Node lockedNode2 = testRoot2.addNode(nodeName2, testNodeType);
+        lockedNode2.addMixin(mixLockable);
+        testRoot2.save();
+
+        Lock lock2 = lockedNode2.lock(false, isSessionScoped());
+        otherSession.logout();
+
+        assertFalse(lock2.isLive());
+    }
+
+    /**
+     * Test locks are released when session logs out
+     */
+    public void testNotLockedAfterLogout() throws RepositoryException {
+        Session otherSession = helper.getSuperuserSession();
+        Node testRoot2 = (Node) otherSession.getItem(testRootNode.getPath());
+
+        Node lockedNode2 = testRoot2.addNode(nodeName2, testNodeType);
+        lockedNode2.addMixin(mixLockable);
+        testRoot2.save();
+
+        Node n2 = (Node) superuser.getItem(lockedNode2.getPath());
+
+        // remove lock implicit by logout lock-holding session
+        otherSession.logout();
+
+        assertFalse(n2.isLocked());
+        assertFalse(n2.holdsLock());
+        try {
+            n2.getLock();
+            fail("Upon logout of the session a session-scoped lock must be gone.");
+        } catch (LockException e) {
+            // ok
+        }
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/SessionScopedLockTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/lock/SessionScopedLockTest.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision url

Added: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/nodetype/AddMixinTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/nodetype/AddMixinTest.java?view=auto&rev=506915
==============================================================================
--- jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/nodetype/AddMixinTest.java (added)
+++ jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/nodetype/AddMixinTest.java Tue Feb 13 01:02:11 2007
@@ -0,0 +1,147 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.jcr2spi.nodetype;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.jackrabbit.test.AbstractJCRTest;
+import org.apache.jackrabbit.test.NotExecutableException;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.nodetype.NodeType;
+import javax.jcr.nodetype.NodeTypeManager;
+import java.util.List;
+import java.util.Arrays;
+
+/**
+ * <code>AddMixinTest</code>...
+ */
+public class AddMixinTest extends AbstractJCRTest {
+
+    private static Logger log = LoggerFactory.getLogger(AddMixinTest.class);
+
+    private NodeTypeManager ntMgr;
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        ntMgr = testRootNode.getSession().getWorkspace().getNodeTypeManager();
+    }
+
+
+    protected void tearDown() throws Exception {
+        testRootNode.refresh(false);
+        super.tearDown();
+    }
+
+    /**
+     * Implementation specific test for 'addMixin' only taking effect upon
+     * save.
+     *
+     * @throws NotExecutableException
+     * @throws RepositoryException
+     */
+    public void testAddMixinToNewNode() throws NotExecutableException, RepositoryException {
+        Node newNode;
+        try {
+            newNode = testRootNode.addNode(nodeName1, testNodeType);
+            newNode.addMixin(mixReferenceable);
+        } catch (RepositoryException e) {
+            throw new NotExecutableException();
+        }
+
+        assertFalse("Mixin must not be active before Node has been saved.", newNode.isNodeType(mixReferenceable));
+        NodeType[] mixins = newNode.getMixinNodeTypes();
+        for (int i = 0; i < mixins.length; i++) {
+            if (mixins[i].getName().equals(testNodeType)) {
+                fail("Mixin must not be active before Node has been saved.");
+            }
+        }
+    }
+
+    /**
+     * Implementation specific test adding a new Node with a nodeType, that has
+     * a mixin-supertype. The mixin must only take effect upon save.
+     *
+     * @throws NotExecutableException
+     * @throws RepositoryException
+     */
+    public void testImplicitMixinOnNewNode() throws NotExecutableException, RepositoryException {
+        Node newNode;
+        try {
+            String ntResource = superuser.getNamespacePrefix(NS_NT_URI) + ":resource";
+            newNode = testRootNode.addNode(nodeName1, ntResource);
+        } catch (RepositoryException e) {
+            throw new NotExecutableException();
+        }
+
+        assertFalse("Implict Mixin inherited by primary Nodetype must not be active before Node has been saved.", newNode.isNodeType(mixReferenceable));
+        NodeType[] mixins = newNode.getMixinNodeTypes();
+        for (int i = 0; i < mixins.length; i++) {
+            if (mixins[i].getName().equals(testNodeType)) {
+                fail("Implict Mixin inherited by primary Nodetype must not be active before Node has been saved.");
+            }
+        }
+    }
+
+    /**
+     * Implementation specific test adding a new Node with a nodeType, that has
+     * a mixin-supertype. The mixin must only take effect upon save.
+     *
+     * @throws NotExecutableException
+     * @throws RepositoryException
+     */
+    public void testAddMultipleAtOnce() throws NotExecutableException, RepositoryException {
+        Node node;
+        try {
+            node = testRootNode.addNode(nodeName1, testNodeType);
+            node.addMixin(mixReferenceable);
+            node.addMixin(mixLockable);
+            testRootNode.save();
+        } catch (RepositoryException e) {
+            throw new NotExecutableException();
+        }
+
+        assertTrue("Adding 2 mixins at once -> both must be present.", node.isNodeType(mixReferenceable) && node.isNodeType(mixLockable));
+        List mixins = Arrays.asList(node.getMixinNodeTypes());
+        assertTrue("Adding 2 mixins at once -> both must be present.", mixins.contains(ntMgr.getNodeType(mixReferenceable)) && mixins.contains(ntMgr.getNodeType(mixLockable)));
+    }
+
+    /**
+     * Implementation specific test adding a new Node with a nodeType, that has
+     * a mixin-supertype. The mixin must only take effect upon save.
+     *
+     * @throws NotExecutableException
+     * @throws RepositoryException
+     */
+    public void testAddMultipleSeparately() throws NotExecutableException, RepositoryException {
+        Node node;
+        try {
+            node = testRootNode.addNode(nodeName1, testNodeType);
+            node.addMixin(mixReferenceable);
+            testRootNode.save();
+            node.addMixin(mixLockable);
+            testRootNode.save();
+        } catch (RepositoryException e) {
+            throw new NotExecutableException();
+        }
+
+        assertTrue("Adding 2 mixins at once -> both must be present.", node.isNodeType(mixReferenceable) && node.isNodeType(mixLockable));
+        List mixins = Arrays.asList(node.getMixinNodeTypes());
+        assertTrue("Adding 2 mixins at once -> both must be present.", mixins.contains(ntMgr.getNodeType(mixReferenceable)) && mixins.contains(ntMgr.getNodeType(mixLockable)));
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/nodetype/AddMixinTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/nodetype/AddMixinTest.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision url

Added: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/nodetype/RemoveMixinTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/nodetype/RemoveMixinTest.java?view=auto&rev=506915
==============================================================================
--- jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/nodetype/RemoveMixinTest.java (added)
+++ jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/nodetype/RemoveMixinTest.java Tue Feb 13 01:02:11 2007
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.jcr2spi.nodetype;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.jackrabbit.test.AbstractJCRTest;
+import org.apache.jackrabbit.test.NotExecutableException;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.Node;
+import javax.jcr.nodetype.NodeTypeManager;
+import java.util.List;
+import java.util.Arrays;
+
+/**
+ * <code>RemoveMixinTest</code>...
+ */
+public class RemoveMixinTest extends AbstractJCRTest {
+
+    private static Logger log = LoggerFactory.getLogger(RemoveMixinTest.class);
+
+    private NodeTypeManager ntMgr;
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        ntMgr = testRootNode.getSession().getWorkspace().getNodeTypeManager();
+    }
+
+    /**
+     * Implementation specific test for 'removeMixin' only taking effect upon
+     * save.
+     *
+     * @throws NotExecutableException
+     * @throws RepositoryException
+     */
+    public void testRemoveMixinTakingAffectUponSave() throws NotExecutableException, RepositoryException {
+        Node node;
+        try {
+            node = testRootNode.addNode(nodeName1, testNodeType);
+            node.addMixin(mixReferenceable);
+            testRootNode.save();
+        } catch (RepositoryException e) {
+            throw new NotExecutableException();
+        }
+
+        node.removeMixin(mixReferenceable);
+        assertTrue("Removing Mixin must not take effect but after Node has been saved.", node.isNodeType(mixReferenceable));
+        List mixins = Arrays.asList(node.getMixinNodeTypes());
+        assertTrue("Removing Mixin must not take effect but after Node has been saved.", mixins.contains(ntMgr.getNodeType(mixReferenceable)));
+    }
+
+    /**
+     * Implementation specific test
+     *
+     * @throws NotExecutableException
+     * @throws RepositoryException
+     */
+    public void testAddAndRemoveMixinFromNew() throws NotExecutableException, RepositoryException {
+        Node node;
+        try {
+            node = testRootNode.addNode(nodeName1, testNodeType);
+            node.addMixin(mixReferenceable);
+        } catch (RepositoryException e) {
+            throw new NotExecutableException();
+        }
+
+        node.removeMixin(mixReferenceable);
+        testRootNode.save();
+
+        assertFalse("Adding + Removing a mixin within the same batch must have not effect.", node.isNodeType(mixReferenceable));
+        List mixins = Arrays.asList(node.getMixinNodeTypes());
+        assertFalse("Adding + Removing a mixin within the same batch must have not effect.", mixins.contains(ntMgr.getNodeType(mixReferenceable)));
+    }
+
+    /**
+     * Implementation specific test
+     *
+     * @throws NotExecutableException
+     * @throws RepositoryException
+     */
+    public void testAddAndRemoveMixin() throws NotExecutableException, RepositoryException {
+        Node node;
+        try {
+            node = testRootNode.addNode(nodeName1, testNodeType);
+            testRootNode.save();
+        } catch (RepositoryException e) {
+            throw new NotExecutableException();
+        }
+
+        node.addMixin(mixReferenceable);
+        node.removeMixin(mixReferenceable);
+        testRootNode.save();
+
+        assertFalse("Adding + Removing a mixin within the same batch must have not effect.", node.isNodeType(mixReferenceable));
+        List mixins = Arrays.asList(node.getMixinNodeTypes());
+        assertFalse("Adding + Removing a mixin within the same batch must have not effect.", mixins.contains(ntMgr.getNodeType(mixReferenceable)));
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/nodetype/RemoveMixinTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/nodetype/RemoveMixinTest.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision url

Added: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestGeneralRead.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestGeneralRead.java?view=auto&rev=506915
==============================================================================
--- jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestGeneralRead.java (added)
+++ jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestGeneralRead.java Tue Feb 13 01:02:11 2007
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.test;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.jackrabbit.test.api.NamespaceRegistryReadMethodsTest;
+import org.apache.jackrabbit.test.api.NamespaceRemappingTest;
+import org.apache.jackrabbit.test.api.RepositoryDescriptorTest;
+import org.apache.jackrabbit.test.api.SessionReadMethodsTest;
+import org.apache.jackrabbit.test.api.WorkspaceReadMethodsTest;
+import org.apache.jackrabbit.test.api.ExportSysViewTest;
+import org.apache.jackrabbit.test.api.ExportDocViewTest;
+import org.apache.jackrabbit.test.api.RepositoryLoginTest;
+import org.apache.jackrabbit.test.api.ImpersonateTest;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import junit.framework.TestCase;
+
+/**
+ * <code>TestGeneralRead</code>...
+ */
+public class TestGeneralRead extends TestCase {
+
+    private static Logger log = LoggerFactory.getLogger(TestGeneralRead.class);
+
+    public static Test suite() {
+
+        TestSuite suite = new TestSuite("javax.jcr General-Read");
+
+        suite.addTestSuite(NamespaceRegistryReadMethodsTest.class);
+        suite.addTestSuite(NamespaceRemappingTest.class);
+        suite.addTestSuite(RepositoryDescriptorTest.class);
+        suite.addTestSuite(SessionReadMethodsTest.class);
+        suite.addTestSuite(WorkspaceReadMethodsTest.class);
+
+        suite.addTestSuite(ExportSysViewTest.class);
+        suite.addTestSuite(ExportDocViewTest.class);
+
+        suite.addTestSuite(RepositoryLoginTest.class);
+        suite.addTestSuite(ImpersonateTest.class);
+
+
+        return suite;
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestGeneralRead.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestGeneralRead.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision url

Added: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestGeneralWrite.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestGeneralWrite.java?view=auto&rev=506915
==============================================================================
--- jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestGeneralWrite.java (added)
+++ jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestGeneralWrite.java Tue Feb 13 01:02:11 2007
@@ -0,0 +1,94 @@
+/*
+ * $Id$
+ *
+ * Copyright 1997-2005 Day Management AG
+ * Barfuesserplatz 6, 4001 Basel, Switzerland
+ * All Rights Reserved.
+ *
+ * This software is the confidential and proprietary information of
+ * Day Management AG, ("Confidential Information"). You shall not
+ * disclose such Confidential Information and shall use it only in
+ * accordance with the terms of the license agreement you entered into
+ * with Day.
+ */
+package org.apache.jackrabbit.test;
+
+import junit.framework.TestCase;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.jackrabbit.test.api.NamespaceRegistryTest;
+import org.apache.jackrabbit.test.api.SessionTest;
+import org.apache.jackrabbit.test.api.SessionUUIDTest;
+import org.apache.jackrabbit.test.api.WorkspaceCloneReferenceableTest;
+import org.apache.jackrabbit.test.api.WorkspaceCloneSameNameSibsTest;
+import org.apache.jackrabbit.test.api.WorkspaceCloneTest;
+import org.apache.jackrabbit.test.api.WorkspaceCloneVersionableTest;
+import org.apache.jackrabbit.test.api.WorkspaceCopyBetweenWorkspacesReferenceableTest;
+import org.apache.jackrabbit.test.api.WorkspaceCopyBetweenWorkspacesSameNameSibsTest;
+import org.apache.jackrabbit.test.api.WorkspaceCopyBetweenWorkspacesTest;
+import org.apache.jackrabbit.test.api.WorkspaceCopyBetweenWorkspacesVersionableTest;
+import org.apache.jackrabbit.test.api.WorkspaceCopyReferenceableTest;
+import org.apache.jackrabbit.test.api.WorkspaceCopySameNameSibsTest;
+import org.apache.jackrabbit.test.api.WorkspaceCopyTest;
+import org.apache.jackrabbit.test.api.WorkspaceCopyVersionableTest;
+import org.apache.jackrabbit.test.api.WorkspaceMoveReferenceableTest;
+import org.apache.jackrabbit.test.api.WorkspaceMoveSameNameSibsTest;
+import org.apache.jackrabbit.test.api.WorkspaceMoveTest;
+import org.apache.jackrabbit.test.api.WorkspaceMoveVersionableTest;
+import org.apache.jackrabbit.test.api.DocumentViewImportTest;
+import org.apache.jackrabbit.test.api.SerializationTest;
+import org.apache.jackrabbit.test.api.ValueFactoryTest;
+import org.apache.jackrabbit.test.api.CheckPermissionTest;
+
+/**
+ * <code>TestAllPropertyRead</code>...
+ */
+public class TestGeneralWrite extends TestCase {
+
+    private static Logger log = LoggerFactory.getLogger(TestGeneralWrite.class);
+
+    /**
+     * Returns a <code>Test</code> suite that executes all tests inside this
+     * package.
+     *
+     * @return a <code>Test</code> suite that executes all tests inside this
+     *         package.
+     */
+    public static Test suite() {
+
+        TestSuite suite = new TestSuite("javax.jcr General-Write");
+
+        suite.addTestSuite(CheckPermissionTest.class);
+
+        suite.addTestSuite(NamespaceRegistryTest.class);
+
+        suite.addTestSuite(SessionTest.class);
+        suite.addTestSuite(SessionUUIDTest.class);
+
+        suite.addTestSuite(WorkspaceCloneReferenceableTest.class);
+        suite.addTestSuite(WorkspaceCloneSameNameSibsTest.class);
+        suite.addTestSuite(WorkspaceCloneTest.class);
+        suite.addTestSuite(WorkspaceCloneVersionableTest.class);
+        suite.addTestSuite(WorkspaceCopyBetweenWorkspacesReferenceableTest.class);
+        suite.addTestSuite(WorkspaceCopyBetweenWorkspacesSameNameSibsTest.class);
+        suite.addTestSuite(WorkspaceCopyBetweenWorkspacesTest.class);
+        suite.addTestSuite(WorkspaceCopyBetweenWorkspacesVersionableTest.class);
+        suite.addTestSuite(WorkspaceCopyReferenceableTest.class);
+        suite.addTestSuite(WorkspaceCopySameNameSibsTest.class);
+        suite.addTestSuite(WorkspaceCopyTest.class);
+        suite.addTestSuite(WorkspaceCopyVersionableTest.class);
+        suite.addTestSuite(WorkspaceMoveReferenceableTest.class);
+        suite.addTestSuite(WorkspaceMoveSameNameSibsTest.class);
+        suite.addTestSuite(WorkspaceMoveTest.class);
+        suite.addTestSuite(WorkspaceMoveVersionableTest.class);
+
+        suite.addTestSuite(DocumentViewImportTest.class);
+        suite.addTestSuite(SerializationTest.class);
+
+        suite.addTestSuite(ValueFactoryTest.class);
+
+        return suite;
+    }
+}

Propchange: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestGeneralWrite.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestGeneralWrite.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision url

Added: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestNodeRead.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestNodeRead.java?view=auto&rev=506915
==============================================================================
--- jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestNodeRead.java (added)
+++ jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestNodeRead.java Tue Feb 13 01:02:11 2007
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.test;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.jackrabbit.test.api.RootNodeTest;
+import org.apache.jackrabbit.test.api.NodeReadMethodsTest;
+import org.apache.jackrabbit.test.api.NodeDiscoveringNodeTypesTest;
+import org.apache.jackrabbit.test.api.NodeIteratorTest;
+import org.apache.jackrabbit.test.api.ReferenceableRootNodesTest;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import junit.framework.TestCase;
+
+/**
+ * <code>TestNodeRead</code>...
+ */
+public class TestNodeRead extends TestCase {
+
+    private static Logger log = LoggerFactory.getLogger(TestNodeRead.class);
+
+    public static Test suite() {
+
+        TestSuite suite = new TestSuite("javax.jcr Node-Read");
+
+        suite.addTestSuite(RootNodeTest.class);
+        suite.addTestSuite(NodeReadMethodsTest.class);
+        suite.addTestSuite(NodeDiscoveringNodeTypesTest.class);
+        suite.addTestSuite(NodeIteratorTest.class);
+        suite.addTestSuite(ReferenceableRootNodesTest.class);
+
+        return suite;
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestNodeRead.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestNodeRead.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision url

Added: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestNodeWrite.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestNodeWrite.java?view=auto&rev=506915
==============================================================================
--- jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestNodeWrite.java (added)
+++ jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestNodeWrite.java Tue Feb 13 01:02:11 2007
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.test;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.jackrabbit.test.api.AddNodeTest;
+import org.apache.jackrabbit.test.api.NodeTest;
+import org.apache.jackrabbit.test.api.NodeUUIDTest;
+import org.apache.jackrabbit.test.api.NodeOrderableChildNodesTest;
+import org.apache.jackrabbit.test.api.ReferencesTest;
+import org.apache.jackrabbit.test.api.NodeItemIsModifiedTest;
+import org.apache.jackrabbit.test.api.NodeItemIsNewTest;
+import org.apache.jackrabbit.test.api.NodeAddMixinTest;
+import org.apache.jackrabbit.test.api.NodeCanAddMixinTest;
+import org.apache.jackrabbit.test.api.NodeRemoveMixinTest;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * <code>TestNodeWrite</code>...
+ */
+public class TestNodeWrite {
+
+    private static Logger log = LoggerFactory.getLogger(TestNodeWrite.class);
+
+    public static Test suite() {
+
+        TestSuite suite = new TestSuite("javax.jcr Node-Write");
+        suite.addTestSuite(AddNodeTest.class);
+        suite.addTestSuite(NodeTest.class);
+        suite.addTestSuite(NodeUUIDTest.class);
+        suite.addTestSuite(NodeOrderableChildNodesTest.class);
+        suite.addTestSuite(ReferencesTest.class);
+        suite.addTestSuite(NodeItemIsModifiedTest.class);
+        suite.addTestSuite(NodeItemIsNewTest.class);
+
+        suite.addTestSuite(NodeAddMixinTest.class);
+        suite.addTestSuite(NodeCanAddMixinTest.class);
+        suite.addTestSuite(NodeRemoveMixinTest.class);
+
+        return suite;
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestNodeWrite.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestNodeWrite.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision url

Added: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestPropertyRead.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestPropertyRead.java?view=auto&rev=506915
==============================================================================
--- jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestPropertyRead.java (added)
+++ jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestPropertyRead.java Tue Feb 13 01:02:11 2007
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.test;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.jackrabbit.test.api.PropertyTypeTest;
+import org.apache.jackrabbit.test.api.BinaryPropertyTest;
+import org.apache.jackrabbit.test.api.BooleanPropertyTest;
+import org.apache.jackrabbit.test.api.DatePropertyTest;
+import org.apache.jackrabbit.test.api.DoublePropertyTest;
+import org.apache.jackrabbit.test.api.LongPropertyTest;
+import org.apache.jackrabbit.test.api.NamePropertyTest;
+import org.apache.jackrabbit.test.api.PathPropertyTest;
+import org.apache.jackrabbit.test.api.ReferencePropertyTest;
+import org.apache.jackrabbit.test.api.StringPropertyTest;
+import org.apache.jackrabbit.test.api.UndefinedPropertyTest;
+import org.apache.jackrabbit.test.api.PropertyReadMethodsTest;
+import junit.framework.TestCase;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * <code>TestPropertyRead</code>...
+ */
+public class TestPropertyRead extends TestCase {
+
+    private static Logger log = LoggerFactory.getLogger(TestPropertyRead.class);
+
+    /**
+     * Returns a <code>Test</code> suite that executes all tests inside this
+     * package.
+     *
+     * @return a <code>Test</code> suite that executes all tests inside this
+     *         package.
+     */
+    public static Test suite() {
+
+        TestSuite suite = new TestSuite("javax.jcr Property-Read");
+
+        suite.addTestSuite(PropertyTypeTest.class);
+        suite.addTestSuite(BinaryPropertyTest.class);
+        suite.addTestSuite(BooleanPropertyTest.class);
+        suite.addTestSuite(DatePropertyTest.class);
+        suite.addTestSuite(DoublePropertyTest.class);
+        suite.addTestSuite(LongPropertyTest.class);
+        suite.addTestSuite(NamePropertyTest.class);
+        suite.addTestSuite(PathPropertyTest.class);
+        suite.addTestSuite(ReferencePropertyTest.class);
+        suite.addTestSuite(StringPropertyTest.class);
+        suite.addTestSuite(UndefinedPropertyTest.class);
+        suite.addTestSuite(PropertyReadMethodsTest.class);
+
+        return suite;
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestPropertyRead.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestPropertyRead.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision url

Added: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestPropertyWrite.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestPropertyWrite.java?view=auto&rev=506915
==============================================================================
--- jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestPropertyWrite.java (added)
+++ jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestPropertyWrite.java Tue Feb 13 01:02:11 2007
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.test;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.jackrabbit.test.api.PropertyTest;
+import org.apache.jackrabbit.test.api.SetValueBinaryTest;
+import org.apache.jackrabbit.test.api.SetValueBooleanTest;
+import org.apache.jackrabbit.test.api.SetValueDateTest;
+import org.apache.jackrabbit.test.api.SetValueDoubleTest;
+import org.apache.jackrabbit.test.api.SetValueLongTest;
+import org.apache.jackrabbit.test.api.SetValueReferenceTest;
+import org.apache.jackrabbit.test.api.SetValueStringTest;
+import org.apache.jackrabbit.test.api.SetValueConstraintViolationExceptionTest;
+import org.apache.jackrabbit.test.api.SetValueValueFormatExceptionTest;
+import org.apache.jackrabbit.test.api.SetValueVersionExceptionTest;
+import org.apache.jackrabbit.test.api.SetPropertyBooleanTest;
+import org.apache.jackrabbit.test.api.SetPropertyCalendarTest;
+import org.apache.jackrabbit.test.api.SetPropertyDoubleTest;
+import org.apache.jackrabbit.test.api.SetPropertyInputStreamTest;
+import org.apache.jackrabbit.test.api.SetPropertyLongTest;
+import org.apache.jackrabbit.test.api.SetPropertyNodeTest;
+import org.apache.jackrabbit.test.api.SetPropertyStringTest;
+import org.apache.jackrabbit.test.api.SetPropertyValueTest;
+import org.apache.jackrabbit.test.api.SetPropertyConstraintViolationExceptionTest;
+import org.apache.jackrabbit.test.api.SetPropertyAssumeTypeTest;
+import org.apache.jackrabbit.test.api.PropertyItemIsModifiedTest;
+import org.apache.jackrabbit.test.api.PropertyItemIsNewTest;
+import junit.framework.TestSuite;
+import junit.framework.Test;
+import junit.framework.TestCase;
+
+/**
+ * <code>TestPropertyWrite</code>...
+ */
+public class TestPropertyWrite extends TestCase {
+
+    private static Logger log = LoggerFactory.getLogger(TestPropertyWrite.class);
+
+    public static Test suite() {
+
+        TestSuite suite = new TestSuite("javax.jcr Property-Write");
+
+        suite.addTestSuite(PropertyTest.class);
+
+        suite.addTestSuite(SetValueBinaryTest.class);
+        suite.addTestSuite(SetValueBooleanTest.class);
+        suite.addTestSuite(SetValueDateTest.class);
+        suite.addTestSuite(SetValueDoubleTest.class);
+        suite.addTestSuite(SetValueLongTest.class);
+        suite.addTestSuite(SetValueReferenceTest.class);
+        suite.addTestSuite(SetValueStringTest.class);
+        suite.addTestSuite(SetValueConstraintViolationExceptionTest.class);
+        suite.addTestSuite(SetValueValueFormatExceptionTest.class);
+        suite.addTestSuite(SetValueVersionExceptionTest.class);
+
+        suite.addTestSuite(SetPropertyBooleanTest.class);
+        suite.addTestSuite(SetPropertyCalendarTest.class);
+        suite.addTestSuite(SetPropertyDoubleTest.class);
+        suite.addTestSuite(SetPropertyInputStreamTest.class);
+        suite.addTestSuite(SetPropertyLongTest.class);
+        suite.addTestSuite(SetPropertyNodeTest.class);
+        suite.addTestSuite(SetPropertyStringTest.class);
+        suite.addTestSuite(SetPropertyValueTest.class);
+        suite.addTestSuite(SetPropertyConstraintViolationExceptionTest.class);
+        suite.addTestSuite(SetPropertyAssumeTypeTest.class);
+
+        suite.addTestSuite(PropertyItemIsModifiedTest.class);
+        suite.addTestSuite(PropertyItemIsNewTest.class);
+
+        return suite;
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestPropertyWrite.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/test/TestPropertyWrite.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision url