/*
* (C) Copyright 2006-2007 Nuxeo SA (http://nuxeo.com/) and others.
*
* 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.
*
* Contributors:
* Nuxeo - initial API and implementation
*
* $Id: TestEventConfService.java 28493 2008-01-04 19:51:30Z sfermigier $
*/
package org.nuxeo.ecm.platform.audit;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import org.junit.Test;
import org.junit.Ignore;
import static org.junit.Assert.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuxeo.ecm.platform.audit.api.ExtendedInfo;
import org.nuxeo.ecm.platform.audit.api.FilterMapEntry;
import org.nuxeo.ecm.platform.audit.api.LogEntry;
import org.nuxeo.ecm.platform.audit.api.query.AuditQueryException;
import org.nuxeo.ecm.platform.audit.api.query.DateRangeParser;
import org.nuxeo.ecm.platform.audit.impl.ExtendedInfoImpl;
import org.nuxeo.ecm.platform.audit.impl.LogEntryImpl;
import org.nuxeo.ecm.platform.audit.service.LogEntryProvider;
/**
* Test the log entries persistence
*
* @author Stephane Lacoin (Nuxeo EP Software Engineer)
*/
public class TestLogEntryProvider extends PersistenceTestCase {
protected static final Log log = LogFactory.getLog(TestLogEntryProvider.class);
private LogEntryProvider providerUnderTest;
@Override
protected void handleAfterSetup(EntityManager entityManager) {
providerUnderTest = LogEntryProvider.createProvider(entityManager);
}
protected Map<String, ExtendedInfo> createExtendedInfos() {
Map<String, ExtendedInfo> infos = new HashMap<String, ExtendedInfo>();
ExtendedInfo info = ExtendedInfoImpl.createExtendedInfo(new Long(1));
infos.put("id", info);
return infos;
}
protected String eventId() {
return TestLogEntryProvider.class.getSimpleName();
}
protected String[] eventIds() {
return new String[] { eventId() };
}
protected LogEntry doCreateEntry(String docId, String repositoryId) {
LogEntry createdEntry = new LogEntryImpl();
createdEntry.setEventId(eventId());
createdEntry.setDocUUID(docId);
createdEntry.setEventDate(new Date());
createdEntry.setDocPath("/" + docId);
createdEntry.setRepositoryId(repositoryId);
createdEntry.setExtendedInfos(createExtendedInfos());
return createdEntry;
}
protected LogEntry doCreateEntryAndPersist(String docId, String repositoryId) {
LogEntry entry = doCreateEntry(docId, repositoryId);
entityManager.persist(entry);
return entry;
}
protected LogEntry doCreateEntryAndPersist(String docId) {
return doCreateEntryAndPersist(docId, "test");
}
protected List<LogEntry> doEncapsulate(LogEntry entry) {
List<LogEntry> entries = new ArrayList<LogEntry>(1);
entries.add(entry);
return entries;
}
@Test
public void testAddLogEntry() {
LogEntry entry = doCreateEntry("id", "test");
providerUnderTest.addLogEntry(entry);
boolean hasId = entry.getId() != 0;
assertTrue(hasId);
}
@Test
public void testHavingKey() {
LogEntry entry = doCreateEntryAndPersist("id");
providerUnderTest.addLogEntry(entry);
List<LogEntry> entries = providerUnderTest.nativeQueryLogs(
"log.id = " + entry.getId() + " and log.extendedInfos['id'] is not null", 1, 10);
assertEquals(1, entries.size());
assertEquals(new Long(1L), entries.get(0).getExtendedInfos().get("id").getValue(Long.class));
}
@Test
public void testByUUID() {
LogEntry entry = doCreateEntryAndPersist("id");
providerUnderTest.addLogEntry(entry);
List<LogEntry> fetchedEntries = providerUnderTest.getLogEntriesFor("id");
assertNotNull(fetchedEntries);
int entriesCount = fetchedEntries.size();
assertEquals(1, entriesCount);
LogEntry fetchedEntry = fetchedEntries.get(0);
assertNotNull(fetchedEntry);
assertEquals("id", fetchedEntry.getDocUUID());
}
@Test
public void testByUuidAndRepository() {
LogEntry entry1 = doCreateEntryAndPersist("id", "repository1");
providerUnderTest.addLogEntry(entry1);
LogEntry entry2 = doCreateEntryAndPersist("id", "repository2");
providerUnderTest.addLogEntry(entry2);
List<LogEntry> fetchedEntries = providerUnderTest.getLogEntriesFor("id");
assertNotNull(fetchedEntries);
int entriesCount = fetchedEntries.size();
assertEquals(2, entriesCount);
List<LogEntry> fetchedEntries1 = providerUnderTest.getLogEntriesFor("id", "repository1");
assertNotNull(fetchedEntries1);
int entriesCount1 = fetchedEntries1.size();
assertEquals(1, entriesCount1);
List<LogEntry> fetchedEntries2 = providerUnderTest.getLogEntriesFor("id", "repository2");
assertNotNull(fetchedEntries2);
int entriesCount2 = fetchedEntries2.size();
assertEquals(1, entriesCount2);
LogEntry fetchedEntry1 = fetchedEntries1.get(0);
assertNotNull(fetchedEntry1);
assertEquals("id", fetchedEntry1.getDocUUID());
assertEquals("repository1", fetchedEntry1.getRepositoryId());
LogEntry fetchedEntry2 = fetchedEntries2.get(0);
assertNotNull(fetchedEntry2);
assertEquals("id", fetchedEntry2.getDocUUID());
assertEquals("repository2", fetchedEntry2.getRepositoryId());
}
@SuppressWarnings("deprecation")
@Test
public void testByFilter() throws Exception {
LogEntry one = doCreateEntryAndPersist("id");
Thread.sleep(1000);
@SuppressWarnings("unused")
LogEntry two = doCreateEntryAndPersist("id");
Map<String, FilterMapEntry> filters = new HashMap<String, FilterMapEntry>();
FilterMapEntry filterOne = new FilterMapEntry();
filterOne.setQueryParameterName("yop");
filterOne.setColumnName("eventDate");
filterOne.setOperator("=");
filterOne.setObject(one.getEventDate());
filters.put("oups", filterOne);
List<LogEntry> entries = providerUnderTest.getLogEntriesFor("id", filters, true);
assertNotNull(entries);
assertEquals(1, entries.size());
assertEquals(one.getId(), entries.get(0).getId());
}
@Test
public void testById() {
LogEntry one = doCreateEntryAndPersist("id");
LogEntry fetchedEntry = providerUnderTest.getLogEntryByID(one.getId());
assertNotNull(fetchedEntry);
assertEquals(one.getId(), fetchedEntry.getId());
}
@Test
public void testByNativeQuery() {
doCreateEntryAndPersist("one");
doCreateEntryAndPersist("two");
List<LogEntry> entries = providerUnderTest.nativeQueryLogs(
"log.extendedInfos['id'] is not null order by log.eventDate desc", 2, 1);
assertNotNull(entries);
int entryCount = entries.size();
assertEquals(1, entryCount);
}
@Test
public void testDateRange() throws AuditQueryException {
Date now = new Date();
Date nowMinusOneHour = DateRangeParser.parseDateRangeQuery(now, "-1h");
LogEntry one = doCreateEntryAndPersist("one");
one.setEventDate(nowMinusOneHour);
LogEntry two = doCreateEntryAndPersist("two");
two.setEventDate(now);
entityManager.flush();
List<LogEntry> entries = providerUnderTest.queryLogs(eventIds(), "-40m");
assertNotNull(entries);
int entryCount = entries.size();
assertEquals(1, entryCount);
}
@Test
public void testLogsByPage() throws Exception {
LogEntry one = doCreateEntryAndPersist("one");
Thread.sleep(1000);
Date limit = new Date();
@SuppressWarnings("unused")
LogEntry two = doCreateEntryAndPersist("two");
LogEntry three = doCreateEntryAndPersist("three");
one.setCategory("nuch");
three.setCategory("nuch");
String[] categories = { "nuch" };
List<LogEntry> entries = providerUnderTest.queryLogsByPage(eventIds(), limit, categories, "/", 1, 1);
assertNotNull(entries);
int entryCount = entries.size();
assertEquals(1, entryCount);
assertEquals("three", entries.get(0).getDocUUID());
}
@Test
public void testRemove() {
@SuppressWarnings("unused")
LogEntry one = doCreateEntryAndPersist("one");
@SuppressWarnings("unused")
LogEntry two = doCreateEntryAndPersist("two");
@SuppressWarnings("unused")
LogEntry three = doCreateEntryAndPersist("three");
int count = providerUnderTest.removeEntries(eventId(), "/");
assertEquals(3, count);
}
@Test
public void testCountEventsById() {
LogEntry one = doCreateEntryAndPersist("one");
String eventId = one.getEventId();
Long count = providerUnderTest.countEventsById(eventId);
assertEquals(new Long(1), count);
}
@Test
public void testQuery() {
LogEntry one = doCreateEntryAndPersist("one");
@SuppressWarnings("unused")
LogEntry two = doCreateEntryAndPersist("two");
LogEntry three = doCreateEntryAndPersist("three");
one.setCategory("nuch");
three.setCategory("nuch");
List<?> entries = providerUnderTest.nativeQuery(
"select log.eventId, count(*) from LogEntry log where log.eventId = 'TestLogEntryProvider' group by log.eventId",
1, 1);
assertNotNull(entries);
int entryCount = entries.size();
assertEquals(1, entryCount);
Object[] entry = (Object[]) entries.get(0);
String name = (String) entry[0];
Long count = (Long) entry[1];
assertEquals("TestLogEntryProvider", name);
assertEquals(new Long(3L), count);
}
@Test
@Ignore
public void testEventIds() {
String eventId = eventId();
@SuppressWarnings("unused")
LogEntry one = doCreateEntryAndPersist("one");
@SuppressWarnings("unused")
LogEntry two = doCreateEntryAndPersist("two");
List<String> eventIds = providerUnderTest.findEventIds();
assertEquals(1, eventIds.size());
assertEquals(eventId, eventIds.get(0));
}
}