add missing test for JcrResourceProvider.getParent
diff --git a/src/test/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderTest.java b/src/test/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderTest.java
index 684ce80..90e8f9c 100644
--- a/src/test/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderTest.java
+++ b/src/test/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderTest.java
@@ -26,16 +26,23 @@
 import javax.jcr.Session;
 import javax.jcr.nodetype.NodeType;
 
-import org.apache.jackrabbit.commons.JcrUtils;
+import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.sling.api.resource.PersistenceException;
 import org.apache.sling.api.resource.Resource;
+import org.apache.sling.jcr.resource.internal.HelperData;
 import org.apache.sling.spi.resource.provider.ResolveContext;
 import org.apache.sling.spi.resource.provider.ResourceContext;
+import org.jetbrains.annotations.NotNull;
 import org.junit.Assert;
 import org.mockito.Mockito;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.component.ComponentContext;
 
+import static javax.jcr.nodetype.NodeType.NT_UNSTRUCTURED;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.withSettings;
+
 public class JcrResourceProviderTest extends SlingRepositoryTestBase {
 
     JcrResourceProvider jcrResourceProvider;
@@ -47,34 +54,48 @@
         // create the session
         session = getSession();
         Repository repo = getRepository();
-        ComponentContext ctx = Mockito.mock(ComponentContext.class);
-        Mockito.when(ctx.locateService(Mockito.anyString(), Mockito.any(ServiceReference.class))).thenReturn(repo);
+        ComponentContext ctx = mock(ComponentContext.class);
+        when(ctx.locateService(Mockito.anyString(), Mockito.any(ServiceReference.class))).thenReturn(repo);
         jcrResourceProvider = new JcrResourceProvider();
         jcrResourceProvider.activate(ctx);
     }
 
     @Override
     protected void tearDown() throws Exception {
-        jcrResourceProvider.deactivate();
-        super.tearDown();
+        try {
+            if (session.nodeExists("/parent")) {
+                session.removeItem("/parent");
+                session.save();
+            }
+        } finally {
+            jcrResourceProvider.deactivate();
+            super.tearDown();
+        }
+    }
+    
+    private @NotNull JcrProviderState createProviderState() {
+        return new JcrProviderState(session, new HelperData(null, null), false);
+    }
+    
+    private @NotNull ResolveContext mockResolveContext() {
+        ResolveContext ctx = mock(ResolveContext.class);
+        when(ctx.getProviderState()).thenReturn(createProviderState());
+        return ctx;
     }
 
     public void testAdaptTo_Principal() {
-        ResolveContext ctx = Mockito.mock(ResolveContext.class);
-        Mockito.when(ctx.getProviderState()).thenReturn(new JcrProviderState(session, null, false));
+        ResolveContext ctx = mockResolveContext();
         Assert.assertNotNull(jcrResourceProvider.adaptTo(ctx, Principal.class));
     }
 
     public void testOrderBefore() throws RepositoryException, PersistenceException {
-        Node parentNode = session.getRootNode().addNode("parent", NodeType.NT_UNSTRUCTURED);
-        parentNode.addNode("child1", NodeType.NT_UNSTRUCTURED);
-        parentNode.addNode("child2", NodeType.NT_UNSTRUCTURED);
-        parentNode.addNode("child3", NodeType.NT_UNSTRUCTURED);
+        Node parentNode = session.getRootNode().addNode("parent", NT_UNSTRUCTURED);
+        parentNode.addNode("child1", NT_UNSTRUCTURED);
+        parentNode.addNode("child2", NT_UNSTRUCTURED);
+        parentNode.addNode("child3", NT_UNSTRUCTURED);
         session.save();
 
-        ResolveContext ctx = Mockito.mock(ResolveContext.class);
-        JcrProviderState state = new JcrProviderState(session, null, false);
-        Mockito.when(ctx.getProviderState()).thenReturn(state);
+        ResolveContext ctx = mockResolveContext();
         Resource parent = jcrResourceProvider.getResource(ctx, "/parent", ResourceContext.EMPTY_CONTEXT, null);
         Assert.assertNotNull(parent);
         // order with invalid names
@@ -100,6 +121,45 @@
         
         Assert.assertTrue(jcrResourceProvider.orderBefore(ctx, parent, "child2", null));
     }
+    
+    public void testGetParent() throws Exception {
+        Node parentNode = session.getRootNode().addNode("parent", NT_UNSTRUCTURED);
+        Node child = parentNode.addNode("child", NT_UNSTRUCTURED);
+        Node grandchild = child.addNode("grandchild", NT_UNSTRUCTURED);
+        session.save();
+
+        ResolveContext ctx = mockResolveContext();
+        Resource rootResource = jcrResourceProvider.getResource(ctx, PathUtils.ROOT_PATH, ResourceContext.EMPTY_CONTEXT, null);
+        Resource parentResource = jcrResourceProvider.getResource(ctx, parentNode.getPath(), ResourceContext.EMPTY_CONTEXT, rootResource);
+        Resource childResource = jcrResourceProvider.getResource(ctx, child.getPath(), ResourceContext.EMPTY_CONTEXT, parentResource);
+        Resource grandChildResource = jcrResourceProvider.getResource(ctx, grandchild.getPath(), ResourceContext.EMPTY_CONTEXT, childResource);
+        assertResources(rootResource, parentResource, childResource, grandChildResource);
+        
+        assertParent(jcrResourceProvider.getParent(ctx, grandChildResource), child.getPath());
+        assertParent(jcrResourceProvider.getParent(ctx, childResource), parentNode.getPath());
+        assertParent(jcrResourceProvider.getParent(ctx, parentResource), PathUtils.ROOT_PATH);
+        assertNull(jcrResourceProvider.getParent(ctx, rootResource));
+    }
+    
+    public void testGetParentDifferentResource() {
+        Resource r = mock(Resource.class);
+        when(r.getPath()).thenReturn("/test/path");
+        Resource parent = jcrResourceProvider.getParent(mockResolveContext(), r);
+        assertFalse(parent instanceof JcrNodeResource);
+    }
+    
+    private static void assertResources(Resource... resources) {
+        for (Resource r : resources) {
+            assertNotNull(r);
+            assertTrue(r instanceof JcrNodeResource);
+        }
+    }
+    
+    private static void assertParent(Resource parent, String expectedPath) {
+        assertNotNull(parent);
+        assertTrue(parent instanceof JcrNodeResource);
+        assertEquals(expectedPath, parent.getPath());
+    }
 }