/**
* Licensed to The Apereo Foundation under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
*
* The Apereo Foundation licenses this file to you under the Educational
* Community 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://opensource.org/licenses/ecl2.txt
*
* 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.opencastproject.workflow.handler.inspection;
import org.opencastproject.inspection.api.MediaInspectionService;
import org.opencastproject.job.api.Job;
import org.opencastproject.job.api.Job.Status;
import org.opencastproject.mediapackage.Catalog;
import org.opencastproject.mediapackage.EName;
import org.opencastproject.mediapackage.MediaPackage;
import org.opencastproject.mediapackage.MediaPackageBuilder;
import org.opencastproject.mediapackage.MediaPackageBuilderFactory;
import org.opencastproject.mediapackage.MediaPackageElementParser;
import org.opencastproject.mediapackage.Track;
import org.opencastproject.metadata.api.MediaPackageMetadata;
import org.opencastproject.metadata.dublincore.DublinCore;
import org.opencastproject.metadata.dublincore.DublinCoreCatalog;
import org.opencastproject.metadata.dublincore.DublinCoreCatalogService;
import org.opencastproject.metadata.dublincore.DublinCoreValue;
import org.opencastproject.serviceregistry.api.ServiceRegistry;
import org.opencastproject.workflow.api.WorkflowInstance.WorkflowState;
import org.opencastproject.workflow.api.WorkflowInstanceImpl;
import org.opencastproject.workflow.api.WorkflowOperationException;
import org.opencastproject.workflow.api.WorkflowOperationInstance;
import org.opencastproject.workflow.api.WorkflowOperationInstance.OperationState;
import org.opencastproject.workflow.api.WorkflowOperationInstanceImpl;
import org.opencastproject.workflow.api.WorkflowOperationResult;
import org.opencastproject.workspace.api.Workspace;
import org.easymock.EasyMock;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.net.URI;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
public class InspectWorkflowOperationHandlerTest {
private InspectWorkflowOperationHandler operationHandler;
// local resources
private URI uriMP;
private URI uriMPUpdated;
private MediaPackage mp;
private MediaPackage mpUpdatedDC;
private Track newTrack;
private Job job;
// mock services and objects
private Workspace workspace = null;
private MediaInspectionService inspectionService = null;
private DublinCoreCatalogService dcService = null;
private MediaPackageMetadata metadata = null;
// constant metadata values
private static final Date DATE = new Date();
private static final String LANGUAGE = "language";
private static final String LICENSE = "license";
private static final String SERIES = "series";
private static final String SERIES_TITLE = "series title";
private static final String TITLE = "title";
private static final String NEW_DC_URL = "http://www.url.org";
@Before
public void setUp() throws Exception {
MediaPackageBuilder builder = MediaPackageBuilderFactory.newInstance().newMediaPackageBuilder();
// test resources
uriMP = InspectWorkflowOperationHandler.class.getResource("/inspect_mediapackage.xml").toURI();
uriMPUpdated = InspectWorkflowOperationHandler.class.getResource("/inspect_mediapackage_updated.xml").toURI();
mp = builder.loadFromXml(uriMP.toURL().openStream());
mpUpdatedDC = builder.loadFromXml(uriMPUpdated.toURL().openStream());
newTrack = (Track) mpUpdatedDC.getTracks()[0];
// set up service
operationHandler = new InspectWorkflowOperationHandler();
operationHandler.setJobBarrierPollingInterval(0);
// set up mock metadata and metadata service providing it
metadata = EasyMock.createNiceMock(MediaPackageMetadata.class);
EasyMock.expect(metadata.getDate()).andReturn(DATE);
EasyMock.expect(metadata.getLanguage()).andReturn(LANGUAGE);
EasyMock.expect(metadata.getLicense()).andReturn(LICENSE);
EasyMock.expect(metadata.getSeriesIdentifier()).andReturn(SERIES);
EasyMock.expect(metadata.getSeriesTitle()).andReturn(SERIES_TITLE);
EasyMock.expect(metadata.getTitle()).andReturn(TITLE);
EasyMock.replay(metadata);
// set up mock dublin core and dcService providing it
DublinCoreCatalog dc = EasyMock.createStrictMock(DublinCoreCatalog.class);
EasyMock.expect(dc.hasValue(DublinCore.PROPERTY_EXTENT)).andReturn(false);
dc.set((EName) EasyMock.anyObject(), (DublinCoreValue) EasyMock.anyObject());
EasyMock.expect(dc.hasValue(DublinCore.PROPERTY_CREATED)).andReturn(false);
dc.set((EName) EasyMock.anyObject(), (DublinCoreValue) EasyMock.anyObject());
dc.toXml((ByteArrayOutputStream) EasyMock.anyObject(), EasyMock.anyBoolean());
// EasyMock.expect(dc.getIdentifier()).andReturn("123");
EasyMock.replay(dc);
dcService = EasyMock.createNiceMock(DublinCoreCatalogService.class);
EasyMock.expect(dcService.getMetadata((MediaPackage) EasyMock.anyObject())).andReturn(
metadata);
EasyMock.expect(
dcService.load((InputStream) EasyMock.anyObject())).andReturn(dc);
EasyMock.replay(dcService);
operationHandler.setDublincoreService(dcService);
// set up mock receipt and inspect service providing it
job = EasyMock.createNiceMock(Job.class);
EasyMock.expect(job.getPayload()).andReturn(MediaPackageElementParser.getAsXml(newTrack)).anyTimes();
EasyMock.expect(job.getId()).andReturn(new Long(123));
EasyMock.expect(job.getStatus()).andReturn(Status.FINISHED);
EasyMock.expect(job.getDateCreated()).andReturn(new Date());
EasyMock.expect(job.getDateStarted()).andReturn(new Date());
EasyMock.replay(job);
// set up mock service registry
ServiceRegistry serviceRegistry = EasyMock.createNiceMock(ServiceRegistry.class);
EasyMock.expect(serviceRegistry.getJob(EasyMock.anyLong())).andReturn(job).anyTimes();
EasyMock.replay(serviceRegistry);
operationHandler.setServiceRegistry(serviceRegistry);
inspectionService = EasyMock.createNiceMock(MediaInspectionService.class);
EasyMock.expect(inspectionService.enrich((Track) EasyMock.anyObject(), EasyMock.anyBoolean(),
(Map<String, String>) EasyMock.anyObject())).andReturn(job);
EasyMock.replay(inspectionService);
operationHandler.setInspectionService(inspectionService);
// set up mock workspace
workspace = EasyMock.createNiceMock(Workspace.class);
// workspace.delete((String) EasyMock.anyObject(), (String) EasyMock.anyObject());
URI newURI = new URI(NEW_DC_URL);
EasyMock.expect(
workspace.put((String) EasyMock.anyObject(), (String) EasyMock.anyObject(), (String) EasyMock.anyObject(),
(InputStream) EasyMock.anyObject())).andReturn(newURI);
EasyMock.expect(workspace.getURI((String) EasyMock.anyObject(), (String) EasyMock.anyObject())).andReturn(newURI);
EasyMock.expect(workspace.get((URI) EasyMock.anyObject())).andReturn(
new File(getClass().getResource("/dublincore.xml").toURI()));
EasyMock.replay(workspace);
operationHandler.setWorkspace(workspace);
}
@Test
public void testInspectOperationTrackMetadata() throws Exception {
for (Catalog c : mp.getCatalogs()) {
mp.remove(c);
}
WorkflowOperationResult result = getWorkflowOperationResult(mp);
Track trackNew = result.getMediaPackage().getTracks()[0];
// check track metadata
Assert.assertNotNull(trackNew.getChecksum());
Assert.assertNotNull(trackNew.getMimeType());
Assert.assertNotNull(trackNew.getDuration());
Assert.assertNotNull(trackNew.getStreams());
}
@Test
public void testInspectOperationDCMetadata() throws Exception {
WorkflowOperationResult result = getWorkflowOperationResult(mp);
Catalog cat = result.getMediaPackage().getCatalogs()[0];
// dublincore check: also checked with strict mock calls
Assert.assertEquals(NEW_DC_URL, cat.getURI().toString());
}
private WorkflowOperationResult getWorkflowOperationResult(MediaPackage mp) throws WorkflowOperationException {
// Add the mediapackage to a workflow instance
WorkflowInstanceImpl workflowInstance = new WorkflowInstanceImpl();
workflowInstance.setId(1);
workflowInstance.setState(WorkflowState.RUNNING);
workflowInstance.setMediaPackage(mp);
WorkflowOperationInstanceImpl operation = new WorkflowOperationInstanceImpl("op", OperationState.RUNNING);
List<WorkflowOperationInstance> operationsList = new ArrayList<WorkflowOperationInstance>();
operationsList.add(operation);
workflowInstance.setOperations(operationsList);
// Run the media package through the operation handler, ensuring that metadata gets added
return operationHandler.start(workflowInstance, null);
}
}