blob: 4f592f7baf323a49a9cd9fa684f44c5c00351284 [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.upgrade;
import com.google.common.base.Joiner;
import org.apache.jackrabbit.oak.spi.state.NodeStore;
import org.apache.jackrabbit.oak.upgrade.cli.AbstractOak2OakTest;
import org.apache.jackrabbit.oak.upgrade.cli.OakUpgrade;
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.NodeStoreContainer;
import org.apache.jackrabbit.oak.upgrade.cli.container.SegmentNodeStoreContainer;
import org.apache.jackrabbit.oak.upgrade.cli.container.SegmentTarNodeStoreContainer;
import org.apache.jackrabbit.oak.upgrade.cli.parser.CliArgumentException;
import org.apache.jackrabbit.oak.upgrade.cli.parser.DatastoreArguments;
import org.apache.jackrabbit.oak.upgrade.cli.parser.MigrationCliArguments;
import org.apache.jackrabbit.oak.upgrade.cli.parser.MigrationOptions;
import org.apache.jackrabbit.oak.upgrade.cli.parser.OptionParserFactory;
import org.apache.jackrabbit.oak.upgrade.cli.parser.StoreArguments;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.jcr.RepositoryException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import static java.util.Arrays.asList;
import static org.junit.Assert.fail;
@RunWith(Parameterized.class)
public class CopyCheckpointsTest extends AbstractOak2OakTest {
private enum Result {
EXCEPTION, CHECKPOINTS_MISSING, CHECKPOINTS_COPIED
}
private static final Logger log = LoggerFactory.getLogger(CopyCheckpointsTest.class);
@Parameterized.Parameters(name = "{0}")
public static Collection<Object[]> data() throws IOException {
List<Object[]> params = new ArrayList<Object[]>();
BlobStoreContainer blob = new FileDataStoreContainer();
params.add(new Object[]{
"Without data store defined it always copies checkpoints",
new SegmentNodeStoreContainer(blob),
new SegmentNodeStoreContainer(blob),
asList(),
Result.CHECKPOINTS_COPIED
});
params.add(new Object[]{
"Suppress the warning",
new SegmentNodeStoreContainer(blob),
new SegmentNodeStoreContainer(blob),
asList("--skip-checkpoints"),
Result.CHECKPOINTS_MISSING
});
params.add(new Object[]{
"Source data store defined, checkpoints migrated",
new SegmentTarNodeStoreContainer(blob),
new SegmentTarNodeStoreContainer(blob),
asList("--src-datastore=" + blob.getDescription()),
Result.CHECKPOINTS_COPIED
});
return params;
}
private final NodeStoreContainer source;
private final NodeStoreContainer destination;
private final List<String> args;
private final Result expectedResult;
public CopyCheckpointsTest(String name, NodeStoreContainer source, NodeStoreContainer destination, List<String> args, Result expectedResult) throws IOException, CliArgumentException {
this.source = source;
this.destination = destination;
this.args = args;
this.expectedResult = expectedResult;
this.source.clean();
this.destination.clean();
}
@Override
protected NodeStoreContainer getSourceContainer() {
return source;
}
@Override
protected NodeStoreContainer getDestinationContainer() {
return destination;
}
@Override
protected String[] getArgs() {
List<String> result = new ArrayList<>(args);
result.addAll(asList("--disable-mmap", source.getDescription(), destination.getDescription()));
return result.toArray(new String[result.size()]);
}
@Before
@Override
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));
try {
MigrationCliArguments cliArgs = new MigrationCliArguments(OptionParserFactory.create().parse(args));
MigrationOptions options = new MigrationOptions(cliArgs);
StoreArguments stores = new StoreArguments(options, cliArgs.getArguments());
DatastoreArguments datastores = new DatastoreArguments(options, stores, stores.srcUsesEmbeddedDatastore());
OakUpgrade.migrate(options, stores, datastores);
} catch(RuntimeException e) {
if (expectedResult == Result.EXCEPTION) {
return;
} else {
throw e;
}
}
if (expectedResult == Result.EXCEPTION) {
fail("Migration should fail");
}
createSession();
}
@Test
@Override
public void validateMigration() throws RepositoryException, IOException, CliArgumentException {
switch (expectedResult) {
case CHECKPOINTS_COPIED:
verifyCheckpoint();
break;
case CHECKPOINTS_MISSING:
break;
}
}
}