blob: ef652f0714b0b24262747f6fc03a50e2700deb73 [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.jackrabbit.oak.core;
import static org.apache.jackrabbit.oak.api.Tree.Status.NEW;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.List;
import org.apache.jackrabbit.oak.OakBaseTest;
import org.apache.jackrabbit.oak.api.CommitFailedException;
import org.apache.jackrabbit.oak.api.ContentSession;
import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.api.Root;
import org.apache.jackrabbit.oak.api.Tree;
import org.apache.jackrabbit.oak.api.Tree.Status;
import org.apache.jackrabbit.oak.api.Type;
import org.apache.jackrabbit.oak.fixture.NodeStoreFixture;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class RootTest extends OakBaseTest {
private ContentSession session;
public RootTest(NodeStoreFixture fixture) {
super(fixture);
}
@Before
public void setUp() throws CommitFailedException {
session = createContentSession();
// Add test content
Root root = session.getLatestRoot();
Tree tree = root.getTree("/");
tree.setProperty("a", 1);
tree.setProperty("b", 2);
tree.setProperty("c", 3);
Tree x = tree.addChild("x");
x.addChild("xx");
x.setProperty("xa", "value");
tree.addChild("y");
tree.addChild("z");
root.commit();
}
@After
public void tearDown() {
session = null;
}
@Test
public void getTree() {
Root root = session.getLatestRoot();
List<String> validPaths = new ArrayList<String>();
validPaths.add("/");
validPaths.add("/x");
validPaths.add("/x/xx");
validPaths.add("/y");
validPaths.add("/z");
for (String treePath : validPaths) {
Tree tree = root.getTree(treePath);
assertTrue(tree.exists());
assertEquals(treePath, tree.getPath());
}
List<String> invalidPaths = new ArrayList<String>();
invalidPaths.add("/any");
invalidPaths.add("/x/any");
for (String treePath : invalidPaths) {
assertFalse(root.getTree(treePath).exists());
}
}
@Test
public void move() throws CommitFailedException {
Root root = session.getLatestRoot();
Tree tree = root.getTree("/");
Tree y = tree.getChild("y");
Tree x = tree.getChild("x");
assertTrue(x.exists());
assertFalse(root.hasPendingChanges());
root.move("/x", "/y/xx");
assertTrue(root.hasPendingChanges());
assertFalse(tree.hasChild("x"));
assertTrue(y.hasChild("xx"));
assertEquals("/y/xx", x.getPath());
root.commit();
assertFalse(root.hasPendingChanges());
assertFalse(tree.hasChild("x"));
assertTrue(tree.hasChild("y"));
assertTrue(tree.getChild("y").hasChild("xx"));
}
@Test
public void moveRemoveAdd() {
Root root = session.getLatestRoot();
Tree x = root.getTree("/x");
Tree z = root.getTree("/z");
z.setProperty("p", "1");
root.move("/z", "/x/z");
root.getTree("/x/z").remove();
assertFalse(z.exists());
x.addChild("z");
assertEquals(Status.NEW, z.getStatus());
x.getChild("z").setProperty("p", "2");
PropertyState p = z.getProperty("p");
assertNotNull(p);
assertEquals("2", p.getValue(Type.STRING));
}
@Test
public void moveNew() {
Root root = session.getLatestRoot();
Tree tree = root.getTree("/");
Tree t = tree.addChild("new");
root.move("/new", "/y/new");
assertEquals("/y/new", t.getPath());
assertFalse(tree.getChild("new").exists());
}
@Test
public void moveExistingParent() throws CommitFailedException {
Root root = session.getLatestRoot();
root.getTree("/").addChild("parent").addChild("new");
root.commit();
Tree parent = root.getTree("/parent");
Tree n = root.getTree("/parent/new");
root.move("/parent", "/moved");
assertEquals(Status.NEW, parent.getStatus());
assertEquals(Status.NEW, n.getStatus());
assertEquals("/moved", parent.getPath());
assertEquals("/moved/new", n.getPath());
}
@Test
public void moveToSelf() throws CommitFailedException {
Root root = session.getLatestRoot();
root.getTree("/").addChild("s");
root.commit();
assertTrue(root.move("/s", "/s"));
}
@Test
public void moveToDescendant() throws CommitFailedException {
Root root = session.getLatestRoot();
root.getTree("/").addChild("s");
root.commit();
assertFalse(root.move("/s", "/s/t"));
}
/**
* Regression test for OAK-208
*/
@Test
public void removeMoved() throws CommitFailedException {
Root root = session.getLatestRoot();
Tree r = root.getTree("/");
r.addChild("a");
r.addChild("b");
root.move("/a", "/b/c");
assertFalse(r.hasChild("a"));
assertTrue(r.hasChild("b"));
r.getChild("b").remove();
assertFalse(r.hasChild("a"));
assertFalse(r.hasChild("b"));
root.commit();
assertFalse(r.hasChild("a"));
assertFalse(r.hasChild("b"));
}
@Test
public void rename() throws CommitFailedException {
Root root = session.getLatestRoot();
Tree tree = root.getTree("/");
Tree x = tree.getChild("x");
assertTrue(x.exists());
root.move("/x", "/xx");
assertFalse(tree.hasChild("x"));
assertTrue(tree.hasChild("xx"));
assertEquals("/xx", x.getPath());
root.commit();
assertFalse(tree.hasChild("x"));
assertTrue(tree.hasChild("xx"));
}
@Test
public void rebase() throws CommitFailedException {
Root root1 = session.getLatestRoot();
Root root2 = session.getLatestRoot();
checkEqual(root1.getTree("/"), root2.getTree("/"));
root2.getTree("/").addChild("one").addChild("two").addChild("three")
.setProperty("p1", "V1");
root2.commit();
root1.rebase();
checkEqual(root1.getTree("/"), (root2.getTree("/")));
Tree one = root2.getTree("/one");
one.getChild("two").remove();
one.addChild("four");
root2.commit();
root1.rebase();
checkEqual(root1.getTree("/"), (root2.getTree("/")));
}
@Test
public void rebasePreservesStatus() throws CommitFailedException {
Root root1 = session.getLatestRoot();
Root root2 = session.getLatestRoot();
Tree x = root1.getTree("/x");
Tree added = x.addChild("added");
assertEquals(NEW, added.getStatus());
root2.getTree("/x").addChild("bar");
root2.commit();
root1.rebase();
assertTrue(x.hasChild("added"));
assertEquals(NEW, x.getChild("added").getStatus());
assertTrue(x.hasChild("bar"));
}
@Test
public void purgePreservesStatus() throws CommitFailedException {
Tree x = session.getLatestRoot().getTree("/x");
Tree added = x.addChild("added");
for (int k = 0; k < 10000; k++) {
assertEquals("k=" + k, NEW, x.getChild("added").getStatus());
x.addChild("k" + k);
}
}
@Test
public void rebaseWithAddNode() throws CommitFailedException {
Root root1 = session.getLatestRoot();
Root root2 = session.getLatestRoot();
checkEqual(root1.getTree("/"), root2.getTree("/"));
root2.getTree("/").addChild("one").addChild("two").addChild("three")
.setProperty("p1", "V1");
root2.commit();
root1.getTree("/").addChild("child");
root1.rebase();
root2.getTree("/").addChild("child");
checkEqual(root1.getTree("/"), (root2.getTree("/")));
}
@Test
public void rebaseWithRemoveNode() throws CommitFailedException {
Root root1 = session.getLatestRoot();
Root root2 = session.getLatestRoot();
checkEqual(root1.getTree("/"), root2.getTree("/"));
root2.getTree("/").addChild("one").addChild("two").addChild("three")
.setProperty("p1", "V1");
root2.commit();
root1.getTree("/").getChild("x").remove();
root1.rebase();
root2.getTree("/").getChild("x").remove();
checkEqual(root1.getTree("/"), (root2.getTree("/")));
}
@Test
public void rebaseWithAddProperty() throws CommitFailedException {
Root root1 = session.getLatestRoot();
Root root2 = session.getLatestRoot();
checkEqual(root1.getTree("/"), root2.getTree("/"));
root2.getTree("/").addChild("one").addChild("two").addChild("three")
.setProperty("p1", "V1");
root2.commit();
root1.getTree("/").setProperty("new", 42);
root1.rebase();
root2.getTree("/").setProperty("new", 42);
checkEqual(root1.getTree("/"), (root2.getTree("/")));
}
@Test
public void rebaseWithRemoveProperty() throws CommitFailedException {
Root root1 = session.getLatestRoot();
Root root2 = session.getLatestRoot();
checkEqual(root1.getTree("/"), root2.getTree("/"));
root2.getTree("/").addChild("one").addChild("two").addChild("three")
.setProperty("p1", "V1");
root2.commit();
root1.getTree("/").removeProperty("a");
root1.rebase();
root2.getTree("/").removeProperty("a");
checkEqual(root1.getTree("/"), (root2.getTree("/")));
}
@Test
public void rebaseWithSetProperty() throws CommitFailedException {
Root root1 = session.getLatestRoot();
Root root2 = session.getLatestRoot();
checkEqual(root1.getTree("/"), root2.getTree("/"));
root2.getTree("/").addChild("one").addChild("two").addChild("three")
.setProperty("p1", "V1");
root2.commit();
root1.getTree("/").setProperty("a", 42);
root1.rebase();
root2.getTree("/").setProperty("a", 42);
checkEqual(root1.getTree("/"), (root2.getTree("/")));
}
@Test
public void rebaseWithMove() throws CommitFailedException {
Root root1 = session.getLatestRoot();
Root root2 = session.getLatestRoot();
checkEqual(root1.getTree("/"), root2.getTree("/"));
root2.getTree("/").addChild("one").addChild("two").addChild("three")
.setProperty("p1", "V1");
root2.commit();
root1.move("/x", "/y/x-moved");
root1.rebase();
root2.move("/x", "/y/x-moved");
checkEqual(root1.getTree("/"), (root2.getTree("/")));
}
@Test
public void oak962() throws CommitFailedException {
Root root = session.getLatestRoot();
Tree r = root.getTree("/").addChild("root");
r.addChild("N3");
r.addChild("N6");
r.getChild("N6").addChild("N7");
root.commit();
root.move("/root/N6/N7", "/root/N3/N12");
r.getChild("N3").getChild("N12").remove();
r.getChild("N6").remove();
root.commit();
}
private static void checkEqual(Tree tree1, Tree tree2) {
assertEquals(tree1.getChildrenCount(Long.MAX_VALUE), tree2.getChildrenCount(Long.MAX_VALUE));
assertEquals(tree1.getPropertyCount(), tree2.getPropertyCount());
for (PropertyState property1 : tree1.getProperties()) {
assertEquals(property1, tree2.getProperty(property1.getName()));
}
for (Tree child1 : tree1.getChildren()) {
checkEqual(child1, tree2.getChild(child1.getName()));
}
}
}