/*
* (C) Copyright 2014 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:
* Thierry Delprat
*/
package org.nuxeo.ecm.platform.audit;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.io.Serializable;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import javax.inject.Inject;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.nuxeo.ecm.core.api.CoreSession;
import org.nuxeo.ecm.core.api.DocumentModel;
import org.nuxeo.ecm.core.api.VersioningOption;
import org.nuxeo.ecm.core.test.annotations.RepositoryConfig;
import org.nuxeo.ecm.core.test.annotations.RepositoryInit;
import org.nuxeo.ecm.core.versioning.VersioningService;
import org.nuxeo.ecm.platform.audit.TestDocumentAuditPageProvider.Pfouh;
import org.nuxeo.ecm.platform.audit.api.AuditReader;
import org.nuxeo.ecm.platform.audit.api.DocumentHistoryReader;
import org.nuxeo.ecm.platform.audit.api.LogEntry;
import org.nuxeo.ecm.platform.audit.api.document.DocumentHistoryPageProvider;
import org.nuxeo.ecm.platform.query.api.PageProvider;
import org.nuxeo.ecm.platform.query.api.PageProviderDefinition;
import org.nuxeo.ecm.platform.query.api.PageProviderService;
import org.nuxeo.runtime.api.Framework;
import org.nuxeo.runtime.test.runner.Features;
import org.nuxeo.runtime.test.runner.FeaturesRunner;
import org.nuxeo.runtime.test.runner.LocalDeploy;
/**
* Test the {@link DocumentHistoryPageProvider}
*
* @author <a href="mailto:tdelprat@nuxeo.com">Tiry</a>
*/
@RunWith(FeaturesRunner.class)
@Features(AuditFeature.class)
@LocalDeploy("org.nuxeo.ecm.platform.audit.tests:test-pageprovider-contrib.xml")
@RepositoryConfig(init = Pfouh.class)
public class TestDocumentAuditPageProvider {
protected static final Calendar testDate = Calendar.getInstance();
@Inject
AuditReader reader;
@Inject
CoreSession session;
protected static Pfouh pfouh;
public static class Pfouh implements RepositoryInit {
{
pfouh = this;
}
protected boolean verbose = false;
DocumentModel doc;
DocumentModel proxy;
List<DocumentModel> versions;
protected static void sleep(long millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
@Override
public void populate(CoreSession session) {
DocumentModel section = session.createDocumentModel("/", "section", "Folder");
section = session.createDocument(section);
doc = session.createDocumentModel("/", "doc", "File");
doc.setPropertyValue("dc:title", "TestDoc");
// create the doc
doc = session.createDocument(doc);
sleep(10);
// do some updates
for (int i = 0; i < 5; i++) {
doc.setPropertyValue("dc:description", "Update " + i);
doc.putContextData("comment", "Update " + i);
doc = session.saveDocument(doc);
session.save();
sleep(10);
}
// create a version
doc.putContextData(VersioningService.VERSIONING_OPTION, VersioningOption.MINOR);
doc = session.saveDocument(doc);
session.save();
sleep(10);
// do some more updates
for (int i = 5; i < 10; i++) {
doc.setPropertyValue("dc:description", "Update " + i);
doc.putContextData("comment", "Update " + i);
doc = session.saveDocument(doc);
session.save();
sleep(10);
}
proxy = session.publishDocument(doc, section);
session.save();
sleep(10);
// do some more updates
for (int i = 10; i < 15; i++) {
doc.setPropertyValue("dc:description", "Update " + i);
doc.putContextData("comment", "Update " + i);
doc = session.saveDocument(doc);
session.save();
sleep(10);
}
versions = session.getVersions(doc.getRef());
assertEquals(2, versions.size());
}
}
@Test
public void testDocumentHistoryPageProvider() throws Exception {
PageProviderService pps = Framework.getService(PageProviderService.class);
assertNotNull(pps);
PageProviderDefinition ppdef = pps.getPageProviderDefinition("DOCUMENT_HISTORY_PROVIDER");
assertNotNull(ppdef);
PageProvider<?> pp = pps.getPageProvider("DOCUMENT_HISTORY_PROVIDER", null, Long.valueOf(20), Long.valueOf(0),
new HashMap<String, Serializable>(), pfouh.doc);
DocumentModel searchDoc = session.createDocumentModel("BasicAuditSearch");
searchDoc.setPathInfo("/", "auditsearch");
searchDoc = session.createDocument(searchDoc);
pp.setSearchDocumentModel(searchDoc);
assertNotNull(pp);
// Get Live doc history
List<LogEntry> entries = (List<LogEntry>) pp.getCurrentPage();
// create, 15+1 update , 2 checkin
assertEquals(19, entries.size());
long startId = entries.get(entries.size() - 1).getId();
// Get Proxy history
pp = pps.getPageProvider("DOCUMENT_HISTORY_PROVIDER", null, Long.valueOf(20), Long.valueOf(0),
new HashMap<String, Serializable>(), pfouh.proxy);
pp.setSearchDocumentModel(searchDoc);
entries = (List<LogEntry>) pp.getCurrentPage();
// 19 - 5 updates + create + proxyPublished
int proxyEntriesCount = 19 - 5 + 1 + 1;
assertEquals(proxyEntriesCount, entries.size());
assertEquals(startId, entries.get(proxyEntriesCount - 1).getId());
assertEquals(startId + proxyEntriesCount + 1, entries.get(0).getId());
// Get version 1 history
pp = pps.getPageProvider("DOCUMENT_HISTORY_PROVIDER", null, Long.valueOf(20), Long.valueOf(0),
new HashMap<String, Serializable>(), pfouh.versions.get(0));
pp.setSearchDocumentModel(searchDoc);
entries = (List<LogEntry>) pp.getCurrentPage();
// creation + 5 updates + update + checkin + created
int version1EntriesCount = 1 + 5 + 1 + 1 + 1;
if (version1EntriesCount == entries.size()) {
assertEquals(startId, entries.get(version1EntriesCount - 1).getId());
assertEquals(startId + version1EntriesCount - 1, entries.get(0).getId());
} else {
// because update even may be 1ms behind checkin/created !
assertEquals(entries.toString(), version1EntriesCount - 1, entries.size());
}
// get version 2 history
pp = pps.getPageProvider("DOCUMENT_HISTORY_PROVIDER", null, Long.valueOf(20), Long.valueOf(0),
new HashMap<String, Serializable>(), pfouh.versions.get(1));
pp.setSearchDocumentModel(searchDoc);
entries = (List<LogEntry>) pp.getCurrentPage();
// creation + 5x2 updates + checkin/update + checkin + created
int versin2EntriesCount = 1 + 5 * 2 + 1 + 1 + 1 + 1;
assertEquals(versin2EntriesCount, entries.size());
assertEquals(startId, entries.get(versin2EntriesCount - 1).getId());
assertEquals(startId + versin2EntriesCount, entries.get(0).getId());
}
@Inject
DocumentHistoryReader history;
@Test
@Ignore("NXP-21530")
public void testDocumentHistoryReader() throws Exception {
List<LogEntry> entries = history.getDocumentHistory(pfouh.versions.get(1), 0, 20);
assertNotNull(entries);
// creation + 5x2 updates + checkin/update + checkin + created
int versin2EntriesCount = 1 + 5 * 2 + 1 + 1 + 1 + 1;
assertEquals(versin2EntriesCount, entries.size());
}
}