/**
* Licensed to the Austrian Association for Software Tool Integration (AASTI)
* under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright
* ownership. The AASTI 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.openengsb.core.persistence;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import java.io.File;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import org.openengsb.core.api.persistence.PersistenceException;
import org.openengsb.core.api.persistence.PersistenceService;
import org.openengsb.core.persistence.internal.DefaultObjectPersistenceBackend;
import org.openengsb.core.persistence.internal.DefaultPersistenceIndex;
import org.openengsb.core.persistence.internal.DefaultPersistenceService;
import org.openengsb.core.persistence.test.util.FileHelper;
public class PersistenceServiceTest {
private PersistenceService persistence;
private PersistenceTestBean beanA;
private PersistenceTestBean beanB;
private PersistenceTestBean beanC;
@Before
public void init() throws Exception {
File tmpDir = FileHelper.createTempDirectory();
DefaultPersistenceIndex persistenceIndex =
new DefaultPersistenceIndex(tmpDir, new DefaultObjectPersistenceBackend());
persistence = new DefaultPersistenceService(tmpDir, new DefaultObjectPersistenceBackend(), persistenceIndex);
beanA = new PersistenceTestBean("A", 1, null);
beanA.setTestEnum(TestEnum.A);
beanB = new PersistenceTestBean("B", 1, null);
beanC = new PersistenceTestBean("C", 3, beanB);
beanB.setReference(beanC);
persistence.create(Arrays.asList(new PersistenceTestBean[]{ beanA, beanB, beanC }));
}
@Test
public void testExactMatchQuery_shouldReturnSingleResult() throws Exception {
PersistenceTestBean example = new PersistenceTestBean("A", 1, null);
example.setTestEnum(TestEnum.A);
List<PersistenceTestBean> results = persistence.query(example);
assertThat(results.size(), is(1));
PersistenceTestBean result = results.get(0);
assertThat(result, is(beanA));
}
@Test
public void testSlightlyModifiedMatchQuery_shouldNotReturnSingleResult() throws Exception {
PersistenceTestBean example = new PersistenceTestBean("A", 1, null);
example.setTestEnum(TestEnum.B);
List<PersistenceTestBean> results = persistence.query(example);
assertThat(results.size(), is(0));
}
@Test
public void testMatchQuery_shouldReturnSingleResult() throws Exception {
PersistenceTestBean example = new PersistenceTestBean("A", null, null);
List<PersistenceTestBean> results = persistence.query(example);
assertThat(results.size(), is(1));
PersistenceTestBean result = results.get(0);
assertThat(result, is(beanA));
}
@Test
public void testMatchQuery_shouldReturnTwoResults() throws Exception {
PersistenceTestBean example = new PersistenceTestBean(null, 1, null);
List<PersistenceTestBean> results = persistence.query(example);
assertThat(results.size(), is(2));
assertThat(results.contains(beanA), is(true));
assertThat(results.contains(beanB), is(true));
}
@Test
public void testMultipleExampleQuery_shouldBehaveLikeMultipleSimpleExampleQueries() throws Exception {
PersistenceTestBean example = new PersistenceTestBean("A", null, null);
PersistenceTestBean example2 = new PersistenceTestBean("B", null, null);
List<PersistenceTestBean> results = persistence.query(example);
results.addAll(persistence.query(example2));
List<PersistenceTestBean> results2 =
persistence.query(Arrays.asList(new PersistenceTestBean[]{ example, example2 }));
assertThat(results2, is(results));
}
@Test
public void testCreate_shouldStoreElement() throws Exception {
PersistenceTestBean additional = new PersistenceTestBean("Test", 1, null);
persistence.create(additional);
List<PersistenceTestBean> results = persistence.query(new PersistenceTestBean("Test", null, null));
assertThat(results.contains(additional), is(true));
}
@Test
public void testCreateSameElementTwice_shouldStoreElementTwice() throws Exception {
PersistenceTestBean additional = new PersistenceTestBean("Test", 1, null);
persistence.create(additional);
persistence.create(additional);
List<PersistenceTestBean> results = persistence.query(new PersistenceTestBean("Test", null, null));
assertThat(results.size(), is(2));
assertThat(results.get(0), is(additional));
assertThat(results.get(1), is(additional));
}
@Test
public void testCreateAndChange_shouldNotAffectStoredElement() throws Exception {
PersistenceTestBean additional = new PersistenceTestBean("Test", 1, null);
persistence.create(additional);
additional.setStringValue("Foo");
List<PersistenceTestBean> results = persistence.query(new PersistenceTestBean("Test", null, null));
assertThat(results.size(), is(1));
assertThat(results.get(0).getStringValue(), is("Test"));
}
@Test
public void testMultiCreate_shouldWork() throws Exception {
PersistenceTestBean additional1 = new PersistenceTestBean("Test", 1, null);
PersistenceTestBean additional2 = new PersistenceTestBean("Test", 2, null);
persistence.create(Arrays.asList(new PersistenceTestBean[]{ additional1, additional2 }));
List<PersistenceTestBean> results = persistence.query(new PersistenceTestBean("Test", null, null));
assertThat(results.size(), is(2));
assertThat(results.contains(additional1), is(true));
assertThat(results.contains(additional2), is(true));
}
@Test
public void testUpdate_shouldUpdateElement() throws Exception {
PersistenceTestBean newBeanA = new PersistenceTestBean("Foo", 1, null);
persistence.update(beanA, newBeanA);
PersistenceTestBean example = new PersistenceTestBean("A", null, null);
List<PersistenceTestBean> results = persistence.query(example);
assertThat(results.isEmpty(), is(true));
PersistenceTestBean example2 = new PersistenceTestBean("Foo", null, null);
List<PersistenceTestBean> results2 = persistence.query(example2);
assertThat(results2.size(), is(1));
PersistenceTestBean result = results2.get(0);
assertThat(result, is(newBeanA));
}
@Test(expected = PersistenceException.class)
public void testUpdateSourceElementNotPresent_shouldFail() throws Exception {
PersistenceTestBean newBeanA = new PersistenceTestBean("Foo", 1, null);
persistence.update(newBeanA, beanB);
}
@Test(expected = PersistenceException.class)
public void testUpdateSourceElementNotUnique_shouldFail() throws Exception {
PersistenceTestBean additional = new PersistenceTestBean("Test", 1, null);
persistence.create(additional);
persistence.create(additional);
PersistenceTestBean newBean = new PersistenceTestBean("Foo", 1, null);
persistence.update(additional, newBean);
}
@Test
public void testMultiUpdate_shouldWork() throws Exception {
PersistenceTestBean updated1 = new PersistenceTestBean("Test", 1, null);
PersistenceTestBean updated2 = new PersistenceTestBean("Foo", 2, null);
PersistenceTestBean updated3 = new PersistenceTestBean("Bar", 3, null);
Map<PersistenceTestBean, PersistenceTestBean> toUpdate =
new HashMap<PersistenceTestBean, PersistenceTestBean>();
toUpdate.put(beanA, updated1);
toUpdate.put(beanB, updated2);
toUpdate.put(beanC, updated3);
persistence.update(toUpdate);
PersistenceTestBean wildcard = new PersistenceTestBean(null, null, null);
List<PersistenceTestBean> results = persistence.query(wildcard);
assertThat(results.size(), is(3));
assertThat(results.contains(updated1), is(true));
assertThat(results.contains(updated2), is(true));
assertThat(results.contains(updated3), is(true));
}
@Test
public void testDelete_shouldDeleteElement() throws Exception {
persistence.delete(beanA);
List<PersistenceTestBean> results = persistence.query(new PersistenceTestBean("A", 1, null));
assertThat(results.isEmpty(), is(true));
}
@Test(expected = PersistenceException.class)
public void testDeleteElementNotPresent_shouldFail() throws Exception {
PersistenceTestBean test = new PersistenceTestBean("Test", 1, null);
persistence.delete(test);
}
@Test
public void testDeleteMultipleHits_shouldWork() throws Exception {
PersistenceTestBean example = new PersistenceTestBean(null, 1, null);
List<PersistenceTestBean> results = persistence.query(example);
assertThat(results.size(), is(2));
persistence.delete(example);
results = persistence.query(example);
assertThat(results.isEmpty(), is(true));
}
@Test
public void testMultiDelete_shouldWork() throws Exception {
PersistenceTestBean wildcard = new PersistenceTestBean(null, null, null);
List<PersistenceTestBean> results = persistence.query(wildcard);
assertThat(results.size(), is(3));
PersistenceTestBean aAndB = new PersistenceTestBean(null, 1, null);
PersistenceTestBean c = new PersistenceTestBean("C", 3, null);
List<PersistenceTestBean> toDelete = Arrays.asList(new PersistenceTestBean[]{ aAndB, c });
persistence.delete(toDelete);
results = persistence.query(wildcard);
assertThat(results.isEmpty(), is(true));
}
}