You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ss...@apache.org on 2021/08/25 14:36:33 UTC

[sling-org-apache-sling-testing-sling-mock] branch feature/SLING-5922-load-folder updated (39153e6 -> 30764a2)

This is an automated email from the ASF dual-hosted git repository.

sseifert pushed a change to branch feature/SLING-5922-load-folder
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-testing-sling-mock.git.


    from 39153e6  SLING-5922 add ContentLoader.folderJson and ContentLoader.folderXmlJcr methods to mount content folders using fsresource
     new 57926fa  SLING-5922 add simplified resource provider support for resource resolver mock
     new 30764a2  SLING-5922 support loading single filevault XML files

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../apache/sling/testing/mock/sling/MockSling.java |  32 ++---
 .../sling/RRMockMockResourceResolverAdapter.java   |  14 ++-
 .../RRMockResourceResolverFactoryWrapper.java      | 113 +++++++++++++++++
 .../mock/sling/RRMockResourceResolverWrapper.java  | 121 ++++++++++++++++++
 .../testing/mock/sling/loader/ContentLoader.java   | 136 +++++++++++++++------
 .../sling/spi/ResourceResolverTypeAdapter.java     |   5 +
 ...est.java => ContentLoaderFileVaultXmlTest.java} |   5 +-
 ...va => ContentLoaderFolderFileVaultXmlTest.java} |   4 +-
 ... => AbstractContentLoaderFileVaultXmlTest.java} |  52 ++++++--
 ...stractContentLoaderFolderFileVaultXmlTest.java} |  15 ++-
 .../AbstractContentLoaderFolderJsonTest.java       |  23 ++--
 ...est.java => ContentLoaderFileVaultXmlTest.java} |   4 +-
 ...va => ContentLoaderFolderFileVaultXmlTest.java} |   4 +-
 ...yTest.java => ContentLoaderFolderJsonTest.java} |   4 +-
 .../mock/sling/junit5/SlingContextMemberTest.java  |   5 +-
 .../mock/sling/junit5/SlingContextTest.java        |   5 +-
 16 files changed, 434 insertions(+), 108 deletions(-)
 create mode 100644 core/src/main/java/org/apache/sling/testing/mock/sling/RRMockResourceResolverFactoryWrapper.java
 create mode 100644 core/src/main/java/org/apache/sling/testing/mock/sling/RRMockResourceResolverWrapper.java
 rename core/src/test/java/org/apache/sling/testing/mock/sling/jcrmock/loader/{ContentLoaderFolderXmlJcrTest.java => ContentLoaderFileVaultXmlTest.java} (89%)
 copy core/src/test/java/org/apache/sling/testing/mock/sling/jcrmock/loader/{ContentLoaderFolderJsonTest.java => ContentLoaderFolderFileVaultXmlTest.java} (89%)
 copy core/src/test/java/org/apache/sling/testing/mock/sling/loader/{AbstractContentLoaderFolderJsonTest.java => AbstractContentLoaderFileVaultXmlTest.java} (56%)
 rename core/src/test/java/org/apache/sling/testing/mock/sling/loader/{AbstractContentLoaderFolderXmlJcrTest.java => AbstractContentLoaderFolderFileVaultXmlTest.java} (82%)
 copy core/src/test/java/org/apache/sling/testing/mock/sling/rrmock/loader/{ContentLoaderBinaryTest.java => ContentLoaderFileVaultXmlTest.java} (90%)
 copy core/src/test/java/org/apache/sling/testing/mock/sling/rrmock/loader/{ContentLoaderBinaryTest.java => ContentLoaderFolderFileVaultXmlTest.java} (89%)
 copy core/src/test/java/org/apache/sling/testing/mock/sling/rrmock/loader/{ContentLoaderBinaryTest.java => ContentLoaderFolderJsonTest.java} (91%)

[sling-org-apache-sling-testing-sling-mock] 01/02: SLING-5922 add simplified resource provider support for resource resolver mock

Posted by ss...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sseifert pushed a commit to branch feature/SLING-5922-load-folder
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-testing-sling-mock.git

commit 57926fa4ddaaf2ebdb9184e00aa6076bcd442fc7
Author: Stefan Seifert <st...@users.noreply.github.com>
AuthorDate: Wed Aug 25 15:37:29 2021 +0200

    SLING-5922 add simplified resource provider support for resource resolver mock
---
 .../apache/sling/testing/mock/sling/MockSling.java |  32 +++---
 .../sling/RRMockMockResourceResolverAdapter.java   |  14 ++-
 .../RRMockResourceResolverFactoryWrapper.java      | 113 +++++++++++++++++++
 .../mock/sling/RRMockResourceResolverWrapper.java  | 121 +++++++++++++++++++++
 .../testing/mock/sling/loader/ContentLoader.java   |   6 +-
 .../sling/spi/ResourceResolverTypeAdapter.java     |   5 +
 .../AbstractContentLoaderFolderJsonTest.java       |   9 ++
 .../AbstractContentLoaderFolderXmlJcrTest.java     |  11 ++
 .../rrmock/loader/ContentLoaderFolderJsonTest.java |  31 ++++++
 .../loader/ContentLoaderFolderXmlJcrTest.java      |  31 ++++++
 .../mock/sling/junit5/SlingContextMemberTest.java  |   5 +-
 .../mock/sling/junit5/SlingContextTest.java        |   5 +-
 12 files changed, 353 insertions(+), 30 deletions(-)

diff --git a/core/src/main/java/org/apache/sling/testing/mock/sling/MockSling.java b/core/src/main/java/org/apache/sling/testing/mock/sling/MockSling.java
index 35489ab..31a7162 100644
--- a/core/src/main/java/org/apache/sling/testing/mock/sling/MockSling.java
+++ b/core/src/main/java/org/apache/sling/testing/mock/sling/MockSling.java
@@ -18,6 +18,9 @@
  */
 package org.apache.sling.testing.mock.sling;
 
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.SlingHttpServletResponse;
 import org.apache.sling.api.adapter.SlingAdaptable;
@@ -69,7 +72,7 @@ public final class MockSling {
      */
     public static @NotNull ResourceResolverFactory newResourceResolverFactory(@NotNull final ResourceResolverType type,
             @NotNull final BundleContext bundleContext) {
-        ResourceResolverTypeAdapter adapter = getResourceResolverTypeAdapter(type);
+        ResourceResolverTypeAdapter adapter = getResourceResolverTypeAdapter(type, bundleContext);
         ResourceResolverFactory factory = adapter.newResourceResolverFactory();
         if (factory == null) {
             SlingRepository repository = adapter.newSlingRepository();
@@ -81,24 +84,21 @@ public final class MockSling {
         return factory;
     }
 
-    private static ResourceResolverTypeAdapter getResourceResolverTypeAdapter(final ResourceResolverType type) {
+    private static ResourceResolverTypeAdapter getResourceResolverTypeAdapter(final ResourceResolverType type,
+            @NotNull final BundleContext bundleContext) {
         try {
             Class clazz = Class.forName(type.getResourceResolverTypeAdapterClass());
-            return (ResourceResolverTypeAdapter) clazz.newInstance();
-        }
-        catch (ClassNotFoundException ex) {
-            throw new RuntimeException("Unable to instantiate resourcer resolver: "
-                    + type.getResourceResolverTypeAdapterClass()
-                    + (type.getArtifactCoordinates() != null ? ". Make sure this maven dependency is included: "
-                            + type.getArtifactCoordinates() : ""), ex);
-        }
-        catch (InstantiationException ex) {
-            throw new RuntimeException("Unable to instantiate resourcer resolver: "
-                    + type.getResourceResolverTypeAdapterClass()
-                    + (type.getArtifactCoordinates() != null ? ". Make sure this maven dependency is included: "
-                            + type.getArtifactCoordinates() : ""), ex);
+            try {
+                Constructor<ResourceResolverTypeAdapter> bundleContextConstructor = clazz.getConstructor(BundleContext.class);
+                // use constructor with bundle context
+                return bundleContextConstructor.newInstance(bundleContext);
+            }
+            catch (NoSuchMethodException ex) {
+                // fallback to default constructor
+                return (ResourceResolverTypeAdapter)clazz.newInstance();
+            }
         }
-        catch (IllegalAccessException ex) {
+        catch (ClassNotFoundException | InstantiationException | IllegalAccessException | InvocationTargetException ex) {
             throw new RuntimeException("Unable to instantiate resourcer resolver: "
                     + type.getResourceResolverTypeAdapterClass()
                     + (type.getArtifactCoordinates() != null ? ". Make sure this maven dependency is included: "
diff --git a/core/src/main/java/org/apache/sling/testing/mock/sling/RRMockMockResourceResolverAdapter.java b/core/src/main/java/org/apache/sling/testing/mock/sling/RRMockMockResourceResolverAdapter.java
index 84f9248..ccb2c2e 100644
--- a/core/src/main/java/org/apache/sling/testing/mock/sling/RRMockMockResourceResolverAdapter.java
+++ b/core/src/main/java/org/apache/sling/testing/mock/sling/RRMockMockResourceResolverAdapter.java
@@ -23,26 +23,28 @@ import org.apache.sling.jcr.api.SlingRepository;
 import org.apache.sling.testing.mock.sling.spi.ResourceResolverTypeAdapter;
 import org.apache.sling.testing.resourceresolver.MockResourceResolverFactory;
 import org.apache.sling.testing.resourceresolver.MockResourceResolverFactoryOptions;
-import org.jetbrains.annotations.NotNull;
+import org.osgi.framework.BundleContext;
 
 /**
  * Resource resolver type adapter for Sling Resource Resolver Mock implementation.
  */
 class RRMockMockResourceResolverAdapter implements ResourceResolverTypeAdapter {
 
-    private final @NotNull MockResourceResolverFactoryOptions options;
+    private final MockResourceResolverFactoryOptions options;
+    private final BundleContext bundleContext;
 
     /**
      * Constructor
      */
-    public RRMockMockResourceResolverAdapter() {
-        options = new MockResourceResolverFactoryOptions();
-        options.setMangleNamespacePrefixes(true);
+    public RRMockMockResourceResolverAdapter(BundleContext bundleContext) {
+        this.options = new MockResourceResolverFactoryOptions();
+        this.options.setMangleNamespacePrefixes(true);
+        this.bundleContext = bundleContext;
     }
 
     @Override
     public ResourceResolverFactory newResourceResolverFactory() {
-        return new MockResourceResolverFactory(options);
+        return new RRMockResourceResolverFactoryWrapper(new MockResourceResolverFactory(options), bundleContext);
     }
 
     @Override
diff --git a/core/src/main/java/org/apache/sling/testing/mock/sling/RRMockResourceResolverFactoryWrapper.java b/core/src/main/java/org/apache/sling/testing/mock/sling/RRMockResourceResolverFactoryWrapper.java
new file mode 100644
index 0000000..f72ff91
--- /dev/null
+++ b/core/src/main/java/org/apache/sling/testing/mock/sling/RRMockResourceResolverFactoryWrapper.java
@@ -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.sling.testing.mock.sling;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import org.apache.sling.api.resource.LoginException;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ResourceResolverFactory;
+import org.apache.sling.spi.resource.provider.ResourceProvider;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
+
+/**
+ * Wraps the ResourceResolverFactory from ResourceResolverMock to add a service tracker
+ * for ResourceProvider (e.g. injected by ContentLoader for mounting filesystem folders).
+ */
+class RRMockResourceResolverFactoryWrapper implements ResourceResolverFactory,
+        ServiceTrackerCustomizer<ResourceProvider, ResourceProvider> {
+
+    private final ResourceResolverFactory delegate;
+    private final BundleContext bundleContext;
+    private final ServiceTracker<ResourceProvider, ResourceProvider> serviceTracker;
+    private final ConcurrentMap<String, ResourceProvider> resourceProviders = new ConcurrentHashMap<>();
+
+    @SuppressWarnings("null")
+    RRMockResourceResolverFactoryWrapper(ResourceResolverFactory delegate, BundleContext bundleContext) {
+        this.delegate = delegate;
+        this.bundleContext = bundleContext;
+        // track registered resource provider implementations
+        this.serviceTracker = new ServiceTracker<ResourceProvider, ResourceProvider>(bundleContext, ResourceProvider.class, this);
+        this.serviceTracker.open();
+    }
+
+    @Override
+    public @NotNull ResourceResolver getResourceResolver(Map<String, Object> authenticationInfo) throws LoginException {
+        return wrap(delegate.getResourceResolver(authenticationInfo));
+    }
+
+    @Override
+    @Deprecated
+    public @NotNull ResourceResolver getAdministrativeResourceResolver(Map<String, Object> authenticationInfo) throws LoginException {
+        return wrap(delegate.getAdministrativeResourceResolver(authenticationInfo));
+    }
+
+    @Override
+    public @NotNull ResourceResolver getServiceResourceResolver(Map<String, Object> authenticationInfo) throws LoginException {
+        return wrap(delegate.getServiceResourceResolver(authenticationInfo));
+    }
+
+    @Override
+    public @Nullable ResourceResolver getThreadResourceResolver() {
+        return wrap(delegate.getThreadResourceResolver());
+    }
+
+    private ResourceResolver wrap(ResourceResolver resourceResolver) {
+        return new RRMockResourceResolverWrapper(resourceResolver, resourceProviders);
+    }
+
+    @Override
+    public ResourceProvider addingService(ServiceReference<ResourceProvider> reference) {
+        String rootPath = getRootPath(reference);
+        ResourceProvider service = bundleContext.getService(reference);
+        if (rootPath != null) {
+            resourceProviders.put(rootPath, service);
+        }
+        return service;
+    }
+
+    @Override
+    public void modifiedService(ServiceReference<ResourceProvider> reference, ResourceProvider service) {
+        // ignore
+    }
+
+    @Override
+    public void removedService(ServiceReference<ResourceProvider> reference, ResourceProvider service) {
+        String rootPath = getRootPath(reference);
+        if (rootPath != null) {
+            resourceProviders.remove(rootPath);
+        }
+    }
+
+    private String getRootPath(ServiceReference<ResourceProvider> reference) {
+        Object value = reference.getProperty(ResourceProvider.PROPERTY_ROOT);
+        if (value instanceof String) {
+            return (String)value;
+        }
+        return null;
+    }
+
+}
diff --git a/core/src/main/java/org/apache/sling/testing/mock/sling/RRMockResourceResolverWrapper.java b/core/src/main/java/org/apache/sling/testing/mock/sling/RRMockResourceResolverWrapper.java
new file mode 100644
index 0000000..6689e5d
--- /dev/null
+++ b/core/src/main/java/org/apache/sling/testing/mock/sling/RRMockResourceResolverWrapper.java
@@ -0,0 +1,121 @@
+/*
+ * 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.sling.testing.mock.sling;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.concurrent.ConcurrentMap;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ResourceUtil;
+import org.apache.sling.api.wrappers.ResourceResolverWrapper;
+import org.apache.sling.spi.resource.provider.ResolveContext;
+import org.apache.sling.spi.resource.provider.ResourceContext;
+import org.apache.sling.spi.resource.provider.ResourceProvider;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Wraps resource resolver form ResourceResolverMock to check for resource provider implementations
+ * registered to specific path. This is a very simplified implementation to overlay the mocked
+ * resource tree with resource providers, but should be sufficient for unit tests.
+ */
+class RRMockResourceResolverWrapper extends ResourceResolverWrapper implements ResolveContext {
+
+    private final ConcurrentMap<String, ResourceProvider> resourceProviders;
+
+    RRMockResourceResolverWrapper(ResourceResolver delegate, ConcurrentMap<String, ResourceProvider> resourceProviders) {
+        super(delegate);
+        this.resourceProviders = resourceProviders;
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public Resource getResource(@NotNull String path) {
+        ResourceProvider resourceProvider = getMatchingResourceProvider(path);
+        if (resourceProvider != null) {
+            return resourceProvider.getResource(this, path, ResourceContext.EMPTY_CONTEXT, null);
+        }
+        return super.getResource(path);
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public @NotNull Iterator<Resource> listChildren(@NotNull Resource parent) {
+        ResourceProvider resourceProvider = getMatchingResourceProvider(parent.getPath());
+        if (resourceProvider != null) {
+            Iterator<Resource> result = resourceProvider.listChildren(this,  parent);
+            if (result == null) {
+                return Collections.emptyIterator();
+            }
+            else {
+                return result;
+            }
+        }
+        return super.listChildren(parent);
+    }
+
+    private ResourceProvider getMatchingResourceProvider(String path) {
+        if (resourceProviders.isEmpty()) {
+            return null;
+        }
+        String normalizedPath = ResourceUtil.normalize(path);
+        if (!StringUtils.startsWith(normalizedPath, "/")) {
+            return null;
+        }
+        return getMatchingResourceProviderRecursively(normalizedPath);
+    }
+
+    private ResourceProvider getMatchingResourceProviderRecursively(String path) {
+        ResourceProvider provider = resourceProviders.get(path);
+        if (provider != null) {
+            return provider;
+        }
+        String parentPath = ResourceUtil.getParent(path);
+        if (parentPath != null) {
+            return getMatchingResourceProviderRecursively(parentPath);
+        }
+        else {
+            return null;
+        }
+    }
+
+    @Override
+    public @NotNull ResourceResolver getResourceResolver() {
+        return this;
+    }
+
+    @Override
+    public @Nullable Object getProviderState() {
+        return null;
+    }
+
+    @Override
+    public @Nullable ResolveContext getParentResolveContext() {
+        return null;
+    }
+
+    @Override
+    public @Nullable ResourceProvider getParentResourceProvider() {
+        return null;
+    }
+
+}
diff --git a/core/src/main/java/org/apache/sling/testing/mock/sling/loader/ContentLoader.java b/core/src/main/java/org/apache/sling/testing/mock/sling/loader/ContentLoader.java
index e8a107f..a7c2238 100644
--- a/core/src/main/java/org/apache/sling/testing/mock/sling/loader/ContentLoader.java
+++ b/core/src/main/java/org/apache/sling/testing/mock/sling/loader/ContentLoader.java
@@ -568,7 +568,8 @@ public final class ContentLoader {
                 "provider.file", mountFolder.getAbsolutePath(),
                 "provider.root", destPath,
                 "provider.fs.mode", "INITIAL_CONTENT",
-                "provider.initial.content.import.options", "overwrite:=true;ignoreImportProviders:=\"xml\"");
+                "provider.initial.content.import.options", "overwrite:=true;ignoreImportProviders:=\"xml\"",
+                "provider.checkinterval", 0);
         FsResourceProvider service = MockOsgi.activateInjectServices(FsResourceProvider.class, bundleContext, serviceProperties);
         bundleContext.registerService(ResourceProvider.class, service, serviceProperties);
     }
@@ -615,7 +616,8 @@ public final class ContentLoader {
         Dictionary<String, Object> serviceProperties = MapUtil.toDictionary(
                 "provider.file", mountFolder.getAbsolutePath(),
                 "provider.root", destPath,
-                "provider.fs.mode", "FILEVAULT_XML");
+                "provider.fs.mode", "FILEVAULT_XML",
+                "provider.checkinterval", 0);
         FsResourceProvider service = MockOsgi.activateInjectServices(FsResourceProvider.class, bundleContext, serviceProperties);
         bundleContext.registerService(ResourceProvider.class, service, serviceProperties);
     }
diff --git a/core/src/main/java/org/apache/sling/testing/mock/sling/spi/ResourceResolverTypeAdapter.java b/core/src/main/java/org/apache/sling/testing/mock/sling/spi/ResourceResolverTypeAdapter.java
index 66bde79..55bf8cf 100644
--- a/core/src/main/java/org/apache/sling/testing/mock/sling/spi/ResourceResolverTypeAdapter.java
+++ b/core/src/main/java/org/apache/sling/testing/mock/sling/spi/ResourceResolverTypeAdapter.java
@@ -25,6 +25,11 @@ import org.jetbrains.annotations.Nullable;
 /**
  * SPI interface for resource resolver type implementations to provide a mock
  * resource resolver factory.
+ * <p>Supported constructors for implementing classes:</p>
+ * <ul>
+ * <li>Empty constructor</li>
+ * <li>Constructor with {@link org.osgi.framework.BundleContext} parameter</li>
+ * </ul>
  */
 public interface ResourceResolverTypeAdapter {
 
diff --git a/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderFolderJsonTest.java b/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderFolderJsonTest.java
index e247041..237daab 100644
--- a/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderFolderJsonTest.java
+++ b/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderFolderJsonTest.java
@@ -22,6 +22,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 
 import java.io.IOException;
+import java.util.List;
 
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
@@ -76,6 +77,14 @@ public abstract class AbstractContentLoaderFolderJsonTest {
     }
 
     @Test
+    public void testContentListChildren() {
+        Resource resource = context.resourceResolver().getResource(path + "/mount/content");
+        List<Resource> result = ImmutableList.copyOf(resource.listChildren());
+        assertEquals("jcr:content", result.get(0).getName());
+        assertEquals("toolbar", result.get(1).getName());
+    }
+
+    @Test
     public void testDamResourceType() {
         Resource resource = context.resourceResolver().getResource(path + "/mount/dam/portraits/scott_reynolds.jpg");
         assertEquals("dam:Asset", resource.getResourceType());
diff --git a/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderFolderXmlJcrTest.java b/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderFolderXmlJcrTest.java
index 89f4c84..e2806aa 100644
--- a/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderFolderXmlJcrTest.java
+++ b/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderFolderXmlJcrTest.java
@@ -24,6 +24,7 @@ import static org.junit.Assert.assertNotNull;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.List;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.sling.api.resource.Resource;
@@ -34,6 +35,8 @@ import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 
+import com.google.common.collect.ImmutableList;
+
 @SuppressWarnings("null")
 public abstract class AbstractContentLoaderFolderXmlJcrTest {
 
@@ -63,6 +66,14 @@ public abstract class AbstractContentLoaderFolderXmlJcrTest {
     }
 
     @Test
+    public void testContentListChildren() {
+        Resource resource = context.resourceResolver().getResource(path + "/samples/en");
+        List<Resource> result = ImmutableList.copyOf(resource.listChildren());
+        assertEquals("jcr:content", result.get(0).getName());
+        assertEquals("tools", result.get(1).getName());
+    }
+
+    @Test
     public void testDamResourceType() {
         Resource resource = context.resourceResolver().getResource(path + "/dam/talk.png/jcr:content");
         assertEquals("app:AssetContent", resource.getResourceType());
diff --git a/core/src/test/java/org/apache/sling/testing/mock/sling/rrmock/loader/ContentLoaderFolderJsonTest.java b/core/src/test/java/org/apache/sling/testing/mock/sling/rrmock/loader/ContentLoaderFolderJsonTest.java
new file mode 100644
index 0000000..01f0c5c
--- /dev/null
+++ b/core/src/test/java/org/apache/sling/testing/mock/sling/rrmock/loader/ContentLoaderFolderJsonTest.java
@@ -0,0 +1,31 @@
+/*
+ * 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.sling.testing.mock.sling.rrmock.loader;
+
+import org.apache.sling.testing.mock.sling.ResourceResolverType;
+import org.apache.sling.testing.mock.sling.loader.AbstractContentLoaderFolderJsonTest;
+
+public class ContentLoaderFolderJsonTest extends AbstractContentLoaderFolderJsonTest {
+
+    @Override
+    protected ResourceResolverType getResourceResolverType() {
+        return ResourceResolverType.RESOURCERESOLVER_MOCK;
+    }
+
+}
diff --git a/core/src/test/java/org/apache/sling/testing/mock/sling/rrmock/loader/ContentLoaderFolderXmlJcrTest.java b/core/src/test/java/org/apache/sling/testing/mock/sling/rrmock/loader/ContentLoaderFolderXmlJcrTest.java
new file mode 100644
index 0000000..2b10dc4
--- /dev/null
+++ b/core/src/test/java/org/apache/sling/testing/mock/sling/rrmock/loader/ContentLoaderFolderXmlJcrTest.java
@@ -0,0 +1,31 @@
+/*
+ * 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.sling.testing.mock.sling.rrmock.loader;
+
+import org.apache.sling.testing.mock.sling.ResourceResolverType;
+import org.apache.sling.testing.mock.sling.loader.AbstractContentLoaderFolderXmlJcrTest;
+
+public class ContentLoaderFolderXmlJcrTest extends AbstractContentLoaderFolderXmlJcrTest {
+
+    @Override
+    protected ResourceResolverType getResourceResolverType() {
+        return ResourceResolverType.RESOURCERESOLVER_MOCK;
+    }
+
+}
diff --git a/junit5/src/test/java/org/apache/sling/testing/mock/sling/junit5/SlingContextMemberTest.java b/junit5/src/test/java/org/apache/sling/testing/mock/sling/junit5/SlingContextMemberTest.java
index 74231df..ff8d07c 100644
--- a/junit5/src/test/java/org/apache/sling/testing/mock/sling/junit5/SlingContextMemberTest.java
+++ b/junit5/src/test/java/org/apache/sling/testing/mock/sling/junit5/SlingContextMemberTest.java
@@ -19,10 +19,9 @@
 package org.apache.sling.testing.mock.sling.junit5;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import org.apache.sling.api.resource.Resource;
-import org.apache.sling.testing.resourceresolver.MockResourceResolver;
+import org.apache.sling.testing.mock.sling.ResourceResolverType;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -38,7 +37,7 @@ class SlingContextMemberTest {
 
     @BeforeEach
     void setUp() {
-        assertTrue(context.resourceResolver() instanceof MockResourceResolver);
+        assertEquals(ResourceResolverType.RESOURCERESOLVER_MOCK, context.resourceResolverType());
 
         context.create().resource("/content/test", "prop1", "value1");
     }
diff --git a/junit5/src/test/java/org/apache/sling/testing/mock/sling/junit5/SlingContextTest.java b/junit5/src/test/java/org/apache/sling/testing/mock/sling/junit5/SlingContextTest.java
index fc956ab..485d9a7 100644
--- a/junit5/src/test/java/org/apache/sling/testing/mock/sling/junit5/SlingContextTest.java
+++ b/junit5/src/test/java/org/apache/sling/testing/mock/sling/junit5/SlingContextTest.java
@@ -19,11 +19,10 @@
 package org.apache.sling.testing.mock.sling.junit5;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import org.apache.sling.api.resource.Resource;
+import org.apache.sling.testing.mock.sling.ResourceResolverType;
 import org.apache.sling.testing.mock.sling.context.modelsautoreg.ClasspathRegisteredModel;
-import org.apache.sling.testing.resourceresolver.MockResourceResolver;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -38,7 +37,7 @@ class SlingContextTest {
 
     @BeforeEach
     void setUp(SlingContext context) {
-        assertTrue(context.resourceResolver() instanceof MockResourceResolver);
+        assertEquals(ResourceResolverType.RESOURCERESOLVER_MOCK, context.resourceResolverType());
 
         context.create().resource("/content/test", "prop1", "value1");
     }

[sling-org-apache-sling-testing-sling-mock] 02/02: SLING-5922 support loading single filevault XML files

Posted by ss...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sseifert pushed a commit to branch feature/SLING-5922-load-folder
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-testing-sling-mock.git

commit 30764a2d489c1c7a15cb5668e25273d9856c00ef
Author: Stefan Seifert <st...@users.noreply.github.com>
AuthorDate: Wed Aug 25 16:18:27 2021 +0200

    SLING-5922 support loading single filevault XML files
---
 .../testing/mock/sling/loader/ContentLoader.java   | 130 +++++++++++++++------
 ...est.java => ContentLoaderFileVaultXmlTest.java} |   5 +-
 ...va => ContentLoaderFolderFileVaultXmlTest.java} |   4 +-
 ... => AbstractContentLoaderFileVaultXmlTest.java} |  55 ++++++---
 ...stractContentLoaderFolderFileVaultXmlTest.java} |   4 +-
 .../AbstractContentLoaderFolderJsonTest.java       |  14 ---
 ...est.java => ContentLoaderFileVaultXmlTest.java} |   4 +-
 ...va => ContentLoaderFolderFileVaultXmlTest.java} |   4 +-
 8 files changed, 138 insertions(+), 82 deletions(-)

diff --git a/core/src/main/java/org/apache/sling/testing/mock/sling/loader/ContentLoader.java b/core/src/main/java/org/apache/sling/testing/mock/sling/loader/ContentLoader.java
index a7c2238..c79a883 100644
--- a/core/src/main/java/org/apache/sling/testing/mock/sling/loader/ContentLoader.java
+++ b/core/src/main/java/org/apache/sling/testing/mock/sling/loader/ContentLoader.java
@@ -29,6 +29,7 @@ import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.sling.api.resource.PersistenceException;
@@ -41,6 +42,7 @@ import org.apache.sling.contentparser.api.ParserOptions;
 import org.apache.sling.contentparser.json.JSONParserFeature;
 import org.apache.sling.contentparser.json.JSONParserOptions;
 import org.apache.sling.contentparser.json.internal.JSONContentParser;
+import org.apache.sling.contentparser.xml.jcr.internal.JCRXMLContentParser;
 import org.apache.sling.fsprovider.internal.FsResourceProvider;
 import org.apache.sling.spi.resource.provider.ResourceProvider;
 import org.apache.sling.testing.mock.osgi.MapUtil;
@@ -90,6 +92,8 @@ public final class ContentLoader {
     private final Set<String> ignoredNames;
     private final ContentParser jsonParser;
     private final ParserOptions jsonParserOptions;
+    private final ContentParser fileVaultXmlParser;
+    private final ParserOptions fileVaultXmlParserOptions;
 
     /**
      * @param resourceResolver Resource resolver
@@ -127,13 +131,19 @@ public final class ContentLoader {
         this.bundleContext = bundleContext;
         this.autoCommit = autoCommit;
         this.ignoredNames = getIgnoredNamesForResourceResolverType(resourceResolverType);
+
         this.jsonParserOptions = new JSONParserOptions()
             .withFeatures(EnumSet.of(JSONParserFeature.COMMENTS, JSONParserFeature.QUOTE_TICK))
             .detectCalendarValues(true)
             .ignorePropertyNames(this.ignoredNames)
             .ignoreResourceNames(this.ignoredNames);
-        // JSONContentParser is an OSGi service - for sake of simplicity in this mock environment instantiate it directly
         this.jsonParser = new JSONContentParser();
+
+        this.fileVaultXmlParserOptions = new ParserOptions()
+                .detectCalendarValues(true)
+                .ignorePropertyNames(this.ignoredNames)
+                .ignoreResourceNames(this.ignoredNames);
+        this.fileVaultXmlParser = new JCRXMLContentParser();
     }
 
     private final Set<String> getIgnoredNamesForResourceResolverType(ResourceResolverType resourceResolverType) {
@@ -153,19 +163,7 @@ public final class ContentLoader {
      * @return Resource
      */
     public @NotNull Resource json(@NotNull String classpathResource, @NotNull Resource parentResource, @NotNull String childName) {
-        InputStream is = ContentLoader.class.getResourceAsStream(classpathResource);
-        if (is == null) {
-            throw new IllegalArgumentException("Classpath resource not found: " + classpathResource);
-        }
-        try {
-            return json(is, parentResource, childName);
-        } finally {
-            try {
-                is.close();
-            } catch (IOException ex) {
-                // ignore
-            }
-        }
+        return json(classpathResource, parentResource.getPath() + "/" + childName);
     }
 
     /**
@@ -182,12 +180,9 @@ public final class ContentLoader {
         }
         try {
             return json(is, destPath);
-        } finally {
-            try {
-                is.close();
-            } catch (IOException ex) {
-                // ignore
-            }
+        }
+        finally {
+            IOUtils.closeQuietly(is);
         }
     }
 
@@ -209,8 +204,66 @@ public final class ContentLoader {
      * @param destPath Path to import the JSON content to
      * @return Resource
      */
-    @SuppressWarnings("null")
     public @NotNull Resource json(@NotNull InputStream inputStream, @NotNull String destPath) {
+        return mountParsedFile(inputStream, destPath, jsonParser, jsonParserOptions);
+    }
+
+    /**
+     * Import content of FileVault XML file into repository.
+     * @param classpathResource Classpath resource URL for Filevault content
+     * @param parentResource Parent resource
+     * @param childName Name of child resource to create with Filevault content
+     * @return Resource
+     */
+    public @NotNull Resource fileVaultXml(@NotNull String classpathResource, @NotNull Resource parentResource, @NotNull String childName) {
+        return fileVaultXml(classpathResource, parentResource.getPath() + "/" + childName);
+    }
+
+    /**
+     * Import content of FileVault XML file into repository. Auto-creates parent
+     * hierarchies as nt:unstrucured nodes if missing.
+     * @param classpathResource Classpath resource URL for Filevault content
+     * @param destPath Path to import the Filevault content to
+     * @return Resource
+     */
+    public @NotNull Resource fileVaultXml(@NotNull String classpathResource, @NotNull String destPath) {
+        InputStream is = ContentLoader.class.getResourceAsStream(classpathResource);
+        if (is == null) {
+            throw new IllegalArgumentException("Classpath resource not found: " + classpathResource);
+        }
+        try {
+            return fileVaultXml(is, destPath);
+        }
+        finally {
+            IOUtils.closeQuietly(is);
+        }
+    }
+
+    /**
+     * Import content of FileVault XML file into repository.
+     * @param inputStream Input stream with Filevault content
+     * @param parentResource Parent resource
+     * @param childName Name of child resource to create with Filevault content
+     * @return Resource
+     */
+    public @NotNull Resource fileVaultXml(@NotNull InputStream inputStream, @NotNull Resource parentResource, @NotNull String childName) {
+        return fileVaultXml(inputStream, parentResource.getPath() + "/" + childName);
+    }
+
+    /**
+     * Import content of FileVault XML file into repository. Auto-creates parent
+     * hierarchies as nt:unstrucured nodes if missing.
+     * @param inputStream Input stream with Filevault content
+     * @param destPath Path to import the Filevault content to
+     * @return Resource
+     */
+    public @NotNull Resource fileVaultXml(@NotNull InputStream inputStream, @NotNull String destPath) {
+        return mountParsedFile(inputStream, destPath, fileVaultXmlParser, fileVaultXmlParserOptions);
+    }
+
+    @SuppressWarnings("null")
+    private @NotNull Resource mountParsedFile(@NotNull InputStream inputStream, @NotNull String destPath,
+            @NotNull ContentParser contentParser, @NotNull ParserOptions parserOptions) {
         try {
             String parentPath = ResourceUtil.getParent(destPath);
             String childName = ResourceUtil.getName(destPath);
@@ -228,12 +281,13 @@ public final class ContentLoader {
             }
 
             LoaderContentHandler contentHandler = new LoaderContentHandler(destPath, resourceResolver);
-            jsonParser.parse(contentHandler, inputStream, jsonParserOptions);
+            contentParser.parse(contentHandler, inputStream, parserOptions);
             if (autoCommit) {
                 resourceResolver.commit();
             }
             return resourceResolver.getResource(destPath);
-        } catch (IOException ex) {
+        }
+        catch (IOException ex) {
             throw new RuntimeException(ex);
         }
     }
@@ -526,7 +580,7 @@ public final class ContentLoader {
     }
 
     /**
-     * Mount a folder containing Content in JSON (Sling-Inital-Content) format in repository.
+     * Mount a folder containing content in JSON (Sling-Inital-Content) format in repository.
      * @param mountFolderPath Root folder path to mount
      * @param parentResource Parent resource
      * @param childName Name of child resource to mount folder into
@@ -536,7 +590,7 @@ public final class ContentLoader {
     }
 
     /**
-     * Mount a folder containing Content in JSON (Sling-Inital-Content) format in repository.
+     * Mount a folder containing content in JSON (Sling-Inital-Content) format in repository.
      * @param mountFolder Root folder path to mount
      * @param destPath Path to mount folder into
      */
@@ -545,7 +599,7 @@ public final class ContentLoader {
     }
 
     /**
-     * Mount a folder containing Content in JSON (Sling-Inital-Content) format in repository.
+     * Mount a folder containing content in JSON (Sling-Inital-Content) format in repository.
      * @param mountFolderPath Root folder to mount
      * @param parentResource Parent resource
      * @param childName Name of child resource to mount folder into
@@ -555,7 +609,7 @@ public final class ContentLoader {
     }
 
     /**
-     * Mount a folder containing Content in JSON (Sling-Inital-Content) format in repository.
+     * Mount a folder containing content in JSON (Sling-Inital-Content) format in repository.
      * @param mountFolder Root folder to mount
      * @param destPath Path to mount folder into
      */
@@ -575,41 +629,41 @@ public final class ContentLoader {
     }
 
     /**
-     * Mount a folder containing Content in FileVault XML format in repository.
+     * Mount a folder containing content in FileVault XML format in repository.
      * @param mountFolderPath Root folder path to mount. Path needs to point to the root folder of the content package structure.
      * @param parentResource Parent resource
      * @param childName Name of child resource to mount folder into
      */
-    public void folderXmlJcr(@NotNull String mountFolderPath, @NotNull Resource parentResource, @NotNull String childName) {
-        folderXmlJcr(new File(mountFolderPath), parentResource, childName);
+    public void folderFileVaultXml(@NotNull String mountFolderPath, @NotNull Resource parentResource, @NotNull String childName) {
+        folderFileVaultXml(new File(mountFolderPath), parentResource, childName);
     }
 
     /**
-     * Mount a folder containing Content in FileVault XML format in repository.
+     * Mount a folder containing content in FileVault XML format in repository.
      * @param mountFolder Root folder path to mount. Path needs to point to the root folder of the content package structure.
      * @param destPath Path to mount folder into
      */
-    public void folderXmlJcr(@NotNull String mountFolderPath, @NotNull String destPath) {
-        folderXmlJcr(new File(mountFolderPath), destPath);
+    public void folderFileVaultXml(@NotNull String mountFolderPath, @NotNull String destPath) {
+        folderFileVaultXml(new File(mountFolderPath), destPath);
     }
 
     /**
-     * Mount a folder containing Content in FileVault XML format in repository.
+     * Mount a folder containing content in FileVault XML format in repository.
      * @param mountFolderPath Root folder to mount. Path needs to point to the root folder of the content package structure.
      * @param parentResource Parent resource
      * @param childName Name of child resource to mount folder into
      */
-    public void folderXmlJcr(@NotNull File mountFolder, @NotNull Resource parentResource, @NotNull String childName) {
-        folderXmlJcr(mountFolder, parentResource.getPath() + "/" + childName);
+    public void folderFileVaultXml(@NotNull File mountFolder, @NotNull Resource parentResource, @NotNull String childName) {
+        folderFileVaultXml(mountFolder, parentResource.getPath() + "/" + childName);
     }
 
     /**
-     * Mount a folder containing Content in FileVault XML format in repository.
+     * Mount a folder containing content in FileVault XML format in repository.
      * @param mountFolder Root folder to mount. Path needs to point to the root folder of the content package structure.
      * @param destPath Path to mount folder into
      */
     @SuppressWarnings("null")
-    public void folderXmlJcr(@NotNull File mountFolder, @NotNull String destPath) {
+    public void folderFileVaultXml(@NotNull File mountFolder, @NotNull String destPath) {
         if (bundleContext == null) {
             throw new IllegalArgumentException("No bundle context given for content loader.");
         }
diff --git a/core/src/test/java/org/apache/sling/testing/mock/sling/jcrmock/loader/ContentLoaderFolderXmlJcrTest.java b/core/src/test/java/org/apache/sling/testing/mock/sling/jcrmock/loader/ContentLoaderFileVaultXmlTest.java
similarity index 89%
copy from core/src/test/java/org/apache/sling/testing/mock/sling/jcrmock/loader/ContentLoaderFolderXmlJcrTest.java
copy to core/src/test/java/org/apache/sling/testing/mock/sling/jcrmock/loader/ContentLoaderFileVaultXmlTest.java
index 0697e88..6431531 100644
--- a/core/src/test/java/org/apache/sling/testing/mock/sling/jcrmock/loader/ContentLoaderFolderXmlJcrTest.java
+++ b/core/src/test/java/org/apache/sling/testing/mock/sling/jcrmock/loader/ContentLoaderFileVaultXmlTest.java
@@ -19,11 +19,10 @@
 package org.apache.sling.testing.mock.sling.jcrmock.loader;
 
 import org.apache.sling.testing.mock.sling.ResourceResolverType;
-import org.apache.sling.testing.mock.sling.loader.AbstractContentLoaderFolderXmlJcrTest;
+import org.apache.sling.testing.mock.sling.loader.AbstractContentLoaderFileVaultXmlTest;
 
-public class ContentLoaderFolderXmlJcrTest extends AbstractContentLoaderFolderXmlJcrTest {
+public class ContentLoaderFileVaultXmlTest extends AbstractContentLoaderFileVaultXmlTest {
 
-    @Override
     protected ResourceResolverType getResourceResolverType() {
         return ResourceResolverType.JCR_MOCK;
     }
diff --git a/core/src/test/java/org/apache/sling/testing/mock/sling/jcrmock/loader/ContentLoaderFolderXmlJcrTest.java b/core/src/test/java/org/apache/sling/testing/mock/sling/jcrmock/loader/ContentLoaderFolderFileVaultXmlTest.java
similarity index 89%
rename from core/src/test/java/org/apache/sling/testing/mock/sling/jcrmock/loader/ContentLoaderFolderXmlJcrTest.java
rename to core/src/test/java/org/apache/sling/testing/mock/sling/jcrmock/loader/ContentLoaderFolderFileVaultXmlTest.java
index 0697e88..b920628 100644
--- a/core/src/test/java/org/apache/sling/testing/mock/sling/jcrmock/loader/ContentLoaderFolderXmlJcrTest.java
+++ b/core/src/test/java/org/apache/sling/testing/mock/sling/jcrmock/loader/ContentLoaderFolderFileVaultXmlTest.java
@@ -19,9 +19,9 @@
 package org.apache.sling.testing.mock.sling.jcrmock.loader;
 
 import org.apache.sling.testing.mock.sling.ResourceResolverType;
-import org.apache.sling.testing.mock.sling.loader.AbstractContentLoaderFolderXmlJcrTest;
+import org.apache.sling.testing.mock.sling.loader.AbstractContentLoaderFolderFileVaultXmlTest;
 
-public class ContentLoaderFolderXmlJcrTest extends AbstractContentLoaderFolderXmlJcrTest {
+public class ContentLoaderFolderFileVaultXmlTest extends AbstractContentLoaderFolderFileVaultXmlTest {
 
     @Override
     protected ResourceResolverType getResourceResolverType() {
diff --git a/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderFolderJsonTest.java b/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderFileVaultXmlTest.java
similarity index 58%
copy from core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderFolderJsonTest.java
copy to core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderFileVaultXmlTest.java
index 237daab..d71c4f6 100644
--- a/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderFolderJsonTest.java
+++ b/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderFileVaultXmlTest.java
@@ -21,13 +21,14 @@ package org.apache.sling.testing.mock.sling.loader;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 
-import java.io.IOException;
-import java.util.List;
-
+import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
+import org.apache.jackrabbit.JcrConstants;
 import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceUtil;
+import org.apache.sling.api.resource.ValueMap;
 import org.apache.sling.testing.mock.sling.NodeTypeDefinitionScanner;
 import org.apache.sling.testing.mock.sling.ResourceResolverType;
 import org.apache.sling.testing.mock.sling.junit.SlingContext;
@@ -39,7 +40,7 @@ import org.junit.Test;
 import com.google.common.collect.ImmutableList;
 
 @SuppressWarnings("null")
-public abstract class AbstractContentLoaderFolderJsonTest {
+public abstract class AbstractContentLoaderFileVaultXmlTest {
 
     @Rule
     public SlingContext context = new SlingContext(getResourceResolverType());
@@ -61,7 +62,7 @@ public abstract class AbstractContentLoaderFolderJsonTest {
             throw new RuntimeException("Unable to register namespaces.", ex);
         }
 
-        context.load().folderJson("src/test/resources/json-import-samples", path + "/mount");
+        context.load().fileVaultXml("/xml-jcr-import-samples/content/samples/en/.content.xml", path + "/sample/en");
     }
 
     @After
@@ -71,29 +72,45 @@ public abstract class AbstractContentLoaderFolderJsonTest {
     }
 
     @Test
-    public void testContentResourceType() {
-        Resource resource = context.resourceResolver().getResource(path + "/mount/content/jcr:content");
-        assertEquals("sample/components/homepage", resource.getResourceType());
+    public void testPageResourceType() {
+        Resource resource = context.resourceResolver().getResource(path + "/sample/en");
+        assertEquals("app:Page", resource.getResourceType());
+    }
+
+    @Test
+    public void testPageJcrPrimaryType() throws RepositoryException {
+        Resource resource = context.resourceResolver().getResource(path + "/sample/en");
+        assertPrimaryNodeType(resource, "app:Page");
     }
 
     @Test
-    public void testContentListChildren() {
-        Resource resource = context.resourceResolver().getResource(path + "/mount/content");
-        List<Resource> result = ImmutableList.copyOf(resource.listChildren());
-        assertEquals("jcr:content", result.get(0).getName());
-        assertEquals("toolbar", result.get(1).getName());
+    public void testPageContentResourceType() {
+        Resource resource = context.resourceResolver().getResource(path + "/sample/en/jcr:content");
+        assertEquals("samples/sample-app/components/content/page/homepage", resource.getResourceType());
     }
 
     @Test
-    public void testDamResourceType() {
-        Resource resource = context.resourceResolver().getResource(path + "/mount/dam/portraits/scott_reynolds.jpg");
-        assertEquals("dam:Asset", resource.getResourceType());
+    public void testPageContentJcrPrimaryType() throws RepositoryException {
+        Resource resource = context.resourceResolver().getResource(path + "/sample/en/jcr:content");
+        assertPrimaryNodeType(resource, "app:PageContent");
     }
 
     @Test
-    public void testBinaryResource() throws IOException {
-        Resource fileResource = context.resourceResolver().getResource(path + "/mount/binary/sample-image.gif");
-        AbstractContentLoaderBinaryTest.assertSampleImageFileSize(fileResource);
+    public void testPageContentProperties() {
+        Resource resource = context.resourceResolver().getResource(path + "/sample/en/jcr:content");
+        ValueMap props = ResourceUtil.getValueMap(resource);
+        assertEquals("HOME", props.get("navTitle", String.class));
+        assertEquals(true, props.get("includeAside", Boolean.class));
+    }
+
+    private void assertPrimaryNodeType(final Resource resource, final String nodeType) throws RepositoryException {
+        Node node = resource.adaptTo(Node.class);
+        if (node != null) {
+            assertEquals(nodeType, node.getPrimaryNodeType().getName());
+        } else {
+            ValueMap props = ResourceUtil.getValueMap(resource);
+            assertEquals(nodeType, props.get(JcrConstants.JCR_PRIMARYTYPE));
+        }
     }
 
 }
diff --git a/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderFolderXmlJcrTest.java b/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderFolderFileVaultXmlTest.java
similarity index 95%
rename from core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderFolderXmlJcrTest.java
rename to core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderFolderFileVaultXmlTest.java
index e2806aa..473ecbf 100644
--- a/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderFolderXmlJcrTest.java
+++ b/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderFolderFileVaultXmlTest.java
@@ -38,7 +38,7 @@ import org.junit.Test;
 import com.google.common.collect.ImmutableList;
 
 @SuppressWarnings("null")
-public abstract class AbstractContentLoaderFolderXmlJcrTest {
+public abstract class AbstractContentLoaderFolderFileVaultXmlTest {
 
     @Rule
     public SlingContext context = new SlingContext(getResourceResolverType());
@@ -50,7 +50,7 @@ public abstract class AbstractContentLoaderFolderXmlJcrTest {
     @Before
     public void setUp() {
         path = "/content";
-        context.load().folderXmlJcr("src/test/resources/xml-jcr-import-samples", path);
+        context.load().folderFileVaultXml("src/test/resources/xml-jcr-import-samples", path);
     }
 
     @After
diff --git a/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderFolderJsonTest.java b/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderFolderJsonTest.java
index 237daab..712309c 100644
--- a/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderFolderJsonTest.java
+++ b/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderFolderJsonTest.java
@@ -24,11 +24,7 @@ import static org.junit.Assert.assertFalse;
 import java.io.IOException;
 import java.util.List;
 
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-
 import org.apache.sling.api.resource.Resource;
-import org.apache.sling.testing.mock.sling.NodeTypeDefinitionScanner;
 import org.apache.sling.testing.mock.sling.ResourceResolverType;
 import org.apache.sling.testing.mock.sling.junit.SlingContext;
 import org.junit.After;
@@ -51,16 +47,6 @@ public abstract class AbstractContentLoaderFolderJsonTest {
     @Before
     public void setUp() {
         path = context.uniqueRoot().content();
-
-        try {
-            NodeTypeDefinitionScanner.get().register(context.resourceResolver().adaptTo(Session.class),
-                    ImmutableList.of("SLING-INF/nodetypes/app.cnd"),
-                    getResourceResolverType().getNodeTypeMode());
-        }
-        catch (RepositoryException ex) {
-            throw new RuntimeException("Unable to register namespaces.", ex);
-        }
-
         context.load().folderJson("src/test/resources/json-import-samples", path + "/mount");
     }
 
diff --git a/core/src/test/java/org/apache/sling/testing/mock/sling/rrmock/loader/ContentLoaderFolderXmlJcrTest.java b/core/src/test/java/org/apache/sling/testing/mock/sling/rrmock/loader/ContentLoaderFileVaultXmlTest.java
similarity index 90%
copy from core/src/test/java/org/apache/sling/testing/mock/sling/rrmock/loader/ContentLoaderFolderXmlJcrTest.java
copy to core/src/test/java/org/apache/sling/testing/mock/sling/rrmock/loader/ContentLoaderFileVaultXmlTest.java
index 2b10dc4..b3a87c7 100644
--- a/core/src/test/java/org/apache/sling/testing/mock/sling/rrmock/loader/ContentLoaderFolderXmlJcrTest.java
+++ b/core/src/test/java/org/apache/sling/testing/mock/sling/rrmock/loader/ContentLoaderFileVaultXmlTest.java
@@ -19,9 +19,9 @@
 package org.apache.sling.testing.mock.sling.rrmock.loader;
 
 import org.apache.sling.testing.mock.sling.ResourceResolverType;
-import org.apache.sling.testing.mock.sling.loader.AbstractContentLoaderFolderXmlJcrTest;
+import org.apache.sling.testing.mock.sling.loader.AbstractContentLoaderFileVaultXmlTest;
 
-public class ContentLoaderFolderXmlJcrTest extends AbstractContentLoaderFolderXmlJcrTest {
+public class ContentLoaderFileVaultXmlTest extends AbstractContentLoaderFileVaultXmlTest {
 
     @Override
     protected ResourceResolverType getResourceResolverType() {
diff --git a/core/src/test/java/org/apache/sling/testing/mock/sling/rrmock/loader/ContentLoaderFolderXmlJcrTest.java b/core/src/test/java/org/apache/sling/testing/mock/sling/rrmock/loader/ContentLoaderFolderFileVaultXmlTest.java
similarity index 89%
rename from core/src/test/java/org/apache/sling/testing/mock/sling/rrmock/loader/ContentLoaderFolderXmlJcrTest.java
rename to core/src/test/java/org/apache/sling/testing/mock/sling/rrmock/loader/ContentLoaderFolderFileVaultXmlTest.java
index 2b10dc4..89e34c2 100644
--- a/core/src/test/java/org/apache/sling/testing/mock/sling/rrmock/loader/ContentLoaderFolderXmlJcrTest.java
+++ b/core/src/test/java/org/apache/sling/testing/mock/sling/rrmock/loader/ContentLoaderFolderFileVaultXmlTest.java
@@ -19,9 +19,9 @@
 package org.apache.sling.testing.mock.sling.rrmock.loader;
 
 import org.apache.sling.testing.mock.sling.ResourceResolverType;
-import org.apache.sling.testing.mock.sling.loader.AbstractContentLoaderFolderXmlJcrTest;
+import org.apache.sling.testing.mock.sling.loader.AbstractContentLoaderFolderFileVaultXmlTest;
 
-public class ContentLoaderFolderXmlJcrTest extends AbstractContentLoaderFolderXmlJcrTest {
+public class ContentLoaderFolderFileVaultXmlTest extends AbstractContentLoaderFolderFileVaultXmlTest {
 
     @Override
     protected ResourceResolverType getResourceResolverType() {