Added an Etc Mapping Test to showcase the endless circular mapping
diff --git a/src/test/java/org/apache/sling/resourceresolver/impl/EtcMappingResourceResolverTest.java b/src/test/java/org/apache/sling/resourceresolver/impl/EtcMappingResourceResolverTest.java
index 256dfe9..b8f73e1 100644
--- a/src/test/java/org/apache/sling/resourceresolver/impl/EtcMappingResourceResolverTest.java
+++ b/src/test/java/org/apache/sling/resourceresolver/impl/EtcMappingResourceResolverTest.java
@@ -272,4 +272,38 @@
resolvedResource = resourceResolver.resolve(request, "/stories/");
checkInternalResource(resolvedResource, "/anecdotes/stories");
}
+
+ /**
+ * ATTENTION: this tests showcases an erroneous condition of an endless circular mapping in the /etc/map. When
+ * this test passes this condition is present. After a fix this test must be adjusted.
+ *
+ * This confirms an issue with the Etc Mapping where a mapping from a node to a child node (here / to /content)
+ * ends up in a endless circular mapping.
+ * The only way to recover from this is to go to the OSGi console and change the /etc/map path in the Resource
+ * Resolver factory.
+ * Either the Etc Mapping discovers this condition and stops it or at least ignores mapping for Composum to allow
+ * the /etc/map to be edited.
+ */
+ @Test
+ public void endless_circular_mapping() throws Exception {
+ buildResource(http.getPath() + "/localhost.8080", http, resourceResolver, resourceProvider, PROP_REDIRECT_EXTERNAL, "/content");
+ refreshMapEntries("/etc/map", true);
+
+ ExpectedEtcMapping expectedEtcMapping = new ExpectedEtcMapping("^http/localhost.8080/", "/content/");
+ expectedEtcMapping.assertEtcMap("Etc Mapping for root node to content", commonFactory.getMapEntries().getResolveMaps());
+
+ buildResource("/content/test", null, resourceResolver, resourceProvider);
+ buildResource("/content/content/test", null, resourceResolver, resourceProvider);
+ buildResource("/content/content/content/test", null, resourceResolver, resourceProvider);
+
+ HttpServletRequest request = createRequestFromUrl("http://localhost:8080/");
+ Resource resolvedResource = resourceResolver.resolve(request, "/test.html");
+ checkRedirectResource(resolvedResource, "/content/test.html", 302);
+
+ resolvedResource = resourceResolver.resolve(request, "/content/test.html");
+ checkRedirectResource(resolvedResource, "/content/content/test.html", 302);
+
+ resolvedResource = resourceResolver.resolve(request, "/content/content/test.html");
+ checkRedirectResource(resolvedResource, "/content/content/content/test.html", 302);
+ }
}