/**
* 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.mediapackage;
import static com.jayway.restassured.path.xml.XmlPath.from;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.opencastproject.mediapackage.MediaPackageElements.PRESENTATION_SOURCE;
import static org.opencastproject.mediapackage.MediaPackageElements.PRESENTER_SOURCE;
import static org.opencastproject.mediapackage.MediaPackageSupport.loadFromClassPath;
import static org.opencastproject.mediapackage.PublicationImpl.publication;
import static org.opencastproject.util.MimeType.mimeType;
import org.opencastproject.mediapackage.MediaPackageElement.Type;
import org.opencastproject.util.ConfigurationException;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URI;
import java.util.HashSet;
import java.util.Set;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
/**
* Test cases for the media package.
*/
public class MediaPackageTest extends AbstractMediaPackageTest {
private static final Logger logger = LoggerFactory.getLogger(AbstractMediaPackageTest.class);
@Test
public void testEmptyMediaPackage() {
try {
MediaPackage mediaPackage = mediaPackageBuilder.createNew();
MediaPackageParser.getAsXml(mediaPackage);
} catch (MediaPackageException e) {
fail("Media package excpetion while reading media package from manifest: " + e.getMessage());
} catch (ConfigurationException e) {
fail("Configuration exception while reading media package from manifest: " + e.getMessage());
}
}
@Test
public void testElementUrls() throws ParserConfigurationException, SAXException, IOException {
try {
XPath xPath = XPathFactory.newInstance().newXPath();
// Create a media package and add an element
MediaPackage mediaPackage = mediaPackageBuilder.createNew();
mediaPackage.add(dcFile.toURI());
// Test url
String xmlString = MediaPackageParser.getAsXml(mediaPackage);
DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document xml = docBuilder.parse(new ByteArrayInputStream(xmlString.getBytes()));
String expected = dcFile.toURI().toURL().toExternalForm();
assertEquals(expected, xPath.evaluate("//url", xml));
// TODO: Add more
} catch (MediaPackageException e) {
fail("Media package excpetion while reading media package from manifest: " + e.getMessage());
} catch (ConfigurationException e) {
fail("Configuration exception while reading media package from manifest: " + e.getMessage());
} catch (MalformedURLException e) {
fail("Exception while creating url: " + e.getMessage());
} catch (UnsupportedElementException e) {
fail("Error while creating media package: " + e.getMessage());
} catch (XPathExpressionException e) {
fail("Selecting node form xml document failed: " + e.getMessage());
}
}
@Test
public void testDerivates() {
try {
// Create a media package and add an element
MediaPackage mediaPackage = mediaPackageBuilder.createNew();
MediaPackageElementFlavor sourceFlavor = new MediaPackageElementFlavor("some", "source");
MediaPackageElement dcCatalog = mediaPackage.add(dcFile.toURI(), Type.Catalog, sourceFlavor);
// Add the "derived" catalog
MediaPackageElementFlavor derivedFlavor = new MediaPackageElementFlavor("dublincore", "specialedition");
MediaPackageElement derivedElement = mediaPackageElementBuilder.elementFromURI(dcFile.toURI(), Type.Catalog,
derivedFlavor);
mediaPackage.addDerived(derivedElement, dcCatalog);
// Test the whole thing
assertEquals(1, mediaPackage.getElementsByFlavor(derivedFlavor).length);
assertEquals(2, mediaPackage.getCatalogs().length);
assertEquals(1, mediaPackage.getCatalogs(derivedFlavor).length);
assertEquals(1, mediaPackage.getDerived(dcCatalog, derivedFlavor).length);
assertEquals(derivedElement, mediaPackage.getDerived(dcCatalog, derivedFlavor)[0]);
} catch (MediaPackageException e) {
fail("Media package excpetion while reading media package from manifest: " + e.getMessage());
} catch (ConfigurationException e) {
fail("Configuration exception while reading media package from manifest: " + e.getMessage());
} catch (UnsupportedElementException e) {
fail("Error while creating media package: " + e.getMessage());
}
}
@Test
public void testPublicationElement() throws Exception {
final MediaPackage mp = mediaPackageBuilder.createNew();
mp.add(publication("1", "engage", new URI("http://localhost/1.html"), mimeType("text", "html")));
assertEquals("Number of media package elements", 1, mp.getElements().length);
final String xml = MediaPackageParser.getAsXml(mp);
logger.info(xml);
assertEquals("Media package identifier", mp.getIdentifier().toString(), from(xml).get("mediapackage.@id"));
assertEquals("Publication channel name", "engage", from(xml).get("mediapackage.publications.publication.@channel"));
}
@Test
public void testPublicationElementFromFile() throws Exception {
final MediaPackage mp = loadFromClassPath("/manifest.xml");
assertEquals("Number of publication elements", 1, mp.getPublications().length);
assertEquals("Publication channel name in deserialized mediapackage", "engage",
mp.getPublications()[0].getChannel());
final String xml = MediaPackageParser.getAsXml(mp);
assertEquals("Publication channel name in serialized mediapackage", "engage",
from(xml).get("mediapackage.publications.publication.@channel"));
}
@Test
public void testAddElement() throws Exception {
final MediaPackage mp1 = mediaPackageBuilder.createNew();
final MediaPackage mp2 = mediaPackageBuilder.createNew();
final MediaPackageElement presentation = mediaPackageElementBuilder.newElement(Type.Track, PRESENTATION_SOURCE);
presentation.setURI(new URI("http://localhost/presentation"));
final MediaPackageElement presenter = mediaPackageElementBuilder.newElement(Type.Track, PRESENTER_SOURCE);
presenter.setURI(new URI("http://localhost/presenter"));
final Set<MediaPackageElement> elements = new HashSet<MediaPackageElement>();
elements.add(presentation);
elements.add(presenter);
assertEquals("Expect two elements", 2, elements.size());
assertTrue("Expect presenter to be in set", elements.contains(presenter));
assertTrue("Expect presentation to be in set", elements.contains(presentation));
mp1.add(presentation);
assertEquals("Expect parent mediapackage to be mp1", mp1, presentation.getMediaPackage());
// breaks element <-> parent relationship
mp2.add(presentation);
assertEquals(mp2, presentation.getMediaPackage()); // this works!
assertEquals(1, mp1.getElements().length);
assertEquals(1, mp2.getElements().length);
mp2.add(presenter);
assertEquals(2, mp2.getElements().length);
// check element set again
assertEquals(2, elements.size());
// crash! does not hold true anymore since adding mutates fields that are used for hash code calculation
// comment in if issue has been resolved
// assertTrue("Expect presenter to be in set", elements.contains(presenter));
// assertTrue("Expect presentation to be in set", elements.contains(presentation));
}
}