blob: 33208061cd9589892244f4b4eb334dbffefca9b2 [file] [log] [blame]
/*
* 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.nosql.generic.resource.impl;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.Iterator;
import org.apache.sling.api.resource.ModifiableValueMap;
import org.apache.sling.api.resource.PersistenceException;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.testing.mock.sling.ResourceResolverType;
import org.apache.sling.testing.mock.sling.junit.SlingContext;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import com.google.common.collect.ImmutableMap;
/**
* Test basic ResourceResolver and ValueMap with different data types.
*/
public abstract class AbstractNoSqlResourceProviderTransactionalTest {
@Rule
public SlingContext context = new SlingContext(ResourceResolverType.JCR_MOCK);
protected abstract void registerResourceProviderFactory();
protected abstract Resource testRoot();
@Before
public void setUp() throws Exception {
registerResourceProviderFactory();
}
@After
public void tearDown() {
context.resourceResolver().revert();
try {
context.resourceResolver().delete(testRoot());
context.resourceResolver().commit();
}
catch (PersistenceException ex) {
// ignore
}
}
@Test
public void testRootNode() {
assertTrue(testRoot() instanceof NoSqlResource);
}
@Test
public void testAddDeleteNodesPartialCommit() throws PersistenceException {
context.resourceResolver().create(testRoot(), "node0", ImmutableMap.<String, Object>of());
context.resourceResolver().create(testRoot(), "node1", ImmutableMap.<String, Object>of());
context.resourceResolver().commit();
assertFalse(context.resourceResolver().hasChanges());
context.resourceResolver().create(testRoot(), "node2", ImmutableMap.<String, Object>of());
context.resourceResolver().create(testRoot(), "node3", ImmutableMap.<String, Object>of());
assertTrue(context.resourceResolver().hasChanges());
assertNotNull(testRoot().getChild("node0"));
assertNotNull(testRoot().getChild("node1"));
assertNotNull(testRoot().getChild("node2"));
assertNotNull(testRoot().getChild("node3"));
context.resourceResolver().delete(testRoot().getChild("node0"));
context.resourceResolver().delete(testRoot().getChild("node2"));
assertNull(testRoot().getChild("node0"));
assertNotNull(testRoot().getChild("node1"));
assertNull(testRoot().getChild("node2"));
assertNotNull(testRoot().getChild("node3"));
Iterator<Resource> children = testRoot().listChildren();
assertEquals("node1", children.next().getName());
assertEquals("node3", children.next().getName());
assertFalse(children.hasNext());
assertTrue(context.resourceResolver().hasChanges());
context.resourceResolver().revert();
assertFalse(context.resourceResolver().hasChanges());
assertNotNull(testRoot().getChild("node1"));
assertNull(testRoot().getChild("node2"));
assertNull(testRoot().getChild("node3"));
children = testRoot().listChildren();
assertEquals("node0", children.next().getName());
assertEquals("node1", children.next().getName());
assertFalse(children.hasNext());
}
@Test
public void testRecursiveDeleteWithoutCommit() throws PersistenceException {
Resource node1 = context.resourceResolver().create(testRoot(), "node1", ImmutableMap.<String, Object>of());
Resource node11 = context.resourceResolver().create(node1, "node11", ImmutableMap.<String, Object>of());
context.resourceResolver().create(node11, "node111", ImmutableMap.<String, Object>of());
assertNotNull(testRoot().getChild("node1"));
assertNotNull(testRoot().getChild("node1/node11"));
assertNotNull(testRoot().getChild("node1/node11/node111"));
context.resourceResolver().delete(node1);
assertNull(testRoot().getChild("node1"));
assertNull(testRoot().getChild("node1/node11"));
assertNull(testRoot().getChild("node1/node11/node111"));
}
@Test
public void testRecursiveDeleteWithCommit() throws PersistenceException {
Resource node1 = context.resourceResolver().create(testRoot(), "node1", ImmutableMap.<String, Object>of());
Resource node11 = context.resourceResolver().create(node1, "node11", ImmutableMap.<String, Object>of());
context.resourceResolver().create(node11, "node111", ImmutableMap.<String, Object>of());
assertTrue(context.resourceResolver().hasChanges());
context.resourceResolver().commit();
assertFalse(context.resourceResolver().hasChanges());
assertNotNull(testRoot().getChild("node1"));
assertNotNull(testRoot().getChild("node1/node11"));
assertNotNull(testRoot().getChild("node1/node11/node111"));
context.resourceResolver().delete(node1);
assertNull(testRoot().getChild("node1"));
assertNull(testRoot().getChild("node1/node11"));
assertNull(testRoot().getChild("node1/node11/node111"));
assertTrue(context.resourceResolver().hasChanges());
context.resourceResolver().commit();
assertFalse(context.resourceResolver().hasChanges());
assertNull(testRoot().getChild("node1"));
assertNull(testRoot().getChild("node1/node11"));
assertNull(testRoot().getChild("node1/node11/node111"));
}
@Test(expected = PersistenceException.class)
public void testCreateAlreadyExistWithoutCommit() throws PersistenceException {
context.resourceResolver().create(testRoot(), "node1", ImmutableMap.<String, Object>of());
context.resourceResolver().create(testRoot(), "node1", ImmutableMap.<String, Object>of());
}
@Test(expected = PersistenceException.class)
public void testCreateAlreadyExistWithCommit() throws PersistenceException {
context.resourceResolver().create(testRoot(), "node1", ImmutableMap.<String, Object>of());
context.resourceResolver().commit();
context.resourceResolver().create(testRoot(), "node1", ImmutableMap.<String, Object>of());
}
@Test
public void testCreateAlreadyExistDeletedWithoutCommit() throws PersistenceException {
context.resourceResolver().create(testRoot(), "node1", ImmutableMap.<String, Object>of());
context.resourceResolver().delete(testRoot().getChild("node1"));
context.resourceResolver().create(testRoot(), "node1", ImmutableMap.<String, Object>of());
}
@Test
public void testCreateAlreadyExistDeletedWithCommit() throws PersistenceException {
context.resourceResolver().create(testRoot(), "node1", ImmutableMap.<String, Object>of());
context.resourceResolver().commit();
context.resourceResolver().delete(testRoot().getChild("node1"));
context.resourceResolver().commit();
context.resourceResolver().create(testRoot(), "node1", ImmutableMap.<String, Object>of());
}
@Test
public void testUpdateWithoutCommit() throws PersistenceException {
Resource node1 = context.resourceResolver().create(testRoot(), "node1", ImmutableMap.<String, Object>of("prop1", "value1"));
assertEquals("value1", node1.getValueMap().get("prop1", String.class));
ModifiableValueMap props = node1.adaptTo(ModifiableValueMap.class);
props.put("prop1", "value2");
node1 = testRoot().getChild("node1");
assertEquals("value2", node1.getValueMap().get("prop1", String.class));
}
@Test
public void testUpdateWithCommit() throws PersistenceException {
Resource node1 = context.resourceResolver().create(testRoot(), "node1", ImmutableMap.<String, Object>of("prop1", "value1"));
assertEquals("value1", node1.getValueMap().get("prop1", String.class));
context.resourceResolver().commit();
ModifiableValueMap props = node1.adaptTo(ModifiableValueMap.class);
props.put("prop1", "value2");
context.resourceResolver().commit();
node1 = testRoot().getChild("node1");
assertEquals("value2", node1.getValueMap().get("prop1", String.class));
}
}