/**
* 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.assetmanager.impl;
import static org.hamcrest.Matchers.instanceOf;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.opencastproject.assetmanager.api.fn.ARecords.getProperties;
import org.opencastproject.assetmanager.api.AssetManagerException;
import org.opencastproject.assetmanager.api.Availability;
import org.opencastproject.assetmanager.api.Property;
import org.opencastproject.assetmanager.api.PropertyId;
import org.opencastproject.assetmanager.api.Value;
import org.opencastproject.assetmanager.api.Version;
import org.opencastproject.assetmanager.api.query.AResult;
import org.opencastproject.assetmanager.impl.persistence.QSnapshotDto;
import org.opencastproject.mediapackage.MediaPackage;
import org.opencastproject.mediapackage.MediaPackageBuilderFactory;
import org.opencastproject.mediapackage.MediaPackageElement;
import org.opencastproject.mediapackage.MediaPackageElement.Type;
import org.opencastproject.mediapackage.MediaPackageElementBuilderImpl;
import org.opencastproject.mediapackage.MediaPackageElements;
import com.entwinemedia.fn.data.Opt;
import org.junit.Test;
import java.net.URI;
import java.util.Date;
// CHECKSTYLE:OFF
public class AbstractAssetManagerBasicTest extends AbstractAssetManagerTestBase {
@Test
public void testAddToStore() {
createAndAddMediaPackagesSimple(1, 1, 1);
assertStoreSize(2);
createAndAddMediaPackagesSimple(3, 1, 1);
assertStoreSize(8);
}
@Test
public void testQuerydslEquality() {
final QSnapshotDto dto1 = QSnapshotDto.snapshotDto;
final QSnapshotDto dto2 = new QSnapshotDto("s");
final QSnapshotDto dto3 = new QSnapshotDto("s");
assertFalse("Entity paths with different names must not be equal", dto1.equals(dto2));
assertTrue("Two entity paths are equals if they have the same alias", dto2.equals(dto3));
assertFalse("Descendant paths of entities with different names must not be equal", dto1.mediaPackageId.equals(dto2.mediaPackageId));
}
@Test
public void testVersioning() throws Exception {
final MediaPackage mp = MediaPackageBuilderFactory.newInstance().newMediaPackageBuilder().createNew();
final Version v1 = am.takeSnapshot(OWNER, mp).getVersion();
final Version v2 = am.takeSnapshot(OWNER, mp).getVersion();
assertTrue("First version must be older", v1.isOlder(v2));
assertTrue("Second version must be younger", v2.isYounger(v1));
assertTrue(v1.equals(v1));
assertFalse(v1.equals(v2));
}
@Test
public void testSerializeVersion() throws Exception {
final MediaPackage mp = MediaPackageBuilderFactory.newInstance().newMediaPackageBuilder().createNew();
final Version v1 = am.takeSnapshot(OWNER, mp).getVersion();
assertTrue("Version should be ", am.toVersion(v1.toString()).isSome());
assertEquals(v1, am.toVersion(v1.toString()).get());
}
@Test
public void testUnwrapException() {
assertTrue(AbstractAssetManager.unwrapExceptionUntil(Exception.class, new AssetManagerException()).isSome());
assertThat(AbstractAssetManager.unwrapExceptionUntil(Exception.class, new AssetManagerException()).get(), instanceOf(AssetManagerException.class));
assertEquals("error", AbstractAssetManager.unwrapExceptionUntil(
AssetManagerException.class,
new AssetManagerException("error")).get().getMessage());
assertEquals("error", AbstractAssetManager.unwrapExceptionUntil(
AssetManagerException.class,
new Exception(new AssetManagerException("error"))).get().getMessage());
assertEquals("wrapper", AbstractAssetManager.unwrapExceptionUntil(
AssetManagerException.class,
new AssetManagerException("wrapper", new AssetManagerException("error"))).get().getMessage());
}
@Test
public void testSetAvailability() throws Exception {
final MediaPackage mp = MediaPackageBuilderFactory.newInstance().newMediaPackageBuilder().createNew();
final Version v1 = am.takeSnapshot(OWNER, mp).getVersion();
am.setAvailability(v1, mp.getIdentifier().toString(), Availability.OFFLINE);
assertEquals("One offline snapshot should be found", 1, q.select(q.snapshot()).where(q.availability(Availability.OFFLINE)).run().getSize());
assertEquals("No online snapshot should be found", 0, q.select(q.snapshot()).where(q.availability(Availability.ONLINE)).run().getSize());
}
@Test
public void testSetPropertyOnNonExistingMediaPackage() throws Exception {
assertFalse("Property should not be stored since the referenced media package does not exist",
am.setProperty(Property.mk(PropertyId.mk("id", "namespace", "name"), Value.mk("value"))));
assertEquals("No properties should exist in the AssetManager", 0, q.select(q.properties()).run().getRecords().toList().size());
}
@Test
public void testGetFileNameFromUrn() throws Exception {
MediaPackageElement element = new MediaPackageElementBuilderImpl().newElement(Type.Track,
MediaPackageElements.PRESENTER_SOURCE);
Opt<String> fileNameFromUrn = AbstractAssetManager.getFileNameFromUrn(element);
assertTrue(fileNameFromUrn.isNone());
element.setURI(URI.create("file://test.txt"));
fileNameFromUrn = AbstractAssetManager.getFileNameFromUrn(element);
assertTrue(fileNameFromUrn.isNone());
element.setURI(URI.create("urn:matterhorn:uuid:22:uuid2:caption-ger.vtt"));
fileNameFromUrn = AbstractAssetManager.getFileNameFromUrn(element);
assertTrue(fileNameFromUrn.isSome());
assertEquals("caption-ger.vtt", fileNameFromUrn.get());
}
@Test
public void testSetAndUpdateProperty() throws Exception {
final MediaPackage mp = mkMediaPackage(mkCatalog());
final String mpId = mp.getIdentifier().toString();
am.takeSnapshot(OWNER, mp);
final Date d1 = new Date(0);
final Date d2 = new Date(1);
final Date d3 = new Date(2);
logger.info("Add a property to the media package");
assertTrue("The property should be set", am.setProperty(p.start.mk(mpId, d1)));
logger.info("Select all properties of the media package");
{
AResult r = q.select(p.allProperties()).where(q.mediaPackageId(mpId)).run();
assertEquals("One record should be found", 1, r.getSize());
assertEquals("One property should be found", 1, r.getRecords().bind(getProperties).toList().size());
assertEquals("Value check", d1, r.getRecords().bind(getProperties).head2().getValue().get(Value.DATE));
assertEquals("One property should be found", 1, q.select(q.properties()).run().getRecords().toList().size());
}
logger.info("Update the property");
assertTrue("The property should be updated", am.setProperty(p.start.mk(mpId, d2)));
{
AResult r = q.select(p.allProperties()).where(q.mediaPackageId(mpId)).run();
assertEquals("One record should be found", 1, r.getSize());
assertEquals("One property should be found", 1, r.getRecords().bind(getProperties).toList().size());
assertEquals("Value check", d2, r.getRecords().bind(getProperties).head2().getValue().get(Value.DATE));
assertEquals("One record should be found", 1, q.select(q.properties()).run().getRecords().toList().size());
}
logger.info("The existence of multiple versions of a media package should not affect property storage");
logger.info("Add a new version of the media package");
am.takeSnapshot(OWNER, mp);
logger.info("Update the property again");
assertTrue("The property should be updated", am.setProperty(p.start.mk(mpId, d3)));
{
AResult r = q.select(p.allProperties()).where(q.mediaPackageId(mpId)).run();
assertEquals("Two records should be found since there are now two versions of the media package and no version restriction has been applied",
2, r.getSize());
assertEquals("Two properties should be found, one per found record", 2, r.getRecords().bind(getProperties).toList().size());
assertEquals("There should be one distinct property in all of the found records", 1, r.getRecords().bind(getProperties).toSet().size());
assertEquals("Value check", d3, r.getRecords().bind(getProperties).head2().getValue().get(Value.DATE));
assertEquals("Two record should be found", 2, q.select(q.properties()).run().getRecords().toList().size());
}
}
}