// // Copyright 2010 Cinch Logic Pty Ltd. // // http://www.chililog.com // // 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.chililog.server.data; import static org.junit.Assert.*; import java.util.ArrayList; import java.util.Hashtable; import java.util.List; import java.util.regex.Pattern; import org.bson.types.ObjectId; import org.chililog.server.common.ChiliLogException; import org.chililog.server.data.MongoConnection; import org.chililog.server.data.RepositoryFieldConfigBO; import org.chililog.server.data.RepositoryConfigBO; import org.chililog.server.data.RepositoryConfigController; import org.chililog.server.data.RepositoryConfigListCriteria; import org.chililog.server.data.RepositoryParserConfigBO; import org.chililog.server.data.Strings; import org.chililog.server.data.RepositoryFieldConfigBO.DataType; import org.chililog.server.data.RepositoryConfigBO.MaxMemoryPolicy; import org.chililog.server.data.RepositoryConfigBO.Status; import org.chililog.server.data.RepositoryParserConfigBO.AppliesTo; import org.chililog.server.data.RepositoryParserConfigBO.ParseFieldErrorHandling; import org.chililog.server.engine.parsers.DelimitedEntryParser; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBObject; /** * Tests RepositoryInfoBO and RepositoryInfoController * * @author vibul * */ public class RepositoryConfigTest { private static DB _db; @BeforeClass public static void classSetup() throws Exception { _db = MongoConnection.getInstance().getConnection(); assertNotNull(_db); // Clean up old test data if any exists DBCollection coll = _db.getCollection(RepositoryConfigController.MONGODB_COLLECTION_NAME); Pattern pattern = Pattern.compile("^repo_info_test[\\w]*$"); DBObject query = new BasicDBObject(); query.put(RepositoryConfigBO.NAME_FIELD_NAME, pattern); coll.remove(query); } @AfterClass public static void classTeardown() { // Clean up old test data if any exists DBCollection coll = _db.getCollection(RepositoryConfigController.MONGODB_COLLECTION_NAME); Pattern pattern = Pattern.compile("^repo_info_test[\\w]*$"); DBObject query = new BasicDBObject(); query.put(RepositoryConfigBO.NAME_FIELD_NAME, pattern); coll.remove(query); } @Test(expected = ChiliLogException.class) public void testGetNotFound() throws ChiliLogException { RepositoryConfigController.getInstance().getByName(_db, "notfound"); } @Test public void testTryGetNotFound() throws ChiliLogException { RepositoryConfigBO repoInfo = RepositoryConfigController.getInstance().tryGetByName(_db, "notfound"); assertNull(repoInfo); } @Test public void testCRUD() throws ChiliLogException { // Insert RepositoryConfigBO repoConfig = new RepositoryConfigBO(); repoConfig.setName("repo_info_test1"); repoConfig.setDisplayName("Test 1"); repoConfig.setDescription("description"); repoConfig.setStoreEntriesIndicator(true); repoConfig.setStorageQueueDurableIndicator(true); repoConfig.setStorageQueueWorkerCount(10); repoConfig.setStorageMaxKeywords(100); repoConfig.setMaxMemory(100); repoConfig.setMaxMemoryPolicy(MaxMemoryPolicy.BLOCK); repoConfig.setPageSize(2); repoConfig.setPageCountCache(1); RepositoryParserConfigBO repoParserConfig = new RepositoryParserConfigBO(); repoParserConfig.setName("parser1"); repoParserConfig.setAppliesTo(AppliesTo.All); repoParserConfig.setClassName(DelimitedEntryParser.class.getName()); repoParserConfig.setMaxKeywords(1L); repoParserConfig.setParseFieldErrorHandling(ParseFieldErrorHandling.SkipEntry); repoParserConfig.getProperties().put("key1", "value11"); repoParserConfig.getProperties().put("key2", "value12"); repoParserConfig.getProperties().put("key3", "value13"); repoConfig.getParsers().add(repoParserConfig); RepositoryFieldConfigBO repoFieldConfig = new RepositoryFieldConfigBO(); repoFieldConfig.setName("field1"); repoFieldConfig.setDisplayName("Field Number 1"); repoFieldConfig.setDescription("description"); repoFieldConfig.setDataType(RepositoryFieldConfigBO.DataType.String); repoFieldConfig.getProperties().put("key1", "value11"); repoFieldConfig.getProperties().put("key2", "value12"); repoFieldConfig.getProperties().put("key3", "value13"); repoParserConfig.getFields().add(repoFieldConfig); repoFieldConfig = new RepositoryFieldConfigBO(); repoFieldConfig.setName("field2"); repoFieldConfig.setDisplayName("Field Number 2"); repoFieldConfig.setDescription("description"); repoFieldConfig.setDataType(RepositoryFieldConfigBO.DataType.Integer); repoFieldConfig.getProperties().put("key1", "value21"); repoFieldConfig.getProperties().put("key2", "value22"); repoFieldConfig.getProperties().put("key3", "value23"); repoParserConfig.getFields().add(repoFieldConfig); assertFalse(repoConfig.isExistingRecord()); assertNull(repoConfig.getDocumentID()); assertEquals(-1, repoConfig.getDocumentVersion()); RepositoryConfigController.getInstance().save(_db, repoConfig); assertTrue(repoConfig.isExistingRecord()); assertNotNull(repoConfig.getDocumentID()); assertEquals(1, repoConfig.getDocumentVersion()); // Get RepositoryConfigBO repoConfig2 = RepositoryConfigController.getInstance().getByName(_db, "repo_info_test1"); assertEquals("repo_info_test1", repoConfig2.getName()); assertEquals("Test 1", repoConfig2.getDisplayName()); assertEquals("description", repoConfig2.getDescription()); assertEquals("repo.repo_info_test1", repoConfig2.getPubSubAddress()); assertEquals("repo.repo_info_test1.storage", repoConfig2.getStorageQueueName()); assertEquals(Status.ONLINE, repoConfig2.getStartupStatus()); assertEquals(true, repoConfig2.getStoreEntriesIndicator()); assertEquals(true, repoConfig2.getStorageQueueDurableIndicator()); assertEquals(10, repoConfig2.getStorageQueueWorkerCount()); assertEquals(100L, repoConfig2.getStorageMaxKeywords()); assertEquals(100, repoConfig2.getMaxMemory()); assertEquals(MaxMemoryPolicy.BLOCK, repoConfig2.getMaxMemoryPolicy()); assertEquals(2, repoConfig2.getPageSize()); assertEquals(1, repoConfig2.getPageCountCache()); assertEquals(1, repoConfig2.getParsers().size()); RepositoryParserConfigBO repoParserConfig2 = repoConfig2.getParsers().get(0); assertEquals("parser1", repoParserConfig2.getName()); assertEquals(AppliesTo.All, repoParserConfig2.getAppliesTo()); assertEquals(DelimitedEntryParser.class.getName(), repoParserConfig2.getClassName()); assertEquals(1L, repoParserConfig2.getMaxKeywords()); assertEquals(ParseFieldErrorHandling.SkipEntry, repoParserConfig2.getParseFieldErrorHandling()); Hashtable<String, String> ht2 = repoParserConfig2.getProperties(); assertEquals(3, ht2.keySet().size()); assertTrue(ht2.containsKey("key1")); assertEquals("value11", ht2.get("key1")); assertTrue(ht2.containsKey("key2")); assertEquals("value12", ht2.get("key2")); assertTrue(ht2.containsKey("key3")); assertEquals("value13", ht2.get("key3")); ArrayList<RepositoryFieldConfigBO> f2 = repoParserConfig2.getFields(); assertEquals(2, f2.size()); assertEquals("field1", f2.get(0).getName()); assertEquals("Field Number 1", f2.get(0).getDisplayName()); assertEquals("description", f2.get(0).getDescription()); assertEquals(DataType.String, f2.get(0).getDataType()); ht2 = f2.get(0).getProperties(); assertEquals(3, ht2.keySet().size()); assertTrue(ht2.containsKey("key1")); assertEquals("value11", ht2.get("key1")); assertTrue(ht2.containsKey("key2")); assertEquals("value12", ht2.get("key2")); assertTrue(ht2.containsKey("key3")); assertEquals("value13", ht2.get("key3")); assertEquals("field2", f2.get(1).getName()); assertEquals("Field Number 2", f2.get(1).getDisplayName()); assertEquals("description", f2.get(1).getDescription()); assertEquals(DataType.Integer, f2.get(1).getDataType()); ht2 = f2.get(1).getProperties(); assertEquals(3, ht2.keySet().size()); assertTrue(ht2.containsKey("key1")); assertEquals("value21", ht2.get("key1")); assertTrue(ht2.containsKey("key2")); assertEquals("value22", ht2.get("key2")); assertTrue(ht2.containsKey("key3")); assertEquals("value23", ht2.get("key3")); // Update repoConfig.setName("repo_info_test1x"); repoConfig.setDisplayName("Test 1x"); repoConfig.setDescription("description x"); repoConfig.setStartupStatus(Status.OFFLINE); repoConfig.setStoreEntriesIndicator(false); repoConfig.setStorageQueueDurableIndicator(false); repoConfig.setStorageQueueWorkerCount(100); repoConfig.setStorageMaxKeywords(200); repoConfig.setMaxMemory(210); repoConfig.setMaxMemoryPolicy(MaxMemoryPolicy.DROP); repoConfig.setPageSize(22); repoConfig.setPageCountCache(10); repoParserConfig.setClassName("com.chililog.server.data.DeclimitedRepositoryParserX"); repoParserConfig.setMaxKeywords(2); repoParserConfig.setParseFieldErrorHandling(ParseFieldErrorHandling.SkipFieldIgnoreError); repoParserConfig.getProperties().put("key1", "value11x"); repoParserConfig.getProperties().put("key4", "value14x"); repoParserConfig.getProperties().remove("key3"); repoParserConfig.getFields().remove(1); repoFieldConfig = repoParserConfig.getFields().get(0); repoFieldConfig.setName("field1x"); repoFieldConfig.setDisplayName("Field Number 1x"); repoFieldConfig.setDescription("description x"); repoFieldConfig.setDataType(RepositoryFieldConfigBO.DataType.Boolean); repoFieldConfig.getProperties().put("key1", "value11x"); repoFieldConfig.getProperties().put("key4", "value14x"); repoFieldConfig.getProperties().remove("key3"); RepositoryConfigController.getInstance().save(_db, repoConfig); assertEquals(2, repoConfig.getDocumentVersion()); repoConfig2 = RepositoryConfigController.getInstance().getByName(_db, "repo_info_test1x"); assertEquals("repo_info_test1x", repoConfig2.getName()); assertEquals("Test 1x", repoConfig2.getDisplayName()); assertEquals("description x", repoConfig2.getDescription()); assertEquals(Status.OFFLINE, repoConfig2.getStartupStatus()); assertEquals(false, repoConfig2.getStoreEntriesIndicator()); assertEquals(false, repoConfig2.getStorageQueueDurableIndicator()); assertEquals(100, repoConfig2.getStorageQueueWorkerCount()); assertEquals(200L, repoConfig2.getStorageMaxKeywords()); assertEquals(210, repoConfig2.getMaxMemory()); assertEquals(MaxMemoryPolicy.DROP, repoConfig2.getMaxMemoryPolicy()); assertEquals(22, repoConfig2.getPageSize()); assertEquals(10, repoConfig2.getPageCountCache()); assertEquals(2, repoConfig2.getDocumentVersion()); repoParserConfig2 = repoConfig2.getParsers().get(0); assertEquals("parser1", repoParserConfig2.getName()); assertEquals(AppliesTo.All, repoParserConfig2.getAppliesTo()); assertEquals("com.chililog.server.data.DeclimitedRepositoryParserX", repoParserConfig2.getClassName()); assertEquals(2L, repoParserConfig2.getMaxKeywords()); assertEquals(ParseFieldErrorHandling.SkipFieldIgnoreError, repoParserConfig2.getParseFieldErrorHandling()); ht2 = repoParserConfig2.getProperties(); assertEquals(3, ht2.keySet().size()); assertTrue(ht2.containsKey("key1")); assertEquals("value11x", ht2.get("key1")); assertTrue(ht2.containsKey("key2")); assertEquals("value12", ht2.get("key2")); assertFalse(ht2.containsKey("key3")); assertTrue(ht2.containsKey("key4")); assertEquals("value14x", ht2.get("key4")); f2 = repoParserConfig2.getFields(); assertEquals(1, f2.size()); assertEquals("field1x", f2.get(0).getName()); assertEquals("Field Number 1x", f2.get(0).getDisplayName()); assertEquals("description x", f2.get(0).getDescription()); assertEquals(DataType.Boolean, f2.get(0).getDataType()); ht2 = f2.get(0).getProperties(); assertEquals(3, ht2.keySet().size()); assertTrue(ht2.containsKey("key1")); assertEquals("value11x", ht2.get("key1")); assertTrue(ht2.containsKey("key2")); assertEquals("value12", ht2.get("key2")); assertFalse(ht2.containsKey("key3")); assertTrue(ht2.containsKey("key4")); assertEquals("value14x", ht2.get("key4")); // Get by id String id = repoConfig2.getDocumentID().toString(); RepositoryConfigBO repoInfo3 = RepositoryConfigController.getInstance().get(_db, new ObjectId(id)); assertEquals("repo_info_test1x", repoInfo3.getName()); // Remove RepositoryConfigController.getInstance().remove(_db, repoConfig); // Get again repoConfig2 = RepositoryConfigController.getInstance().tryGetByName(_db, "repo_info_test1"); assertNull(repoConfig2); repoConfig2 = RepositoryConfigController.getInstance().tryGetByName(_db, "repo_info_test2"); assertNull(repoConfig2); // Remove again should not throw an error RepositoryConfigController.getInstance().remove(_db, repoConfig); } @Test public void testDuplicateFieldName() throws ChiliLogException { try { // Insert RepositoryConfigBO repoConfig = new RepositoryConfigBO(); repoConfig.setName("repo_info_test4"); RepositoryParserConfigBO repoParserConfig = new RepositoryParserConfigBO(); repoParserConfig.setName("parser1"); repoParserConfig.setAppliesTo(AppliesTo.All); repoParserConfig.setClassName(DelimitedEntryParser.class.getName()); repoConfig.getParsers().add(repoParserConfig); RepositoryFieldConfigBO repoFieldConfig = new RepositoryFieldConfigBO(); repoFieldConfig.setName("field1"); repoFieldConfig.setDisplayName("Field Number 1"); repoFieldConfig.setDescription("description"); repoFieldConfig.setDataType(RepositoryFieldConfigBO.DataType.String); repoFieldConfig.getProperties().put("key1", "value11"); repoFieldConfig.getProperties().put("key2", "value12"); repoFieldConfig.getProperties().put("key3", "value13"); repoParserConfig.getFields().add(repoFieldConfig); repoFieldConfig = new RepositoryFieldConfigBO(); repoFieldConfig.setName("field1"); repoFieldConfig.setDisplayName("Field Number 2"); repoFieldConfig.setDescription("description"); repoFieldConfig.setDataType(RepositoryFieldConfigBO.DataType.Integer); repoFieldConfig.getProperties().put("key1", "value21"); repoFieldConfig.getProperties().put("key2", "value22"); repoFieldConfig.getProperties().put("key3", "value23"); repoParserConfig.getFields().add(repoFieldConfig); RepositoryConfigController.getInstance().save(_db, repoConfig); fail("Exception expected"); } catch (ChiliLogException ex) { assertEquals(Strings.REPO_INFO_DUPLICATE_FIELD_NAME_ERROR, ex.getErrorCode()); } } @Test public void testDuplicateParserName() throws ChiliLogException { try { // Insert RepositoryConfigBO repoConfig = new RepositoryConfigBO(); repoConfig.setName("repo_info_test5"); RepositoryParserConfigBO repoParserConfig = new RepositoryParserConfigBO(); repoParserConfig.setName("parser1"); repoParserConfig.setAppliesTo(AppliesTo.All); repoParserConfig.setClassName(DelimitedEntryParser.class.getName()); repoConfig.getParsers().add(repoParserConfig); repoParserConfig = new RepositoryParserConfigBO(); repoParserConfig.setName("parser1"); repoParserConfig.setAppliesTo(AppliesTo.All); repoParserConfig.setClassName(DelimitedEntryParser.class.getName()); repoConfig.getParsers().add(repoParserConfig); RepositoryConfigController.getInstance().save(_db, repoConfig); fail("Exception expected"); } catch (ChiliLogException ex) { assertEquals(Strings.REPO_INFO_DUPLICATE_PARSER_NAME_ERROR, ex.getErrorCode()); } } @Test public void testDuplicateName() throws ChiliLogException { try { RepositoryConfigBO repoConfig = new RepositoryConfigBO(); repoConfig.setName("repo_info_test3"); RepositoryConfigController.getInstance().save(_db, repoConfig); RepositoryConfigBO repoConfig2 = new RepositoryConfigBO(); repoConfig2.setName("repo_info_test3"); RepositoryConfigController.getInstance().save(_db, repoConfig2); fail("Exception expected"); } catch (ChiliLogException ex) { assertEquals(Strings.REPO_INFO_DUPLICATE_NAME_ERROR, ex.getErrorCode()); } } @Test public void testBadName() throws ChiliLogException { try { RepositoryConfigBO repoConfig = new RepositoryConfigBO(); repoConfig.setName("bad name"); RepositoryConfigController.getInstance().save(_db, repoConfig); fail("Exception expected"); } catch (ChiliLogException ex) { assertEquals(Strings.REPO_INFO_NAME_FORMAT_ERROR, ex.getErrorCode()); } } @Test public void testBadPageFileSize() throws ChiliLogException { try { RepositoryConfigBO repoConfig = new RepositoryConfigBO(); repoConfig.setName("badfilesize"); repoConfig.setMaxMemory(1); repoConfig.setPageSize(2); RepositoryConfigController.getInstance().save(_db, repoConfig); fail("Exception expected"); } catch (ChiliLogException ex) { assertEquals(Strings.REPO_INFO_PAGE_FILE_SIZE_ERROR, ex.getErrorCode()); } } @Test public void testList() throws ChiliLogException { // Insert RepositoryConfigBO repoConfig = new RepositoryConfigBO(); repoConfig.setName("repo_info_testlist4"); RepositoryConfigController.getInstance().save(_db, repoConfig); RepositoryConfigBO repoConfig2 = new RepositoryConfigBO(); repoConfig2.setName("repo_info_testlist5"); RepositoryConfigController.getInstance().save(_db, repoConfig2); List<RepositoryConfigBO> list = null; // *************************** // Name pattern // *************************** RepositoryConfigListCriteria criteria = new RepositoryConfigListCriteria(); criteria.setNamePattern("^repo_info_testlist[\\w]*$"); list = RepositoryConfigController.getInstance().getList(_db, criteria); assertEquals(2, list.size()); assertEquals("repo_info_testlist4", list.get(0).getName()); assertEquals("repo_info_testlist5", list.get(1).getName()); criteria = new RepositoryConfigListCriteria(); criteria.setNamePattern("^no matches for sure[\\w]*$"); list = RepositoryConfigController.getInstance().getList(_db, criteria); assertEquals(0, list.size()); } }