/** * 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.itests.exam; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.ops4j.pax.exam.OptionUtils.combine; import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.editConfigurationFileExtend; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.sql.DataSource; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.openengsb.core.api.context.ContextHolder; import org.openengsb.core.edbi.api.Index; import org.openengsb.core.edbi.api.IndexEngine; import org.openengsb.core.ekb.api.EKBCommit; import org.openengsb.core.ekb.api.PersistInterface; import org.openengsb.domain.example.model.EOModel; import org.openengsb.itests.util.AbstractModelUsingExamTestHelper; import org.ops4j.pax.exam.Configuration; import org.ops4j.pax.exam.Option; import org.ops4j.pax.exam.junit.PaxExam; import org.ops4j.pax.exam.karaf.options.KarafDistributionConfigurationFilePutOption; import org.ops4j.pax.exam.karaf.options.configs.FeaturesCfg; import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy; import org.ops4j.pax.exam.spi.reactors.PerMethod; import org.springframework.jdbc.core.JdbcTemplate; @RunWith(PaxExam.class) @ExamReactorStrategy(PerMethod.class) public class EDBIndexIT extends AbstractModelUsingExamTestHelper { public static final String CONTEXT = "testcontext"; private PersistInterface ekb; private IndexEngine indexEngine; private DataSource dataSource; @Configuration public static Option[] myConfiguration() throws Exception { Option[] options = new Option[]{ configFilePut("etc/org.openengsb.ekb.cfg", "modelUpdatePropagationMode", "DEACTIVATED"), configFilePut("etc/org.openengsb.ekb.cfg", "persistInterfaceLockingMode", "DEACTIVATED"), feature("openengsb-domain-example"), feature("openengsb-edbi") // also loads spring-jdbc }; return combine(baseConfiguration(), options); } @Before public void setup() throws Exception { ekb = getOsgiService(PersistInterface.class); indexEngine = getOsgiService(IndexEngine.class); dataSource = getOsgiService(DataSource.class); ContextHolder.get().setCurrentContextId(CONTEXT); } @Test public void getEngineService_works() throws Exception { assertNotNull(indexEngine); } @Test public void ekbCommit_shouldCreateIndexInherently() throws Exception { EOModel insert = new EOModel(); insert.setEdbId("insert/1"); EKBCommit ekbCommit = getTestEKBCommit(); ekbCommit.addInsert(insert); ekb.commit(ekbCommit); Index<?> index = indexEngine.getIndex(insert.getClass()); assertNotNull(index); assertEquals("org.openengsb.domain.example.model.EOModel", index.getName()); assertEquals(insert.getClass(), index.getModelClass()); assertNotNull(index.getHeadTableName()); assertNotNull(index.getHistoryTableName()); assertEquals(6, index.getFields().size()); } @Test public void createdIndexHeadTableShouldHaveCorrectPrimaryKey() throws Exception { EOModel insert = new EOModel(); insert.setEdbId("insert/1"); ekb.commit(getTestEKBCommit().addInsert(insert)); String sql = "SELECT * FROM INFORMATION_SCHEMA.INDEXES WHERE TABLE_NAME = ?"; Map<String, Object> record = new JdbcTemplate(dataSource).queryForMap(sql, indexEngine.getIndex(EOModel.class).getHeadTableName()); assertEquals("EDBID", record.get("COLUMN_NAME")); assertTrue("Column EDBID is not a primary key", record.get("INDEX_NAME").toString().startsWith("PRIMARY_KEY")); } @Test public void ekbCommit_updateAndDelete_shouldCreateHistoryRecordsCorreclty() throws Exception { // model 1 stays the same // model 2 gets updated // model 3 gets deleted EOModel model1 = new EOModel(); EOModel model2 = new EOModel(); EOModel model3 = new EOModel(); model1.setEdbId("eom/1"); model2.setEdbId("eom/2"); model3.setEdbId("eom/3"); model1.setShared("A"); model2.setShared("B"); model3.setShared("C"); EKBCommit insertCommit = getTestEKBCommit().addInsert(model1).addInsert(model2).addInsert(model3); ekb.commit(insertCommit); model2.setShared("B_EDITED"); EKBCommit updateCommit = getTestEKBCommit().addUpdate(model2).addDelete(model3); ekb.commit(updateCommit); // assert Index<?> index = indexEngine.getIndex(model1.getClass()); assertEquals(5, new JdbcTemplate(dataSource).queryForLong("SELECT COUNT(*) FROM " + index.getHistoryTableName())); String sql = "SELECT * FROM " + index.getHistoryTableName() + " ORDER BY REV_OPERATION, EDBID"; List<Map<String, Object>> records = new JdbcTemplate(dataSource).queryForList(sql); Iterator<Map<String, Object>> iterator = records.iterator(); Map<String, Object> record; record = iterator.next(); assertEquals("eom/3", record.get("EDBID")); assertEquals("C", record.get("SHARED")); assertEquals("DELETE", record.get("REV_OPERATION")); record = iterator.next(); assertEquals("eom/1", record.get("EDBID")); assertEquals("A", record.get("SHARED")); assertEquals("INSERT", record.get("REV_OPERATION")); record = iterator.next(); assertEquals("eom/2", record.get("EDBID")); assertEquals("B", record.get("SHARED")); assertEquals("INSERT", record.get("REV_OPERATION")); record = iterator.next(); assertEquals("eom/3", record.get("EDBID")); assertEquals("C", record.get("SHARED")); assertEquals("INSERT", record.get("REV_OPERATION")); record = iterator.next(); assertEquals("eom/2", record.get("EDBID")); assertEquals("B_EDITED", record.get("SHARED")); assertEquals("UPDATE", record.get("REV_OPERATION")); assertFalse(iterator.hasNext()); } private static Option configFilePut(String configurationFilePath, String key, String value) { return new KarafDistributionConfigurationFilePutOption(configurationFilePath, key, value); } private static Option feature(String feature) { return editConfigurationFileExtend(FeaturesCfg.BOOT, "," + feature); } }