org.roda.core.plugins.PluginReportContentTest.java Source code

Java tutorial

Introduction

Here is the source code for org.roda.core.plugins.PluginReportContentTest.java

Source

/**
 * The contents of this file are subject to the license and copyright
 * detailed in the LICENSE file at the root of the source
 * tree and available online at
 *
 * https://github.com/keeps/roda
 */
package org.roda.core.plugins;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.PosixFilePermissions;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.RandomStringUtils;
import org.apache.solr.client.solrj.SolrServerException;
import org.roda.core.RodaCoreFactory;
import org.roda.core.TestsHelper;
import org.roda.core.common.monitor.TransferredResourcesScanner;
import org.roda.core.data.common.RodaConstants;
import org.roda.core.data.exceptions.AlreadyExistsException;
import org.roda.core.data.exceptions.AuthorizationDeniedException;
import org.roda.core.data.exceptions.GenericException;
import org.roda.core.data.exceptions.InvalidParameterException;
import org.roda.core.data.exceptions.NotFoundException;
import org.roda.core.data.exceptions.RODAException;
import org.roda.core.data.exceptions.RequestNotValidException;
import org.roda.core.data.v2.index.IndexResult;
import org.roda.core.data.v2.index.IndexRunnable;
import org.roda.core.data.v2.index.filter.Filter;
import org.roda.core.data.v2.index.select.SelectedItemsList;
import org.roda.core.data.v2.index.sort.Sorter;
import org.roda.core.data.v2.index.sublist.Sublist;
import org.roda.core.data.v2.ip.AIP;
import org.roda.core.data.v2.ip.IndexedAIP;
import org.roda.core.data.v2.ip.IndexedFile;
import org.roda.core.data.v2.ip.IndexedRepresentation;
import org.roda.core.data.v2.ip.Permissions;
import org.roda.core.data.v2.ip.TransferredResource;
import org.roda.core.data.v2.jobs.Job;
import org.roda.core.data.v2.jobs.PluginType;
import org.roda.core.data.v2.jobs.Report;
import org.roda.core.index.IndexService;
import org.roda.core.model.ModelService;
import org.roda.core.plugins.plugins.characterization.SiegfriedPlugin;
import org.roda.core.plugins.plugins.ingest.MinimalIngestPlugin;
import org.roda.core.plugins.plugins.ingest.TransferredResourceToAIPPlugin;
import org.roda.core.storage.fs.FSUtils;
import org.roda.core.util.IdUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.AssertJUnit;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

@Test(groups = { RodaConstants.TEST_GROUP_ALL, RodaConstants.TEST_GROUP_TRAVIS })
public class PluginReportContentTest {

    private static Path basePath;
    private static ModelService model;
    private static IndexService index;

    private static final Logger LOGGER = LoggerFactory.getLogger(PluginReportContentTest.class);

    private static final String CORPORA_PDF = "test.docx";
    private static final String CORPORA_TEST1 = "test1";
    private static final String CORPORA_TEST1_TXT = "test1.txt";
    private static final int GENERATED_FILE_SIZE = 100;
    private static final String AIP_CREATOR = "admin";

    @BeforeClass
    public static void setUp() throws Exception {
        basePath = TestsHelper.createBaseTempDir(PluginReportContentTest.class, true,
                PosixFilePermissions.asFileAttribute(new HashSet<>(Arrays.asList(PosixFilePermission.OWNER_READ,
                        PosixFilePermission.OWNER_WRITE, PosixFilePermission.OWNER_EXECUTE,
                        PosixFilePermission.OTHERS_READ, PosixFilePermission.OTHERS_EXECUTE))));

        boolean deploySolr = true;
        boolean deployLdap = true;
        boolean deployFolderMonitor = true;
        boolean deployOrchestrator = true;
        boolean deployPluginManager = true;
        boolean deployDefaultResources = false;
        RodaCoreFactory.instantiateTest(deploySolr, deployLdap, deployFolderMonitor, deployOrchestrator,
                deployPluginManager, deployDefaultResources);

        model = RodaCoreFactory.getModelService();
        index = RodaCoreFactory.getIndexService();

        LOGGER.debug("Running index tests under storage {}", basePath);
    }

    @AfterClass
    public void tearDown() throws Exception {
        RodaCoreFactory.shutdown();
        FSUtils.deletePath(basePath);
    }

    @AfterMethod
    public void cleanUp() throws RODAException {

        // delete all AIPs
        index.execute(IndexedAIP.class, Filter.ALL, new ArrayList<>(), new IndexRunnable<IndexedAIP>() {
            @Override
            public void run(IndexedAIP item)
                    throws GenericException, RequestNotValidException, AuthorizationDeniedException {
                try {
                    model.deleteAIP(item.getId());
                } catch (NotFoundException e) {
                    // do nothing
                }
            }
        });

        // delete all Transferred Resources
        index.execute(TransferredResource.class, Filter.ALL, new ArrayList<>(),
                new IndexRunnable<TransferredResource>() {

                    @Override
                    public void run(TransferredResource item)
                            throws GenericException, RequestNotValidException, AuthorizationDeniedException {
                        model.deleteTransferredResource(item);
                    }
                });
    }

    private ByteArrayInputStream generateContentData() {
        return new ByteArrayInputStream(RandomStringUtils.randomAscii(GENERATED_FILE_SIZE).getBytes());
    }

    private TransferredResource createCorpora() throws InterruptedException, IOException, NotFoundException,
            GenericException, RequestNotValidException, AlreadyExistsException {
        TransferredResourcesScanner f = RodaCoreFactory.getTransferredResourcesScanner();

        String parentUUID = f.createFolder(null, "test").getUUID();
        String test1UUID = f.createFolder(parentUUID, CORPORA_TEST1).getUUID();
        String test2UUID = f.createFolder(parentUUID, "test2").getUUID();
        String test3UUID = f.createFolder(parentUUID, "test3").getUUID();

        f.createFile(parentUUID, CORPORA_TEST1_TXT, generateContentData());
        f.createFile(parentUUID, "test2.txt", generateContentData());
        f.createFile(parentUUID, "test3.txt", generateContentData());
        f.createFile(test1UUID, CORPORA_TEST1_TXT, generateContentData());
        f.createFile(test1UUID, "test2.txt", generateContentData());
        f.createFile(test1UUID, "test3.txt", generateContentData());
        f.createFile(test2UUID, CORPORA_TEST1_TXT, generateContentData());
        f.createFile(test2UUID, "test2.txt", generateContentData());
        f.createFile(test2UUID, "test3.txt", generateContentData());
        f.createFile(test3UUID, CORPORA_TEST1_TXT, generateContentData());
        f.createFile(test3UUID, "test2.txt", generateContentData());
        f.createFile(test3UUID, "test3.txt", generateContentData());

        f.createFile(parentUUID, CORPORA_PDF, getClass().getResourceAsStream("/corpora/Media/" + CORPORA_PDF));

        index.commit(TransferredResource.class);

        return index.retrieve(TransferredResource.class, IdUtils.createUUID("test"), new ArrayList<>());
    }

    @Test
    private void ingestCorporaTest() throws RequestNotValidException, NotFoundException, GenericException,
            AlreadyExistsException, AuthorizationDeniedException, InvalidParameterException, InterruptedException,
            IOException, SolrServerException {
        AIP root = model.createAIP(null, RodaConstants.AIP_TYPE_MIXED, new Permissions(), AIP_CREATOR);

        TransferredResource transferredResource = createCorpora();
        AssertJUnit.assertEquals(transferredResource == null, false);

        Map<String, String> parameters = new HashMap<>();
        parameters.put(RodaConstants.PLUGIN_PARAMS_PARENT_ID, root.getId());
        parameters.put(RodaConstants.PLUGIN_PARAMS_SIP_TO_AIP_CLASS,
                TransferredResourceToAIPPlugin.class.getName());

        Job job = TestsHelper.executeJob(MinimalIngestPlugin.class, parameters, PluginType.SIP_TO_AIP,
                SelectedItemsList.create(TransferredResource.class, transferredResource.getUUID()));

        List<Report> jobReports = TestsHelper.getJobReports(index, job, true);
        AssertJUnit.assertEquals(1, jobReports.size());

        for (Report report : jobReports) {
            AssertJUnit.assertEquals(MinimalIngestPlugin.TOTAL_STEPS, report.getReports().size());
            Report first = report.getReports().get(0);
            Report last = report.getReports().get(MinimalIngestPlugin.TOTAL_STEPS - 1);
            AssertJUnit.assertEquals(false, report.getDateCreated().equals(report.getDateUpdated()));
            AssertJUnit.assertEquals(true, report.getDateCreated().equals(first.getDateCreated()));
            AssertJUnit.assertEquals(true, report.getDateUpdated().equals(last.getDateUpdated()));
        }
    }

    @Test
    public void siegfriedCorporaTestAIP() throws RODAException, ParseException, InterruptedException, IOException {
        AIP root = model.createAIP(null, RodaConstants.AIP_TYPE_MIXED, new Permissions(), AIP_CREATOR);

        TransferredResource transferredResource = createCorpora();
        AssertJUnit.assertEquals(transferredResource == null, false);

        Map<String, String> parameters = new HashMap<>();
        parameters.put(RodaConstants.PLUGIN_PARAMS_PARENT_ID, root.getId());
        parameters.put(RodaConstants.PLUGIN_PARAMS_SIP_TO_AIP_CLASS,
                TransferredResourceToAIPPlugin.class.getName());

        Job ingest = TestsHelper.executeJob(MinimalIngestPlugin.class, parameters, PluginType.SIP_TO_AIP,
                SelectedItemsList.create(TransferredResource.class, transferredResource.getUUID()));

        List<Report> ingestReports = TestsHelper.getJobReports(index, ingest, true);
        AssertJUnit.assertEquals(1, ingestReports.size());
        String aipId = ingestReports.get(0).getOutcomeObjectId();

        Job job = TestsHelper.executeJob(SiegfriedPlugin.class, new HashMap<String, String>(), PluginType.MISC,
                SelectedItemsList.create(AIP.class, aipId));

        List<Report> jobReports = TestsHelper.getJobReports(index, job, true);
        AssertJUnit.assertEquals(1, jobReports.size());

        Report report = jobReports.get(0);
        AssertJUnit.assertEquals(1, report.getReports().size());
        Report innerReport = report.getReports().get(0);
        AssertJUnit.assertEquals(false, report.getDateCreated().equals(report.getDateUpdated()));
        AssertJUnit.assertEquals(true, report.getDateCreated().equals(innerReport.getDateCreated()));
        AssertJUnit.assertEquals(true, report.getDateUpdated().equals(innerReport.getDateUpdated()));
    }

    @Test
    public void siegfriedCorporaTestRepresentation()
            throws RODAException, ParseException, InterruptedException, IOException {
        AIP root = model.createAIP(null, RodaConstants.AIP_TYPE_MIXED, new Permissions(), AIP_CREATOR);

        TransferredResource transferredResource = createCorpora();
        AssertJUnit.assertEquals(transferredResource == null, false);

        Map<String, String> parameters = new HashMap<>();
        parameters.put(RodaConstants.PLUGIN_PARAMS_PARENT_ID, root.getId());
        parameters.put(RodaConstants.PLUGIN_PARAMS_SIP_TO_AIP_CLASS,
                TransferredResourceToAIPPlugin.class.getName());

        Job ingest = TestsHelper.executeJob(MinimalIngestPlugin.class, parameters, PluginType.SIP_TO_AIP,
                SelectedItemsList.create(TransferredResource.class, transferredResource.getUUID()));

        List<Report> ingestReports = TestsHelper.getJobReports(index, ingest, true);
        AssertJUnit.assertEquals(1, ingestReports.size());

        IndexResult<IndexedRepresentation> reps = index.find(IndexedRepresentation.class, Filter.ALL, Sorter.NONE,
                new Sublist(0, 1), new ArrayList<String>());
        String representationUUID = reps.getResults().get(0).getUUID();

        Job job = TestsHelper.executeJob(SiegfriedPlugin.class, new HashMap<String, String>(), PluginType.MISC,
                SelectedItemsList.create(IndexedRepresentation.class, representationUUID));

        List<Report> jobReports = TestsHelper.getJobReports(index, job, true);
        AssertJUnit.assertEquals(1, jobReports.size());

        Report report = jobReports.get(0);
        AssertJUnit.assertEquals(1, report.getReports().size());
        Report innerReport = report.getReports().get(0);
        AssertJUnit.assertEquals(false, report.getDateCreated().equals(report.getDateUpdated()));
        AssertJUnit.assertEquals(true, report.getDateCreated().equals(innerReport.getDateCreated()));
        AssertJUnit.assertEquals(true, report.getDateUpdated().equals(innerReport.getDateUpdated()));
    }

    @Test
    public void siegfriedCorporaTestFile() throws RODAException, ParseException, InterruptedException, IOException {
        AIP root = model.createAIP(null, RodaConstants.AIP_TYPE_MIXED, new Permissions(), AIP_CREATOR);

        TransferredResource transferredResource = createCorpora();
        AssertJUnit.assertEquals(transferredResource == null, false);

        Map<String, String> parameters = new HashMap<>();
        parameters.put(RodaConstants.PLUGIN_PARAMS_PARENT_ID, root.getId());
        parameters.put(RodaConstants.PLUGIN_PARAMS_SIP_TO_AIP_CLASS,
                TransferredResourceToAIPPlugin.class.getName());

        Job ingest = TestsHelper.executeJob(MinimalIngestPlugin.class, parameters, PluginType.SIP_TO_AIP,
                SelectedItemsList.create(TransferredResource.class, transferredResource.getUUID()));

        List<Report> ingestReports = TestsHelper.getJobReports(index, ingest, true);
        AssertJUnit.assertEquals(1, ingestReports.size());

        IndexResult<IndexedFile> files = index.find(IndexedFile.class, Filter.ALL, Sorter.NONE, new Sublist(0, 1),
                new ArrayList<String>());
        String fileUUID = files.getResults().get(0).getUUID();

        Job job = TestsHelper.executeJob(SiegfriedPlugin.class, new HashMap<String, String>(), PluginType.MISC,
                SelectedItemsList.create(IndexedFile.class, fileUUID));

        List<Report> jobReports = TestsHelper.getJobReports(index, job, true);
        AssertJUnit.assertEquals(1, jobReports.size());

        Report report = jobReports.get(0);
        AssertJUnit.assertEquals(1, report.getReports().size());
        Report innerReport = report.getReports().get(0);
        AssertJUnit.assertEquals(false, report.getDateCreated().equals(report.getDateUpdated()));
        AssertJUnit.assertEquals(true, report.getDateCreated().equals(innerReport.getDateCreated()));
        AssertJUnit.assertEquals(true, report.getDateUpdated().equals(innerReport.getDateUpdated()));
    }
}