You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by to...@apache.org on 2017/04/28 07:16:15 UTC
svn commit: r1792993 [7/9] - in /jackrabbit/oak/branches/1.0/oak-upgrade: ./
src/main/java/org/apache/jackrabbit/core/
src/main/java/org/apache/jackrabbit/oak/plugins/
src/main/java/org/apache/jackrabbit/oak/plugins/document/
src/main/java/org/apache/j...
Modified: jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.java?rev=1792993&r1=1792992&r2=1792993&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.java (original)
+++ jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.java Fri Apr 28 07:16:13 2017
@@ -18,62 +18,19 @@
*/
package org.apache.jackrabbit.oak.upgrade;
-import static com.google.common.collect.Sets.newHashSet;
-import static java.util.Arrays.asList;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.assertTrue;
-import static org.apache.jackrabbit.JcrConstants.JCR_FROZENMIXINTYPES;
-import static org.apache.jackrabbit.JcrConstants.JCR_FROZENPRIMARYTYPE;
-import static org.apache.jackrabbit.JcrConstants.JCR_FROZENUUID;
-import static org.apache.jackrabbit.JcrConstants.JCR_UUID;
-import static org.apache.jackrabbit.JcrConstants.MIX_VERSIONABLE;
-import static org.apache.jackrabbit.JcrConstants.NT_UNSTRUCTURED;
-import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_ADD_CHILD_NODES;
-import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_ALL;
-import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_LIFECYCLE_MANAGEMENT;
-import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_LOCK_MANAGEMENT;
-import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_MODIFY_ACCESS_CONTROL;
-import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_MODIFY_PROPERTIES;
-import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_NAMESPACE_MANAGEMENT;
-import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_NODE_TYPE_DEFINITION_MANAGEMENT;
-import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_NODE_TYPE_MANAGEMENT;
-import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_READ;
-import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_READ_ACCESS_CONTROL;
-import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_REMOVE_CHILD_NODES;
-import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_REMOVE_NODE;
-import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_RETENTION_MANAGEMENT;
-import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_VERSION_MANAGEMENT;
-import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_WORKSPACE_MANAGEMENT;
-import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_WRITE;
-import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.REP_ADD_PROPERTIES;
-import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.REP_ALTER_PROPERTIES;
-import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.REP_INDEX_DEFINITION_MANAGEMENT;
-import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.REP_PRIVILEGE_MANAGEMENT;
-import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.REP_READ_NODES;
-import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.REP_READ_PROPERTIES;
-import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.REP_REMOVE_PROPERTIES;
-import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.REP_USER_MANAGEMENT;
-import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.REP_WRITE;
-
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.math.BigDecimal;
-import java.util.Arrays;
import java.util.Calendar;
-import java.util.List;
-import java.util.Map;
import java.util.Random;
import java.util.Set;
-
import javax.jcr.Binary;
import javax.jcr.NamespaceRegistry;
import javax.jcr.Node;
+import javax.jcr.NodeIterator;
import javax.jcr.Property;
import javax.jcr.PropertyIterator;
import javax.jcr.PropertyType;
-import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.Value;
@@ -82,19 +39,27 @@ import javax.jcr.nodetype.NodeTypeManage
import javax.jcr.nodetype.NodeTypeTemplate;
import javax.jcr.nodetype.PropertyDefinition;
import javax.jcr.nodetype.PropertyDefinitionTemplate;
-import javax.jcr.security.Privilege;
import javax.jcr.version.Version;
import javax.jcr.version.VersionHistory;
import javax.jcr.version.VersionManager;
-import com.google.common.collect.Maps;
-import org.apache.jackrabbit.api.JackrabbitSession;
+import com.google.common.collect.Sets;
import org.apache.jackrabbit.api.JackrabbitWorkspace;
-import org.apache.jackrabbit.api.security.authorization.PrivilegeManager;
import org.apache.jackrabbit.oak.plugins.index.IndexConstants;
import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
import org.junit.Test;
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertNotNull;
+import static junit.framework.Assert.assertTrue;
+import static org.apache.jackrabbit.JcrConstants.JCR_FROZENMIXINTYPES;
+import static org.apache.jackrabbit.JcrConstants.JCR_FROZENPRIMARYTYPE;
+import static org.apache.jackrabbit.JcrConstants.JCR_FROZENUUID;
+import static org.apache.jackrabbit.JcrConstants.JCR_UUID;
+import static org.apache.jackrabbit.JcrConstants.MIX_VERSIONABLE;
+import static org.apache.jackrabbit.JcrConstants.NT_UNSTRUCTURED;
+
public class RepositoryUpgradeTest extends AbstractRepositoryUpgradeTest {
private static final Calendar DATE = Calendar.getInstance();
@@ -107,97 +72,89 @@ public class RepositoryUpgradeTest exten
@Override
@SuppressWarnings("unchecked")
- protected void createSourceContent(Repository repository) throws Exception {
- Session session = repository.login(CREDENTIALS);
- try {
- JackrabbitWorkspace workspace =
- (JackrabbitWorkspace) session.getWorkspace();
+ protected void createSourceContent(Session session) throws Exception {
+ JackrabbitWorkspace workspace = (JackrabbitWorkspace) session.getWorkspace();
- NamespaceRegistry registry = workspace.getNamespaceRegistry();
- registry.registerNamespace("test", "http://www.example.org/");
+ NamespaceRegistry registry = workspace.getNamespaceRegistry();
+ registry.registerNamespace("test", "http://www.example.org/");
- PrivilegeManager privilegeManager = workspace.getPrivilegeManager();
- privilegeManager.registerPrivilege("test:privilege", false, null);
- privilegeManager.registerPrivilege(
- "test:aggregate", false, new String[] { "jcr:read", "test:privilege" });
-
- NodeTypeManager nodeTypeManager = workspace.getNodeTypeManager();
- NodeTypeTemplate template = nodeTypeManager.createNodeTypeTemplate();
- template.setName("test:unstructured");
- template.setDeclaredSuperTypeNames(
- new String[] {"nt:unstructured"});
- PropertyDefinitionTemplate pDef1 = nodeTypeManager.createPropertyDefinitionTemplate();
- pDef1.setName("defaultString");
- pDef1.setRequiredType(PropertyType.STRING);
- Value stringValue = session.getValueFactory().createValue("stringValue");
- pDef1.setDefaultValues(new Value[] {stringValue});
- template.getPropertyDefinitionTemplates().add(pDef1);
-
- PropertyDefinitionTemplate pDef2 = nodeTypeManager.createPropertyDefinitionTemplate();
- pDef2.setName("defaultPath");
- pDef2.setRequiredType(PropertyType.PATH);
- Value pathValue = session.getValueFactory().createValue("/jcr:path/nt:value", PropertyType.PATH);
- pDef2.setDefaultValues(new Value[] {pathValue});
- template.getPropertyDefinitionTemplates().add(pDef2);
-
- nodeTypeManager.registerNodeType(template, false);
-
- template = nodeTypeManager.createNodeTypeTemplate();
- template.setName("test:referenceable");
- template.setDeclaredSuperTypeNames(
- new String[] {"nt:unstructured", "mix:referenceable"});
- nodeTypeManager.registerNodeType(template, false);
-
- Node root = session.getRootNode();
-
- Node referenceable =
- root.addNode("referenceable", "test:unstructured");
- referenceable.addMixin(NodeType.MIX_REFERENCEABLE);
- Node versionable = root.addNode("versionable", NT_UNSTRUCTURED);
- versionable.addMixin(MIX_VERSIONABLE);
- Node child = versionable.addNode("child", "test:referenceable");
- child.addNode("child2", NT_UNSTRUCTURED);
- session.save();
-
- session.getWorkspace().getVersionManager().checkin("/versionable");
-
- Node properties = root.addNode("properties", "test:unstructured");
- properties.setProperty("boolean", true);
- Binary binary = session.getValueFactory().createBinary(
- new ByteArrayInputStream(BINARY));
- try {
- properties.setProperty("binary", binary);
- } finally {
- binary.dispose();
- }
- properties.setProperty("date", DATE);
- properties.setProperty("decimal", new BigDecimal(123));
- properties.setProperty("double", Math.PI);
- properties.setProperty("long", 9876543210L);
- properties.setProperty("reference", referenceable);
- properties.setProperty("weak_reference", session.getValueFactory().createValue(referenceable, true));
- properties.setProperty("mv_reference", new Value[]{session.getValueFactory().createValue(versionable, false)});
- properties.setProperty("mv_weak_reference", new Value[]{session.getValueFactory().createValue(versionable, true)});
- properties.setProperty("string", "test");
- properties.setProperty("multiple", "a,b,c".split(","));
- session.save();
+ NodeTypeManager nodeTypeManager = workspace.getNodeTypeManager();
+ NodeTypeTemplate template = nodeTypeManager.createNodeTypeTemplate();
+ template.setName("test:unstructured");
+ template.setDeclaredSuperTypeNames(new String[] { "nt:unstructured" });
+ PropertyDefinitionTemplate pDef1 = nodeTypeManager.createPropertyDefinitionTemplate();
+ pDef1.setName("defaultString");
+ pDef1.setRequiredType(PropertyType.STRING);
+ Value stringValue = session.getValueFactory().createValue("stringValue");
+ pDef1.setDefaultValues(new Value[] { stringValue });
+ template.getPropertyDefinitionTemplates().add(pDef1);
+
+ PropertyDefinitionTemplate pDef2 = nodeTypeManager.createPropertyDefinitionTemplate();
+ pDef2.setName("defaultPath");
+ pDef2.setRequiredType(PropertyType.PATH);
+ Value pathValue = session.getValueFactory().createValue("/jcr:path/nt:value", PropertyType.PATH);
+ pDef2.setDefaultValues(new Value[] { pathValue });
+ template.getPropertyDefinitionTemplates().add(pDef2);
+
+ nodeTypeManager.registerNodeType(template, false);
+
+ template = nodeTypeManager.createNodeTypeTemplate();
+ template.setName("test:referenceable");
+ template.setDeclaredSuperTypeNames(new String[] { "nt:unstructured", "mix:referenceable" });
+ nodeTypeManager.registerNodeType(template, false);
+
+ Node root = session.getRootNode();
+
+ Node referenceable = root.addNode("referenceable", "test:unstructured");
+ referenceable.addMixin(NodeType.MIX_REFERENCEABLE);
+ Node versionable = root.addNode("versionable", NT_UNSTRUCTURED);
+ versionable.addMixin(MIX_VERSIONABLE);
+ Node child = versionable.addNode("child", "test:referenceable");
+ child.addNode("child2", NT_UNSTRUCTURED);
+ session.save();
+
+ Node sns = root.addNode("sns");
+ sns.addNode("sibling");
+ sns.addNode("sibling");
+ sns.addNode("sibling");
+
+ session.getWorkspace().getVersionManager().checkin("/versionable");
+
+ Node properties = root.addNode("properties", "test:unstructured");
+ properties.setProperty("boolean", true);
+ Binary binary = session.getValueFactory().createBinary(new ByteArrayInputStream(BINARY));
+ try {
+ properties.setProperty("binary", binary);
+ } finally {
+ binary.dispose();
+ }
+ properties.setProperty("date", DATE);
+ properties.setProperty("decimal", new BigDecimal(123));
+ properties.setProperty("double", Math.PI);
+ properties.setProperty("long", 9876543210L);
+ properties.setProperty("reference", referenceable);
+ properties.setProperty("weak_reference", session.getValueFactory().createValue(referenceable, true));
+ properties.setProperty("mv_reference",
+ new Value[] { session.getValueFactory().createValue(versionable, false) });
+ properties.setProperty("mv_weak_reference",
+ new Value[] { session.getValueFactory().createValue(versionable, true) });
+ properties.setProperty("string", "test");
+ properties.setProperty("multiple", "a,b,c".split(","));
+ session.save();
- binary = properties.getProperty("binary").getBinary();
+ binary = properties.getProperty("binary").getBinary();
+ try {
+ InputStream stream = binary.getStream();
try {
- InputStream stream = binary.getStream();
- try {
- for (byte aBINARY : BINARY) {
- assertEquals(aBINARY, (byte) stream.read());
- }
- assertEquals(-1, stream.read());
- } finally {
- stream.close();
+ for (byte aBINARY : BINARY) {
+ assertEquals(aBINARY, (byte) stream.read());
}
+ assertEquals(-1, stream.read());
} finally {
- binary.dispose();
+ stream.close();
}
} finally {
- session.logout();
+ binary.dispose();
}
}
@@ -214,108 +171,6 @@ public class RepositoryUpgradeTest exten
}
@Test
- public void verifyPrivileges() throws RepositoryException {
- Set<String> nonAggregatePrivileges = newHashSet(
- REP_READ_NODES, REP_READ_PROPERTIES, REP_ADD_PROPERTIES, REP_ALTER_PROPERTIES,
- REP_REMOVE_PROPERTIES, JCR_ADD_CHILD_NODES, JCR_REMOVE_CHILD_NODES, JCR_REMOVE_NODE,
- JCR_READ_ACCESS_CONTROL, JCR_MODIFY_ACCESS_CONTROL, JCR_NODE_TYPE_MANAGEMENT,
- JCR_VERSION_MANAGEMENT, JCR_LOCK_MANAGEMENT, JCR_LIFECYCLE_MANAGEMENT,
- JCR_RETENTION_MANAGEMENT, JCR_WORKSPACE_MANAGEMENT, JCR_NODE_TYPE_DEFINITION_MANAGEMENT,
- JCR_NAMESPACE_MANAGEMENT, REP_PRIVILEGE_MANAGEMENT, REP_USER_MANAGEMENT,
- REP_INDEX_DEFINITION_MANAGEMENT);
-
- Map<String, String[]> aggregatePrivileges = Maps.newHashMap();
- aggregatePrivileges.put(JCR_READ,
- new String[] {REP_READ_NODES, REP_READ_PROPERTIES});
- aggregatePrivileges.put(JCR_MODIFY_PROPERTIES,
- new String[] {REP_ADD_PROPERTIES, REP_ALTER_PROPERTIES, REP_REMOVE_PROPERTIES});
- aggregatePrivileges.put(JCR_WRITE,
- new String[] {JCR_MODIFY_PROPERTIES, REP_ADD_PROPERTIES, REP_ALTER_PROPERTIES,
- REP_REMOVE_PROPERTIES, JCR_ADD_CHILD_NODES, JCR_REMOVE_CHILD_NODES,
- JCR_REMOVE_NODE});
- aggregatePrivileges.put(REP_WRITE,
- new String[] {JCR_WRITE, JCR_MODIFY_PROPERTIES, REP_ADD_PROPERTIES,
- REP_ALTER_PROPERTIES, REP_REMOVE_PROPERTIES, JCR_ADD_CHILD_NODES,
- JCR_REMOVE_CHILD_NODES, JCR_REMOVE_NODE, JCR_NODE_TYPE_MANAGEMENT});
- aggregatePrivileges.put(JCR_ALL,
- new String[] {REP_READ_NODES, REP_READ_PROPERTIES, REP_ADD_PROPERTIES, REP_ALTER_PROPERTIES,
- REP_REMOVE_PROPERTIES, JCR_ADD_CHILD_NODES, JCR_REMOVE_CHILD_NODES, JCR_REMOVE_NODE,
- JCR_READ_ACCESS_CONTROL, JCR_MODIFY_ACCESS_CONTROL, JCR_NODE_TYPE_MANAGEMENT,
- JCR_VERSION_MANAGEMENT, JCR_LOCK_MANAGEMENT, JCR_LIFECYCLE_MANAGEMENT,
- JCR_RETENTION_MANAGEMENT, JCR_WORKSPACE_MANAGEMENT, JCR_NODE_TYPE_DEFINITION_MANAGEMENT,
- JCR_NAMESPACE_MANAGEMENT, REP_PRIVILEGE_MANAGEMENT, REP_USER_MANAGEMENT,
- REP_INDEX_DEFINITION_MANAGEMENT, JCR_READ, JCR_MODIFY_PROPERTIES, JCR_WRITE, REP_WRITE,
- "test:privilege", "test:aggregate"});
-
- JackrabbitSession session = createAdminSession();
- try {
- JackrabbitWorkspace workspace = (JackrabbitWorkspace) session.getWorkspace();
- PrivilegeManager manager = workspace.getPrivilegeManager();
- Privilege[] privileges = manager.getRegisteredPrivileges();
-
- for (Privilege privilege : privileges) {
- if (privilege.isAggregate()) {
- String[] expected = aggregatePrivileges.remove(privilege.getName());
- if (expected != null) {
- String[] actual = getNames(privilege.getAggregatePrivileges());
- assertTrue("Miss match in aggregate privilege " + privilege.getName() +
- " expected " + Arrays.toString(expected) +
- " actual " + Arrays.toString(actual),
- newHashSet(expected).equals(newHashSet(actual)));
- }
- } else {
- nonAggregatePrivileges.remove(privilege.getName());
- }
- }
-
- assertTrue("Missing non aggregate privileges: " + nonAggregatePrivileges,
- nonAggregatePrivileges.isEmpty());
- assertTrue("Missing aggregate privileges: " + aggregatePrivileges.keySet(),
- aggregatePrivileges.isEmpty());
- }
- finally {
- session.logout();
- }
- }
-
- private static String[] getNames(Privilege[] privileges) {
- String[] names = new String[privileges.length];
- for (int i = 0; i < privileges.length; i++) {
- names[i] = privileges[i].getName();
- }
- return names;
- }
-
- @Test
- public void verifyCustomPrivileges() throws Exception {
- JackrabbitSession session = createAdminSession();
- try {
- JackrabbitWorkspace workspace =
- (JackrabbitWorkspace) session.getWorkspace();
- PrivilegeManager manager = workspace.getPrivilegeManager();
-
- Privilege privilege = manager.getPrivilege("test:privilege");
- assertNotNull(privilege);
- assertFalse(privilege.isAbstract());
- assertFalse(privilege.isAggregate());
- assertEquals(0, privilege.getDeclaredAggregatePrivileges().length);
-
- Privilege aggregate = manager.getPrivilege("test:aggregate");
- assertNotNull(aggregate);
- assertFalse(aggregate.isAbstract());
- assertTrue(aggregate.isAggregate());
- assertEquals(2, aggregate.getDeclaredAggregatePrivileges().length);
-
- Privilege jcrAll = manager.getPrivilege("jcr:all");
- List<Privilege> privileges = asList(jcrAll.getAggregatePrivileges());
- assertTrue(privileges.contains(privilege));
- assertTrue(privileges.contains(aggregate));
- } finally {
- session.logout();
- }
- }
-
- @Test
public void verifyCustomNodeTypes() throws Exception {
Session session = createAdminSession();
try {
@@ -546,11 +401,31 @@ public class RepositoryUpgradeTest exten
frozenChild2.getProperty(JCR_FROZENUUID).getString());
VersionHistory history = manager.getVersionHistory("/versionable");
+ assertTrue(history.isNodeType("rep:VersionablePaths"));
Property versionablePath = history.getProperty("default");
assertEquals("/versionable", versionablePath.getString());
} finally {
session.logout();
}
+ }
+
+ @Test
+ public void verifySNS() throws RepositoryException {
+ Set<String> nodeNames = Sets.newHashSet("sibling", "sibling[2]", "sibling[3]");
+ Session session = createAdminSession();
+ try {
+ Node sns = session.getNode("/sns");
+ NodeIterator ns = sns.getNodes();
+ int c = 0;
+ while (ns.hasNext()) {
+ Node node = ns.nextNode();
+ String name = node.getName();
+ assertTrue("Unexpected node: " + name, nodeNames.remove(name));
+ }
+ assertTrue("Missing nodes: " + nodeNames, nodeNames.isEmpty());
+ } finally {
+ session.logout();
+ }
}
}
Added: jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/SameNodeSiblingsTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/SameNodeSiblingsTest.java?rev=1792993&view=auto
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/SameNodeSiblingsTest.java (added)
+++ jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/SameNodeSiblingsTest.java Fri Apr 28 07:16:13 2017
@@ -0,0 +1,167 @@
+/*
+ * 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.upgrade;
+
+import static com.google.common.collect.ImmutableSet.of;
+import static com.google.common.collect.Sets.newHashSet;
+import static org.junit.Assert.assertEquals;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Set;
+
+import javax.jcr.Credentials;
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.jackrabbit.core.RepositoryContext;
+import org.apache.jackrabbit.core.RepositoryImpl;
+import org.apache.jackrabbit.core.config.RepositoryConfig;
+import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStore;
+import org.apache.jackrabbit.oak.plugins.document.DocumentMK;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class SameNodeSiblingsTest {
+
+ public static final Credentials CREDENTIALS = new SimpleCredentials("admin", "admin".toCharArray());
+
+ private File crx2RepoDir;
+
+ @Before
+ public void createCrx2RepoDir() throws IOException {
+ crx2RepoDir = Files.createTempDirectory(Paths.get("target"), "repo-crx2").toFile();
+ }
+
+ @After
+ public void deleteCrx2RepoDir() {
+ FileUtils.deleteQuietly(crx2RepoDir);
+ }
+
+ @Test
+ public void snsShouldBeRenamed() throws RepositoryException, IOException {
+ DocumentNodeStore nodeStore = migrate(new SourceDataCreator() {
+ @Override
+ public void create(Session session) throws RepositoryException {
+ Node parent = session.getRootNode().addNode("parent");
+ parent.addNode("child", "nt:folder");
+ parent.addNode("child", "nt:folder");
+ parent.addNode("child", "nt:folder");
+ parent.addNode("something_else", "nt:folder");
+ session.save();
+
+ parent.setPrimaryType("nt:folder"); // change parent type to
+ // something that doesn't
+ // allow SNS
+ session.save();
+ }
+ });
+ try {
+ NodeState parent = nodeStore.getRoot().getChildNode("parent");
+ Set<String> children = newHashSet(parent.getChildNodeNames());
+ assertEquals(of("child", "child_2_", "child_3_", "something_else"), children);
+ } finally {
+ nodeStore.dispose();
+ }
+ }
+
+ @Test
+ public void snsShouldntBeRenamed() throws RepositoryException, IOException {
+ DocumentNodeStore nodeStore = migrate(new SourceDataCreator() {
+ @Override
+ public void create(Session session) throws RepositoryException {
+ Node parent = session.getRootNode().addNode("parent");
+ parent.addNode("child", "nt:folder");
+ parent.addNode("child", "nt:folder");
+ parent.addNode("child", "nt:folder");
+ parent.addNode("something_else", "nt:folder");
+ session.save();
+ }
+ });
+ try {
+ NodeState parent = nodeStore.getRoot().getChildNode("parent");
+ Set<String> children = newHashSet(parent.getChildNodeNames());
+ assertEquals(of("child", "child[2]", "child[3]", "something_else"), children);
+ } finally {
+ nodeStore.dispose();
+ }
+ }
+
+ @Test
+ public void snsNewNameAlreadyExists() throws RepositoryException, IOException {
+ DocumentNodeStore nodeStore = migrate(new SourceDataCreator() {
+ @Override
+ public void create(Session session) throws RepositoryException {
+ Node parent = session.getRootNode().addNode("parent");
+ parent.addNode("child", "nt:folder");
+ parent.addNode("child", "nt:folder");
+ parent.addNode("child", "nt:folder");
+ parent.addNode("child_2_", "nt:folder");
+ parent.addNode("child_3_", "nt:folder");
+ parent.addNode("child_3_2", "nt:folder");
+ session.save();
+
+ parent.setPrimaryType("nt:folder");
+ session.save();
+ }
+ });
+ try {
+ NodeState parent = nodeStore.getRoot().getChildNode("parent");
+ Set<String> children = newHashSet(parent.getChildNodeNames());
+ assertEquals(of("child", "child_2_", "child_3_", "child_2_2", "child_3_2", "child_3_3"), children);
+ } finally {
+ nodeStore.dispose();
+ }
+ }
+
+ private DocumentNodeStore migrate(SourceDataCreator sourceDataCreator) throws RepositoryException, IOException {
+ RepositoryConfig config = RepositoryConfig.install(crx2RepoDir);
+ RepositoryImpl repository = RepositoryImpl.create(config);
+
+ try {
+ Session session = repository.login(CREDENTIALS);
+ sourceDataCreator.create(session);
+ session.logout();
+ } finally {
+ repository.shutdown();
+ }
+
+ config = RepositoryConfig.install(crx2RepoDir); // re-create the config
+ RepositoryContext context = RepositoryContext.create(config);
+ DocumentNodeStore target = new DocumentMK.Builder().getNodeStore();
+ try {
+ RepositoryUpgrade upgrade = new RepositoryUpgrade(context, target);
+ upgrade.copy(null);
+ } finally {
+ context.getRepository().shutdown();
+ }
+ return target;
+ }
+
+ private static interface SourceDataCreator {
+ void create(Session session) throws RepositoryException;
+ }
+}
Added: jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/UpgradeFromTwoSourcesTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/UpgradeFromTwoSourcesTest.java?rev=1792993&view=auto
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/UpgradeFromTwoSourcesTest.java (added)
+++ jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/UpgradeFromTwoSourcesTest.java Fri Apr 28 07:16:13 2017
@@ -0,0 +1,157 @@
+/*
+ * 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.upgrade;
+
+import org.apache.jackrabbit.commons.JcrUtils;
+import org.apache.jackrabbit.core.RepositoryContext;
+import org.apache.jackrabbit.core.RepositoryImpl;
+import org.apache.jackrabbit.core.config.RepositoryConfig;
+import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStore;
+import org.apache.jackrabbit.oak.plugins.segment.file.FileStore;
+import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * Test case that simulates copying different paths from two source repositories
+ * into a single target repository.
+ */
+public class UpgradeFromTwoSourcesTest extends AbstractRepositoryUpgradeTest {
+
+ private static boolean upgradeComplete;
+ private static FileStore fileStore;
+
+ @Override
+ protected NodeStore createTargetNodeStore() {
+ return new SegmentNodeStore(fileStore);
+ }
+
+ @BeforeClass
+ public static void initialize() {
+ final File dir = new File(getTestDirectory(), "segments");
+ dir.mkdirs();
+ try {
+ fileStore = FileStore.newFileStore(dir).withMaxFileSize(128).create();
+ upgradeComplete = false;
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @AfterClass
+ public static void cleanup() {
+ fileStore.close();
+ fileStore = null;
+ }
+
+ @Before
+ public synchronized void upgradeRepository() throws Exception {
+ if (!upgradeComplete) {
+ final File sourceDir1 = new File(getTestDirectory(), "source1");
+ final File sourceDir2 = new File(getTestDirectory(), "source2");
+
+ sourceDir1.mkdirs();
+ sourceDir2.mkdirs();
+
+ final RepositoryImpl source1 = createSourceRepository(sourceDir1);
+ final RepositoryImpl source2 = createSourceRepository(sourceDir2);
+ final Session session1 = source1.login(CREDENTIALS);
+ final Session session2 = source2.login(CREDENTIALS);
+ try {
+ createSourceContent(session1);
+ createSourceContent2(session2);
+ } finally {
+ session1.save();
+ session2.save();
+ session1.logout();
+ session2.logout();
+ source1.shutdown();
+ source2.shutdown();
+ }
+
+ final NodeStore target = getTargetNodeStore();
+ doUpgradeRepository(sourceDir1, target, "/left");
+ doUpgradeRepository(sourceDir2, target, "/right", "/left/child2", "/left/child3");
+ fileStore.flush();
+ upgradeComplete = true;
+ }
+ }
+
+ private void doUpgradeRepository(File source, NodeStore target, String... includes) throws RepositoryException {
+ final RepositoryConfig config = RepositoryConfig.create(source);
+ final RepositoryContext context = RepositoryContext.create(config);
+ try {
+ final RepositoryUpgrade upgrade = new RepositoryUpgrade(context, target);
+ upgrade.setIncludes(includes);
+ upgrade.copy(null);
+ } finally {
+ context.getRepository().shutdown();
+ }
+ }
+
+ @Override
+ protected void createSourceContent(Session session) throws RepositoryException {
+ JcrUtils.getOrCreateByPath("/left/child1/grandchild1", "nt:unstructured", session);
+ JcrUtils.getOrCreateByPath("/left/child1/grandchild2", "nt:unstructured", session);
+ JcrUtils.getOrCreateByPath("/left/child1/grandchild3", "nt:unstructured", session);
+ JcrUtils.getOrCreateByPath("/left/child2/grandchild1", "nt:unstructured", session);
+ JcrUtils.getOrCreateByPath("/left/child2/grandchild2", "nt:unstructured", session);
+
+ session.save();
+ }
+
+ protected void createSourceContent2(Session session) throws RepositoryException {
+ JcrUtils.getOrCreateByPath("/left/child2/grandchild3", "nt:unstructured", session);
+ JcrUtils.getOrCreateByPath("/left/child2/grandchild2", "nt:unstructured", session);
+ JcrUtils.getOrCreateByPath("/left/child3", "nt:unstructured", session);
+ JcrUtils.getOrCreateByPath("/right/child1/grandchild1", "nt:unstructured", session);
+ JcrUtils.getOrCreateByPath("/right/child1/grandchild2", "nt:unstructured", session);
+
+ session.save();
+ }
+
+ @Test
+ public void shouldContainNodesFromBothSources() throws Exception {
+ assertExisting(
+ "/",
+ "/left",
+ "/left/child1",
+ "/left/child2",
+ "/left/child3",
+ "/left/child1/grandchild1",
+ "/left/child1/grandchild2",
+ "/left/child1/grandchild3",
+ "/left/child2/grandchild2",
+ "/left/child2/grandchild3",
+ "/right",
+ "/right/child1",
+ "/right/child1/grandchild1",
+ "/right/child1/grandchild2"
+ );
+
+ assertMissing(
+ "/left/child2/grandchild1"
+ );
+ }
+}
\ No newline at end of file
Added: jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/UpgradeOldSegmentTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/UpgradeOldSegmentTest.java?rev=1792993&view=auto
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/UpgradeOldSegmentTest.java (added)
+++ jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/UpgradeOldSegmentTest.java Fri Apr 28 07:16:13 2017
@@ -0,0 +1,121 @@
+/*
+ * 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.upgrade;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.InputStream;
+import java.io.StringReader;
+
+import javax.jcr.Node;
+import javax.jcr.Repository;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+import javax.jcr.nodetype.NodeType;
+import javax.jcr.nodetype.NodeTypeManager;
+import javax.jcr.nodetype.PropertyDefinition;
+
+import com.google.common.collect.Iterators;
+import org.apache.commons.io.FileUtils;
+import org.apache.jackrabbit.api.JackrabbitRepository;
+import org.apache.jackrabbit.commons.cnd.CndImporter;
+import org.apache.jackrabbit.oak.jcr.Jcr;
+import org.apache.jackrabbit.oak.upgrade.cli.OakUpgrade;
+import org.apache.jackrabbit.oak.upgrade.cli.Util;
+import org.apache.jackrabbit.oak.upgrade.cli.container.SegmentNodeStoreContainer;
+import org.junit.Test;
+
+public class UpgradeOldSegmentTest {
+
+ @Test
+ public void upgradeFrom10() throws Exception {
+ File testFolder = new File(new File("target"), UpgradeOldSegmentTest.class.getSimpleName());
+ FileUtils.deleteDirectory(testFolder);
+ File oldRepo = new File(testFolder, "test-repo-1.0");
+ oldRepo.mkdirs();
+ InputStream in = UpgradeOldSegmentTest.class.getResourceAsStream("/test-repo-1.0.zip");
+ try {
+ Util.unzip(in, oldRepo);
+ } finally {
+ in.close();
+ }
+
+ SegmentNodeStoreContainer newRepoContainer = new SegmentNodeStoreContainer();
+ OakUpgrade.main(oldRepo.getPath(), newRepoContainer.getDescription());
+
+ Repository repo = new Jcr(newRepoContainer.open()).createRepository();
+ Session s = repo.login(new SimpleCredentials("admin", "admin".toCharArray()));
+
+ Node myType = s.getNode("/jcr:system/jcr:nodeTypes/test:MyType");
+ assertEquals(2, Iterators.size(myType.getNodes("jcr:propertyDefinition")));
+
+ NodeTypeManager ntMgr = s.getWorkspace().getNodeTypeManager();
+ assertTrue(ntMgr.hasNodeType("test:MyType"));
+ NodeType nt = ntMgr.getNodeType("test:MyType");
+ PropertyDefinition[] pDefs = nt.getDeclaredPropertyDefinitions();
+ assertEquals(2, pDefs.length);
+ for (PropertyDefinition pd : pDefs) {
+ String name = pd.getName();
+ if (name.equals("test:mandatory")) {
+ assertTrue(pd.isMandatory());
+ } else if (name.equals("test:optional")) {
+ assertFalse(pd.isMandatory());
+ } else {
+ fail("Unexpected property definition: " + name);
+ }
+ }
+
+ // flip mandatory flag for test:mandatory
+ String cnd = "<'test'='http://www.apache.org/jackrabbit/test'>\n" +
+ "[test:MyType] > nt:unstructured\n" +
+ " - test:mandatory (string)\n" +
+ " - test:optional (string)";
+
+ CndImporter.registerNodeTypes(new StringReader(cnd), s, true);
+
+ myType = s.getNode("/jcr:system/jcr:nodeTypes/test:MyType");
+ assertEquals(2, Iterators.size(myType.getNodes("jcr:propertyDefinition")));
+
+ nt = ntMgr.getNodeType("test:MyType");
+ pDefs = nt.getDeclaredPropertyDefinitions();
+ assertEquals(2, pDefs.length);
+ for (PropertyDefinition pd : pDefs) {
+ String name = pd.getName();
+ if (name.equals("test:mandatory")) {
+ assertFalse(pd.isMandatory());
+ } else if (name.equals("test:optional")) {
+ assertFalse(pd.isMandatory());
+ } else {
+ fail("Unexpected property definition: " + name);
+ }
+ }
+
+ s.logout();
+ if (repo instanceof JackrabbitRepository) {
+ ((JackrabbitRepository) repo).shutdown();
+ }
+ newRepoContainer.close();
+ newRepoContainer.clean();
+ FileUtils.deleteQuietly(testFolder);
+ }
+}
\ No newline at end of file
Modified: jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/blob/LengthCachingDataStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/blob/LengthCachingDataStoreTest.java?rev=1792993&r1=1792992&r2=1792993&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/blob/LengthCachingDataStoreTest.java (original)
+++ jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/blob/LengthCachingDataStoreTest.java Fri Apr 28 07:16:13 2017
@@ -19,6 +19,10 @@
package org.apache.jackrabbit.oak.upgrade.blob;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
@@ -28,7 +32,7 @@ import java.nio.charset.Charset;
import java.util.Properties;
import java.util.Random;
-import com.google.common.io.ByteStreams;
+import com.google.common.io.ByteSource;
import com.google.common.io.Files;
import com.google.common.io.InputSupplier;
import org.apache.jackrabbit.core.data.DataIdentifier;
@@ -39,14 +43,10 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
public class LengthCachingDataStoreTest {
@Rule
- public final TemporaryFolder tempFolder = new TemporaryFolder();
+ public final TemporaryFolder tempFolder = new TemporaryFolder(new File("target"));
@Test
public void mappingFileData() throws Exception {
@@ -106,7 +106,7 @@ public class LengthCachingDataStoreTest
assertEquals(dr, dr2);
assertEquals(dr.getLength(), dr2.getLength());
- assertTrue(ByteStreams.equal(supplier(dr), supplier(dr2)));
+ assertTrue(supplier(dr).contentEquals(supplier(dr2)));
}
@Test
@@ -181,10 +181,10 @@ public class LengthCachingDataStoreTest
return data;
}
- private static InputSupplier<InputStream> supplier(final DataRecord dr) {
- return new InputSupplier<InputStream>() {
+ private static ByteSource supplier(final DataRecord dr) {
+ return new ByteSource() {
@Override
- public InputStream getInput() throws IOException {
+ public InputStream openStream() throws IOException {
try {
return dr.getStream();
} catch (DataStoreException e) {
Added: jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/AbstractOak2OakTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/AbstractOak2OakTest.java?rev=1792993&view=auto
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/AbstractOak2OakTest.java (added)
+++ jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/AbstractOak2OakTest.java Fri Apr 28 07:16:13 2017
@@ -0,0 +1,262 @@
+/*
+ * 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.upgrade.cli;
+
+import static junit.framework.Assert.assertFalse;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Random;
+
+import javax.annotation.Nullable;
+import javax.jcr.Node;
+import javax.jcr.Property;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+import javax.jcr.Value;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Lists;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.jackrabbit.oak.Oak;
+import org.apache.jackrabbit.oak.api.Blob;
+import org.apache.jackrabbit.oak.api.CommitFailedException;
+import org.apache.jackrabbit.oak.commons.IOUtils;
+import org.apache.jackrabbit.oak.jcr.Jcr;
+import org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl;
+import org.apache.jackrabbit.oak.plugins.document.DocumentNodeState;
+import org.apache.jackrabbit.oak.plugins.index.reference.ReferenceIndexProvider;
+import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState;
+import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
+import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.apache.jackrabbit.oak.upgrade.RepositorySidegrade;
+import org.apache.jackrabbit.oak.upgrade.checkpoint.CheckpointRetriever;
+import org.apache.jackrabbit.oak.upgrade.cli.container.NodeStoreContainer;
+import org.apache.jackrabbit.oak.upgrade.cli.container.SegmentNodeStoreContainer;
+import org.apache.jackrabbit.oak.upgrade.cli.parser.CliArgumentException;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Joiner;
+
+public abstract class AbstractOak2OakTest {
+
+ private static final Logger log = LoggerFactory.getLogger(AbstractOak2OakTest.class);
+
+ protected static SegmentNodeStoreContainer testContent;
+
+ private NodeStore destination;
+
+ protected Session session;
+
+ private RepositoryImpl repository;
+
+ protected abstract NodeStoreContainer getSourceContainer();
+
+ protected abstract NodeStoreContainer getDestinationContainer();
+
+ protected abstract String[] getArgs();
+
+ @BeforeClass
+ public static void unpackSegmentRepo() throws IOException {
+ File tempDir = new File("target", "test-segment-store");
+ if (!tempDir.isDirectory()) {
+ Util.unzip(AbstractOak2OakTest.class.getResourceAsStream("/segmentstore.zip"), tempDir);
+ }
+ testContent = new SegmentNodeStoreContainer(tempDir);
+ }
+
+ @Before
+ public void prepare() throws Exception {
+ NodeStore source = getSourceContainer().open();
+ try {
+ initContent(source);
+ } finally {
+ getSourceContainer().close();
+ }
+
+ String[] args = getArgs();
+ log.info("oak2oak {}", Joiner.on(' ').join(args));
+ OakUpgrade.main(args);
+ createSession();
+ }
+
+ protected void createSession() throws RepositoryException, IOException {
+ destination = getDestinationContainer().open();
+ repository = (RepositoryImpl) new Jcr(new Oak(destination).with("oak.sling")).with(new ReferenceIndexProvider()).createRepository();
+ session = repository.login(new SimpleCredentials("admin", "admin".toCharArray()));
+ }
+
+ @After
+ public void clean() throws IOException {
+ try {
+ if (session != null) {
+ session.logout();
+ }
+ if (repository != null) {
+ repository.shutdown();
+ }
+ } finally {
+ IOUtils.closeQuietly(getDestinationContainer());
+ getDestinationContainer().clean();
+ getSourceContainer().clean();
+ }
+ }
+
+ protected void initContent(NodeStore target) throws IOException, RepositoryException, CommitFailedException {
+ NodeStore initialContent = testContent.open();
+ try {
+ RepositorySidegrade sidegrade = new RepositorySidegrade(initialContent, target);
+ sidegrade.copy();
+ } finally {
+ testContent.close();
+ }
+
+ NodeBuilder builder = target.getRoot().builder();
+ builder.setProperty("binary-prop", getRandomBlob(target));
+ builder.setProperty("checkpoint-state", "before");
+ target.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+ target.checkpoint(60000);
+
+ builder.setProperty("checkpoint-state", "after");
+ builder.setProperty("binary-prop", getRandomBlob(target));
+ builder.child(":async").setProperty("test", "123");
+ target.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+ }
+
+ private Blob getRandomBlob(NodeStore target) throws IOException {
+ Random r = new Random();
+ byte[] buff = new byte[512 * 1024];
+ r.nextBytes(buff);
+ return target.createBlob(new ByteArrayInputStream(buff));
+ }
+
+ @Test
+ public void validateMigration() throws RepositoryException, IOException, CliArgumentException {
+ verifyContent(session);
+ verifyBlob(session);
+ if (supportsCheckpointMigration()) {
+ verifyCheckpoint();
+ } else {
+ verifyEmptyAsync();
+ }
+ }
+
+ public static void verifyContent(Session session) throws RepositoryException {
+ Node root = session.getRootNode();
+ assertEquals("rep:root", root.getPrimaryNodeType().getName());
+ assertEquals(1, root.getMixinNodeTypes().length);
+ assertEquals("rep:AccessControllable", root.getMixinNodeTypes()[0].getName());
+ assertEquals("sling:redirect", root.getProperty("sling:resourceType").getString());
+
+ Node allow = session.getNode("/apps");
+ assertEquals("sling:Folder", allow.getProperty("jcr:primaryType").getString());
+ assertEquals("admin", allow.getProperty("jcr:createdBy").getString());
+
+ Node nodeType = session.getNode("/jcr:system/jcr:nodeTypes/sling:OrderedFolder");
+ assertEquals("rep:NodeType", nodeType.getProperty("jcr:primaryType").getString());
+
+ List<String> values = Lists.transform(Arrays.asList(nodeType.getProperty("rep:protectedProperties").getValues()), new Function<Value, String>() {
+ @Nullable
+ @Override
+ public String apply(@Nullable Value input) {
+ try {
+ return input.getString();
+ } catch (RepositoryException e) {
+ return null;
+ }
+ }
+ });
+ assertTrue(values.contains("jcr:mixinTypes"));
+ assertTrue(values.contains("jcr:primaryType"));
+ assertEquals("false", nodeType.getProperty("jcr:isAbstract").getString());
+ }
+
+ public static void verifyBlob(Session session) throws IOException, RepositoryException {
+ Property p = session.getProperty("/sling-logo.png/jcr:content/jcr:data");
+ InputStream is = p.getValue().getBinary().getStream();
+ String expectedMD5 = "35504d8c59455ab12a31f3d06f139a05";
+ try {
+ assertEquals(expectedMD5, DigestUtils.md5Hex(is));
+ } finally {
+ is.close();
+ }
+ }
+
+ protected void verifyCheckpoint() {
+ assertEquals("after", destination.getRoot().getString("checkpoint-state"));
+
+ String checkpointReference = null;
+
+ for (CheckpointRetriever.Checkpoint c : CheckpointRetriever.getCheckpoints(destination)) {
+ checkpointReference = c.getName();
+ }
+
+ assertNotNull(checkpointReference);
+
+ NodeState checkpoint = destination.retrieve(checkpointReference);
+ assertEquals("before", checkpoint.getString("checkpoint-state"));
+
+ assertEquals("123", destination.getRoot().getChildNode(":async").getString("test"));
+
+ for (String name : new String[] {"var", "etc", "sling.css", "apps", "libs", "sightly"}) {
+ assertSameRecord(destination.getRoot().getChildNode(name), checkpoint.getChildNode(name));
+ }
+ }
+
+ private static void assertSameRecord(NodeState ns1, NodeState ns2) {
+ String recordId1 = getRecordId(ns1);
+ String recordId2 = getRecordId(ns2);
+ assertNotNull(recordId1);
+ assertEquals(recordId1, recordId2);
+ }
+
+ private static String getRecordId(NodeState node) {
+ if (node instanceof SegmentNodeState) {
+ return ((SegmentNodeState) node).getRecordId().toString();
+ } else if (node instanceof DocumentNodeState) {
+ return ((DocumentNodeState) node).getLastRevision().toString();
+ } else {
+ return null;
+ }
+ }
+
+ // OAK-2869
+ protected void verifyEmptyAsync() {
+ NodeState state = destination.getRoot().getChildNode(":async");
+ assertFalse(state.hasProperty("test"));
+ }
+
+ protected boolean supportsCheckpointMigration() {
+ return false;
+ }
+}
Added: jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/Jcr2ToSegmentTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/Jcr2ToSegmentTest.java?rev=1792993&view=auto
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/Jcr2ToSegmentTest.java (added)
+++ jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/Jcr2ToSegmentTest.java Fri Apr 28 07:16:13 2017
@@ -0,0 +1,78 @@
+/*
+ * 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.upgrade.cli;
+
+import java.io.File;
+import java.io.IOException;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+
+import org.apache.jackrabbit.oak.Oak;
+import org.apache.jackrabbit.oak.jcr.Jcr;
+import org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl;
+import org.apache.jackrabbit.oak.plugins.index.reference.ReferenceIndexProvider;
+import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.apache.jackrabbit.oak.upgrade.cli.container.NodeStoreContainer;
+import org.apache.jackrabbit.oak.upgrade.cli.container.SegmentNodeStoreContainer;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class Jcr2ToSegmentTest {
+
+ private final NodeStoreContainer destinationContainer = new SegmentNodeStoreContainer();
+
+ private NodeStore destination;
+
+ private RepositoryImpl repository;
+
+ private Session session;
+
+ public Jcr2ToSegmentTest() throws IOException {
+ }
+
+ @Before
+ public void prepare() throws Exception {
+ File tempDir = new File("target", "test-jcr2");
+ if (!tempDir.isDirectory()) {
+ Util.unzip(AbstractOak2OakTest.class.getResourceAsStream("/jcr2.zip"), tempDir);
+ }
+
+ OakUpgrade.main("--copy-binaries", tempDir.getPath(), destinationContainer.getDescription());
+
+ destination = destinationContainer.open();
+ repository = (RepositoryImpl) new Jcr(new Oak(destination).with("oak.sling")).with(new ReferenceIndexProvider()).createRepository();
+ session = repository.login(new SimpleCredentials("admin", "admin".toCharArray()));
+ }
+
+ @After
+ public void clean() throws IOException {
+ session.logout();
+ repository.shutdown();
+ destinationContainer.close();
+ destinationContainer.clean();
+ }
+
+ @Test
+ public void validateMigration() throws RepositoryException, IOException {
+ AbstractOak2OakTest.verifyContent(session);
+ AbstractOak2OakTest.verifyBlob(session);
+ }
+
+}
Added: jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/JdbcToSegmentTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/JdbcToSegmentTest.java?rev=1792993&view=auto
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/JdbcToSegmentTest.java (added)
+++ jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/JdbcToSegmentTest.java Fri Apr 28 07:16:13 2017
@@ -0,0 +1,56 @@
+/*
+ * 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.upgrade.cli;
+
+import java.io.IOException;
+
+import org.apache.jackrabbit.oak.upgrade.cli.container.JdbcNodeStoreContainer;
+import org.apache.jackrabbit.oak.upgrade.cli.container.NodeStoreContainer;
+import org.apache.jackrabbit.oak.upgrade.cli.container.SegmentNodeStoreContainer;
+
+public class JdbcToSegmentTest extends AbstractOak2OakTest {
+
+ private final NodeStoreContainer source;
+
+ private final NodeStoreContainer destination;
+
+ public JdbcToSegmentTest() throws IOException {
+ source = new JdbcNodeStoreContainer();
+ destination = new SegmentNodeStoreContainer();
+ }
+
+ @Override
+ protected NodeStoreContainer getSourceContainer() {
+ return source;
+ }
+
+ @Override
+ protected NodeStoreContainer getDestinationContainer() {
+ return destination;
+ }
+
+ @Override
+ protected String[] getArgs() {
+ return new String[] { "--src-user", "sa", "--src-password", "sa", source.getDescription(),
+ destination.getDescription() };
+ }
+
+ @Override
+ protected boolean supportsCheckpointMigration() {
+ return true;
+ }
+}
Added: jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToMongoFbsTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToMongoFbsTest.java?rev=1792993&view=auto
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToMongoFbsTest.java (added)
+++ jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToMongoFbsTest.java Fri Apr 28 07:16:13 2017
@@ -0,0 +1,67 @@
+/*
+ * 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.upgrade.cli;
+
+import java.io.IOException;
+
+import static org.apache.jackrabbit.oak.upgrade.cli.container.MongoNodeStoreContainer.isMongoAvailable;
+import static org.junit.Assume.assumeTrue;
+
+import org.apache.jackrabbit.oak.upgrade.cli.container.BlobStoreContainer;
+import org.apache.jackrabbit.oak.upgrade.cli.container.FileBlobStoreContainer;
+import org.apache.jackrabbit.oak.upgrade.cli.container.MongoNodeStoreContainer;
+import org.apache.jackrabbit.oak.upgrade.cli.container.NodeStoreContainer;
+
+/**
+ * This covers the bug GRANITE-8719.
+ */
+public class MongoToMongoFbsTest extends AbstractOak2OakTest {
+
+ private final BlobStoreContainer destinationBlob;
+
+ private final NodeStoreContainer source;
+
+ private final NodeStoreContainer destination;
+
+ public MongoToMongoFbsTest() throws IOException {
+ assumeTrue(isMongoAvailable());
+ destinationBlob = new FileBlobStoreContainer();
+ source = new MongoNodeStoreContainer();
+ destination = new MongoNodeStoreContainer(destinationBlob);
+ }
+
+ @Override
+ protected NodeStoreContainer getSourceContainer() {
+ return source;
+ }
+
+ @Override
+ protected NodeStoreContainer getDestinationContainer() {
+ return destination;
+ }
+
+ @Override
+ protected String[] getArgs() {
+ return new String[] { "--copy-binaries", "--fileblobstore", destinationBlob.getDescription(),
+ source.getDescription(), destination.getDescription() };
+ }
+
+ @Override
+ protected boolean supportsCheckpointMigration() {
+ return true;
+ }
+}
Added: jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToMongoFdsTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToMongoFdsTest.java?rev=1792993&view=auto
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToMongoFdsTest.java (added)
+++ jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToMongoFdsTest.java Fri Apr 28 07:16:13 2017
@@ -0,0 +1,64 @@
+/*
+ * 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.upgrade.cli;
+
+import static org.apache.jackrabbit.oak.upgrade.cli.container.MongoNodeStoreContainer.isMongoAvailable;
+import static org.junit.Assume.assumeTrue;
+
+import java.io.IOException;
+
+import org.apache.jackrabbit.oak.upgrade.cli.container.BlobStoreContainer;
+import org.apache.jackrabbit.oak.upgrade.cli.container.FileDataStoreContainer;
+import org.apache.jackrabbit.oak.upgrade.cli.container.MongoNodeStoreContainer;
+import org.apache.jackrabbit.oak.upgrade.cli.container.NodeStoreContainer;
+
+public class MongoToMongoFdsTest extends AbstractOak2OakTest {
+
+ private final BlobStoreContainer destinationBlob;
+
+ private final NodeStoreContainer source;
+
+ private final NodeStoreContainer destination;
+
+ public MongoToMongoFdsTest() throws IOException {
+ assumeTrue(isMongoAvailable());
+ destinationBlob = new FileDataStoreContainer();
+ source = new MongoNodeStoreContainer();
+ destination = new MongoNodeStoreContainer(destinationBlob);
+ }
+
+ @Override
+ protected NodeStoreContainer getSourceContainer() {
+ return source;
+ }
+
+ @Override
+ protected NodeStoreContainer getDestinationContainer() {
+ return destination;
+ }
+
+ @Override
+ protected String[] getArgs() {
+ return new String[] { "--copy-binaries", "--datastore", destinationBlob.getDescription(),
+ source.getDescription(), destination.getDescription() };
+ }
+
+ @Override
+ protected boolean supportsCheckpointMigration() {
+ return true;
+ }
+}
Added: jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToSegmentTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToSegmentTest.java?rev=1792993&view=auto
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToSegmentTest.java (added)
+++ jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/MongoToSegmentTest.java Fri Apr 28 07:16:13 2017
@@ -0,0 +1,59 @@
+/*
+ * 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.upgrade.cli;
+
+import static org.apache.jackrabbit.oak.upgrade.cli.container.MongoNodeStoreContainer.isMongoAvailable;
+import static org.junit.Assume.assumeTrue;
+
+import java.io.IOException;
+
+import org.apache.jackrabbit.oak.upgrade.cli.container.MongoNodeStoreContainer;
+import org.apache.jackrabbit.oak.upgrade.cli.container.NodeStoreContainer;
+import org.apache.jackrabbit.oak.upgrade.cli.container.SegmentNodeStoreContainer;
+
+public class MongoToSegmentTest extends AbstractOak2OakTest {
+
+ private final MongoNodeStoreContainer source;
+
+ private final SegmentNodeStoreContainer destination;
+
+ public MongoToSegmentTest() throws IOException {
+ assumeTrue(isMongoAvailable());
+ source = new MongoNodeStoreContainer();
+ destination = new SegmentNodeStoreContainer();
+ }
+
+ @Override
+ protected NodeStoreContainer getSourceContainer() {
+ return source;
+ }
+
+ @Override
+ protected NodeStoreContainer getDestinationContainer() {
+ return destination;
+ }
+
+ @Override
+ protected String[] getArgs() {
+ return new String[] { source.getDescription(), destination.getDescription() };
+ }
+
+ @Override
+ protected boolean supportsCheckpointMigration() {
+ return true;
+ }
+}
Added: jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToJdbcTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToJdbcTest.java?rev=1792993&view=auto
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToJdbcTest.java (added)
+++ jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToJdbcTest.java Fri Apr 28 07:16:13 2017
@@ -0,0 +1,57 @@
+/*
+ * 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.upgrade.cli;
+
+import java.io.IOException;
+
+import org.apache.jackrabbit.oak.upgrade.cli.container.JdbcNodeStoreContainer;
+import org.apache.jackrabbit.oak.upgrade.cli.container.NodeStoreContainer;
+import org.apache.jackrabbit.oak.upgrade.cli.container.SegmentNodeStoreContainer;
+import org.junit.Ignore;
+
+public class SegmentToJdbcTest extends AbstractOak2OakTest {
+
+ private final NodeStoreContainer source;
+
+ private final NodeStoreContainer destination;
+
+ public SegmentToJdbcTest() throws IOException {
+ source = new SegmentNodeStoreContainer();
+ destination = new JdbcNodeStoreContainer();
+ }
+
+ @Override
+ protected NodeStoreContainer getSourceContainer() {
+ return source;
+ }
+
+ @Override
+ protected NodeStoreContainer getDestinationContainer() {
+ return destination;
+ }
+
+ @Override
+ protected String[] getArgs() {
+ return new String[] { "--disable-mmap", "--user", "sa", "--password", "sa", source.getDescription(),
+ destination.getDescription() };
+ }
+
+ @Override
+ protected boolean supportsCheckpointMigration() {
+ return true;
+ }
+}
Added: jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToMongoTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToMongoTest.java?rev=1792993&view=auto
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToMongoTest.java (added)
+++ jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToMongoTest.java Fri Apr 28 07:16:13 2017
@@ -0,0 +1,59 @@
+/*
+ * 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.upgrade.cli;
+
+import static org.apache.jackrabbit.oak.upgrade.cli.container.MongoNodeStoreContainer.isMongoAvailable;
+import static org.junit.Assume.assumeTrue;
+
+import java.io.IOException;
+
+import org.apache.jackrabbit.oak.upgrade.cli.container.MongoNodeStoreContainer;
+import org.apache.jackrabbit.oak.upgrade.cli.container.NodeStoreContainer;
+import org.apache.jackrabbit.oak.upgrade.cli.container.SegmentNodeStoreContainer;
+
+public class SegmentToMongoTest extends AbstractOak2OakTest {
+
+ private final NodeStoreContainer source;
+
+ private final NodeStoreContainer destination;
+
+ public SegmentToMongoTest() throws IOException {
+ assumeTrue(isMongoAvailable());
+ source = new SegmentNodeStoreContainer();
+ destination = new MongoNodeStoreContainer();
+ }
+
+ @Override
+ protected NodeStoreContainer getSourceContainer() {
+ return source;
+ }
+
+ @Override
+ protected NodeStoreContainer getDestinationContainer() {
+ return destination;
+ }
+
+ @Override
+ protected String[] getArgs() {
+ return new String[] { source.getDescription(), destination.getDescription() };
+ }
+
+ @Override
+ protected boolean supportsCheckpointMigration() {
+ return true;
+ }
+}
Added: jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToSegmentTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToSegmentTest.java?rev=1792993&view=auto
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToSegmentTest.java (added)
+++ jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToSegmentTest.java Fri Apr 28 07:16:13 2017
@@ -0,0 +1,54 @@
+/*
+ * 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.upgrade.cli;
+
+import org.apache.jackrabbit.oak.upgrade.cli.container.NodeStoreContainer;
+import org.apache.jackrabbit.oak.upgrade.cli.container.SegmentNodeStoreContainer;
+
+import java.io.IOException;
+
+public class SegmentToSegmentTest extends AbstractOak2OakTest {
+
+ private final NodeStoreContainer source;
+
+ private final NodeStoreContainer destination;
+
+ public SegmentToSegmentTest() throws IOException {
+ source = new SegmentNodeStoreContainer();
+ destination = new SegmentNodeStoreContainer();
+ }
+
+ @Override
+ protected NodeStoreContainer getSourceContainer() {
+ return source;
+ }
+
+ @Override
+ protected NodeStoreContainer getDestinationContainer() {
+ return destination;
+ }
+
+ @Override
+ protected String[] getArgs() {
+ return new String[] { source.getDescription(), destination.getDescription() };
+ }
+
+ @Override
+ protected boolean supportsCheckpointMigration() {
+ return true;
+ }
+}
Added: jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToSegmentWithMissingDestinationDirectoryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToSegmentWithMissingDestinationDirectoryTest.java?rev=1792993&view=auto
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToSegmentWithMissingDestinationDirectoryTest.java (added)
+++ jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToSegmentWithMissingDestinationDirectoryTest.java Fri Apr 28 07:16:13 2017
@@ -0,0 +1,60 @@
+/*
+ * 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.upgrade.cli;
+
+import org.apache.jackrabbit.oak.upgrade.cli.container.NodeStoreContainer;
+import org.apache.jackrabbit.oak.upgrade.cli.container.SegmentNodeStoreContainer;
+
+import java.io.IOException;
+
+public class SegmentToSegmentWithMissingDestinationDirectoryTest extends AbstractOak2OakTest {
+ private final NodeStoreContainer source;
+
+ private final NodeStoreContainer destination;
+
+ public SegmentToSegmentWithMissingDestinationDirectoryTest() throws IOException {
+ source = new SegmentNodeStoreContainer();
+ destination = getSegmentNodeStoreContainerWithMissingDirectory();
+ }
+
+ private SegmentNodeStoreContainer getSegmentNodeStoreContainerWithMissingDirectory() throws IOException {
+ SegmentNodeStoreContainer segmentNodeStoreContainer = new SegmentNodeStoreContainer();
+ segmentNodeStoreContainer.getDirectory().delete();
+ return segmentNodeStoreContainer;
+ }
+
+ @Override
+ protected NodeStoreContainer getSourceContainer() {
+ return source;
+ }
+
+ @Override
+ protected NodeStoreContainer getDestinationContainer() {
+ return destination;
+ }
+
+ @Override
+ protected String[] getArgs() {
+ return new String[] { source.getDescription(), destination.getDescription() };
+ }
+
+ @Override
+ protected boolean supportsCheckpointMigration() {
+ return true;
+ }
+
+}
Added: jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/Util.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/Util.java?rev=1792993&view=auto
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/Util.java (added)
+++ jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/Util.java Fri Apr 28 07:16:13 2017
@@ -0,0 +1,66 @@
+/*
+ * 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.upgrade.cli;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+import org.apache.commons.io.IOUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class Util {
+
+ private static final Logger log = LoggerFactory.getLogger(Util.class);
+
+ private Util() {
+ }
+
+ public static void unzip(InputStream is, File targetDir) throws IOException {
+ long start = System.currentTimeMillis();
+ log.info("Unzipping to {}", targetDir.getAbsolutePath());
+ final ZipInputStream zis = new ZipInputStream(is);
+ try {
+ ZipEntry entry = null;
+ while((entry = zis.getNextEntry()) != null) {
+ if (entry.isDirectory()) {
+ new File(targetDir, entry.getName()).mkdirs();
+ } else {
+ File target = new File(targetDir, entry.getName());
+ target.getParentFile().mkdirs();
+ OutputStream output = new FileOutputStream(target);
+ try {
+ IOUtils.copy(zis, output);
+ } finally {
+ output.close();
+ }
+ }
+ }
+ } finally {
+ zis.close();
+ }
+ final long delta = System.currentTimeMillis() - start;
+ if(delta > 1000L) {
+ log.info("Unzip took {} msec", delta);
+ }
+ }
+}