/*
* Copyright 2012 NGDATA nv
*
* Licensed 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.lilyproject.process.test;
import java.io.File;
import org.apache.commons.io.FileUtils;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.lilyproject.client.LilyClient;
import org.lilyproject.lilyservertestfw.LilyProxy;
import org.lilyproject.repository.api.FieldType;
import org.lilyproject.repository.api.QName;
import org.lilyproject.repository.api.Record;
import org.lilyproject.repository.api.RecordType;
import org.lilyproject.repository.api.Repository;
import org.lilyproject.repository.api.Scope;
import org.lilyproject.repository.api.TypeManager;
import static org.junit.Assert.assertEquals;
/**
* Tests the record update hook feature.
*
* <p>This test relies on test-updatehook being installed in the local maven repository, hence
* requires that the build is done with "mvn install".</p>
*/
public class RecordUpdateHookTest {
private static LilyProxy lilyProxy;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
String basedir = System.getProperty("basedir");
if (basedir == null) {
basedir = System.getProperty("java.io.tmpdir");
}
// Temp dir where we will create plugin & conf stuff
File tmpDir = new File(basedir + "/target/lily-test");
String pluginDir = setupPluginsDirectory(tmpDir);
System.setProperty("lily.plugin.dir", pluginDir);
File customConfDir = setupConfDirectory(tmpDir);
System.setProperty("lily.conf.dir", basedir + "/../server/conf");
System.setProperty("lily.conf.customdir", customConfDir.getAbsolutePath());
try {
lilyProxy = new LilyProxy();
lilyProxy.start();
} finally {
// Make sure it's properties won't be used by later-running tests
System.getProperties().remove("lily.plugin.dir");
System.getProperties().remove("lily.conf.dir");
System.getProperties().remove("lily.conf.customdir");
}
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
try {
if (lilyProxy != null) {
lilyProxy.stop();
}
} catch (Throwable t) {
t.printStackTrace();
}
}
private static String setupPluginsDirectory(File tmpDir) throws Exception {
File pluginDir = new File(tmpDir + "/plugins");
// Delete it if it would already exist
FileUtils.deleteDirectory(pluginDir);
FileUtils.forceMkdir(pluginDir);
File beforeRepoDir = new File(pluginDir, "load-before-repository");
FileUtils.forceMkdir(beforeRepoDir);
String projectVersion = System.getProperty("project.version");
if (projectVersion == null) {
throw new Exception("This test relies on a system property project.version being set. Probably you " +
"are running this test outside of Maven? Try adding -Dproject.version=...");
}
String wiringXml = "<wiring>\n" +
" <modules>\n" +
" <artifact id=\"test-updatehook\" groupId=\"org.lilyproject\" artifactId=\"lily-test-updatehook\" version=\"" + projectVersion + "\">\n" +
" </artifact>\n" +
" </modules>\n" +
"</wiring>";
FileUtils.writeStringToFile(new File(beforeRepoDir, "testupdatehook.xml"), wiringXml, "UTF-8");
return pluginDir.getAbsolutePath();
}
private static File setupConfDirectory(File tmpDir) throws Exception {
File confDir = new File(tmpDir + "/conf");
File repoConfDir = new File(confDir, "repository");
FileUtils.forceMkdir(repoConfDir);
// Write configuration to activate the decorator
String repositoryXml = "<repository xmlns:conf=\"http://lilyproject.org/configuration\" conf:inherit=\"shallow\">" +
"<updateHooks><updateHook>test-updatehook</updateHook></updateHooks>" +
"</repository>";
FileUtils.writeStringToFile(new File(repoConfDir, "repository.xml"), repositoryXml, "UTF-8");
return confDir;
}
@Test
public void test() throws Exception {
LilyClient client = lilyProxy.getLilyServerProxy().getClient();
// Obtain a repository
Repository repository = client.getRepository();
TypeManager typeMgr = repository.getTypeManager();
QName fieldName = new QName("ns", "f1");
FieldType fieldType = typeMgr.newFieldType(typeMgr.getValueType("STRING"), fieldName, Scope.NON_VERSIONED);
fieldType = typeMgr.createFieldType(fieldType);
QName typeName = new QName("ns", "rt1");
RecordType recordType = typeMgr.newRecordType(typeName);
recordType.addFieldTypeEntry(fieldType.getId(), false);
recordType = typeMgr.createRecordType(recordType);
Record record = repository.newRecord();
record.setRecordType(typeName);
record.setField(fieldName, "foo");
record = repository.create(record);
assertEquals("foo-create-hook", record.getField(fieldName));
record = repository.read(record.getId());
assertEquals("foo-create-hook", record.getField(fieldName));
record.setField(fieldName, "bar");
record = repository.update(record);
assertEquals("bar-update-hook", record.getField(fieldName));
record = repository.read(record.getId());
assertEquals("bar-update-hook", record.getField(fieldName));
}
}