This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to annotated tag org.apache.sling.testing.resourceresolver-mock-1.1.0 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-testing-resourceresolver-mock.git
commit f736863e79a33a0dff3506a6f338dd5b1bc1d34b Author: Stefan Seifert <[email protected]> AuthorDate: Tue Sep 9 14:13:45 2014 +0000 SLING-3889 fix issue where creating a resources fails when deleting it before without committing refactor unit tests and add a new unit test suite for create/delete scenarios git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/testing/resourceresolver-mock@1623828 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 6 + .../resourceresolver/MockResourceResolver.java | 2 +- .../CreateDeleteResourceResolverTest.java | 136 +++++++++++++++++++++ .../SlingCrudResourceResolverTest.java | 97 ++++++--------- 4 files changed, 183 insertions(+), 58 deletions(-) diff --git a/pom.xml b/pom.xml index a38f9d1..9cccf1c 100644 --- a/pom.xml +++ b/pom.xml @@ -87,6 +87,12 @@ <artifactId>junit</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>com.google.guava</groupId> + <artifactId>guava</artifactId> + <version>15.0</version> + <scope>test</scope> + </dependency> </dependencies> </project> diff --git a/src/main/java/org/apache/sling/testing/resourceresolver/MockResourceResolver.java b/src/main/java/org/apache/sling/testing/resourceresolver/MockResourceResolver.java index b5c4682..c79839c 100644 --- a/src/main/java/org/apache/sling/testing/resourceresolver/MockResourceResolver.java +++ b/src/main/java/org/apache/sling/testing/resourceresolver/MockResourceResolver.java @@ -265,7 +265,7 @@ public class MockResourceResolver extends SlingAdaptable implements ResourceReso throw new PersistenceException("Path already exists: " + path); } synchronized ( this.resources ) { - if ( this.resources.containsKey(path) ) { + if ( this.resources.containsKey(path) && !this.deletedResources.contains(path) ) { throw new PersistenceException("Path already exists: " + path); } } diff --git a/src/test/java/org/apache/sling/testing/resourceresolver/CreateDeleteResourceResolverTest.java b/src/test/java/org/apache/sling/testing/resourceresolver/CreateDeleteResourceResolverTest.java new file mode 100644 index 0000000..dba669c --- /dev/null +++ b/src/test/java/org/apache/sling/testing/resourceresolver/CreateDeleteResourceResolverTest.java @@ -0,0 +1,136 @@ +/* + * 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.resourceresolver; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +import java.io.IOException; +import java.util.Map; + +import org.apache.sling.api.resource.LoginException; +import org.apache.sling.api.resource.PersistenceException; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceResolver; +import org.apache.sling.api.resource.ValueMap; +import org.junit.Before; +import org.junit.Test; + +import com.google.common.collect.ImmutableMap; + +/** + * Tests combinations of create and deletion of resources and conflict detection. + */ +public class CreateDeleteResourceResolverTest { + + private static final Map<String,Object> PROPS1 = ImmutableMap.<String, Object>builder() + .put("prop1", "value1").build(); + private static final Map<String,Object> PROPS2 = ImmutableMap.<String, Object>builder() + .put("prop2", "value2").build(); + + private ResourceResolver resourceResolver; + private Resource testRoot; + + @Before + public final void setUp() throws IOException, LoginException { + resourceResolver = new MockResourceResolverFactory().getResourceResolver(null); + Resource root = resourceResolver.getResource("/"); + testRoot = resourceResolver.create(root, "test", ValueMap.EMPTY); + } + + @Test + public void testCreateDeleteCreate() throws PersistenceException { + // create new node without commit + Resource resource = resourceResolver.create(testRoot, "node", PROPS1); + assertEquals(PROPS1, resource.getValueMap()); + + // delete node without commit + resourceResolver.delete(resource); + assertNull(resourceResolver.getResource(testRoot.getPath() + "/node")); + + // create node again with different properties without commit + resource = resourceResolver.create(testRoot, "node", PROPS2); + assertEquals(PROPS2, resource.getValueMap()); + } + + @Test + public void testCreateDeleteCreateCommit() throws PersistenceException { + // create new node without commit + Resource resource = resourceResolver.create(testRoot, "node", PROPS1); + assertEquals(PROPS1, resource.getValueMap()); + + // delete node without commit + resourceResolver.delete(resource); + assertNull(resourceResolver.getResource(testRoot.getPath() + "/node")); + + // create node again with different properties with commit + resource = resourceResolver.create(testRoot, "node", PROPS2); + assertEquals(PROPS2, resource.getValueMap()); + resourceResolver.commit(); + } + + @Test + public void testCreateCommitDeleteCreateCommit() throws PersistenceException { + // create new node with commit + Resource resource = resourceResolver.create(testRoot, "node", PROPS1); + assertEquals(PROPS1, resource.getValueMap()); + resourceResolver.commit(); + + // delete node without commit + resourceResolver.delete(resource); + assertNull(resourceResolver.getResource(testRoot.getPath() + "/node")); + + // create node again with different properties with commit + resource = resourceResolver.create(testRoot, "node", PROPS2); + assertEquals(PROPS2, resource.getValueMap()); + resourceResolver.commit(); + } + + @Test + public void testCreateCommitDeleteCommitCreateCommit() throws PersistenceException { + // create new node with commit + Resource resource = resourceResolver.create(testRoot, "node", PROPS1); + assertEquals(PROPS1, resource.getValueMap()); + resourceResolver.commit(); + + // delete node with commit + resourceResolver.delete(resource); + assertNull(resourceResolver.getResource(testRoot.getPath() + "/node")); + resourceResolver.commit(); + + // create node again with different properties with commit + resource = resourceResolver.create(testRoot, "node", PROPS2); + assertEquals(PROPS2, resource.getValueMap()); + resourceResolver.commit(); + } + + @Test(expected=PersistenceException.class) + public void testCreatePathAlreadyExists() throws PersistenceException { + resourceResolver.create(testRoot, "node", PROPS1); + resourceResolver.create(testRoot, "node", PROPS2); + } + + @Test(expected=PersistenceException.class) + public void testCreateCommitPathAlreadyExists() throws PersistenceException { + resourceResolver.create(testRoot, "node", PROPS1); + resourceResolver.commit(); + resourceResolver.create(testRoot, "node", PROPS2); + } + +} diff --git a/src/test/java/org/apache/sling/testing/resourceresolver/SlingCrudResourceResolverTest.java b/src/test/java/org/apache/sling/testing/resourceresolver/SlingCrudResourceResolverTest.java index 617773f..33021dd 100644 --- a/src/test/java/org/apache/sling/testing/resourceresolver/SlingCrudResourceResolverTest.java +++ b/src/test/java/org/apache/sling/testing/resourceresolver/SlingCrudResourceResolverTest.java @@ -20,7 +20,6 @@ package org.apache.sling.testing.resourceresolver; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import java.io.ByteArrayInputStream; @@ -28,9 +27,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.Calendar; import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; +import java.util.List; import org.apache.commons.io.IOUtils; import org.apache.sling.api.resource.LoginException; @@ -38,12 +35,14 @@ import org.apache.sling.api.resource.PersistenceException; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.resource.ValueMap; -import org.junit.After; import org.junit.Before; import org.junit.Test; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Lists; + /** - * Implements simple write and read resource and values test + * Implements simple write and read resource and values test. * Sling CRUD API is used to create the test data. */ public class SlingCrudResourceResolverTest { @@ -60,53 +59,37 @@ public class SlingCrudResourceResolverTest { private static final String NT_UNSTRUCTURED = "nt:unstructured"; private ResourceResolver resourceResolver; - protected Resource testRoot; + private Resource testRoot; @Before public final void setUp() throws IOException, LoginException { - this.resourceResolver = new MockResourceResolverFactory().getResourceResolver(null); - - // prepare some test data using Sling CRUD API - Resource rootNode = getTestRootResource(); - - Map<String, Object> props = new HashMap<String, Object>(); - props.put(MockResource.JCR_PRIMARYTYPE, NT_UNSTRUCTURED); - props.put("stringProp", STRING_VALUE); - props.put("stringArrayProp", STRING_ARRAY_VALUE); - props.put("integerProp", INTEGER_VALUE); - props.put("doubleProp", DOUBLE_VALUE); - props.put("booleanProp", BOOLEAN_VALUE); - props.put("dateProp", DATE_VALUE); - props.put("calendarProp", CALENDAR_VALUE); - props.put("binaryProp", new ByteArrayInputStream(BINARY_VALUE)); - Resource node1 = this.resourceResolver.create(rootNode, "node1", props); - - this.resourceResolver.create(node1, "node11", ValueMap.EMPTY); - this.resourceResolver.create(node1, "node12", ValueMap.EMPTY); - - this.resourceResolver.commit(); - } - - @After - public final void tearDown() { - this.testRoot = null; - } - - /** - * Return a test root resource, created on demand, with a unique path - * @throws PersistenceException - */ - private Resource getTestRootResource() throws PersistenceException { - if (this.testRoot == null) { - final Resource root = this.resourceResolver.getResource("/"); - this.testRoot = this.resourceResolver.create(root, "test", ValueMap.EMPTY); - } - return this.testRoot; + resourceResolver = new MockResourceResolverFactory().getResourceResolver(null); + + Resource root = resourceResolver.getResource("/"); + testRoot = resourceResolver.create(root, "test", ValueMap.EMPTY); + + Resource node1 = resourceResolver.create(testRoot, "node1", + ImmutableMap.<String, Object>builder() + .put(MockResource.JCR_PRIMARYTYPE, NT_UNSTRUCTURED) + .put("stringProp", STRING_VALUE) + .put("stringArrayProp", STRING_ARRAY_VALUE) + .put("integerProp", INTEGER_VALUE) + .put("doubleProp", DOUBLE_VALUE) + .put("booleanProp", BOOLEAN_VALUE) + .put("dateProp", DATE_VALUE) + .put("calendarProp", CALENDAR_VALUE) + .put("binaryProp", new ByteArrayInputStream(BINARY_VALUE)) + .build()); + + resourceResolver.create(node1, "node11", ValueMap.EMPTY); + resourceResolver.create(node1, "node12", ValueMap.EMPTY); + + resourceResolver.commit(); } @Test public void testSimpleProperties() throws IOException { - Resource resource1 = this.resourceResolver.getResource(getTestRootResource().getPath() + "/node1"); + Resource resource1 = resourceResolver.getResource(testRoot.getPath() + "/node1"); assertNotNull(resource1); assertEquals("node1", resource1.getName()); @@ -120,14 +103,14 @@ public class SlingCrudResourceResolverTest { @Test public void testDateProperty() throws IOException { - Resource resource1 = this.resourceResolver.getResource(getTestRootResource().getPath() + "/node1"); + Resource resource1 = resourceResolver.getResource(testRoot.getPath() + "/node1"); ValueMap props = resource1.getValueMap(); assertEquals(DATE_VALUE, props.get("dateProp", Date.class)); } @Test public void testDatePropertyToCalendar() throws IOException { - Resource resource1 = this.resourceResolver.getResource(getTestRootResource().getPath() + "/node1"); + Resource resource1 = resourceResolver.getResource(testRoot.getPath() + "/node1"); ValueMap props = resource1.getValueMap(); Calendar calendarValue = props.get("dateProp", Calendar.class); assertNotNull(calendarValue); @@ -136,14 +119,14 @@ public class SlingCrudResourceResolverTest { @Test public void testCalendarProperty() throws IOException { - Resource resource1 = this.resourceResolver.getResource(getTestRootResource().getPath() + "/node1"); + Resource resource1 = resourceResolver.getResource(testRoot.getPath() + "/node1"); ValueMap props = resource1.getValueMap(); assertEquals(CALENDAR_VALUE.getTime(), props.get("calendarProp", Calendar.class).getTime()); } @Test public void testCalendarPropertyToDate() throws IOException { - Resource resource1 = this.resourceResolver.getResource(getTestRootResource().getPath() + "/node1"); + Resource resource1 = resourceResolver.getResource(testRoot.getPath() + "/node1"); ValueMap props = resource1.getValueMap(); Date dateValue = props.get("calendarProp", Date.class); assertNotNull(dateValue); @@ -152,17 +135,17 @@ public class SlingCrudResourceResolverTest { @Test public void testListChildren() throws IOException { - Resource resource1 = this.resourceResolver.getResource(getTestRootResource().getPath() + "/node1"); + Resource resource1 = resourceResolver.getResource(testRoot.getPath() + "/node1"); - Iterator<Resource> children = resource1.listChildren(); - assertEquals("node11", children.next().getName()); - assertEquals("node12", children.next().getName()); - assertFalse(children.hasNext()); + List<Resource> children = Lists.newArrayList(resource1.listChildren()); + assertEquals(2, children.size()); + assertEquals("node11", children.get(0).getName()); + assertEquals("node12", children.get(1).getName()); } @Test public void testBinaryData() throws IOException { - Resource resource1 = this.resourceResolver.getResource(getTestRootResource().getPath() + "/node1"); + Resource resource1 = resourceResolver.getResource(testRoot.getPath() + "/node1"); Resource binaryPropResource = resource1.getChild("binaryProp"); InputStream is = binaryPropResource.adaptTo(InputStream.class); @@ -180,7 +163,7 @@ public class SlingCrudResourceResolverTest { @Test public void testPrimaryTypeResourceType() throws PersistenceException { - Resource resource1 = this.resourceResolver.getResource(getTestRootResource().getPath() + "/node1"); + Resource resource1 = resourceResolver.getResource(testRoot.getPath() + "/node1"); assertEquals(NT_UNSTRUCTURED, resource1.getResourceType()); } -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
