/**
* 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 org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import org.opencastproject.mediapackage.MediaPackageSupport.MergeMode;
import org.opencastproject.util.FileSupport;
import org.apache.commons.io.FileUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
/**
* Test case to make sure media package support works as expected.
*/
public class MediaPackageMergeTest {
/** tmp directory */
private File tmpDir = null;
/** Media package directories */
private File packageDir1 = null;
private File packageDir2 = null;
/** The media package builder */
private MediaPackageBuilder mediaPackageBuilder = null;
/** The source media package directory for merge tests */
private MediaPackage sourcePackage = null;
/** The target media package directory for merge tests */
private MediaPackage targetPackage = null;
@Rule
public TemporaryFolder testFolder = new TemporaryFolder();
@Before
public void setUp() throws Exception {
// Get hold of the tmp directory
tmpDir = testFolder.newFolder();
// Create a media package builder
mediaPackageBuilder = MediaPackageBuilderFactory.newInstance().newMediaPackageBuilder();
// Create source and target media package
setUpSourceMediaPackage();
setUpTargeMediaPackage();
}
/**
* @throws java.io.File.IOException
*/
@After
public void tearDown() throws Exception {
FileUtils.deleteDirectory(packageDir1);
FileUtils.deleteDirectory(packageDir2);
}
/**
* Creates the source media package.
*
* @throws IOException
* @throws MediaPackageException
*/
private void setUpSourceMediaPackage() throws Exception {
// Create the media package directory
packageDir1 = new File(tmpDir, Long.toString(System.currentTimeMillis()));
// Create subdirectories
File trackDir = new File(packageDir1, "tracks");
trackDir.mkdirs();
File metadataDir = new File(packageDir1, "metadata");
metadataDir.mkdirs();
File attachmentDir = new File(packageDir1, "attachments");
attachmentDir.mkdirs();
// Setup test files
File baseDir = new File(MediaPackageBuilderTest.class.getResource("/").toURI());
File sourceManifestFile = new File(baseDir, "source-manifest.xml");
File videoTestFile = new File(baseDir, "vonly.mov");
File audioTestFile = new File(baseDir, "aonly.mov");
File dcTestFile = new File(baseDir, "dublincore.xml");
File dcSeriesTestFile = new File(baseDir, "series-dublincore.xml");
File mpeg7TestFile = new File(baseDir, "mpeg-7.xml");
File coverTestFile = new File(baseDir, "cover.png");
// Copy files into place
File manifestFile = new File(packageDir1, MediaPackageElements.MANIFEST_FILENAME);
FileSupport.copy(sourceManifestFile, manifestFile);
FileSupport.copy(videoTestFile, trackDir);
FileSupport.copy(audioTestFile, trackDir);
FileSupport.copy(dcTestFile, metadataDir);
FileSupport.copy(dcSeriesTestFile, metadataDir);
FileSupport.copy(dcSeriesTestFile, new File(metadataDir, "series-dublincore-new.xml"));
FileSupport.copy(mpeg7TestFile, metadataDir);
FileSupport.copy(coverTestFile, attachmentDir);
FileSupport.copy(coverTestFile, new File(attachmentDir, "series-cover.png"));
// Test the media package
mediaPackageBuilder.setSerializer(new DefaultMediaPackageSerializerImpl(manifestFile.getParentFile()));
sourcePackage = mediaPackageBuilder.loadFromXml(new FileInputStream(manifestFile));
sourcePackage.verify();
}
/**
* Creates the target media package.
*
* @throws IOException
* @throws MediaPackageException
* @throws URISyntaxException
*/
private void setUpTargeMediaPackage() throws IOException, MediaPackageException, URISyntaxException {
// Create the media package directory
packageDir2 = new File(tmpDir, Long.toString(System.currentTimeMillis()));
// Create subdirectories
File trackDir = new File(packageDir2, "tracks");
trackDir.mkdirs();
File metadataDir = new File(packageDir2, "metadata");
metadataDir.mkdirs();
File attachmentDir = new File(packageDir2, "attachments");
attachmentDir.mkdirs();
// Setup test files
File baseDir = new File(MediaPackageBuilderTest.class.getResource("/").toURI());
File sourceManifestFile = new File(baseDir, "target-manifest.xml");
File videoTestFile = new File(baseDir, "vonly.mov");
File audioTestFile = new File(baseDir, "aonly.mov");
File dcTestFile = new File(baseDir, "dublincore.xml");
File dcSeriesTestFile = new File(baseDir, "series-dublincore.xml");
File mpeg7TestFile = new File(baseDir, "mpeg-7.xml");
File coverTestFile = new File(baseDir, "cover.png");
// Copy files into place
File manifestFile = new File(packageDir2, MediaPackageElements.MANIFEST_FILENAME);
FileSupport.copy(sourceManifestFile, manifestFile);
FileSupport.copy(videoTestFile, trackDir);
FileSupport.copy(audioTestFile, trackDir);
FileSupport.copy(audioTestFile, new File(trackDir, "aonly2.mov"));
FileSupport.copy(dcTestFile, metadataDir);
FileSupport.copy(dcSeriesTestFile, metadataDir);
FileSupport.copy(mpeg7TestFile, metadataDir);
FileSupport.copy(coverTestFile, attachmentDir);
// Test the media package
mediaPackageBuilder.setSerializer(new DefaultMediaPackageSerializerImpl(manifestFile.getParentFile()));
targetPackage = mediaPackageBuilder.loadFromXml(new FileInputStream(manifestFile));
targetPackage.verify();
}
/**
* Checks the media package for duplicate identifier and files.
*
* @param mediaPackage
* the media package to test
* @throws MediaPackageException
*/
private void testMediaPackageConsistency(MediaPackage mediaPackage) throws MediaPackageException {
List<String> ids = new ArrayList<String>();
List<URI> files = new ArrayList<URI>();
for (MediaPackageElement e : mediaPackage.elements()) {
if (ids.contains(e.getIdentifier()))
throw new MediaPackageException("Duplicate id " + e.getIdentifier() + "' found");
ids.add(e.getIdentifier());
if (files.contains(e.getURI()))
throw new MediaPackageException("Duplicate filename " + e.getURI() + "' found");
files.add(e.getURI());
}
}
@Test
public void testMergeByMerging() {
try {
MediaPackage mediaPackage = MediaPackageSupport.merge(targetPackage, sourcePackage, MergeMode.Merge);
assertTrue(mediaPackage.getTracks().length == 5);
assertTrue(mediaPackage.getCatalogs().length == 6);
assertTrue(mediaPackage.getAttachments().length == 3);
testMediaPackageConsistency(mediaPackage);
} catch (MediaPackageException e) {
fail(e.getMessage());
}
}
@Test
public void testMergeByReplacing() {
try {
// Should be replaced
MediaPackageElement track1 = targetPackage.getElementById("track-1");
MediaPackageElement catalog1 = targetPackage.getElementById("catalog-1");
MediaPackageElement catalog2 = targetPackage.getElementById("catalog-2");
MediaPackageElement cover = targetPackage.getElementById("cover");
// Should remain untouched
MediaPackageElement track2 = targetPackage.getElementById("track-2");
MediaPackageElement track4 = targetPackage.getElementById("track-4");
MediaPackageElement catalog3 = targetPackage.getElementById("catalog-3");
// Merge the media package
MediaPackage mergedPackage = MediaPackageSupport.merge(targetPackage, sourcePackage, MergeMode.Replace);
// Test number of elements
assertEquals(mergedPackage.getTracks().length, 4);
assertEquals(mergedPackage.getCatalogs().length, 4);
assertEquals(mergedPackage.getAttachments().length, 2);
// Test for replaced elements
assertNotSame(track1, mergedPackage.getElementById("track-1"));
assertNotSame(catalog1, mergedPackage.getElementById("catalog-1"));
assertNotSame(catalog2, mergedPackage.getElementById("catalog-2"));
assertNotSame(cover, mergedPackage.getElementById("cover"));
// Test for untouched elements
assertEquals(track2, mergedPackage.getElementById("track-2"));
assertEquals(track4, mergedPackage.getElementById("track-4"));
assertEquals(catalog3, mergedPackage.getElementById("catalog-3"));
testMediaPackageConsistency(mergedPackage);
} catch (MediaPackageException e) {
fail(e.getMessage());
}
}
@Test
public void testMergeBySkipping() {
try {
// Should remain untouched
MediaPackageElement track1 = targetPackage.getElementById("track-1");
MediaPackageElement catalog1 = targetPackage.getElementById("catalog-1");
MediaPackageElement catalog2 = targetPackage.getElementById("catalog-2");
MediaPackageElement cover = targetPackage.getElementById("cover");
// Merge the media package
MediaPackage mergedPackage = MediaPackageSupport.merge(targetPackage, sourcePackage, MergeMode.Skip);
// Test number of elements
assertEquals(mergedPackage.getTracks().length, 4);
assertEquals(mergedPackage.getCatalogs().length, 4);
assertEquals(mergedPackage.getAttachments().length, 2);
// Test for untouched elements
assertEquals(track1, mergedPackage.getElementById("track-1"));
assertEquals(catalog1, mergedPackage.getElementById("catalog-1"));
assertEquals(catalog2, mergedPackage.getElementById("catalog-2"));
assertEquals(cover, mergedPackage.getElementById("cover"));
testMediaPackageConsistency(mergedPackage);
} catch (MediaPackageException e) {
fail(e.getMessage());
}
}
@Test
public void testMergeByFailing() {
try {
MediaPackageSupport.merge(targetPackage, sourcePackage, MergeMode.Fail);
fail("Merging should have failed but didn't");
} catch (MediaPackageException e) {
// This is excpected
}
}
}