/** * 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.storage; import static org.hamcrest.MatcherAssert.assertThat; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertFalse; import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.assertTrue; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.commons.io.IOUtils; import org.hamcrest.Matchers; import org.roda.core.common.iterables.CloseableIterable; import org.roda.core.data.common.RodaConstants; import org.roda.core.data.exceptions.AlreadyExistsException; import org.roda.core.data.exceptions.GenericException; 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.ip.StoragePath; import org.roda.core.storage.fedora.FedoraStorageService; import org.roda.core.storage.fs.FSUtils; import org.testng.Assert; import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; import jersey.repackaged.com.google.common.collect.Iterables; /** * * @author Luis Faria <lfaria@keep.pt> * @author Helder Silva <hsilva@keep.pt> * @author Sebastien Leroux <sleroux@keep.pt> * * @param <T> * the storage service implementation * */ @Test(groups = {RodaConstants.TEST_GROUP_ALL, RodaConstants.TEST_GROUP_TRAVIS}) public abstract class AbstractStorageServiceTest<T extends StorageService> { /** * Get current instance of storage. * * @return */ protected abstract T getStorage(); /** * Clean up storage, making it empty. */ @AfterMethod public abstract void cleanUp(); public abstract void testClassInstantiation() throws RODAException; public void testListContainer() throws RODAException { // 1) list of containers CloseableIterable<Container> iterable = getStorage().listContainers(); assertThat(iterable, Matchers.iterableWithSize(0)); // 2) container list with one element (which implies creating one // container) final StoragePath containerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().createContainer(containerStoragePath); Iterator<Container> iterator = getStorage().listContainers().iterator(); assertTrue(iterator.hasNext()); Container next = iterator.next(); assertNotNull(next); assertEquals(containerStoragePath, next.getStoragePath()); assertFalse(iterator.hasNext()); // 3) list after cleanup getStorage().deleteContainer(containerStoragePath); iterator = getStorage().listContainers().iterator(); assertFalse(iterator.hasNext()); } public void testCreateGetDeleteContainer() throws RODAException { // 1) create container final StoragePath containerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().createContainer(containerStoragePath); // 2) get created container Container container = getStorage().getContainer(containerStoragePath); assertNotNull(container); assertEquals(containerStoragePath, container.getStoragePath()); // 3) create container that already exists try { getStorage().createContainer(containerStoragePath); Assert.fail( "An exception should have been thrown while creating a container that already exists but it didn't happen!"); } catch (AlreadyExistsException e) { // do nothing } // 4) delete container getStorage().deleteContainer(containerStoragePath); // 5) test delete container try { getStorage().getContainer(containerStoragePath); Assert.fail( "An exception should have been thrown while getting a container that was deleted but it didn't happened!"); } catch (NotFoundException e) { // do nothing } } public void testGetContainerThatDoesntExist() throws RODAException { // 1) get container that doesn't exist final StoragePath containerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); try { getStorage().getContainer(containerStoragePath); Assert.fail( "An exception should have been thrown while getting a container that doesn't exist but it didn't happened!"); } catch (NotFoundException e) { // do nothing } } public void testGetContainerThatIsActuallyADirectory() throws RODAException { // set up final StoragePath containerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().createContainer(containerStoragePath); final StoragePath directoryStoragePath = StorageTestUtils .generateRandomResourceStoragePathUnder(containerStoragePath); getStorage().createDirectory(directoryStoragePath); // get directory as it was a binary try { getStorage().getContainer(directoryStoragePath); Assert.fail( "An exception should have been thrown while getting a container which actually isn't a container but instead a directory but it didn't happened!"); } catch (RequestNotValidException e) { // do nothing } // cleanup getStorage().deleteContainer(containerStoragePath); } public void testGetContainerThatIsActuallyABinary() throws RODAException { // set up final StoragePath containerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().createContainer(containerStoragePath); final StoragePath binaryStoragePath = StorageTestUtils.generateRandomResourceStoragePathUnder(containerStoragePath); final ContentPayload payload = new RandomMockContentPayload(); getStorage().createBinary(binaryStoragePath, payload, false); // get binary as it was a directory try { getStorage().getContainer(binaryStoragePath); Assert.fail( "An exception should have been thrown while getting a container which actually isn't a container but instead a binary but it didn't happened!"); } catch (RequestNotValidException e) { // do nothing } // cleanup getStorage().deleteContainer(containerStoragePath); } public void testDeleteContainerThatDoesntExist() throws RODAException { // create container final StoragePath containerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().createContainer(containerStoragePath); // 1) delete container that exists getStorage().deleteContainer(containerStoragePath); // 2) delete container that no longer exists try { getStorage().deleteContainer(containerStoragePath); Assert.fail( "An exception should have been thrown while deleting a container that no longer exists but it didn't happened!"); } catch (NotFoundException e) { // do nothing } } public void testDeleteNonEmptyContainer() throws RODAException { // Set up final StoragePath containerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().createContainer(containerStoragePath); StoragePath directoryStoragePath = StorageTestUtils.generateRandomResourceStoragePathUnder(containerStoragePath); getStorage().createDirectory(directoryStoragePath); // 1) delete container recursively getStorage().deleteContainer(containerStoragePath); // 2) test delete container try { getStorage().getContainer(containerStoragePath); Assert.fail( "An exception should have been thrown while getting a container that doesn't exist but it didn't happened!"); } catch (NotFoundException e) { // do nothing } try { getStorage().getDirectory(directoryStoragePath); Assert.fail( "An exception should have been thrown while getting a container that doesn't exist but it didn't happened!"); } catch (NotFoundException e) { // do nothing } } public void testListResourcesUnderContainer() throws RODAException { // create container final StoragePath containerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().createContainer(containerStoragePath); // 1) list empty container Iterable<Resource> resources = getStorage().listResourcesUnderContainer(containerStoragePath, false); assertNotNull(resources); assertNotNull(resources.iterator()); assertFalse(resources.iterator().hasNext()); // 2) list container with 2 resources beneath (directories) StoragePath directoryStoragePath1 = StorageTestUtils.generateRandomResourceStoragePathUnder(containerStoragePath); getStorage().createDirectory(directoryStoragePath1); StoragePath directoryStoragePath2 = StorageTestUtils.generateRandomResourceStoragePathUnder(containerStoragePath); getStorage().createDirectory(directoryStoragePath2); resources = getStorage().listResourcesUnderContainer(containerStoragePath, false); assertNotNull(resources); assertThat(resources, Matchers.<Resource> iterableWithSize(2)); // TODO test recursive listing // cleanup getStorage().deleteResource(containerStoragePath); } public void testCreateGetDeleteDirectory() throws RODAException { // create container final StoragePath containerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().createContainer(containerStoragePath); // 1) create directory StoragePath directoryStoragePath = StorageTestUtils.generateRandomResourceStoragePathUnder(containerStoragePath); getStorage().createDirectory(directoryStoragePath); // 2) get created directory Directory directory = getStorage().getDirectory(directoryStoragePath); assertNotNull(directory); assertEquals(directoryStoragePath, directory.getStoragePath()); assertTrue(directory.isDirectory()); // 3) create directory that already exists try { getStorage().createDirectory(directoryStoragePath); Assert.fail( "An exception should have been thrown while creating a directory that already exists but it didn't happened!"); } catch (AlreadyExistsException e) { // do nothing } // 4) delete directory getStorage().deleteResource(directoryStoragePath); // 5) test deleted directory try { getStorage().getDirectory(directoryStoragePath); Assert.fail( "An exception should have been thrown while getting a directory that was deleted but it didn't happened!"); } catch (NotFoundException e) { // do nothing } // cleanup getStorage().deleteContainer(containerStoragePath); } public void testGetDirectoryThatDoesntExist() throws RODAException { // set up final StoragePath containerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().createContainer(containerStoragePath); StoragePath directoryStoragePath = StorageTestUtils.generateRandomResourceStoragePathUnder(containerStoragePath); // get directory that doesn't exist try { getStorage().getDirectory(directoryStoragePath); Assert.fail( "An exception should have been thrown while getting a directory that doesn't exist but it didn't happened!"); } catch (NotFoundException e) { // do nothing } // cleanup getStorage().deleteContainer(containerStoragePath); } public void testGetDirectoryThatIsActuallyABinary() throws RODAException { // set up final StoragePath containerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().createContainer(containerStoragePath); final StoragePath binaryStoragePath = StorageTestUtils.generateRandomResourceStoragePathUnder(containerStoragePath); final ContentPayload payload = new RandomMockContentPayload(); getStorage().createBinary(binaryStoragePath, payload, false); // get binary as it was a directory try { getStorage().getDirectory(binaryStoragePath); Assert.fail( "An exception should have been thrown while getting a directory which actually isn't a directory but instead a binary but it didn't happened!"); } catch (RequestNotValidException e) { // do nothing } // cleanup getStorage().deleteContainer(containerStoragePath); } public void testGetDirectoryThatIsActuallyAContainer() throws RODAException { // set up final StoragePath containerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().createContainer(containerStoragePath); // get container as it was a directory try { getStorage().getDirectory(containerStoragePath); Assert.fail( "An exception should have been thrown while getting a directory which actually isn't a directory but instead a container but it didn't happened!"); } catch (RequestNotValidException e) { // do nothing } // cleanup getStorage().deleteContainer(containerStoragePath); } public void testListResourcesUnderDirectory() throws RODAException, IOException { // create container final StoragePath containerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().createContainer(containerStoragePath); // create directory StoragePath directoryStoragePath = StorageTestUtils.generateRandomResourceStoragePathUnder(containerStoragePath); getStorage().createDirectory(directoryStoragePath); // 1) list empty directory Iterable<Resource> resources = getStorage().listResourcesUnderDirectory(directoryStoragePath, false); assertNotNull(resources); assertFalse(resources.iterator().hasNext()); // 2) list directory with 2 resources beneath (directories) final StoragePath subDirectoryStoragePath1 = StorageTestUtils .generateRandomResourceStoragePathUnder(directoryStoragePath); getStorage().createDirectory(subDirectoryStoragePath1); final StoragePath subDirectoryStoragePath2 = StorageTestUtils .generateRandomResourceStoragePathUnder(directoryStoragePath); getStorage().createDirectory(subDirectoryStoragePath2); // add grand-child to ensure it is not listed final StoragePath subSubDirectoryStoragePath1 = StorageTestUtils .generateRandomResourceStoragePathUnder(subDirectoryStoragePath1); getStorage().createDirectory(subSubDirectoryStoragePath1); resources = getStorage().listResourcesUnderDirectory(directoryStoragePath, false); assertNotNull(resources); assertThat(resources, Matchers.<Resource> iterableWithSize(2)); // TODO test recursive listing // cleanup getStorage().deleteContainer(containerStoragePath); } @Test(enabled = false) protected void testBinaryContent(Binary binary, ContentPayload providedPayload) throws IOException, GenericException { // check if content is the same assertTrue(IOUtils.contentEquals(providedPayload.createInputStream(), binary.getContent().createInputStream())); Path tempFile = Files.createTempFile("test", ".tmp"); Files.copy(binary.getContent().createInputStream(), tempFile, StandardCopyOption.REPLACE_EXISTING); // check size in bytes assertEquals(Long.valueOf(Files.size(tempFile)), binary.getSizeInBytes()); if (binary.getContentDigest() != null) { for (Entry<String, String> entry : binary.getContentDigest().entrySet()) { String digest = FSUtils.computeContentDigest(tempFile, entry.getKey()); assertEquals(digest, entry.getValue()); } } // delete temp file Files.delete(tempFile); } public void testCreateGetDeleteBinary() throws RODAException, IOException { // create container final StoragePath containerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().createContainer(containerStoragePath); // 1) create binary final StoragePath binaryStoragePath = StorageTestUtils.generateRandomResourceStoragePathUnder(containerStoragePath); final ContentPayload payload = new RandomMockContentPayload(); getStorage().createBinary(binaryStoragePath, payload, false); // 2) get binary Binary binary = getStorage().getBinary(binaryStoragePath); assertNotNull(binary); assertEquals(binaryStoragePath, binary.getStoragePath()); assertFalse(binary.isDirectory()); assertFalse(binary.isReference()); testBinaryContent(binary, payload); // 3) create binary that already exists try { getStorage().createBinary(binaryStoragePath, payload, false); Assert.fail( "An exception should have been thrown while creating a binary that already exists but it didn't happened!"); } catch (AlreadyExistsException e) { // do nothing } // 4) delete binary getStorage().deleteResource(binaryStoragePath); // 5) test deleted binary try { getStorage().getBinary(binaryStoragePath); Assert .fail("An exception should have been thrown while getting a binary that was deleted but it didn't happened!"); } catch (NotFoundException e) { // do nothing } // cleanup getStorage().deleteContainer(containerStoragePath); } public void testCreateGetDeleteBinaryAsReference() throws RODAException, IOException { // create container final StoragePath containerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().createContainer(containerStoragePath); // 1) create binary final StoragePath binaryStoragePath = StorageTestUtils.generateRandomResourceStoragePathUnder(containerStoragePath); final ContentPayload payload = new RandomMockContentPayload(); try { getStorage().createBinary(binaryStoragePath, payload, true); // 2) get binary Binary binary = getStorage().getBinary(binaryStoragePath); assertNotNull(binary); assertEquals(binaryStoragePath, binary.getStoragePath()); assertFalse(binary.isDirectory()); assertTrue(binary.isReference()); testBinaryContent(binary, payload); // 3) create binary that already exists try { getStorage().createBinary(binaryStoragePath, payload, false); Assert.fail( "An exception should have been thrown while creating a binary that already exists but it didn't happened!"); } catch (AlreadyExistsException e) { // do nothing } // 4) delete binary getStorage().deleteResource(binaryStoragePath); // 5) test deleted binary try { getStorage().getBinary(binaryStoragePath); Assert .fail("An exception should have been thrown while getting a binary that was deleted but it didn't happened!"); } catch (NotFoundException e) { // do nothing } } catch (GenericException e) { // catching not implemented // do nothing } // cleanup getStorage().deleteContainer(containerStoragePath); } public void testUpdateBinaryContent() throws RODAException, IOException { // create container final StoragePath containerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().createContainer(containerStoragePath); // create binary final StoragePath binaryStoragePath = StorageTestUtils.generateRandomResourceStoragePathUnder(containerStoragePath); final ContentPayload payload = new RandomMockContentPayload(); getStorage().createBinary(binaryStoragePath, payload, false); // get created binary and save content to file final Binary binaryCreated = getStorage().getBinary(binaryStoragePath); assertNotNull(binaryCreated); final Path original = Files.createTempFile(binaryCreated.getStoragePath().getName(), ".tmp"); binaryCreated.getContent().writeToPath(original); // 1) update binary content final ContentPayload newPayload = new RandomMockContentPayload(); final Binary binaryUpdated = getStorage().updateBinaryContent(binaryStoragePath, newPayload, false, false); assertNotNull(binaryUpdated); try (InputStream stream = Files.newInputStream(original)) { assertFalse(IOUtils.contentEquals(stream, binaryUpdated.getContent().createInputStream())); } testBinaryContent(binaryUpdated, newPayload); // cleanup getStorage().deleteContainer(containerStoragePath); } public void testUpdateBinaryThatDoesntExist() throws RODAException, IOException { // create container final StoragePath containerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().createContainer(containerStoragePath); // update binary content from binary that doesn't exist final StoragePath binaryStoragePath = StorageTestUtils.generateRandomResourceStoragePathUnder(containerStoragePath); final ContentPayload payload = new RandomMockContentPayload(); final boolean asReference = false; try { getStorage().updateBinaryContent(binaryStoragePath, payload, asReference, false); Assert.fail( "An exception should have been thrown while updating a binary that doesn't exist but it didn't happened!"); } catch (NotFoundException e) { // do nothing } // update binary content now with createIfNotExists=true Binary updatedBinaryContent = getStorage().updateBinaryContent(binaryStoragePath, payload, asReference, true); testBinaryContent(updatedBinaryContent, payload); // cleanup getStorage().deleteContainer(containerStoragePath); } // TODO test update binary from reference to reference // TODO test update binary from non-reference to reference // TODO test update binary from reference to non-reference public void testGetBinaryThatDoesntExist() throws RODAException { // set up final StoragePath containerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().createContainer(containerStoragePath); StoragePath binaryStoragePath = StorageTestUtils.generateRandomResourceStoragePathUnder(containerStoragePath); // get binary that doesn't exist try { getStorage().getBinary(binaryStoragePath); Assert .fail("An exception should have been thrown while getting a binary that doesn't exist but it didn't happened!"); } catch (NotFoundException e) { // do nothing } // cleanup getStorage().deleteContainer(containerStoragePath); } public void testGetBinaryThatIsActuallyADirectory() throws RODAException { // set up final StoragePath containerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().createContainer(containerStoragePath); final StoragePath directoryStoragePath = StorageTestUtils .generateRandomResourceStoragePathUnder(containerStoragePath); getStorage().createDirectory(directoryStoragePath); // get directory as it was a binary try { getStorage().getBinary(directoryStoragePath); Assert.fail( "An exception should have been thrown while getting a binary which actually isn't a binary but instead a directory but it didn't happened!"); } catch (RequestNotValidException e) { // do nothing } // cleanup getStorage().deleteContainer(containerStoragePath); } public void testGetBinaryThatIsActuallyAContainer() throws RODAException { // set up final StoragePath containerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().createContainer(containerStoragePath); // get container as it was a binary try { getStorage().getBinary(containerStoragePath); Assert.fail( "An exception should have been thrown while getting a binary which actually isn't a binary but instead a container but it didn't happened!"); } catch (RequestNotValidException e) { // do nothing } // cleanup getStorage().deleteContainer(containerStoragePath); } public void testDeleteNonEmptyDirectory() throws RODAException { // Set up final StoragePath containerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().createContainer(containerStoragePath); StoragePath directoryStoragePath = StorageTestUtils.generateRandomResourceStoragePathUnder(containerStoragePath); getStorage().createDirectory(directoryStoragePath); StoragePath binaryStoragePath = StorageTestUtils.generateRandomResourceStoragePathUnder(directoryStoragePath); final ContentPayload binaryPayload = new RandomMockContentPayload(); getStorage().createBinary(binaryStoragePath, binaryPayload, false); // test recursively delete directory getStorage().deleteResource(directoryStoragePath); // test get sub-resource try { getStorage().getBinary(binaryStoragePath); Assert .fail("An exception should have been thrown while getting a binary that doesn't exist but it didn't happened!"); } catch (NotFoundException e) { // do nothing } // test specific cleanup getStorage().deleteContainer(containerStoragePath); } public void testCopyContainerToSameStorage() throws RODAException, IOException { // create and populate source container final StoragePath sourceContainerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().createContainer(sourceContainerStoragePath); StorageTestUtils.populate(getStorage(), sourceContainerStoragePath); final StoragePath targetContainerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().copy(getStorage(), sourceContainerStoragePath, targetContainerStoragePath); StorageTestUtils.testEntityEqualRecursively(getStorage(), sourceContainerStoragePath, getStorage(), targetContainerStoragePath); // cleanup getStorage().deleteContainer(sourceContainerStoragePath); getStorage().deleteContainer(targetContainerStoragePath); } public void testCopyDirectoryToSameStorage() throws RODAException, IOException { // create container final StoragePath containerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().createContainer(containerStoragePath); // create and populate source directory final StoragePath sourceDirectoryStoragePath = StorageTestUtils .generateRandomResourceStoragePathUnder(containerStoragePath); getStorage().createDirectory(sourceDirectoryStoragePath); StorageTestUtils.populate(getStorage(), sourceDirectoryStoragePath); final StoragePath targetDirectoryStoragePath = StorageTestUtils .generateRandomResourceStoragePathUnder(containerStoragePath); getStorage().copy(getStorage(), sourceDirectoryStoragePath, targetDirectoryStoragePath); StorageTestUtils.testEntityEqualRecursively(getStorage(), sourceDirectoryStoragePath, getStorage(), targetDirectoryStoragePath); // cleanup getStorage().deleteContainer(containerStoragePath); } public void testCopyBinaryToSameStorage() throws RODAException, IOException { // create container final StoragePath containerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().createContainer(containerStoragePath); // create binary final StoragePath sourceBinaryStoragePath = StorageTestUtils .generateRandomResourceStoragePathUnder(containerStoragePath); final ContentPayload sourcePayload = new RandomMockContentPayload(); getStorage().createBinary(sourceBinaryStoragePath, sourcePayload, false); final StoragePath targetBinaryStoragePath = StorageTestUtils .generateRandomResourceStoragePathUnder(containerStoragePath); getStorage().copy(getStorage(), sourceBinaryStoragePath, targetBinaryStoragePath); final Binary sourceBinary = getStorage().getBinary(sourceBinaryStoragePath); final Binary targetBinary = getStorage().getBinary(targetBinaryStoragePath); assertEquals(sourceBinary.isDirectory(), targetBinary.isDirectory()); assertEquals(sourceBinary.getContentDigest(), targetBinary.getContentDigest()); assertEquals(sourceBinary.getSizeInBytes(), targetBinary.getSizeInBytes()); assertEquals(sourceBinary.isReference(), targetBinary.isReference()); assertTrue(IOUtils.contentEquals(sourceBinary.getContent().createInputStream(), targetBinary.getContent().createInputStream())); // cleanup getStorage().deleteContainer(containerStoragePath); } // TODO test copy from different storage public void testMoveContainerToSameStorage() throws RODAException, IOException { // create and populate source container final StoragePath sourceContainerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().createContainer(sourceContainerStoragePath); StorageTestUtils.populate(getStorage(), sourceContainerStoragePath); // copy for comparison test final StoragePath copyContainerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().copy(getStorage(), sourceContainerStoragePath, copyContainerStoragePath); // move final StoragePath targetContainerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().move(getStorage(), sourceContainerStoragePath, targetContainerStoragePath); // check with copy StorageTestUtils.testEntityEqualRecursively(getStorage(), copyContainerStoragePath, getStorage(), targetContainerStoragePath); // test source does not exist try { getStorage().getContainer(sourceContainerStoragePath); Assert .fail("An exception should have been thrown while getting a container that was moved but it didn't happened!"); } catch (NotFoundException e) { // do nothing } // cleanup getStorage().deleteContainer(copyContainerStoragePath); getStorage().deleteContainer(targetContainerStoragePath); } public void testMoveDirectoryToSameStorage() throws RODAException, IOException { // create container final StoragePath containerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().createContainer(containerStoragePath); // create and populate source directory final StoragePath sourceDirectoryStoragePath = StorageTestUtils .generateRandomResourceStoragePathUnder(containerStoragePath); getStorage().createDirectory(sourceDirectoryStoragePath); StorageTestUtils.populate(getStorage(), sourceDirectoryStoragePath); // copy for comparison test final StoragePath copyDirectoryStoragePath = StorageTestUtils .generateRandomResourceStoragePathUnder(containerStoragePath); getStorage().copy(getStorage(), sourceDirectoryStoragePath, copyDirectoryStoragePath); // move final StoragePath targetDirectoryStoragePath = StorageTestUtils .generateRandomResourceStoragePathUnder(containerStoragePath); getStorage().move(getStorage(), sourceDirectoryStoragePath, targetDirectoryStoragePath); // check with copy StorageTestUtils.testEntityEqualRecursively(getStorage(), copyDirectoryStoragePath, getStorage(), targetDirectoryStoragePath); // test source does not exist try { getStorage().getDirectory(sourceDirectoryStoragePath); Assert .fail("An exception should have been thrown while getting a directory that was moved but it didn't happened!"); } catch (NotFoundException e) { // do nothing } // cleanup getStorage().deleteContainer(containerStoragePath); } public void testMoveBinaryToSameStorage() throws RODAException, IOException { // create container final StoragePath containerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().createContainer(containerStoragePath); // create binary final StoragePath sourceBinaryStoragePath = StorageTestUtils .generateRandomResourceStoragePathUnder(containerStoragePath); final ContentPayload sourcePayload = new RandomMockContentPayload(); getStorage().createBinary(sourceBinaryStoragePath, sourcePayload, false); // copy for comparison test final StoragePath copyBinaryStoragePath = StorageTestUtils .generateRandomResourceStoragePathUnder(containerStoragePath); getStorage().copy(getStorage(), sourceBinaryStoragePath, copyBinaryStoragePath); // move final StoragePath targetBinaryStoragePath = StorageTestUtils .generateRandomResourceStoragePathUnder(containerStoragePath); getStorage().move(getStorage(), sourceBinaryStoragePath, targetBinaryStoragePath); // check with copy final Binary copyBinary = getStorage().getBinary(copyBinaryStoragePath); final Binary targetBinary = getStorage().getBinary(targetBinaryStoragePath); assertEquals(copyBinary.isDirectory(), targetBinary.isDirectory()); assertEquals(copyBinary.getContentDigest(), targetBinary.getContentDigest()); assertEquals(copyBinary.getSizeInBytes(), targetBinary.getSizeInBytes()); assertEquals(copyBinary.isReference(), targetBinary.isReference()); assertTrue(IOUtils.contentEquals(copyBinary.getContent().createInputStream(), targetBinary.getContent().createInputStream())); // test source does not exist try { getStorage().getBinary(sourceBinaryStoragePath); Assert.fail("An exception should have been thrown while getting a binary that was moved but it didn't happened!"); } catch (NotFoundException e) { // do nothing } // cleanup getStorage().deleteContainer(containerStoragePath); } // TODO test move from different storage public void testBinaryVersions() throws RODAException, IOException { Map<String, String> properties = new HashMap<>(); properties.put(RodaConstants.VERSION_ACTION, RodaConstants.VersionAction.UPDATED.toString()); // create container final StoragePath containerStoragePath = StorageTestUtils.generateRandomContainerStoragePath(); getStorage().createContainer(containerStoragePath); // 1) create binary final StoragePath binaryStoragePath = StorageTestUtils.generateRandomResourceStoragePathUnder(containerStoragePath); final ContentPayload payload1 = new RandomMockContentPayload(); getStorage().createBinary(binaryStoragePath, payload1, false); // 2) create binary version String message1 = "v1"; properties.put(RodaConstants.VERSION_MESSAGE, message1); BinaryVersion v1 = getStorage().createBinaryVersion(binaryStoragePath, properties); // 3) update binary final ContentPayload payload2 = new RandomMockContentPayload(); getStorage().updateBinaryContent(binaryStoragePath, payload2, false, false); // 4) create binary version 2 String message2 = "v2"; properties.put(RodaConstants.VERSION_MESSAGE, message2); getStorage().createBinaryVersion(binaryStoragePath, properties); // 5) create a version with a message that already exists getStorage().createBinaryVersion(binaryStoragePath, properties); // 6) list binary versions CloseableIterable<BinaryVersion> binaryVersions = getStorage().listBinaryVersions(binaryStoragePath); List<BinaryVersion> reusableBinaryVersions = new ArrayList<>(); Iterables.addAll(reusableBinaryVersions, binaryVersions); assertEquals(3, reusableBinaryVersions.size()); // 7) get binary version BinaryVersion binaryVersion1 = getStorage().getBinaryVersion(binaryStoragePath, v1.getId()); // TODO compare properties assertEquals(message1, binaryVersion1.getProperties().get(RodaConstants.VERSION_MESSAGE)); if (!(getStorage() instanceof FedoraStorageService)) { assertNotNull(binaryVersion1.getCreatedDate()); } assertTrue( IOUtils.contentEquals(payload1.createInputStream(), binaryVersion1.getBinary().getContent().createInputStream())); // 8) revert to previous version getStorage().revertBinaryVersion(binaryStoragePath, v1.getId()); Binary binary = getStorage().getBinary(binaryStoragePath); testBinaryContent(binary, payload1); // 9) delete binary version getStorage().deleteBinaryVersion(binaryStoragePath, v1.getId()); try { getStorage().getBinaryVersion(binaryStoragePath, v1.getId()); Assert.fail("Should have thrown NotFoundException"); } catch (NotFoundException e) { // do nothing } // 10) delete binary and all its history getStorage().deleteResource(binaryStoragePath); try { getStorage().getBinaryVersion(binaryStoragePath, v1.getId()); Assert.fail("Should have thrown NotFoundException"); } catch (NotFoundException e) { // do nothing } // cleanup getStorage().deleteContainer(containerStoragePath); } }