blob: d01c4f02b1b7b789083acb80e86a21ec24ac2915 [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.spi.observation;
import org.junit.Test;
import static com.google.common.collect.ImmutableSet.of;
import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
public class ChangeSetBuilderTest {
@Test
public void basicMerge() throws Exception{
ChangeSetBuilder cb1 = new ChangeSetBuilder(5, 2);
add(cb1, "1");
ChangeSetBuilder cb2 = new ChangeSetBuilder(5, 2);
add(cb2, "2");
ChangeSet cs = cb1.add(cb2.build()).build();
assertThat(cs.getAllNodeTypes(), containsInAnyOrder("nt-1", "nt-2"));
assertThat(cs.getParentPaths(), containsInAnyOrder("p-1", "p-2"));
assertThat(cs.getParentNodeNames(), containsInAnyOrder("nn-1", "nn-2"));
assertThat(cs.getParentNodeTypes(), containsInAnyOrder("pnt-1", "pnt-2"));
assertThat(cs.getPropertyNames(), containsInAnyOrder("pn-1", "pn-2"));
}
@Test
public void addedChangeSetAlreadyOverflown() throws Exception{
ChangeSetBuilder cb1 = new ChangeSetBuilder(5, 2);
add(cb1, "1");
ChangeSet cs1 = new ChangeSet(2, null, of("nn-2"), of("nt-2"), of("pn-2"), of("nt-2"));
ChangeSet mcs1 = cb1.add(cs1).build();
assertNull(mcs1.getParentPaths());
assertThat(mcs1.getAllNodeTypes(), containsInAnyOrder("nt-1", "nt-2"));
}
@Test
public void overflowPath() throws Exception{
ChangeSetBuilder cb1 = new ChangeSetBuilder(2, 2);
add(cb1, "1");
ChangeSet cs1 = new ChangeSet(2, null, of("nn-2"), of("pnt-2"), of("pn-2"), of("nt-2"));
ChangeSet cs = cb1.add(cs1).build();
assertNull(cs.getParentPaths());
assertThat(cs.getAllNodeTypes(), containsInAnyOrder("nt-1", "nt-2"));
assertThat(cs.getParentNodeNames(), containsInAnyOrder("nn-1", "nn-2"));
assertThat(cs.getParentNodeTypes(), containsInAnyOrder("pnt-1", "pnt-2"));
assertThat(cs.getPropertyNames(), containsInAnyOrder("pn-1", "pn-2"));
ChangeSet cs2 = new ChangeSet(2, of("p-2", "p-3"), of("nn-2"), of("pnt-2"), of("pn-2"), of("nt-2"));
cs = cb1.add(cs2).build();
assertNull(cs.getParentPaths());
}
@Test
public void overflowParentNodeName() throws Exception{
ChangeSetBuilder cb1 = new ChangeSetBuilder(2, 2);
add(cb1, "1");
ChangeSet cs1 = new ChangeSet(2, of("p-2"), null, of("pnt-2"), of("pn-2"), of("nt-2"));
ChangeSet cs = cb1.add(cs1).build();
assertNull(cs.getParentNodeNames());
assertThat(cs.getAllNodeTypes(), containsInAnyOrder("nt-1", "nt-2"));
assertThat(cs.getParentNodeTypes(), containsInAnyOrder("pnt-1", "pnt-2"));
assertThat(cs.getPropertyNames(), containsInAnyOrder("pn-1", "pn-2"));
ChangeSet cs2 = new ChangeSet(2, of("p-2"), of("nn-2", "nn-3"), of("pnt-2"), of("pn-2"), of("nt-2"));
cs = cb1.add(cs2).build();
assertNull(cs.getParentNodeNames());
}
@Test
public void overflowParentNodeTypes() throws Exception{
ChangeSetBuilder cb1 = new ChangeSetBuilder(2, 2);
add(cb1, "1");
ChangeSet cs1 = new ChangeSet(2, of("p-2"), of("nn-2"), null, of("pn-2"), of("nt-2"));
ChangeSet cs = cb1.add(cs1).build();
assertNull(cs.getParentNodeTypes());
assertThat(cs.getParentPaths(), containsInAnyOrder("p-1", "p-2"));
assertThat(cs.getAllNodeTypes(), containsInAnyOrder("nt-1", "nt-2"));
assertThat(cs.getParentNodeNames(), containsInAnyOrder("nn-1", "nn-2"));
assertThat(cs.getPropertyNames(), containsInAnyOrder("pn-1", "pn-2"));
}
@Test
public void overflowPropertyNames() throws Exception{
ChangeSetBuilder cb1 = new ChangeSetBuilder(2, 2);
add(cb1, "1");
ChangeSet cs1 = new ChangeSet(2, of("p-2"), of("nn-2"), of("pnt-2"), null, of("nt-2"));
ChangeSet cs = cb1.add(cs1).build();
assertNull(cs.getPropertyNames());
assertThat(cs.getParentPaths(), containsInAnyOrder("p-1", "p-2"));
assertThat(cs.getAllNodeTypes(), containsInAnyOrder("nt-1", "nt-2"));
assertThat(cs.getParentNodeNames(), containsInAnyOrder("nn-1", "nn-2"));
assertThat(cs.getParentNodeTypes(), containsInAnyOrder("pnt-1", "pnt-2"));
}
@Test
public void overflowAllNodeTypes() throws Exception{
ChangeSetBuilder cb1 = new ChangeSetBuilder(2, 2);
add(cb1, "1");
ChangeSet cs1 = new ChangeSet(2, of("p-2"), of("nn-2"), of("pnt-2"), of("pn-2"), null);
ChangeSet cs = cb1.add(cs1).build();
assertNull(cs.getAllNodeTypes());
assertThat(cs.getParentPaths(), containsInAnyOrder("p-1", "p-2"));
assertThat(cs.getParentNodeNames(), containsInAnyOrder("nn-1", "nn-2"));
assertThat(cs.getParentNodeTypes(), containsInAnyOrder("pnt-1", "pnt-2"));
assertThat(cs.getPropertyNames(), containsInAnyOrder("pn-1", "pn-2"));
}
@Test
public void pathDepth() throws Exception{
ChangeSetBuilder cb = new ChangeSetBuilder(10, 2);
cb.addParentPath("/a/b");
cb.addParentPath("/x");
cb.addParentPath("/p/q/r");
ChangeSet cs = cb.build();
assertThat(cs.getParentPaths(), containsInAnyOrder("/a/b", "/x", "/p/q"));
}
@Test
public void changeSetDepthMoreThanBuilder() throws Exception{
ChangeSetBuilder cb1 = new ChangeSetBuilder(10, 3);
cb1.addParentPath("/x");
cb1.addParentPath("/x/y");
cb1.addParentPath("/x/y/z");
ChangeSetBuilder cb2 = new ChangeSetBuilder(10, 8);
cb2.addParentPath("/p");
cb2.addParentPath("/p/q");
cb2.addParentPath("/p/q/r");
cb2.addParentPath("/a/b/c/d");
cb2.addParentPath("/a/b/x/y/z");
cb1.add(cb2.build());
ChangeSet cs = cb1.build();
assertThat(cs.getParentPaths(), containsInAnyOrder(
"/x", "/x/y", "/x/y/z",
"/p", "/p/q", "/p/q/r",
"/a/b/c", "/a/b/x" //Chopped paths
));
assertEquals(cb1.getMaxPrefilterPathDepth(), cs.getMaxPrefilterPathDepth());
}
@Test
public void builderDepthMoreThanChangeSet() throws Exception{
ChangeSetBuilder cb1 = new ChangeSetBuilder(10, 8);
cb1.addParentPath("/p");
cb1.addParentPath("/p/q");
cb1.addParentPath("/p/q/r");
cb1.addParentPath("/a/b/c/d");
cb1.addParentPath("/a/b/x/y/z");
ChangeSetBuilder cb2 = new ChangeSetBuilder(10, 2);
cb2.addParentPath("/x");
cb2.addParentPath("/x/y");
cb1.add(cb2.build());
ChangeSet cs = cb1.build();
assertThat(cs.getParentPaths(), containsInAnyOrder(
"/x", "/x/y",
"/p", "/p/q",
"/a/b" //Chopped paths
));
assertEquals(cb2.getMaxPrefilterPathDepth(), cs.getMaxPrefilterPathDepth());
}
@Test
public void nullChangeSet() throws Exception{
ChangeSetBuilder cb1 = new ChangeSetBuilder(10, 8);
add(cb1, "1");
cb1.add(null);
ChangeSet cs = cb1.build();
assertNull(cs.getParentNodeTypes());
assertNull(cs.getParentNodeNames());
assertNull(cs.getParentPaths());
assertNull(cs.getAllNodeTypes());
assertNull(cs.getPropertyNames());
}
private static void add(ChangeSetBuilder cb, String suffix){
cb.addNodeType("nt-"+suffix)
.addParentPath("p-"+suffix)
.addParentNodeName("nn-"+suffix)
.addParentNodeType("pnt-"+suffix)
.addPropertyName("pn-"+suffix);
}
}