blob: 95412f8ba3b2a713087e3553c31f1802f290972e [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.plugins.document;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.sql.DataSource;
import org.junit.After;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@RunWith(Parameterized.class)
public abstract class AbstractDocumentStoreTest {
protected String dsname;
protected DocumentStore ds;
protected DocumentStoreFixture dsf;
protected DataSource rdbDataSource;
protected List<String> removeMe = new ArrayList<String>();
protected List<String> removeMeSettings = new ArrayList<String>();
protected List<String> removeMeJournal = new ArrayList<String>();
protected List<String> removeMeClusterNodes = new ArrayList<String>();
static final Logger LOG = LoggerFactory.getLogger(AbstractDocumentStoreTest.class);
public AbstractDocumentStoreTest(DocumentStoreFixture dsf) {
this.dsf = dsf;
this.ds = dsf.createDocumentStore(getBuilder().setClusterId(1));
this.dsname = dsf.getName();
this.rdbDataSource = dsf.getRDBDataSource();
}
public DocumentMK.Builder getBuilder() {
return new DocumentMK.Builder();
}
@After
public void cleanUp() throws Exception {
removeTestNodes(org.apache.jackrabbit.oak.plugins.document.Collection.NODES, removeMe);
removeTestNodes(org.apache.jackrabbit.oak.plugins.document.Collection.SETTINGS, removeMeSettings);
removeTestNodes(org.apache.jackrabbit.oak.plugins.document.Collection.JOURNAL, removeMeJournal);
removeTestNodes(org.apache.jackrabbit.oak.plugins.document.Collection.CLUSTER_NODES, removeMeClusterNodes);
ds.dispose();
dsf.dispose();
}
@Parameterized.Parameters(name="{0}")
public static Collection<Object[]> fixtures() {
return fixtures(false);
}
protected static Collection<Object[]> fixtures(boolean multi) {
Collection<Object[]> result = new ArrayList<Object[]>();
DocumentStoreFixture candidates[] = new DocumentStoreFixture[] { DocumentStoreFixture.MEMORY, DocumentStoreFixture.MONGO,
DocumentStoreFixture.RDB_H2, DocumentStoreFixture.RDB_DERBY, DocumentStoreFixture.RDB_PG,
DocumentStoreFixture.RDB_DB2, DocumentStoreFixture.RDB_MYSQL, DocumentStoreFixture.RDB_ORACLE,
DocumentStoreFixture.RDB_MSSQL };
for (DocumentStoreFixture dsf : candidates) {
if (dsf.isAvailable()) {
if (!multi || dsf.hasSinglePersistence()) {
result.add(new Object[] { dsf });
}
}
}
return result;
}
/**
* Generate a random string of given size, with or without non-ASCII characters.
*/
public static String generateString(int length, boolean asciiOnly) {
char[] s = new char[length];
for (int i = 0; i < length; i++) {
if (asciiOnly) {
s[i] = (char) (32 + (int) (95 * Math.random()));
} else {
s[i] = (char) (32 + (int) ((0xd7ff - 32) * Math.random()));
}
}
return new String(s);
}
/**
* Generate a random string of given size, with or without non-ASCII characters.
*/
public static String generateConstantString(int length) {
char[] s = new char[length];
for (int i = 0; i < length; i++) {
s[i] = (char)('0' + (i % 10));
}
return new String(s);
}
private <T extends Document> void removeTestNodes(org.apache.jackrabbit.oak.plugins.document.Collection<T> col,
List<String> ids) {
if (!ids.isEmpty()) {
long start = System.nanoTime();
try {
ds.remove(col, ids);
} catch (Exception ex) {
// retry one by one
for (String id : ids) {
try {
ds.remove(col, id);
} catch (Exception ex2) {
// best effort
}
}
}
if (ids.size() > 1) {
long elapsed = (System.nanoTime() - start) / (1000 * 1000);
float rate = (((float) ids.size()) / (elapsed == 0 ? 1 : elapsed));
LOG.info(ids.size() + " documents removed in " + elapsed + "ms (" + rate + "/ms)");
}
}
}
}