blob: 96bdcdcfb6722dd562f7f128948c1aa96be368b6 [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.blob.datastore;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import javax.jcr.RepositoryException;
import com.google.common.collect.ImmutableMap;
import org.apache.commons.io.FileUtils;
import org.apache.jackrabbit.core.data.DataStore;
import org.apache.jackrabbit.core.data.FileDataStore;
import org.apache.jackrabbit.oak.api.jmx.CacheStatsMBean;
import org.apache.jackrabbit.oak.commons.PropertiesUtil;
import org.apache.jackrabbit.oak.spi.blob.SharedBackend;
import org.apache.jackrabbit.oak.spi.blob.stats.BlobStoreStatsMBean;
import org.apache.jackrabbit.oak.stats.StatisticsProvider;
import org.apache.sling.testing.mock.osgi.MockOsgi;
import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
public class DataStoreServiceTest {
@Rule
public final TemporaryFolder folder = new TemporaryFolder(new File("target"));
@Rule
public final OsgiContext context = new OsgiContext();
@Test
public void mbeanRegs() throws Exception{
Map<String, Object> config = ImmutableMap.<String, Object>of(
"repository.home", folder.getRoot().getAbsolutePath()
);
FileDataStoreService fds = new FileDataStoreService();
fds.setStatisticsProvider(StatisticsProvider.NOOP);
MockOsgi.activate(fds, context.bundleContext(), config);
assertNotNull(context.getService(BlobStoreStatsMBean.class));
assertNotNull(context.getService(CacheStatsMBean.class));
}
/**
*
* Test {@link CachingFileDataStore} is returned when cacheSize > 0 by default.
*/
@Test
public void configCachingFileDataStore() throws Exception {
String nasPath = folder.getRoot().getAbsolutePath() + "/NASPath";
String cachePath = folder.getRoot().getAbsolutePath() + "/cachePath";
DataStore ds = getAssertCachingFileDataStore(nasPath, cachePath);
CachingFileDataStore cds = (CachingFileDataStore) ds;
SharedBackend backend = cds.getBackend();
Properties props = (Properties) getField(backend);
assertEquals("path not equal", nasPath, props.getProperty(FSBackend.FS_BACKEND_PATH));
}
/**
*
* Test to verify @FileDataStore is returned if cacheSize is not configured.
*/
@Test
public void configFileDataStore() throws Exception {
String nasPath = folder.getRoot().getAbsolutePath() + "/NASPath";
String cachePath = folder.getRoot().getAbsolutePath() + "/cachePath";
Map<String, Object> config = new HashMap<String, Object>();
config.put("repository.home", folder.getRoot().getAbsolutePath());
config.put(FileDataStoreService.PATH, nasPath);
config.put(FileDataStoreService.CACHE_PATH, cachePath);
FileDataStoreService fdsSvc = new FileDataStoreService();
DataStore ds = fdsSvc.createDataStore(context.componentContext(), config);
PropertiesUtil.populate(ds, config, false);
ds.init(folder.getRoot().getAbsolutePath());
assertTrue("not instance of FileDataStore", ds instanceof FileDataStore);
FileDataStore fds = (FileDataStore) ds;
assertEquals("path not equal", nasPath, fds.getPath());
}
/**
* Tests the regitration of CachingFileDataStore and checks existence of
* reference.key file on first access of getOrCreateReference.
* @throws Exception
*/
@Test
public void registerAndCheckReferenceKey() throws Exception {
context.registerService(StatisticsProvider.class, StatisticsProvider.NOOP);
String nasPath = folder.getRoot().getAbsolutePath() + "/NASPath";
String cachePath = folder.getRoot().getAbsolutePath() + "/cachePath";
DataStore ds = getAssertCachingFileDataStore(nasPath, cachePath);
final CachingFileDataStore dataStore = (CachingFileDataStore) ds;
byte[] key = dataStore.getBackend().getOrCreateReferenceKey();
// Check bytes retrieved from reference.key file
File refFile = new File(nasPath, "reference.key");
byte[] keyRet = FileUtils.readFileToByteArray(refFile);
assertArrayEquals(key, keyRet);
assertArrayEquals(key, dataStore.getBackend().getOrCreateReferenceKey());
}
private DataStore getAssertCachingFileDataStore(String nasPath, String cachePath)
throws RepositoryException {
long cacheSize = 100L;
Map<String, Object> config = new HashMap<String, Object>();
config.put("repository.home", folder.getRoot().getAbsolutePath());
config.put(FileDataStoreService.CACHE_SIZE, cacheSize);
config.put(FileDataStoreService.PATH, nasPath);
config.put(FileDataStoreService.CACHE_PATH, cachePath);
FileDataStoreService fdsSvc = new FileDataStoreService();
DataStore ds = fdsSvc.createDataStore(context.componentContext(), config);
PropertiesUtil.populate(ds, config, false);
ds.init(folder.getRoot().getAbsolutePath());
assertTrue("not instance of CachingFDS", ds instanceof CachingFileDataStore);
return ds;
}
private static Object getField(Object obj) throws Exception {
Field f = obj.getClass().getDeclaredField("properties"); //NoSuchFieldException
f.setAccessible(true);
return f.get(obj);
}
}