blob: d710610c2c96cbdcd83e3a018420d97e59cf1e73 [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.composite.checks;
import static org.apache.jackrabbit.oak.InitialContentHelper.INITIAL_CONTENT;
import java.io.IOException;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Service;
import org.apache.jackrabbit.JcrConstants;
import org.apache.jackrabbit.oak.api.CommitFailedException;
import org.apache.jackrabbit.oak.api.IllegalRepositoryStateException;
import org.apache.jackrabbit.oak.api.Type;
import org.apache.jackrabbit.oak.composite.MountedNodeStore;
import org.apache.jackrabbit.oak.composite.checks.NodeTypeDefinitionNodeStoreChecker.Context;
import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore;
import org.apache.jackrabbit.oak.plugins.tree.factories.TreeFactory;
import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
import org.apache.jackrabbit.oak.spi.mount.MountInfoProvider;
import org.apache.jackrabbit.oak.spi.mount.Mounts;
import org.apache.jackrabbit.oak.spi.nodetype.NodeTypeConstants;
import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
import org.junit.Test;
/**
* Validates that the <tt>NodeTypeDefinitionNodeStoreChecker</tt> is properly applied
*
* <p>This class does not attempt to exhaustively validate the checks that should be performed, only
* that they are performed when needed.</p>
*
*/
@Component
@Service(MountedNodeStoreChecker.class)
public class NodeTypeDefinitionNodeStoreCheckerTest {
@Test
public void mountWithConsistentDefinition() throws CommitFailedException, IOException {
new Fixture() {
@Override
protected void initMountContent(NodeBuilder builder) {
builder.setProperty(JcrConstants.JCR_PRIMARYTYPE, NodeTypeConstants.NT_REP_ROOT, Type.NAME);
builder.child("first")
.setProperty(JcrConstants.JCR_PRIMARYTYPE, NodeTypeConstants.NT_UNSTRUCTURED, Type.NAME);
}
}.run();
}
@Test(expected = IllegalRepositoryStateException.class)
public void mountWithInconsistentDefinition() throws CommitFailedException {
new Fixture() {
@Override
protected void initMountContent(NodeBuilder builder) {
builder.setProperty(JcrConstants.JCR_PRIMARYTYPE, "nt:missing", Type.NAME);
}
}.run();
}
@Test(expected = IllegalRepositoryStateException.class)
public void addingDefaultPrimaryTypeFails() throws CommitFailedException {
new Fixture() {
@Override
protected void initMountContent(NodeBuilder builder) {
builder.setProperty(JcrConstants.JCR_PRIMARYTYPE, "nt:missing", Type.NAME);
// missing primary type - would try to add default one, which fails due to the NodeBuilder
// being read-only
builder.child("first");
}
}.run();
}
@Test
public void mountWithDefinitionButHiddenNodes() throws CommitFailedException {
new Fixture() {
@Override
protected void initMountContent(NodeBuilder builder) {
builder.setProperty(JcrConstants.JCR_PRIMARYTYPE, NodeTypeConstants.NT_REP_ROOT, Type.NAME);
// if visible would try to add a default node type - which would fail
builder.child(":hidden").setProperty("foo", "bar");
}
}.run();
}
static abstract class Fixture {
public void run() throws CommitFailedException {
MemoryNodeStore root = new MemoryNodeStore(INITIAL_CONTENT);
MemoryNodeStore mount = new MemoryNodeStore();
NodeBuilder mountBuilder = mount.getRoot().builder();
initMountContent(mountBuilder);
mount.merge(mountBuilder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
MountInfoProvider mip = Mounts.newBuilder()
.readOnlyMount("first", "/first")
.build();
NodeTypeDefinitionNodeStoreChecker checker = new NodeTypeDefinitionNodeStoreChecker();
Context context = checker.createContext(root, mip);
ErrorHolder errorHolder = new ErrorHolder();
checker.check(new MountedNodeStore(mip.getMountByName("first"), mount), TreeFactory.createReadOnlyTree(mount.getRoot()), errorHolder, context);
errorHolder.end();
}
protected abstract void initMountContent(NodeBuilder builder);
}
}